比如使用 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 两种模式)。