找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888广告投放联系QQ68610888
广告投放联系QQ68610888广告投放联系QQ68610888
查看: 781|回复: 3

[ikuai] 记录一下透明代理的实现

[复制链接]
发表于 2026-7-14 07:56 | 显示全部楼层 |阅读模式


爱快 + MosDNS + 插件M 局域网透明代理

## 1. 实现目标

本方案不修改局域网客户端的默认网关,也不让爱快与代理主机互相指定网关。

- 默认网关始终是爱快:`192.168.50.1`
- 客户端 DNS 指向代理主机:`192.168.50.46`
- 大陆域名返回真实地址,客户端通过爱快直接访问
- 海外域名返回透明代理 VIP,再由 插件M 转发
- 同时支持 IPv4 和 IPv6
- 不启用 TUN,不修改爱快默认路由

## 2. 地址和端口规划

| 用途 | 地址或端口 |
|---|---|
| 爱快默认网关 | `192.168.50.1` |
| 爱快管理页面 | `http://192.168.50.1:90/444` |
| DNS/插件M 主机 | `192.168.50.46` |
| IPv4 DNS | `192.168.50.46:53` |
| IPv6 DNS | `[fdfc:562e:f275::46]:53` |
| IPv4 透明代理 VIP | `192.168.50.45` |
| IPv6 透明代理 VIP | `fdfc:562e:f275::45` |
| 插件M Mixed Proxy | `192.168.50.46:7890` |
| 插件M Controller API | `192.168.50.46:9090` |
| Transparent REDIRECT | `7893/tcp` |
| Transparent TPROXY | `7894/udp` |
| Sub2API | `http://192.168.50.46:8092` |
| MetaCubeXD | `http://192.168.50.46:8093` |

必须将 `192.168.50.45` 排除在爱快 DHCP 地址池之外。它是透明代理 VIP,不能分配给其他设备。

## 3. 工作流程

### 3.1 大陆域名

1. 客户端向 `192.168.50.46` 查询域名。
2. MosDNS 判断域名属于大陆规则集合。
3. MosDNS 通过 `223.5.5.5` 和 `119.29.29.29` 查询真实 A/AAAA 地址。
4. 客户端连接真实地址。
5. 流量通过默认网关 `192.168.50.1` 直连。

### 3.2 境外域名

1. 客户端向 `192.168.50.46` 查询域名。
2. MosDNS 判断域名不属于大陆规则集合。
3. A 查询固定返回 `192.168.50.45`。
4. AAAA 查询固定返回 `fdfc:562e:f275::45`。
5. 客户端向透明代理 VIP 发起连接。
6. nftables 将 TCP 转交给 `7893`,将适用的 UDP 转交给 `7894`。
7. Transparent 插件M 从 TLS SNI 或 HTTP Host 恢复真实域名。
8. 流量通过本机现有 插件M `127.0.0.1:7890` 出口代理。

UDP 443 会被主动拒绝,使浏览器快速从 QUIC/HTTP3 回退到 TCP/HTTP2。

## 4. 服务器端现有部署

当前部署目录:

```text
/home/gaoshan/lan-transparent-proxy
```

主要组件:

```text
MosDNS                    TCP/UDP 53
插件M Transparent        TCP 7893、UDP 7894
现有 插件M               Mixed 7890、API 9090
nftables                   VIP 流量重定向
systemd                    开机启动和规则更新
```

### 4.1 MosDNS 关键配置

配置文件:

```text
/home/gaoshan/lan-transparent-proxy/mosdns/config.yaml
```

关键逻辑:

```yaml
- tag: cn_forward
  type: forward
  args:
    concurrent: 2
    upstreams:
      - tag: alidns
        addr: udp://223.5.5.5
      - tag: dnspod
        addr: udp://119.29.29.29

- tag: main_sequence
  type: sequence
  args:
    - matches:
        - qname $cn_domains
      exec: $cn_forward
    - matches:
        - has_resp
      exec: accept
    - matches:
        - qtype 1 28
      exec: black_hole 192.168.50.45 fdfc:562e:f275::45
    - matches:
        - has_resp
      exec: accept
    - exec: reject 0
```

