软路由的最佳实践

2023-06-29 14:07:42 +08:00
 lemonTreeTop

对多数用户来说,软路由最佳实践应该是透明代理网关,俗称旁路由

最近在折腾软路由,谈下对软路由看法,软路由当旁路由是由其缺点决定的,缺点包括系统不稳定,网络层能力弱于硬路由。以常见的 openWrt 为例,相比硬路由,出现挂掉的概率更高,硬路由设计时主要针对网络层,在如 NAT 、小包转发上天生就比软路由优秀,软路由则是针对应用层设计的系统,应用层要求更高的通用计算力处理流量,典型应用是代理服务,软路由在这个层面就表现得非常优秀。从网络分层角度看,硬路由和软路由不是同一个层次的东西

软路由当旁路由使用能很好利用软路由的优点和硬路由的优点,非侵入式接入不影响原有的网络架构

吐槽下旁路由这个名字太形象了🤣,很中文,放在主路由旁边的路由

经常看到有人总是想跑满带宽或升级带宽,不明白背后的需求是什么,要求持续高带宽的场景非常少,带宽到达一定速度后边际收益递减,与其追求带宽上的快,不如优化网络延迟,买个延迟更低的机场更香

30473 次点击
所在节点    宽带症候群
142 条回复
thereone
2023-06-30 12:37:33 +08:00
@Jirajine 旁路有需要设置的防火墙规则?就是一个代理用的。“比如 nat 打洞、upnp 端口转发的去回程流量可能会走不同的路径,这部分流量可能会也可能不会被代理” 是不可能来回不一致的,三层来看代理和非代理的源目 IP 都不一样的怎么可能会来回不一致,非代理的源目 IP 又不会变 从终端出去的源 IP 过旁路又不会改变那自然就和普通访问一样了,代理了的源目就变成了旁路的 IP 了回也是先回旁路 再从旁路转发到终端。过不过代理不就是看 dns 解析和代理的方式。国内的 IP 不过代理的自然就直接转发走了,过代理的就会旁路处理后源 IP 会变成旁路的是不可能直接转发给终端的。
基本要做限速的或者啥的规则只需要在主路由上面做,对于主路由来说过旁路由的除了 mac 地址变了基本就没有区别。硬要说的就是 ttl 和 fcs crc 这些改变了。
“” “单点故障”阻断链路是应有的行为,代理挂了就应该代理流量断网,而非所有流量静默的直接泄漏出去。而透明网桥对三层网络是透明的,你想移除他只需要把网线一拔,直接插到主路由上,网络自然恢复默认状态。 “”
你没有看懂我写的单点故障是啥我说的不是代理的问题,而是设备单点故障,你的透明网桥设备挂了还要手动拔插网线更换, 主路由--透明网桥---交换机?我不清楚你的透明网桥后面有没有交换机
正常的:主路由-----透明网桥------交换机,要想透明网桥挂了那就要两个透明网桥同时接在主路由和交换机之间,同时开启 stp 阻断一条链路,要么就是主路由和交换机做链路聚合两根网线捆绑成一根,这样才能保证某一个透明网桥挂了也不影响整个网络。
而我上面写的 VRRP 是旁路由挂了断电了,dns 和网关会自动迁移到主路由。完全不用人去干预的。甚至旁路由你也可以写个脚本检测是否能过墙,不能过那就直接自动切换回主路由。更高级的就是旁路由也拨号作为备用链路或者分流链路,哪怕主路由挂了也不影响整个网络。还高级的用法就是两台都是 op 路由内部部署负载均衡同时心跳检测 可以随机或者指定走某条链路。
neroxps
2023-06-30 13:07:01 +08:00
@Bluecoda 游戏一般是小包,而硬件路由简单的防火墙策略情况下,小包直接由芯片处理转发的话,效率肯定会比软路由的软件转发快,至于快多少。对于你是否有帮助,取决于你当前网络的小包转发量。

