比如使用 ClashX Pro 开启了 Enhanced Mode 后,通过 ifconfig 可以看到有一个 utun10:
utun10: [ { address: '198.18.0.1', netmask: '255.255.0.0', family: 'IPv4', mac: '00:00:00:00:00:00', internal: false, cidr: '198.18.0.1/16' } ] 但它是如何接管电脑上所有的网络请求的呢? ClashX Pro 是闭源的,没有办法看源码。
通过命令 route -n get default 查看默认 route 是 en0 接口:
route to: default destination: default mask: default gateway: 192.168.11.1 interface: en0 flags: <UP,GATEWAY,DONE,STATIC,PRCLONING,GLOBAL> recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire 0 0 0 0 0 0 1500 0 难道使用 Network Extension 中的 Packet Tunnel Provider 不需要手动设置网络的转发吗?
我所理解的过程是这样的:
- 新建一个 TUN 网络接口
- 接管系统的请求
- 将请求处理
- 处理后的接口转发到其他网络接口
- 收到网络请求后其他网络接口转发到 TUN 网络接口中
- 处理收到的网络请求
- 传递给上层应用
所以总结下我的问题,第二步是如何接管系统所有请求的?第四步是如何转发到其他接口的?在 Linux 中应该是需要手动写吧?在 macOS 中是用 NE 里哪一些 API ?
另外,在 iOS 端也是和 macOS 一样的吧?开启 QX 应用后,在设置中可以看到有 utun 接口。类似的应用都是用 TUN 模式的( Loon 用 TUN 和 HTTP mode 两种模式)。