大陆域名规则文件:

```text
/home/gaoshan/lan-transparent-proxy/mosdns/rules/direct-list.txt
```

规则每天约 `04:20` 自动更新。

### 4.2 Transparent 插件M 关键配置

配置文件:

```text
/home/gaoshan/lan-transparent-proxy/插件M/config.yaml
```

关键配置:

```yaml
redir-port: 7893
tproxy-port: 7894
allow-lan: true
bind-address: "*"
ipv6: true

sniffer:
  enable: true
  parse-pure-ip: true
  override-destination: true
  sniff:
    HTTP:
      ports: [80, 8080-8880]
    TLS:
      ports: [443, 8443]
    QUIC:
      ports: [443, 8443]

proxies:
  - name: EXISTING-插件M
    type: socks5
    server: 127.0.0.1
    port: 7890
    udp: true

rules:
  - MATCH,PROXY
```

Transparent 插件M 本身不保存购物,而是把流量交给已部署的 插件M `7890`,因此 MetaCubeXD 中选择的IP地址和策略继续有效。

### 4.3 nftables 关键流程

规则文件:

```text
/etc/lan-transparent-proxy/nftables.conf
```

作用:

- 发往 `192.168.50.45` 的 TCP 连接重定向到 `7893`
- 发往 `fdfc:562e:f275::45` 的 TCP 连接重定向到 `7893`
- UDP 443 返回拒绝,使 QUIC 回退 TCP
- 其他适用 UDP 流量进入 `7894`
- IPv4/IPv6 使用独立策略路由表 `100`

查看实时计数器:

```bash
sudo nft list table inet lan_transparent
```

## 5. 爱快路由器设置

不同爱快版本的菜单名称可能略有区别,但字段含义相同。

### 5.1 爱快自身的 DNS 设置

进入爱快的“DNS 设置”,保留正常的国内上游:

```text
主 DNS:223.5.5.5
备用 DNS:119.29.29.29
```

不要把爱快自身 DNS 改为 `192.168.50.46`,否则本地域名转发可能形成:

```text
192.168.50.46 → 192.168.50.1 → 192.168.50.46
```

### 5.2 DHCPv4 设置

进入 LAN 对应的 DHCP Server 设置:

```text
默认网关:192.168.50.1
主 DNS:192.168.50.46
备用 DNS:留空或 0.0.0.0
```

备用 DNS 不要填写:

```text
192.168.50.1
223.5.5.5
119.29.29.29
8.8.8.8
1.1.1.1
```

否则部分客户端会随机使用备用 DNS,导致境外域名绕过分流。

### 5.3 DHCP 地址池

确认 DHCP 地址池不包含:

```text
192.168.50.45
192.168.50.46
```

可以把这两个地址加入保留地址,或者调整 DHCP 地址池范围。

### 5.4 IPv6 RA/DHCPv6 设置

在 IPv6 RA、RDNSS 或 DHCPv6 DNS 设置中填写:

```text
fdfc:562e:f275::46
```

备用 IPv6 DNS 留空。不要继续向客户端广播爱快自身或运营商的 IPv6 DNS,否则支持 IPv6 的客户端可能绕过 MosDNS。

## 6. 客户端生效

修改爱快后,让客户端断开并重新连接网络。

Windows 可以执行:

```powershell
ipconfig /release
ipconfig /renew
ipconfig /flushdns
```

检查获得的 DNS:

```powershell
Get-DnsClientServerAddress | Where-Object ServerAddresses
```

应看到:

```text
192.168.50.46
fdfc:562e:f275::46
```

浏览器需要关闭 DoH、Secure DNS 或“使用安全 DNS”功能。使用自带 DoH/DoT 的应用不会服从 DHCP DNS。

## 7. 验证方法

### 7.1 验证境外域名

```powershell
nslookup google.com 192.168.50.46
```

预期 A 记录:

```text
192.168.50.45
```

验证 IPv6:

```powershell
Resolve-DnsName google.com -Type AAAA -Server fdfc:562e:f275::46
```

预期 AAAA:

```text
fdfc:562e:f275::45
```

### 7.2 验证大陆域名