例如有些人什么业务都不跑,就玩游戏,路由只需要处理你的游戏 udp 小包转发那么肯定没问题。

但如果是家里跑了很多业务,小包大包各种流量都有,同等情况下,硬件转发必然比软件转发效率更好。
Eagleyes
2023-06-30 13:08:55 +08:00
@shyrock #2 那肯定的,N1 挂掉不会影响整个网络,只会影响过 N1 的设备
tywtyw2002
2023-06-30 13:09:23 +08:00
看标题,以为这帖讨论的是 vyos ,routeros ,pfsense ,海蜘蛛之类的东西呢。
结果 openwrt+代理。。。

撤退。
Jirajine
2023-06-30 13:15:51 +08:00
@thereone 比如说你的设备通过 upnp 让主路由开了一个端口转发以接受入站连接,而你的设备回复的包会走旁路,这个包可能会被代理(取决于地址与规则)。去程回程的路由路径不一致也会导致比如限速、抓包等无法处理回程流量,这种非标准的结构也违反了更多应用的 assumption ,比如 nat traversal 。

你说的单点故障问题,恰恰与实际需求相反。作为一个代理工具挂了自动切换到直连泄漏所有流量是最糟糕的行为,真正需要的是 kill switch , 几乎所有正经 VPN 都提供的特性: https://www.expressvpn.com/features/network-lock

