返回首页

tun 模式代理软件原理

本文介绍 tun 模式代理软件原理

代理软件为了处理本机全部流量,大多时候会使用 tun 设备,也就是 linux 的 /dev/net/tun 以及 windows 的 wintun.dll ,然后设置默认路由到这个 tun 设备,于是就可以从 tun 设备中读取到包。

环路

但是代理软件内部也会进行网络请求,那么代理软件是怎么防止环路的呢?
一个简单的方法是使用 setsockopt api 指定出口网卡,不遵循路由表,在 linux 和 windows 都有对应api

过程

先分析 tcp
启动一个tun接口,我们命名为 tun0,设置 ip 地址为 tun_ip ,比如 10.66.0.1 ,我们需要一个 tun_next_ip ,比如 10.66.0.2 ,作为临时中介 ip
tun_ip 监听一个随机 tcp 服务端口 listen_port
设置系统默认路由 到 wintun
设置一个 关于 tcp 四元组 和 nat_port 的nat map 和 对应的reverse map
使用 curl https://www.baidu.com ,系统会发出一个 tun_ip:随机端口A -> www.baidu.com:443

由于设置默认路由到 tun 设备,tun设备可以 read 到 tcp ip 包,从里面可以得到 tcp 的 源ip 目的ip 源端口 目的端口。
如果源ip:port 不是 tun_ip:lisnte_port 那么就 申请一个新的nat_port ,并且和 四元组 对应。覆写 ip 报文的源ip 为 tun_next_ip ,源 port 为 nat_port ,目的ip 为 run_ip ,目的 port 为 listen_port 并且写入回 tun 设备
此时 之前的 tcp 监听模块就会收到一个 tcp 连接,peer ip是tun_next_ip ,peer port 是 nat_port ,从前面的 nat_map 查询到 tcp 四元组,得到目的ip 和port ,然后和出栈模块进行对接,此行为和 socks5 服务器类似,那么tcp 服务端会向 tun_next_ip:nat_port 发送数据,这个数据是来自www.baidu.com:443 的
此时tun设备收到的ip包,源ip:port 是 tun_ip:listen_port ,目的ip:port 是 tun_next_ip:nat_port ,查询tun_map 可以得到tun_ip:随机端口A,然后修改这个ip包的目的地址为tun_ip ,目的端口为随机端口A,源ip为 www.baidu.com 源port 为443,写入到 tun 设备,系统就会转交给 curl ,curl 于是得到数据