```powershell
nslookup baidu.com 192.168.50.46
```

应该返回百度真实公网 IP,不能返回 `192.168.50.45`。

### 7.3 验证代理出口

```powershell
curl.exe https://api.ipify.org
```

当前测试过的代理出口示例为:

```text
144.34.170.232
```

出口地址会随着 插件M 自动选择的IP地址变化。

### 7.4 验证服务器服务

在 `192.168.50.46` 执行:

```bash
systemctl is-active \
  lan-transparent-network.service \
  lan-transparent-proxy.service \
  lan-proxy-rules-update.timer

docker ps --filter name=mosdns-lan \
  --filter name=插件M-lan-transparent \
  --filter name=插件M
```

查看透明代理连接:

```bash
docker logs -f 插件M-lan-transparent
```

正常日志示例:

```text
[TCP] 192.168.50.60:xxxxx --> www.google.com:443
match Match using PROXY[EXISTING-插件M]
```

## 8. 插件M 更新

现有 插件M 有两层更新机制:

1. `proxy-provider` 内部间隔为 `1800` 秒。
2. cron 在每小时 `00` 和 `30` 分调用更新 API。

查看 cron:

```bash
crontab -l
```

当前任务:

```cron
*/30 * * * * /home/gaoshan/sub2api-stack/scripts/update-插件M-jms.sh >> /home/gaoshan/sub2api-stack/data/logs/插件M-jms-hourly.log 2>&1
```

手动立即更新:

```bash
/home/gaoshan/sub2api-stack/scripts/update-插件M-jms.sh
```

成功时返回:

```text
api_update_http=204
done
```

## 9. 常见问题

### 9.1 所有域名都无法打开

检查客户端 DNS 是否确实是 `192.168.50.46`:

```powershell
ipconfig /all
nslookup baidu.com
```

检查 MosDNS:

```bash
docker ps --filter name=mosdns-lan
docker logs --tail 100 mosdns-lan
sudo ss -lntup | grep ':53 '
```

### 9.2 大陆网站正常,境外网站失败

检查现有 插件M:

```bash
curl --noproxy '*' -o /dev/null -w '%{http_code}\n' \
  -x http://127.0.0.1:7890 \
  https://www.gstatic.com/generate_204
```

预期结果:

```text
204
```

再检查透明代理日志:

```bash
docker logs --tail 100 插件M-lan-transparent
```

### 9.3 IPv4 正常,IPv6 绕过代理

检查客户端是否还获得了爱快或运营商的其他 IPv6 DNS。IPv6 DNS 应只包含:

```text
fdfc:562e:f275::46
```

### 9.4 有时代理、有时直连

通常是以下原因:

- DHCP 配置了备用公共 DNS
- IPv6 RA 仍在广播其他 DNS
- 浏览器启用了 DoH/Secure DNS
- 应用内置了 DoH/DoT

### 9.5 出现 IP 冲突

确认 `192.168.50.45` 和 `192.168.50.46` 均未包含在 DHCP 动态地址池中。

## 10. 回滚

服务器已经提供完整回滚脚本:

```bash
/home/gaoshan/lan-transparent-proxy/rollback.sh
```

回滚脚本会:

- 停止并禁用透明代理服务
- 删除虚拟地址和 nftables 规则
- 删除相关防火墙放行项
- 恢复原 插件M Docker Compose 配置
- 保留部署文件,便于以后重新启用

回滚后还需要在爱快中把 DHCP DNS 恢复为原设置。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
发表于 2026-7-14 08:04 | 显示全部楼层
太难了啊,看不懂。
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-7-14 08:50 | 显示全部楼层
感谢分享,逻辑很通顺。但是操作对小白来说太难 哈哈
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

发表于 2026-7-14 09:10 | 显示全部楼层
这个方案挺好的,要是能限制ip范围更好,现在家庭局域网内有很多iot设备,最好是能排除在外
只谈技术、莫论政事!(点击见详情) | 互相尊重、友善交流、切勿过度反应、玻璃心。胡乱输入灌水等操作将会被封禁ID。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /2 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2026-8-23 20:08

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 电话:13506125623

快速回复 返回顶部 返回列表