而且透明网桥不需要折腾路由,对三层透明。无论公司还是别的地方,只要把它接入进去,下面的所有设备都能自动代理,拔掉自动恢复,客户端和网络侧都不需要任何修改。dhcp/地址分配/dns/ipv6 统统都不需要关心。
thereone
2023-06-30 13:30:27 +08:00
@Jirajine 透明网桥这个也一样的有这个问题难道你没有发现?还是你觉得透明网桥是怎么处理代理的呢? “这个包可能会被代理(取决于地址与规则)” 这个你的透明网桥就有办法避免?如果可以避免那你说透明网桥的处理代理数据包的原理是啥?不用修改报文不修改源 IP ?判断哪些需要代理的不是一样要地址与规则。相反你这个插入到网络中还会导致不需要代理的被强制代理,而且一旦设备故障了也不会自动切换和自愈。甚至直接导致断网,虽然家用没有多大的问题但终归是会断网要拔插网线。
8355
2023-06-30 13:58:08 +08:00
@KKLeon 所以是不是每个要走旁路由的设备都要设置网关?是不是你的旁路由只要挂了就上不了网了?有其他方案吗
Jirajine
2023-06-30 14:01:00 +08:00
@thereone 当然可以避免,因为不同于“旁路由”,透明网桥是能看到所有流量的。所以可以直接使用 connection track 来排除掉入站方向连接。
“自动切换和自愈”再说一遍这是 anti-feature ,故障了我需要自动断网而不是偷偷直连。
这并不会导致不需要代理的设备被强制代理,如果是公司这种 portable 的场景,只有插在透明网桥下面的设备和交换机/ap 才会代理;如果是家用,只有防火墙规则选择的设备( ip 地址或 mac )才会劫持到网络栈处理,其他的流量则表现为一个正常的二层交换机转发而已。
并且你说的故障只有这个 host 完全挂掉(硬件损坏、kernel panic )才会导致完全断网,如果只是代理服务挂掉,那只有代理无法使用,原本直连的照样可以直连,因为它只是一个“软交换机”而已,bridge 是跑在内核里的。
弄个 alpine 这种 diskless 安装的稳定系统,运行时连 sd 卡/硬盘都不需要,系统挂掉的可能微乎其微。
KKLeon
2023-06-30 14:07:54 +08:00
@8355 不是,我用的全局模式,所有设备的网关都已经自动设置为旁路由地址,稳定性这个也是经过了考验的,n1 稳定运行几年了还没出过问题,除非我自己折腾新固件才会重启。我前段时间本来是买了个红米 ax6 ,想着一台设备直接替换掉原来的 newifi3+n1 组合,但是到手后发现,单纯的红米 ax6 还是会有问题,要么是刷 op 固件的话无线跑不满千兆(开源驱动的问题),要么原生固件装 shellclash 的话,遇到过内存不够会重启的情况。另外红米 ax6 用油管测速的速度比 n1 小 50%,所以现在我还是红米 ax6 做主路由,n1 做旁路网关,用的很舒服
lemonTreeTop
2023-06-30 14:13:34 +08:00
@Bluecoda #80 打游戏需要 clash 开启 tun 模式,并切换网络栈为 Gvisor 。延迟没有变化,如果有可能是几毫秒吧
thereone
2023-06-30 14:20:06 +08:00
@Jirajine 那不是一样的,旁路由一样可以决定哪些需要代理哪些不用直连这个没有区别。
你说的“故障了我需要自动断网而不是偷偷直连。”这个才是没有多少人有这个需求。大部分人要的是不断网。不管怎么折腾旁路由都是不会断网的那种。代理挂了一样不能访问,这个没有问题啊旁路由代理挂了如果 VRRP 里面没有追踪代理本来就是不切换,墙外网络本来就是会不能访问因为代理又没有自动关和取消。所以你这个解决了设备如果挂了电源坏了这种能保证网络不中断吗?问题就在这里你的始终是串在网络里面的没有解决透明网桥 host 挂了不需要手动操作的方法
smilekung
2023-06-30 14:25:11 +08:00
@neroxps 类似方案,不过我还加了 ospf 用来通告一些被墙的 ip 到 clash 网关上
8355
2023-06-30 14:26:28 +08:00
@KKLeon #89 你的意思是
主路由拨号并且设置统一网关为旁路由 ip
dhcp 下发旁路由网关。。是这个意思吧。。
稳定性主要取决于旁路由自身是否稳定 流量还是全部都走旁路由过一下
maybeonly
2023-06-30 14:30:45 +08:00
@thereone 来回路径不一致可能还是小事,端口映射确实可能会出问题:
假设内网用户是 192.168.100.200 ,主路由 192.168.100.1 ,旁路由 192.168.100.9
映射(包括各种映射)了 8888 端口到外网端口 198.51.100.100:8888 。
此时有来自 203.0.113.2 的用户访问了你的公网端口,然后他给你发了一个包。
203.0.113.2:12345->198.51.100.100:8888
进行 nat 以后,通过主路由转发到了客户机,到这里还没问题。
然后客户机需要给他回包:
192.168.100.200:8888->203.0.113.2:12345
这时候这个包首先被发送到旁路由。这个时候说不定(看策略)就被走其他路径“劫走”了,
然后可能通过 vps 的出口发给了对端的机器,对端看起来数据包是这样的:
192.0.2.33:27428->203.0.113.2:1234
这数据包哪儿来的……于是就扔掉了,通信失败。

单点故障的场合,不认为家庭环境有那么多需要热备的,要坏的话主路由一样会坏,主路由更需要热备吧……光猫也可能坏,怎么热备呢?局方给你套个 SDH 大圈圈吗……不可能的吧……连链路都只有一条的说……
虚拟链路的话……就只有一条吗……就算只有一条,主路由一样可以临时禁用(如果这是希望的结果的话)。不要默认旁路由容易坏,更不要默认特殊功能的设备就容易坏。如果设置正确、运维得当是没问题的。当然,如果是刚上手的学习阶段,还是可以用旁路由练手的。

接下来就是性能,转发性能确实比不上硬件但是在家用场合下可以忽略。2023 年了,就算还在用 j1900 ,nat 性能会成为问题吗?小包转发确实有可能会没法千兆线速,但是家庭网络您在干啥会有那么多小包?家庭网络最大的 cpu 开销,一是 pppoe ,二才是加解密。pppoe 是个跟不上时代的古董协议,特别耗费资源。再说,升级个设备其实也没多少钱,考虑下宽带费用电费可能还有其他按月计价的费用……设备成本可是可以摊销的。

