跟风贴自家软路由实现

195 天前
 maybeonly

设计目标

设计总则

具体实现

为什么说玩得开心呢

5615 次点击
所在节点    宽带症候群
53 条回复
povsister
194 天前
@Jirajine #36
不能算在错误的 layer 解决问题吧,只能说是:把解决的问题的阶段下沉,对内网终端设备隐形。
然而把方案下沉,其实哲学意义上,就意味着解决问题时能获取的有效信息会减少。
这和运营商选择把反诈插件放在用户侧光猫里是一样的道理,只有足够贴近用户,才能提高反诈预警的准确性(只是举个例子哈,不对反诈这个东西做任何评价。

说到底,我和 OP 的哲学是一样的,能在网关解决的问题绝不在客户端上解决。
Jirajine
194 天前
@maybeonly #40 很多事情在客户端做更适合也更简单,比如把不同的 app 路由到不同的接口,你在网关就没有足够的信息来做;再比如 dnsroute ,不如浏览器自己分配不同的 tab 走不同的代理。
至于电视、iot 设备,这些直接在网关全局路由到某个接口就行。
在外面上网还要走 vpn 连回家的话,开销就不是一般的了。
kylix
194 天前
好详细,先收藏,再慢慢看~~~
povsister
194 天前
@maybeonly #34 感谢分享思路!
这个问题我个人猜测应该是不会那么痛,但是明显还是大佬思考更细致。

我赞同你对现实情况的考量,只要路由选择上添加 srcIP - dstIP 做匹配,把不同终端的路由选择分割开,就能极大缓解这一问题。
目前我自己的实现是:只做了 dstIP 的路由规则,后续会抽空加上大佬的 srcIP 路由匹配策略。

另外咨询一个问题,大佬的 DNS route 的有效期是怎么计算的?什么时候废止这条路由表?
是靠客户端的 DNS 请求刷新吗?
Jirajine
194 天前
@povsister #41 但因为丢失了信息,有些问题是没有办法在网关正确、可靠的解决的。有些情况对客户端透明非常重要,另一些情况就不一定有这种需求。
maybeonly
194 天前
@povsister
简要流程:

DNS on query -> 匹配隧道? -> YES: 丢给对应的隧道 / NO: 丢回系统递归

DNS on reply -> 匹配隧道? -> NO: 直接返回
... -> YES: 必要时查 ipv4/v6 映射表 -> 记录 DNS 结果地址、DNS 请求的源地址( edns 或者源 IP ),设置 TTL (比如不超过 5min ) -> 设置路由规则(源,目的,超时时间,隧道 ID 。其中超时=DNS 超时+允许的宽限时间) -> 返回记录

on PACKET -> 匹配路由规则(超时的这里就匹不到了)? -> YES: 修改目的 MAC 为隧道对应的 MAC / NO: 修改目的 MAC 为 OWGW 的 MAC -> rawsocket 发出

系统的路由表实现源*目的匹配各种不方便,更别说超时了。这也是自己搓二进制的主要原因。
povsister
194 天前
@maybeonly #46
完全理解了!
也就是只通过 DNS query 去刷新 DNS route 规则,已建立的连接依赖 conntrack 保持,不受 DNS route 限制。

我昨天给自己的实现添加了 onConnectionActivity 时,重置对应 DNS Route 的有效期,只要现有连接上有数据活动,则对应路由条目会一直刷新有效期。直到所有连接断开,且没有对应 DNS 请求时,对应 DNS route 才会被清理掉。
用于应对客户端 DNS 记录的缓存时间超过 DNS TTL 的情况。不过感觉似乎有点矫枉过正了。。
povsister
194 天前
@Jirajine #45
同意的,各种方案都有其优缺点。我描述的多网站共享 anycast ip 问题,确实适合在客户端侧自行解决。网关上只能有限的进行优化,无法彻底根治。属于透明代理的 tradeoff 了。
Donahue
194 天前
好复杂,我选择旁路由+openclash+机场下发代理文件
innoxa
194 天前
高端玩家
dvbs2000
193 天前
我用普通人理解翻译一下


这是一个自己动手实现的软路由系统。设计目标是为了玩得开心,而不是追求极致性能。它采用模块化设计,面向数据包和连接,使用真实 IP 地址。虽然结构复杂,但条理清晰,拓展性好,能够轻松适配各种形式的 VPN 。

基础操作系统使用 Rocky Linux 9 。主要使用 bash 脚本语言编写,部分模块使用 C++。没有图形界面,但有一些命令行工具。使用了多个内网 IPv4 和 IPv6 网段,尽管并非所有 IP 段都是必须的。

核心是 NET-IX 模块,提供虚拟交换功能。它使用一段内网 IPv4 和 IPv6 地址,提供调度、故障自动处理、分流及 DNS 、访问控制等服务。其中的主要功能模块包括:

1. INGW:内网接入网关,可针对不同设备应用不同策略,如 DNS 等。
2. DNSIW:普通 DNS 服务,转发到运营商 DNS 。
3. DNSOW:过墙 DNS 服务,对白名单域名转发 DNSIW,其他使用自己的递归 DNS 。
4. OWGW:隧道入口,对白名单 IP 转发至 RTGW 。
5. RTGW:IX 网段的出口网关,连接到 WAN 。
6. DNSROUTE:DNS 分流/策略分流模块,自行开发。

NET-LAN 模块对应普通内网接入,可直接分配公网 IPv6 地址并使用 SNPT 做转换。

NET-WAN 模块对应宽带接入,支持 PPPoE 、DHCP 等方式,还能转发 IPTV 流量。RTGW 连接 IX 和 WAN,对多宽带使用 connmark 解决连入连接问题。每条宽带使用两个 netns,分别连 ISP 和 TUN 。

NET-TUN 是模块化连出 VPN,每条隧道有两个 netns:TN 和 FW 。TN 接受 OWGW 或 DNSROUTE 的流量,经隧道协议发出;FW 提供防火墙和出口路由。VPN 出口在 OWGW 进行调度并自动检查隧道健康状态。

DNSROUTE 使用 C++ 实现,可匹配 DNS 请求并转发,并对返回的 IP 记录,后续可据此对数据包转发。

NET-XC 模块将连入 VPN 导入 INGW 并应用三层策略。NET-IoT 模块隔离物联网流量。

这个设计很灵活,在外部可方便地增删隧道、调整健康检查、改 WAN 设置等,且不影响整体。还能较容易增加新功能,如指定源 IP 经特定隧道、隧道串接、针对特定 WiFi 的 DNS 解锁等。

总之,这是一个为了玩得开心而设计的软路由系统,结构复杂但条理清晰,模块化程度高,可玩性强。作者在设计时着重考虑了灵活性和可扩展性。


@maybeonly 宠妻狂魔啊
小心惯坏

话说太复杂了 其实软路由稍微需要处理的主要是 dns 部分
dns 主要防被解析到沟里去
自己造轮子 说明技术水平确实高
GotKiCry
192 天前
太复杂了哥,我对软路由的理解还是停留在即插即用稳定上个网
kenywei001
192 天前
这就有点高端了。

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

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

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

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

© 2021 V2EX