V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
oovveeaarr
V2EX  ›  宽带症候群

怎么将多个运营商的 IPv6 利用起来呢?

  •  
  •   oovveeaarr · 2021-10-02 16:45:55 +08:00 · 4605 次点击
    这是一个创建于 1146 天前的主题,其中的信息可能已经有所发展或是发生改变。
    家里接入了联通和电信的宽带,且都分配了 IPv6,目前使用 openwrt 的 mwan3 插件对 IPv4 进行分流。
    得益于 NAT 的存在,分流 IPv4 只需要做路由表就可以达到效果。
    但是对于 IPv6 来说,因为本身就是公网 IP,如果随意做路由的话,是不会通的。

    目前想到有两种方法
    1.对 IPv6 也做一层 NAT
    但是这样一来 IPv6 的优势也就完全失去了(且路由器还不一定支持)。就算魔改后支持了 1:1 NAT,规则复杂不说,对路由器的性能要求也直线上升

    2.在客户端内自行做规则
    如果在客户端内做规则的话,等于每一台机器都需要去修改,同时部分设备(手机)还不能修改。尤其是要修改默认路由的情况下,非常麻烦。

    大家有什么好的办法吗?
    22 条回复    2021-10-06 15:26:07 +08:00
    ghjexxka
        1
    ghjexxka  
       2021-10-02 16:54:49 +08:00
    “但是对于 IPv6 来说,因为本身就是公网 IP,如果随意做路由的话,是不会通的”

    比较好奇不通是指啥
    pupboss
        2
    pupboss  
       2021-10-02 17:06:43 +08:00
    建议先排查出国节点是否支持 IPv6
    oovveeaarr
        3
    oovveeaarr  
    OP
       2021-10-02 17:14:38 +08:00
    @ghjexxka #1 路由不通呀,使用的 IP 是由客户端选择的,如果把 A 运营商的 IP,路由到 B 运营商,这样是不行的。
    titanium98118
        4
    titanium98118  
       2021-10-02 17:34:21 +08:00
    我的状况跟你一样,电信+移动,只做了 ipv4 分流,目前局域网没有下发 ipv6 。
    ihipop
        5
    ihipop  
       2021-10-02 17:44:30 +08:00 via Android
    要流量均衡最简单的就是 nat6 了
    要按运营商分流就做运营商的 v6 地址表
    以上都要原路返回策略路由配合
    其他好像没有特别简单的办法
    cwbsw
        6
    cwbsw  
       2021-10-02 18:37:32 +08:00
    @oovveeaarr
    不会不通的。
    OpenWrt 默认添加的默认路由是诸如
    `default from 240e:ace:8e00:11ea::/64 via fe80::dd1c:abd1:34a:6501 dev pppoe-wan1`
    `default from 2409:832:3295:10ac::/64 via fe80::acae:bd1f:092:32ad dev pppoe-wan2`
    这种样式的,客户端用电信的地址发起连接就会走电信的网关,用移动的就走移动的网关。
    RouterOS v7 最近也支持 IPv6 的策略路由了,通过添加规则应该也能实现上面的效果。
    billccn
        7
    billccn  
       2021-10-02 18:52:33 +08:00
    @cwbsw 你好像没理解楼主的困难在哪。现在 IPv6 地址是客户端选择的,楼主要实现分流效果需要把两个运行商的路由表配置到每个终端里,无法再像 IPv4 一样在路由器配置一次全局使用。

    我觉得解决楼主问题最省事的做法实在局域网里配置一个代理,在代理的机器上设置 IPv6 路由表,其他设备(包括手机)针对这个 WiFi 配置代理,这样绝大多数 App 就可以实现分流,少数不支持代理的从默认路由出去也不会很影响使用。
    cwbsw
        8
    cwbsw  
       2021-10-02 19:06:10 +08:00
    @billccn
    我是在告诉楼主
    “路由不通呀,使用的 IP 是由客户端选择的,如果把 A 运营商的 IP,路由到 B 运营商,这样是不行的。”
    上面这种情况是不会发生的。

    至于你的问题。v6 环境下实现按运营商分流不需要额外配置,客户端解析到的电信的目的地址,据 RFC3484,会自动选择电信的源地址发起连接。
    geekvcn
        9
    geekvcn  
       2021-10-02 19:42:14 +08:00
    IPv6 不需要分流,电信的 IP 会优先走电信,移动的 IP 会优先走移动,联通的 IP 会优先走联通。楼上已经说了,不想折腾客户端你直接路由器搞个 NAT6 就行了
    pcslide
        10
    pcslide  
       2021-10-02 23:29:20 +08:00
    @geekvcn @cwbsw
    根据前缀选择源地址,并不表示下一步的网关选择就是正确的吧?比如我在内网上有两个出口节点,即使优选了源地址,从哪个出口出,不还要看路由表?
    oovveeaarr
        11
    oovveeaarr  
    OP
       2021-10-02 23:38:28 +08:00
    @billccn #7 好主意,用 tcp redirec 透明代理特定端口的这个方法我的确忽略了。不过使用这种方法的话,似乎对局域网内所有的机器都是统一规则了,如果要实现类似 mwan 规则的话感觉上可能要比较复杂了。
    还有一个问题就是因为 DHCP-PD 是动态的,还要办法监控一下 DHCP,不然 IP 变更后路由表就会出问题。
    同时如果局域网内,想设置一个默认出口的 IPv6 似乎也没办法实现(不满足代理规则的情况下,就会控制不到。由于有多个 DHCP-PD 的话,局域网内其他客户端也同时会有多个 IP )
    晚点我看看能不能简单实现下

    @cwbsw #8 你可能没有认真看我的帖子,我的诉求就是如 @billccn 所说。现在的问题就是 IP 地址最长匹配选出来的 IPv6,并不是路线优解。
    这个问题只能通过手动调整路由表实现,由于我在主楼和 3#所说的“使用的 IP 是由客户端选择的”,但是不能路由 A 运营商的 IP 到 B 运营商的路由,所以单纯修改路由表的方式是不行的,不知道这么说你理解没。

    @geekvcn #9 这个也只是网内的情况,考虑更多的是网外的情况,协议默认选择出来的 IP 并不是实际上的最优解。

    这次主要是想和大家探讨,怎么去控制 IPv6 的路由走向的方法,而不是“默认已经就有了,不用控制”这个问题。

    NAT6 我也说了并不是比较好的解决方法,有一下几个原因
    1.很多路由器并不兼容,就算兼容的对于相关工具链也不是很完善(基本上都靠手写规则了)
    2.NAT6 的支持大部分止步于对 1 个 IPv6 进行 NAT,而支持 1:1 NAT 的我现在还没找到(本文其实更希望达到的 n:1 效果了)
    3.需要为每个 IP 配置 2*n 条以上规则( n 为出口数目)。出口同时 IP 发生变更时,需要重新生成规则非常麻烦。
    oovveeaarr
        12
    oovveeaarr  
    OP
       2021-10-02 23:40:55 +08:00
    @pcslide #10 是的,其实不用太纠结“默认的规则可以用”这件事,我想和大家探讨的问题其实是“默认的规则并不合适,要怎么去改变”
    raysonx
        13
    raysonx  
       2021-10-03 00:41:53 +08:00
    @oovveeaarr IPv6 下的 1:1 NAT 也叫做 NPT,软路由的话 Linux nftables 或者 Vyos 1.4 支持这个功能。
    raysonx
        14
    raysonx  
       2021-10-03 00:43:19 +08:00
    pfSense 也支持
    billccn
        15
    billccn  
       2021-10-03 04:13:48 +08:00
    @oovveeaarr 你把我的点子想高级了。

    我其实想的是一个简单的 HTTP 或者 Socks 代理,这样可以实现内网(甚至可以是 IPv4 地址)连接这个代理服务器,由代理机子的路由表再发出连接,这样不仅可以分流,还可以内网不配置 IPv6 地址,增强老系统的兼容性。

    你说的 TCP 代理我猜是指运行在路由器上那种?我想应该会很占 CPU,和 IPv6 NAT 半斤八两。
    Rocketer
        16
    Rocketer  
       2021-10-03 04:51:30 +08:00 via iPhone
    从原理上讲,你的路由器与上级路由器在同一个子网内就可以转发给它,路由器是不关心上上级是哪个子网的。

    所以你的上行是可以发给任意路由器的,你的子网也只需用一家的 IP 段,没必要混用。但下行不是你决定的,所以你用哪家的 IP 段就会从哪家的线路来。

    想要上下行都智能的话就得让客户端有两个 IP,并把路由表配置到客户端。
    oovveeaarr
        17
    oovveeaarr  
    OP
       2021-10-03 16:13:13 +08:00
    @billccn #15 其实也不高级,就是个透明代理而已哈哈。不过是底层级别的路由,不是 Clash 那种软件上的路由了,我还在想这个方案怎么实现比较好。


    @Rocketer #16 现在的运营商都有成熟的源地址检测的,把一个运营商的 IP 路由到另一个运营商的网关,是通不了的。

    现在看来如果客户端有两个 IP,想在路由侧影响源地址选取确实没什么办法。
    oovveeaarr
        18
    oovveeaarr  
    OP
       2021-10-03 16:22:56 +08:00
    @raysonx #13 噢噢,确实我之前也看到 NPT 这个描述,还没来得及去看,晚点去看一下。
    那这个 NPT 的功能,是只能针对一个网段的 1:1 映射吗?还是说能支持 n:1 的(把多个网段,映射到一个内网网段中),如果支持的话感觉就不用倒腾了。
    不过还是得找一下 openwrt 有没有这种功能兼容,不然的话可能还是要写脚本自己手撸规则。
    或者是写规则重定向给旁路路由,旁路路由再处理这些东西,不知道可不可行。

    看了一下大佬的历史帖子,感觉对网络这块很有研究呀。大佬有联系方式吗,想交流(请教)一下))
    oovveeaarr
        19
    oovveeaarr  
    OP
       2021-10-03 16:36:18 +08:00
    @titanium98118 #4 那路由端拨号后还能获取到 IPv6 吗?
    我这边用的 openwrt 把 IPv6 从自动改手工 /关闭,路由也会直接获取不到 IPv6,昨天查了下看起来像是 pppoe 拨号的时候参数有差别。
    但是选择自动的话,就会获取 DHCP-PD,然后下发 IPv6 给客户端,有点头大。

    @ihipop #5 是的,我想了半天感觉可能比较好的解法也只有 nat6 了。但是感觉还挺复杂的,头大。
    ihipop
        20
    ihipop  
       2021-10-03 18:16:43 +08:00 via Android
    @oovveeaarr 还有一个办法,radvd 可以给客户端直接推送路由的,而且支持单播模式推送,剩下的你可以发挥想象了,
    raysonx
        21
    raysonx  
       2021-10-03 21:23:26 +08:00 via iPad
    我个人是建议是直接推两个前缀下去,让客户端选择线路。路由器上配置策略路由( PBR )选择正确的网关。
    conupefox
        22
    conupefox  
       2021-10-06 15:26:07 +08:00
    用 ip6tables 的 NETMAP 功能。lan 下发私网的 ipv6,再 1:1 映射。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4118 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:10 · PVG 12:10 · LAX 20:10 · JFK 23:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.