现在上网标配的双路由,双软路由其实很多时候配置旁路由仅仅是为了实现科学上网。有了软路由就是要各种折腾有时候折腾下分流网也 boom 了,或者旁路由装在 nas allinone ,nas 一重启一折腾也跟着 boom 了,一人折腾全家断网。还有一个常见的麻烦一旦将设备的网关指向旁路由,很多人会因为缺少 SNAT (源地址转换)的设置,导致原本通过主路由端口映射访问的设备在外网法连接,这给日常使用带来了不便。究其原因,在于主路由通过端口映射将流量直接转发给了设备,而设备的网关却指向了旁路由。这样一来,回程的流量就被旁路由接管,但旁路由并不了解主路由的端口映射规则,最终导致连接中断,设备无法访问。关于 SNAT 的设置,网上有很多教程,这里就不再赘述。
本文将重点介绍另一种科学上网的思路:所有设备的网关都指向主路由,无需进行复杂的双网卡双 OP 配置。无论旁路由是不是 BOOM 了,都不会影响到所有设备的正常网络连接。本文推荐使用 OpenWrt 主路由搭配 AdGuard Home ( ADG )和 mihomo (进阶玩法可结合 SmartDNS 进行分流)。
考虑到 OpenWrt 系统的易用性和全面的功能,我们优先选择 OpenWrt 作为主路由。
旁路由配置:
如果已经有 OpenWrt 旁路由,可以直接运行 mihomo 、NekoRay 等软件。或者在虚拟 Debian 、LXC 、Docker 等容器环境下安装 mihomo (在 Docker 和 LXC 这类容器环境中,请务必开启 TUN 设置)。
接下来,配置 mihomo 的 config.yaml
文件:
YAML
dns: enable: true cache-algorithm: arc prefer-h3: true listen: :53 ipv6: true use-hosts: true respect-rules: true enhanced-mode: fake-ip fake-ip-range: 198.18.0.1/16 fake-ip-filter: - '+.lan' - '+.local' - "rule-set:googlefcm" - "rule-set:wechat" - "rule-set:chinamedia" - "rule-set:douyin" - "rule-set:speedtest" - "geosite:cn" default-nameserver: - 192.168.0.3 nameserver-policy: 'rule-set:google,youtube': [https://1.1.1.1/dns-query#美国, https://8.8.8.8/dns-query#美国] nameserver: - 192.168.0.3 proxy-server-nameserver: - 192.168.0.3 direct-nameserver: - 192.168.0.3 fallback-filter: geoip: true geoip-code: CN geosite: - gfw ipcidr: - 240.0.0.0/4 domain: - '+.google.com' - '+.facebook.com' - '+.youtube.com'
(由于我搭建了 SmartDNS 服务器,所以 mihomo 的 DNS 上游设置指向了它。这个 SmartDNS 主要用于防止 DNS 泄露并下发准确的 IP 地址。)
强烈建议在 fake-ip-filter
中包含以上规则集,以便 mihomo 能够直接下发所有国内直连域名的双栈 IP 地址。这样,内网设备可以直接通过主路由访问这些域名,无需再绕行旁路由。这里需要注意的是,由于开启了 IPv6 ,内网设备在访问境外域名时,一旦获取到 IPv6 地址,很可能会直接通过主路由网关访问而导致连接失败。因此,mihomo 对非中国大陆地区的域名一律下发 Fake IP ,配合主路由的后续设置,即可实现国内外流量各取所需。
回到 OpenWrt 的设置:
在 OpenWrt 后台,进入 网络 -> DHCP/DNS -> 设备和端口,将 DNS 服务器端口 更改为 0。这一步是为了在后续安装 AdGuard Home 时,允许 ADG 直接监听 OpenWrt 的 53 端口。
接下来,在 OpenWrt 的官方软件源中安装 AdGuard Home 。安装完成后,进入 AdGuard Home 的管理界面,点击 设置 -> DNS 设置。
192.168.0.2
(这里取决于你的旁路设备的 IP 地址,也可以是 mihomo Docker 容器的 IP 地址。我个人使用的是 LXC 容器直接运行 mihomo 二进制文件)。https://doh.pub/dns-query
(推荐使用 DoH ,至少也要使用 DoT ,这样既能在旁路由失效时提供备用 DNS ,又能防止 DNS 泄露)。0
。重要提示:OpenWrt 切记不要下发 IPv6 DNS !
进入 网络 -> 接口 -> lan,修改 DHCP 服务器 选项下的 IPv6 设置。将 已公布的 IPv6 DNS 服务器 留空,并取消勾选 本地 IPv6 DNS 服务器。
完成以上两个地方的修改后,可以确保内网设备不会受到运营商下发的 IPv6 DNS 的影响,从而保证科学上网的正常进行。
设置完 DNS 后,建议重启一下 OpenWrt ,然后测试一下 DNS 是否正常工作。在终端中执行以下命令:
Bash
nslookup baidu.com nslookup google.com
检查 baidu.com
是否解析到真实的 IP 地址,google.com
是否解析为 Fake IP 地址(198.18.x.x
网段)。如果到这里没有出错,就可以进行下一步了。
在 OpenWrt 下添加静态路由:
进入 网络 -> 路由 -> 静态 IPv4 路由,添加一条新的静态路由。
lan
198.18.0.0/16
(这是 mihomo 下发的 Fake IP 网段)。192.168.0.2
(这是流量需要经过的旁路由网关)。完成以上设置后,你可以尝试让设备通过 DHCP 自动获取 IP 地址,或者手动指定设备的网关和 DNS 服务器为 192.168.0.1
。然后测试访问国内和国外的域名,看是否能够成功访问。
====================================================================================
彩蛋时间:Telegram 用户特别优化
由于 Telegram 的特殊性,其连接主要依赖 IP 地址。如果你是 Telegram 用户,可能需要在路由表中添加以下 IP 地址段,方法与之前添加 198.18.0.0/16
的静态路由类似。你可以简单地点击复制下面的 IP 段,然后在 OpenWrt 的静态路由设置中修改目标网络 IP 地址即可:
91.108.56.0/22 91.108.4.0/22 91.108.8.0/22 91.108.16.0/22 91.108.12.0/22 149.154.160.0/20 91.105.192.0/23 91.108.20.0/22 185.76.151.0/24
同样地,Telegram 也会对 IPv6 地址段发起请求。考虑到 IPv6 配置的复杂性,我们在这里不进行 IPv6 的路由设置,而是通过在防火墙中拒绝 Telegram 请求的特定 IPv6 地址段,从而避免潜在的影响。
你可以通过编辑 OpenWrt 的防火墙配置文件 /etc/config/firewall
,在文件末尾添加以下配置,或者通过 LuCI 界面手动设置防火墙规则(请务必注意目标接口是否为 wan
):
config rule option name 'tg_v6_reject' option src '*' option dest 'wan' list dest_ip '2001:b28:f23d::/48' list dest_ip '2001:b28:f23f::/48' list dest_ip '2001:67c:4e8::/48' list dest_ip '2001:b28:f23c::/48' list dest_ip '2a0a:f280::/32' option target 'REJECT'
1 zha0w 196 天前 太专业了,之前从油管上学习一个双 adg 的方案,跑了几个测 dns 泄漏的网站,实测都没有泄漏,但会出现一些奇葩的问题,比如说我 ios 可以连上 wifi 且可以联网( wifi 助理功能已关),但三星手机连上 wifi 也说没有连通网络。 |
![]() | 2 user100saysth 196 天前 太专业了,感觉门槛有点高 |
![]() | 3 yeh 196 天前 adguard + mosdns + surge 1 年多了 是不是 openwrt 当主路由无所谓,硬路由可以配置网关和静态路由转发 fakeip 的就可以。 旁路由花式就多了,nas 可以,arm 的啥的都可以,反正起 docker 而已。 |
4 nguoidiqua 196 天前 可以了解下 iStoreOS 的浮动网关: &t=315s 简单来说就是它可以在主路由指定某些设备用旁路由作为网关,并检测旁路由状态。 如果旁路由挂了,它会自动把这些设备的网关指向自己,旁路由恢复之后它又会把这些设备的网关指向旁路由。 |
![]() | 5 life90 196 天前 应该介绍下 openwrt 使用的是 x86 还是 arm 。这两者的便利性天差地别。 |
6 yyysuo 196 天前 mihomo 的 dns 不如 sing-box 自由,要更自由,上 mosdns 就行了,旁路用 linux 不好吗,用 openwrt 太复杂了。 |
7 letmefly 196 天前 还挺复杂的,有空的时候研究一下。现在对科学没什么兴趣,只要能用就够了,不想搞那么麻烦。 |
8 linyuhang24 196 天前 ![]() 双软路由方案不是很成熟吗?说的就是楼主这个主路由+根据路由规则转发旁路由的思路,都用好几年了,现在怎么成了新思路? |
![]() | 9 Lentin &nsp;196 天前 看了一下 这个就是交换机的 VRRP 功能额……玩法越来越花了 |
![]() | 10 playboy0 196 天前 ipv6 能正常使用吗?谢谢 |
12 madsword OP @nguoidiqua 在主路由分流主要是为了能让 wg 回家的设备能获取到 fakeip 直接在外面分流只让科学流量回家。 |
14 huaxie1988 195 天前 via Android 旁路由不要开 nat 地址转换就没你说的问题了 |
![]() | 15 Ipsum 195 天前 已经用了快 4 年了。之前给他们说不要指向旁路由,用 fakeip 来分流,那些人都不听的。另外记得把 fakeip 持久化,不然 clash 崩了就是灾难。 |
![]() | 20 383394544 195 天前 via iPhone 这是正确的思路,不是新思路。你会认为新无非是以前的人不重视,没流行开而已。 |
22 v0rtix 194 天前 这个就是 paopaodns+paopaogateway 那一套的思路 |
23 madsword OP @chenbin36255 不一样的 paopao 本质上它就是一个旁路由 再分流 |
![]() | 24 AxaIA 193 天前 请问在你的环境下,hsr.hoyoverse.com 这个域名解析到 fakeip 上了吗 |
25 madsword OP @AxaIA 没有 fakeip root@debian:~# nslookup baidu.com Server: 192.168.10.1 Address: 192.168.10.1#53 Non-authoritative answer: Name: baidu.com Address: 39.156.66.10 Name: baidu.com Address: 110.242.68.66 root@debian:~# nslookup hsr.hoyoverse.com Server: 192.168.10.1 Address: 192.168.10.1#53 Non-authoritative answer: hsr.hoyoverse.com canonical name = d3mo07nxll2mjb.cloudfront.net. Name: d3mo07nxll2mjb.cloudfront.net Address: 3.165.39.50 Name: d3mo07nxll2mjb.cloudfront.net Address: 3.165.39.65 Name: d3mo07nxll2mjb.cloudfront.net Address: 3.165.39.117 Name: d3mo07nxll2mjb.cloudfront.net Address: 3.165.39.100 root@debian:~# nslookup google.com Server: 192.168.10.1 Address: 192.168.10.1#53 Non-authoritative answer: Name: google.com Address: 198.18.1.187 |
26 rulagiti 193 天前 乱七八糟的,看的头痛。 |
![]() | 27 htfcuddles 193 天前 fakeip 有点多此一举,兼容性差,而且上游梯子 boom 了,国外访问照样 boom 。直接用 mwan3 规则转发就行了,注意避免环路就行。 |
28 madsword OP @htfcuddles mwan3 怎么做到梯子炸了国外照样访问的 |
![]() | 29 htfcuddles 192 天前 @madsword #28 可以做 4or7 层健康检查,failover 到 ISP 出口。 |
![]() | 30 titanium98118 192 天前 ![]() |
31 jianv3 192 天前 说白了就是一个 clash 客户端的配置问题 , 一个 openclash 就能搞定的事, 哥们你复杂了 |
32 madsword OP @titanium98118 研究过这个 就是 ipv6 有点头疼 |
![]() | 33 titanium98118 192 天前 @madsword #32 这个应该无解,作者魔改的 v2ray, 除非作者某天加上 ipv6 支持。我自己修改了一下配置:普通域名返回 a 和 aaaa ,gfwlist 的域名只返回 a 。用着也挺好。 |
34 warcraft1236 192 天前 说实话我一直觉得在自己的设备上开翻墙软件是最简单且容易控制的方式 |
![]() | 35 Miary 192 天前 粗看了下和 PaoPaoDNS+PaoPaoGateWay 的方案有点像,都是基于 fakeip ,这个方案我用了大半年最后还是放弃了,浏览器访问经常会遇到 Google 无法打开的情况。 |
![]() | 36 starryloki 192 天前 |
37 a56143575 192 天前 玩法越来越花了 |
38 a56143575 192 天前 mihomo 听说很耗内存 |
![]() | 39 SakuraYuki 191 天前 现在换成 mac mini+surge 了,配置起来方便几个数量级 |
![]() | 40 povsister 191 天前 via iPhone |
![]() | 42 qunqun 114 天前 @htfcuddles 学习下,mwan3 不用 fake-ip ,用什么规则分流 |
![]() | 43 htfcuddles 113 天前 @qunqun 我是 9929/4837/移动三网出口,自建美国/香港/日本/欧洲线路。直连情况下 mwan3 按 ISP/ASN 进行分流,写脚本定期更新 IPSET 。Clash 按目标 IP/ASN/国别/域名进一步分流,在 Clash 中指定 fwmark 设置代理走固定出口。国外网址禁止 ipv6 ,国内 v4v6 开启优选。 |
44 madsword OP @htfcuddles 想要墙外也用上 v6 只能 fakeip 分流一条路 |