软路由的最佳实践

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

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

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

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

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

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

30393 次点击
所在节点    宽带症候群
142 条回复
missdeer
2023-06-29 22:04:47 +08:00
@zhangyq008 pf 不香吗,何必花这个钱买 surge
titanium98118
2023-06-29 22:34:39 +08:00
我一直是用 openwrt 做主路由,从 12.09 开始用到现在的 23.05 ,没遇到什么不稳定。最近用 hyperv+r5c ,两台 openwrt 做 vrrp 故障迁移,只要不作死同时两个一起折腾,家里网都不会断。
helllkz
2023-06-29 22:42:10 +08:00
旁路由确实没啥意思,还做配置,直接主路由透明代理不好么
arfaWong
2023-06-29 22:43:17 +08:00
ros + debian 网关,网关里面装 sing-box ,开启 clash api
lemonTreeTop
2023-06-29 22:56:10 +08:00
@maybeonly #14 多数用户我指的是需要用到代理服务的用户。额,在折腾软路由容易影响其他人的网络访问,这其中有人的原因也有软路由的原因
bobryjosin
2023-06-29 23:54:15 +08:00
ros+openwrt 旁路由,俩路由做 vrrp ,掉线自动切换,在虚拟机里面开了俩 openwrt 掉了就换另一个,完全不干扰,rb5009 这玩意 uptime 已经快半年了,很稳,都可以忽略它的存在了,旁路由可能拗口,叫旁路网关比较合适。
至于 ipv6 流量无法接管,你可以 nat ,旁路由宣告主路由就行了
当然我倒是不推荐 ipv6 nat ,或者更直接一点,不需要设置旁路网关,直接在主路由把 cn ip list 写进路由,排除 cn ip 其他 ip 去旁路由就解决了,旁路由挂掉也不影响。
不稳?不好用?不会用罢了,说白了这东西会玩的人很稳,没能力玩出花,得出结论为这玩意垃圾。当然也不排除觉得这样玩很复杂,单纯只想省事的。
Jirajine
2023-06-30 00:26:59 +08:00
@moxuanyuan 只是你忽视了问题,“旁路由”要想正确配置可一点都不“简单”。dhcp 怎么分配? ipv6 怎么处理?动态前缀? dns 泄漏怎么解决? nat 类型、涉及 upnp 端口转发、打洞呢。还有回程包的路由会怎么走你知道吗?

这三种方案的共同点是在一台单独的 host 上部署透明代理服务和相应的策略路由/防火墙劫持规则,除此之外,软交换机方案只需要创建一个 bridge 把连接主路由和其他设备的端口桥接到一起并添加几条 ebtables/nft 规则劫持以太网流量到网络栈; fakeip 方案只需要在主路由或其他设备上添加一条静态路由;而“旁路由”方案处理好以上所有的事情是最困难的。
Jirajine
2023-06-30 00:30:59 +08:00
@bobryjosin 因为“旁路由”确实是垃圾,正常环境下都没人用的不符合 rfc 标准的 trick 。只是一些半瓶子水的博主出了一堆教程然后小白按图索骥罢了。
Ming5Ming
2023-06-30 02:39:29 +08:00
透明代理的分流很不方便, 所以不怎么用...
zhangyq008
2023-06-30 07:37:05 +08:00
@billytom 内网设备我用 iperf 测过,可以跑到 900 多,我觉得没啥性能问题
zhangyq008
2023-06-30 07:38:50 +08:00
@missdeer 这种问题没有意义,因为我是苹果全家桶,有 mac mini,手机也用 surge,对我来说这是最好的方案
lemonTreeTop
2023-06-30 08:17:01 +08:00
@Ming5Ming 透明代理网关很方便,分流规则简单点就好了,国内直连,国外代理,终端无感知
suixn
2023-06-30 08:28:46 +08:00
对我来说主要是旁路由 ipv6 的问题不好解决。另外 win 系统 ipv6 dns 优先级高。导致 fake ip 用不了
neroxps
2023-06-30 09:06:02 +08:00
“旁路由”,在传统网络上是不存在这种说法,只有单臂路由,策略路由。
其实什么路由都无所谓,能解决问题就是好路由。
每个人也有适合他自己的解决方案,自己觉得好就行了。
最佳实践,这个看哪个角度了,例如你觉得硬路由做主路由,其他需要爬的机器采用修改网关 dns 来实现出墙功能,那么你觉得这样方便维护,那么是没问题的。
我最早折腾是搞 openwrt 做主路由,当年还没有什么插件,都是自己手动搭的,根据 IP 表分流,dnsmasq+ipset+ iptables+ss-libev ( redir )+pdnsd 组合来解决 dns 污染和分流代理
但是这种组合维护特别不方便,ss 的服务更新,分流出问题了调试麻烦(组件太多)
后来 surge 出现后,陆陆续续的 ios 小火箭 qx 等基于规则的代理工具也出现,clash 也同步出现,逐渐成为了主流工具。
我也把 openwrt 的代理工具换成了 openclash 。
优点是:有 web 面板,切换节点,日志查看都非常方便。
缺点:openclash 想做 clash 的 web ui 客户端,想把 clash 的配置全部丢到 web 上方便用户配置和修改,确实做的很棒,但这样脚本的代码量非常大。试过几次因为 openclash 更新订阅的时候可能因为网络抖动问题下载下来的是空文件,但他不会校验(现在不知道会不会)。导致 clash 直接不启动了,不启动他也没有清理 iptables 等配置导致直接断网。(现在应该修复了?没再用了)