透明网桥我实现过,整体上还不错但是有点其他问题,现在 broute 表都被拿掉了,以后不知道该怎么搞。可是那也是条件所限拿不到路由的时候才用的,拿得到路由的话用路由舒服多了。企业应用也一样,管理设备要串行接入网络的话要物理操作要断网,但是路由指过去的话就可以远程操作,也可以屏蔽,还可以部分应用。

至于配置方便程度就更不要说了,拿着主路由权限可以下发各种东西,你要给多少设备设置网关啊?我家的电脑×n 、手机×n 、pad 、电视、虚拟机×n ,都要一个个爬上去设置 dns 吗……我家下发的 dns 的 ip 都是一样的,但是会根据策略拉到不同的服务,返回的东西也可能不一样,这些用旁路由……不是做不到,而是,还是算了。

最后,多线上联(不同运营商多条宽带)这一条,旁路由被薄纱。
KKLeon
2023-06-30 14:30:56 +08:00
@8355 是这个意思。像楼里经常推荐的 N1 做旁路网关,随便搭配个拨号的硬路由,整体稳定性应该非常可以,成本也不高。N1 内存也够大,想多跑点轻服务也绰绰有余。
thereone
2023-06-30 14:36:07 +08:00
@maybeonly 针对你的这个“这数据包哪儿来的……于是就扔掉了,通信失败。”这个透明网桥是一样的没有啥区别。
maybeonly
2023-06-30 14:41:03 +08:00
@thereone 双向经过一个设备的话可以用(有点复杂的) conntrack 解决。单向经过的话就没什么好办法了。
thereone
2023-06-30 14:44:39 +08:00
@maybeonly 所以旁路由可以拨号和主路由做主备啊,我上面也说过了的。谁说要手动配置设备的啊,都说了起 VRRP 协议 下面的自动获取就完了,不需要的过强的在过强软件里面排除掉不就行了,再或者直接在 iptables 里面操作。
还有多线和旁路由有啥关系,你这说的什么看都看不明白。
maybeonly
2023-06-30 15:07:28 +08:00
@thereone 主备实现不难,关键是意义在哪儿……如果旁路由这些都能干了,他还安心当个旁路由吗……为什么不直接升级为主路由呢,网络更简单清晰。当然,如果作为主路由备份是为了过渡到主路由的话,我双手赞成。

多线场景是极限自定义的场景。只有作为主路由,才好充分利用多条宽带的能力。因为流量是双向流过的,才好建立 conntrack 。
简单的说,如果有个 vps ,然后自己有两条宽带 a 和 b ,再乘上 v4 和 v6 ,就变成 4 条线路了。
这一点旁路由完全没办法决定自己出去的直连数据包从哪里出去……如果要同时用两条不同的线路和远端建立两条链路做主备,旁路由最多最多只能一个 v4 一个 v6 然后让主路由写路由表了吧。
但是在主路由上直接搞的话,一切都可能实现。
以及前面说过的,端口映射,也需要在主路由上有相对复杂的配置,这一点旁路由很可能是个干扰。
再考虑 v6 的话,旁路由就更难受了。

其实就是说,当网络结构越来越复杂的时候,旁路由需要越来越多地与主路由交互。这时候就更显得旁路由多余甚至有点难受了。
当然重复一下观点,作为学习练手,或者由于条件所限使用旁路由是很合适的。除此之外长期稳定使用特别是重度使用的话,建议直接做在主路由上。
thereone
2023-06-30 15:14:53 +08:00
@maybeonly 本来就可以升级成主路由只要技术能力行,我这里说的是备份而且大多数家庭也只会接入一条宽带。所以你这里都极限自定义了那和题主说的也没有意义了。同时都是多线接入了那不直接过强的做在主路由上再多做在哪里都不合适。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/952691

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX