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

多线分流策略思路讨论及其详解(其一)

  •  
  •   nbsn · 2021-06-16 22:31:09 +08:00 · 3917 次点击
    这是一个创建于 1016 天前的主题,其中的信息可能已经有所发展或是发生改变。
    宽带症候群节点、路由器节点经常有见大家讨论多线分流的策略,现结合自己的实践经验,谈一下我的实现思路。
    思路:应该是实现“目的”的方式,这里定义为企业级方案,和家用级方案。
    目的:应该是从需要达到的“目的”去讲实现不同“思路”。目的不同,实现的思路也不一样。按照分流方向,可以分为出访和来访方向。

    1. 这里,我尽可能按照大家讨论最多的模式,讨论下:家用方案里面的“出访”方向,需要进行:流量分流和 DNS 分流。

    2. 前提:网络环境下,有两条,或者两条以上的宽带,不同运营商的。(相同运营商谈不上分流,仅仅是带宽叠加而已)

    3. 技能要求:Linux 技能,中级网络知识,虚拟化操作技能。

    4. 需求:分流的场景,按照访问目的地 ip 地址归属运营商,选择本地网络的出口。我采用的是动态导入运营商 IP 地址路由表的方式实现的。
    5. 为什么不采用写静态路由的方式?——可扩展性,故障倒换

    6. 硬件:多口软路由( x86+虚拟化平台)
    7. 软件:OpenWRT (图形) + Bird 插件(命令行),也可以用 R2s,R4s 等硬件平台。

    8. 在软路由运行多个 OpenWRT ( Bird bgp )虚拟机,每个虚拟机的上行链路分别连接不同的运营商。我们这里假定有两条宽带 CT,CU,则我只需要两个 OpenWRT ( Bird bgp )虚拟机就可以了。

    9. 流量分流预期:
    ( 1 ). CT 宽带做主力,CU 宽带分流。
    ( 2 ). 国内访问:访问 CT ASN 内的 IP 地址,走 CT 宽带;访问 CU ASN 内的 IP 地址,走 CU 宽带,剩下的 IP 段(也可将这部分 IP 段再进行细分),默认走 CT 宽带。
    ( 3 ). 国外访问:OpenWRT 的特殊插件分流国外流量(如果可以,也可分流 nf,hbo 等)

    10. 另外一个重要的分流就是 DNS 分流,推荐一个 DNS 分流工具:mosdns 。本站讨论贴: /t/734637
    mosdns 开发者网站: https://github.com/IrineSistiana/mosdns

    11. 参考我之前写的一篇帖子: /t/781573 请问下 bgp peering 可以收全球 internet 路由表( ipv4 全表)的资源(是一个 Vultr 的 VPS )

    12. 通过折腾,我成功实现了接收 bgp 全表,并按照 ASN 的归属,进行分类。

    13. 其中 ASN 的归属,从 https://whois.ipip.net/countries/CN 找到全国 ASN 列表,并按照三大运营商( CT,CU,CM ),OTT 运营商( AL,TX,BD,JD etc ),加上剩下的,进行 ASN 列表分类。

    14. 分类完成后通过 bgp 策略,给对应 ASN 列表内的 ip 路由打上不同的 community 标记,打上 bgp community 后反射( bgp rr )给连接不同运营商链路 OpenWRT ( Bird bgp )虚拟机,这样,对应链路的虚拟机,就有分流的明细 IP 地址表了。

    15. 有了 ipv4 全表的 vps 和两台连接 CT,CU 运营商链路 OpenWRT,就可以搞事情了。三者之间的连接,通过 Zerotier 完成。当三者连接起来后,vps 把打好 community 标记的表发出来,OpenWRT 虚拟机可以选择性的接收:CT-OpenWRT 只接受 CT 的路由表(如果 CT 是主力宽带,这一步也可省略); CU-OpenWRT 只接受 CU 的路由表。

    16. 最后实现分流,CU-OpenWRT 需要通过 bgp 将 CU 的路由表,发送给做主力的 CT-OPENWRT 虚拟机(通过 bird 导入 kernal ),在 CT-OPENWRT 虚拟机上实现分流。注意,CT-OPENWRT 虚拟机和 CU-OPENWRT 虚拟机在 Bird bgp 进程上需要下一跳可达( bgp 协议限制)。

    17. 在我家里的示例环境中,中间是有一个 L3 交换机的,172.16.11.0 则作为了过渡前置网段,用于调整路由策略等,方便实现试验环境的调试。






    18. 用动态路由条目,我只分流 CU 流量,也只增加了 5K 多条路由条目。如果由于 bgp 邻居关系发生变化,路由消失后,也能及时走到 CT 的链路上实现备份。CT 有 6K 多条目,CM 有 14K 多(不知道为什么 CM 发了这么多前缀)



    19. 综上所述,根据 ASN 确定 IP 地址的归属,进而去调度出口流量,用 BGP 加策略的方法,我认为是最灵活的。



    20. 当然,在 CT-OpenWRT 内网接口上额外的 IP redirect 也会消耗额外流量,在家庭的环境下,也是不能克服的。我也尝试着把 CT 差不多 5K 多的路由注入给家里的 L3 交换机,立马就报 TCAM 满。企业级的解决方案中,核心交换机的 TCAM 足够大,可以通过收部分表的方式实现转发。

    写得太多了,待续。。。
    13 条回复    2023-08-11 09:10:48 +08:00
    lxll
        1
    lxll  
       2021-06-17 00:32:20 +08:00 via Android
    用路由表分流原理都差不多,要么动态引入然后分类,要么手动导入路由列表。op 玩玩还可以,真要稳定还是上 hw h3c 等专业设备,轻轻松松承载 500k 路由表。PBR 也是个好东西。
    lxll
        2
    lxll  
       2021-06-17 00:35:03 +08:00 via Android
    @lxll 另外如果和 VPS 连接断开路由条目消失分流就失效了吧。
    onion83
        3
    onion83  
       2021-06-17 01:03:07 +08:00 via iPhone
    纯 Linux 解决方案:网络层 ipset + iptables + ip 命令 DNS:smartdms
    nbsn
        4
    nbsn  
    OP
       2021-06-17 13:13:57 +08:00
    @lxll #2 是这样的呀,避免断开之后成为黑洞
    Tengwait
        5
    Tengwait  
       2021-06-17 15:19:04 +08:00
    其实可以把学来的路由用脚本记下来,然后当静态写入,降低 LP,当 BGP 死了的时候,还有静态路由在,重点是这个静态要定期更新一下,感觉这样会更好
    tpsxiong
        6
    tpsxiong  
       2021-06-17 16:00:57 +08:00 via Android
    如果 dns 固定为电信的 国内域名解析到 cu 的 ip 基本少之又少 如果部分域名使用联通 dns 那目的是什么 感觉国内目标 ip 分流基本是伪需求 之前我也折腾分 3 线 wan: iptv cm ct 现在只有国外 ip 分下流了 国内就分 iptv 和普通流量
    Laitinlok
        7
    Laitinlok  
       2021-06-17 21:40:09 +08:00 via Android
    @tpsxiong 用 Adguard Home 將电信 DNS 、聯通 DNS 、Google DNS 、Cloudflare DNS 放進去, 然後選擇最快的 IP, 然後再分流用那條寬帶
    nbsn
        8
    nbsn  
    OP
       2021-06-18 09:20:27 +08:00
    @Laitinlok #7 Adguard Home 做不了的,还是要 mosdns 才行,可以带上 ecs 。
    lzyliangzheyu
        9
    lzyliangzheyu  
       2021-06-18 11:36:44 +08:00
    现在的知识水平还看不懂。。。战略性马克下
    carrionlee
        10
    carrionlee  
       2021-06-19 11:30:08 +08:00 via iPhone
    我也觉得国内外分流就够了,国内 ip 分流意义不大
    bclerdx
        11
    bclerdx  
       2021-06-20 21:28:15 +08:00 via Android
    @carrionlee 如果鹏博士宽带和三大运营商之间的国内分流,意义就大了。
    mowenqing
        12
    mowenqing  
       232 天前
    大佬,我想咨询一下现在可以通过 vultr 收 BGP 全表,但是 bird 里面要怎么写才能实现国内走 pppoe 直接出去,国外的走隧道啊。
    nbsn
        13
    nbsn  
    OP
       230 天前
    @mowenqing 收了全表之后得交给路由器去做分流啊,我是按照 ASN 过滤,把明细发给路由器走本地,然后默认路由指向国外得隧道
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1106 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:50 · PVG 02:50 · LAX 11:50 · JFK 14:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.