后来了解到 Mikrotik RouterOS ,就入了一台弱电箱神器。开始玩 Mikrotik 系列路由
对于本来就是学网络的人,routeros 其实比较适合,界面直观,配置概念完全是按照网络概念设计,如果你熟悉网络通信原理,熟悉防火墙配置,那么玩 ros 其实并不难。

但换了这个硬路由,爬墙怎么搞呢。我一开始也学大家一样,做“旁路由”(其实就是多层 NAT 路由),那么根本没法解决 openwrt 单点故障的问题。而且 NAT 转换效率,根本没有发挥硬路由的优势。

后来搜到的解决方案都是说例如你某个机器要爬,可以让 dhcp 服务器根据不同的 mac 地址分配不同的网关,或者是手动设置网关和 dns 。

我觉得这种方案太麻烦了,例如我某个设备今天突然需要访问一下 google ,只是突然需求,我还得电脑开机路由上配置,即使 Mikrotik 有手机客户端,我也需要等待 dhcp 生效,或是手动配置网关和 dns 。

我认为这个需求能直接从主路由上解决他们,后来也了解到各种代理工具都在用 faek-ip 方案。理解了工作原理之后,我就针对家里现有的网络拓扑进行修改。

最终采用 硬路由+dns 分流+fake-ip ( shellclash ) 的方案:
优点:
- 完美的分流:分流完全取决 dns 规则,只要匹配规则才能拿到 fake-ip ,fake-ip 的流量才会跑到 openwrt 那边,国内流量是直接从主路由就出去了。根本不会到 openwrt 那边。
- 网络性能:所有流量都先到主路由,主路由根据路由表进行流量转发,这是硬件路由的强项,所以基本不会有性能消耗,即使是最垃圾的 tplink 家用路由器,他也能完美的完成这个需求。因为得益于 fake-ip 方案(出自 https://www.rfc-editor.org/rfc/rfc3089 ),出墙的流量不需要获得真实的 DNS ,也不需要等待 DNS 答复,能以最快的速度封装 IP 层后发起访问。
- 维护便利性:因为只采用 dns 分流,所以只需要关注 dns 分流情况即可,拿到 fakeip 的流量才会跑到 openwrt 那边去。如果 dns 炸了,脚本能够自动检查并切换主路由的 dns ( Mikrotik 带脚本功能)
- 完美兼容 ipv6:因为对于局域网设备而言,他们只有一个网关就是主路由,所以和普通的网络是一样的,ipv6 自然就不受影响,而爬墙流量,因为 dns 服务器回答 fake-ip ,根本没有 ipv6 地址,所以自然也不受影响。
- 自动愈合( Mikrotik 独有):通过 Mikrotik RouterOS 的脚本功能,定期检查 openwrt dns 服务,如果出现故障,立即切换 ROS 的 DNS 上游服务器为运营商 DNS 。路由表则完全不需要管,因为运营商的 dns 不会回应 fake-ip 给你。
缺点:
- 依然存在(非主路由的)单点故障:因为 DNS 分流靠第三方服务,所以如果 DNS 服务器挂了,会导致整个网络的域名解析出现问题。我做法上面也说了,如果出现故障,立即切换 ROS 的 DNS 上游服务器为运营商 DNS 。
- 对非网络专业人员而言,有配置难度。(其实所有透明代理都需要解决 dns 和路由问题,只是人家把这个过程放到 openwrt 脚本里帮你自动配置而已)

这方案我已经用了快两年,几乎 0 运维。这也是我个人认为翻墙网络的最好实践
oovveeaarr
2023-06-30 09:16:04 +08:00
旁路由真的属于半吊子操作...软路由的好处没吃到多少,复杂度+不稳定性倒是拉满了。。。
sun82kg
2023-06-30 09:21:38 +08:00
@neroxps 我是 ros+naiveproxy 。方案其实和你类似,但感觉比你更简单一点,https://hub.docker.com/r/tonysun0319/naive
oovveeaarr
2023-06-30 09:24:20 +08:00
@neroxps 其实 FAKE IP 也很 Dirty ,它破坏了网络的完整性...兼容性不一定好的同时,目的地地址被改写了,如果单纯是用来代理没什么问题,但是很多其他的内容也会造成影响。

如果是我设计,增加这一层额外的复杂度是我想要避免的,既然转发了 DNS 直接路由就行了,然后用通常的 REDIR 等处理方式就行。

甚至更进一步,这一步甚至可以直接在主路由中完成,至于怎么去代理只是加一条策略路由的事。
shijingshijing
2023-06-30 09:26:58 +08:00
先把电信宽带升级到 1000M ,买的梯子稳定跑 200M 以上再谈性能缺口,现在软路由性能一般都是过剩的,这种情况下,稳定性和灵活性反而是实际应用考虑的重点。
thereone
2023-06-30 09:37:32 +08:00
@Jirajine dhcp 走主路由 ipv6 主路由分配当然 ipv6 跳墙的不清楚没做过,dns 泄露单独部署一台 dns 服务器或者旁路部署 mos smart adguardhome 都行,NAT 类型主路由做不就行了。upnp 一样主路由做打洞同样的。
你的问题都是在旁路由做了 NAT 才会出现,真正的问题点反倒是没有提出来。op 的旁路由单纯路由非 NAT 模式正常对普通的数据包又不会有三层及以上的报文的改变,会变的只有源 mac 地址而且只会在有上传的时候才会变。因为过了一个网关 网关自然会对源 mac 地址修改。当开启了过墙插件才会将整个数据包修改成由旁路由始发的,此时源地址为旁路自己目的为过墙服务器的 ip ,这个和你的透明网关是一个样的。
旁路由真正的问题在于终端上传经过旁路由转发 mac 地址改变,上到主路由就会发生 1 个 ip 对应的 mac 地址在不停地发生变化,这个对于主路由有严格模式的 ip 和 mac 一一对应才能上网的会造成无法正常访问国内网站而可以访问国外网站。
当然这个一般主路由是没有这个限制的。
相反透明网关容易出现单点故障除非做两台及以上的同时还要开启 stp 阻断一条链路,要不然就是在下层设备和主路由之间做链路聚合才好避免。而旁路由和主路由起个标准的 VRRP 就可以避免因为折腾旁路导致断网,如果账号支持多拨也可以旁路由也拨号做到真正的故障无感切换。
xiamy1314
2023-06-30 09:41:03 +08:00
花里胡哨,一个 op 就够了。玩 docker ,openclash ,adguardhome 什么的,几年了不断电不重启。完全满足日常需求。当然初期还是要折腾下的。

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

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

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

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

© 2021 V2EX