|
|
爱快 + 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 恢复为原设置。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|