解决旁路由痛点:一种更优雅的科学上网方案 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
madsword
V2EX    宽带症候群

解决旁路由痛点:一种更优雅的科学上网方案

  •  
  •   madsword 197 天前 9474 次点击
    这是一个创建于 197 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前几天发在了友站想想还是转载过来这里,总不能天天白看 v2 的帖子。。 顺便加点高级玩法在后面。

    现在上网标配的双路由,双软路由其实很多时候配置旁路由仅仅是为了实现科学上网。有了软路由就是要各种折腾有时候折腾下分流网也 boom 了,或者旁路由装在 nas allinone ,nas 一重启一折腾也跟着 boom 了,一人折腾全家断网。还有一个常见的麻烦一旦将设备的网关指向旁路由,很多人会因为缺少 SNAT (源地址转换)的设置,导致原本通过主路由端口映射访问的设备在外网法连接,这给日常使用带来了不便。究其原因,在于主路由通过端口映射将流量直接转发给了设备,而设备的网关却指向了旁路由。这样一来,回程的流量就被旁路由接管,但旁路由并不了解主路由的端口映射规则,最终导致连接中断,设备无法访问。关于 SNAT 的设置,网上有很多教程,这里就不再赘述。

    本文将重点介绍另一种科学上网的思路:所有设备的网关都指向主路由,无需进行复杂的双网卡双 OP 配置。无论旁路由是不是 BOOM 了,都不会影响到所有设备的正常网络连接。本文推荐使用 OpenWrt 主路由搭配 AdGuard Home ( ADG )和 mihomo (进阶玩法可结合 SmartDNS 进行分流)。 route

    考虑到 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 端口。 op-dnsmasq|661x500

    接下来,在 OpenWrt 的官方软件源中安装 AdGuard Home 。安装完成后,进入 AdGuard Home 的管理界面,点击 设置 -> DNS 设置

    • 上游 DNS 服务器 填写 192.168.0.2(这里取决于你的旁路设备的 IP 地址,也可以是 mihomo Docker 容器的 IP 地址。我个人使用的是 LXC 容器直接运行 mihomo 二进制文件)。
    • 后备 DNS 服务器 填写 https://doh.pub/dns-query (推荐使用 DoH ,至少也要使用 DoT ,这样既能在旁路由失效时提供备用 DNS ,又能防止 DNS 泄露)。
    • DNS 服务配置 中的 速度限制 设置为 0
    • DNS 缓存配置 中的所有条目删除并留空。

    重要提示:OpenWrt 切记不要下发 IPv6 DNS !

    进入 网络 -> 接口 -> lan,修改 DHCP 服务器 选项下的 IPv6 设置。将 已公布的 IPv6 DNS 服务器 留空,并取消勾选 本地 IPv6 DNS 服务器op-dhcpv6|457x500

    完成以上两个地方的修改后,可以确保内网设备不会受到运营商下发的 IPv6 DNS 的影响,从而保证科学上网的正常进行。

    设置完 DNS 后,建议重启一下 OpenWrt ,然后测试一下 DNS 是否正常工作。在终端中执行以下命令:

    Bash

    nslookup baidu.com nslookup google.com 

    nslookup|367x316

    检查 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' 

    添加以上配置后,记得保存并应用防火墙设置。这样,你的 Telegram 应用应该也能正常使用了。

    终极用法+1: 在外面的话设备不再需要找各种科学工具,只要下一个 wg ,allowed ips 写上 wg 网段,内网网段,fakeip 网段,tg 网段,然后 wg 的 dns 设置为内网主路由 ip 即可。 就能做到国内直连流量从手机直接访问,科学流量回家分流。 家里上行带宽够的话可以试试的!

    45 条回复    2025-08-08 21:18:05 +08:00
    zha0w
        1
    zha0w  
       196 天前
    太专业了,之前从油管上学习一个双 adg 的方案,跑了几个测 dns 泄漏的网站,实测都没有泄漏,但会出现一些奇葩的问题,比如说我 ios 可以连上 wifi 且可以联网( wifi 助理功能已关),但三星手机连上 wifi 也说没有连通网络。
    user100saysth
        2
    user100saysth  
       196 天前
    太专业了,感觉门槛有点高
    yeh
        3
    yeh  
       196 天前
    adguard + mosdns + surge 1 年多了

    是不是 openwrt 当主路由无所谓,硬路由可以配置网关和静态路由转发 fakeip 的就可以。

    旁路由花式就多了,nas 可以,arm 的啥的都可以,反正起 docker 而已。
    nguoidiqua
        4
    nguoidiqua  
       196 天前
    可以了解下 iStoreOS 的浮动网关:


    &t=315s

    简单来说就是它可以在主路由指定某些设备用旁路由作为网关,并检测旁路由状态。

    如果旁路由挂了,它会自动把这些设备的网关指向自己,旁路由恢复之后它又会把这些设备的网关指向旁路由。
    life90
        5
    life90  
       196 天前
    应该介绍下 openwrt 使用的是 x86 还是 arm 。这两者的便利性天差地别。
    yyysuo
        6
    yyysuo  
       196 天前
    mihomo 的 dns 不如 sing-box 自由,要更自由,上 mosdns 就行了,旁路用 linux 不好吗,用 openwrt 太复杂了。
    letmefly
        7
    letmefly  
       196 天前
    还挺复杂的,有空的时候研究一下。现在对科学没什么兴趣,只要能用就够了,不想搞那么麻烦。
    linyuhang24
        8
    linyuhang24  
       196 天前   2
    双软路由方案不是很成熟吗?说的就是楼主这个主路由+根据路由规则转发旁路由的思路,都用好几年了,现在怎么成了新思路?
    Lentin
        9
    Lentin  
      &nsp;196 天前
    看了一下 这个就是交换机的 VRRP 功能额……玩法越来越花了
    playboy0
        10
    playboy0  
       196 天前
    ipv6 能正常使用吗?谢谢
    madsword
        11
    madsword  
    OP
       196 天前 via Android
    @yeh 一般硬路由没法做到不下发 v6dns ,还是会影响的
    madsword
        12
    madsword  
    OP
       196 天前 via Android
    @nguoidiqua 在主路由分流主要是为了能让 wg 回家的设备能获取到 fakeip 直接在外面分流只让科学流量回家。
    madsword
        13
    madsword  
    OP
       196 天前 via Android
    @playboy0 正常
    huaxie1988
        14
    huaxie1988  
       195 天前 via Android
    旁路由不要开 nat 地址转换就没你说的问题了
    Ipsum
        15
    Ipsum  
       195 天前
    已经用了快 4 年了。之前给他们说不要指向旁路由,用 fakeip 来分流,那些人都不听的。另外记得把 fakeip 持久化,不然 clash 崩了就是灾难。
    zbatman
        16
    zbatman  
       195 天前
    /t/981677

    23 年发的
    madsword
        17
    madsword  
    OP
       195 天前
    @Ipsum 我 adg 这里不缓存 fakeip ,adg 有个备用 doh 崩了就由他顶上。 随时重启小猫都不怕 fakeip 错乱
    madsword
        18
    madsword  
    OP
       195 天前
    Ipsum
        19
    Ipsum  
       195 天前
    @madsword #17 不是 adg 缓存,是 clash 开持久化。
    383394544
        20
    383394544  
       195 天前 via iPhone
    这是正确的思路,不是新思路。你会认为新无非是以前的人不重视,没流行开而已。
    madsword
        21
    madsword  
    OP
       194 天前
    @383394544 没人认为是新思路吧
    v0rtix
        22
    v0rtix  
       194 天前
    这个就是 paopaodns+paopaogateway 那一套的思路
    madsword
        23
    madsword  
    OP
       194 天前
    @chenbin36255 不一样的 paopao 本质上它就是一个旁路由 再分流
    AxaIA
        24
    AxaIA  
       193 天前
    请问在你的环境下,hsr.hoyoverse.com 这个域名解析到 fakeip 上了吗
    madsword
        25
    madsword  
    OP
       193 天前
    @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
    rulagiti
        26
    rulagiti  
       193 天前
    乱七八糟的,看的头痛。
    htfcuddles
        27
    htfcuddles  
       193 天前
    fakeip 有点多此一举,兼容性差,而且上游梯子 boom 了,国外访问照样 boom 。直接用 mwan3 规则转发就行了,注意避免环路就行。
    madsword
        28
    madsword  
    OP
       193 天前
    @htfcuddles mwan3 怎么做到梯子炸了国外照样访问的
    htfcuddles
        29
    htfcuddles  
       192 天前
    @madsword #28 可以做 4or7 层健康检查,failover 到 ISP 出口。
    titanium98118
        30
    titanium98118  
       192 天前   1
    我用 OSPF
    https://github.com/povsister/v2ray-core
    旁路由挂了,流量自动回到主路由的 ISP 出口出去
    jianv3
        31
    jianv3  
       192 天前
    说白了就是一个 clash 客户端的配置问题 , 一个 openclash 就能搞定的事, 哥们你复杂了
    madsword
        32
    madsword  
    OP
       192 天前
    @titanium98118 研究过这个 就是 ipv6 有点头疼
    titanium98118
        33
    titanium98118  
       192 天前
    @madsword #32 这个应该无解,作者魔改的 v2ray, 除非作者某天加上 ipv6 支持。我自己修改了一下配置:普通域名返回 a 和 aaaa ,gfwlist 的域名只返回 a 。用着也挺好。
    warcraft1236
        34
    warcraft1236  
       192 天前
    说实话我一直觉得在自己的设备上开翻墙软件是最简单且容易控制的方式
    Miary
        35
    Miary  
       192 天前
    粗看了下和 PaoPaoDNS+PaoPaoGateWay 的方案有点像,都是基于 fakeip ,这个方案我用了大半年最后还是放弃了,浏览器访问经常会遇到 Google 无法打开的情况。
    starryloki
        36
    starryloki  
       192 天前
    @madsword #32
    @titanium98118 #33
    IPv6 可以用 OSPFv3 吧
    a56143575
        37
    a56143575  
       192 天前
    玩法越来越花了
    a56143575
        38
    a56143575  
       192 天前
    mihomo 听说很耗内存
    SakuraYuki
        39
    SakuraYuki  
       191 天前
    现在换成 mac mini+surge 了,配置起来方便几个数量级
    povsister
        40
    povsister  
       191 天前 via iPhone
    @starryloki
    话是这么说,但是哥们… ospfv3 的库哪有 go 版本的啊?
    ospfv2 我手搓了一个部分实现的版本,看 rfc 写协议还是有点头秃的…
    gojo
        41
    gojo  
       143 天前
    @yeh 大佬有教程么
    qunqun
        42
    qunqun  
       114 天前
    @htfcuddles 学习下,mwan3 不用 fake-ip ,用什么规则分流
    htfcuddles
        43
    htfcuddles  
       113 天前
    @qunqun 我是 9929/4837/移动三网出口,自建美国/香港/日本/欧洲线路。直连情况下 mwan3 按 ISP/ASN 进行分流,写脚本定期更新 IPSET 。Clash 按目标 IP/ASN/国别/域名进一步分流,在 Clash 中指定 fwmark 设置代理走固定出口。国外网址禁止 ipv6 ,国内 v4v6 开启优选。
    madsword
        44
    madsword  
    OP
       108 天前
    @htfcuddles 想要墙外也用上 v6 只能 fakeip 分流一条路
    s0n1c
        45
    s0n1c  
       63 天前
    @yeh 老哥能分享一下方案吗
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3605 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 00:47 PVG 08:47 LAX 17:47 JFK 20:47
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86