使用tun2socks进行全局网络代理
tun2socks
(tunnel to socks) 是一种将 tunnel 流量转发到 socks 代理的工具,通常可以用来进行全局流量代理,也可以配合路由表设置,进行一些特定网段的流量代理。
简介
在介绍 tun2socks
之前,需要先了解一些基本概念的含义:
- tunnel:来自于 TUN/TAP,其中的 TUN 表示 tunnel,可以理解为三层代理,而 TAP 可以被理解为二层代理。
- socks:一种应用层代理技术,将进入其中的流量代理到远端服务器。
- 虚拟网卡:由 TUN/TAP 实现的,操作系统创建的虚拟网络设备,可以像普通网卡一样处理应用程序的流量。
- tunnel2socks:连通虚拟网卡和 socks 服务的工具。
以下是 xjasonlyu/tun2socks 项目中的功能介绍,后续的示例中我们也会使用该项目作为例子:
- 全局代理: 处理来自本设备的任意网络应用的所有网络流量并通过代理转发。
- 代理协议: 通过 HTTP/Socks4/Socks5/Shadowsocks 远程连接且支持鉴权。
- 跨平台性: 具有 Linux/macOS/Windows/FreeBSD/OpenBSD 特定优化的多平台支持。
- 网关模式: 作为第三层网关处理来自同一网络中其他设备的所有网络流量。
- IPv6 支持: 所有功能都可以在 IPv6 中工作,允许通过 IPv6 代理转发 IPv4 连接,反之亦然。
- TCP/IP 栈: 由来自 Google 容器应用程序内核 gVisor 的用户空间 TCP/IP 网络栈强力驱动。
环境
为了方便理解,介绍一下笔者所在的网络环境,和本次实验相关的设备共有 3 台:
- 笔记本:
- windows系统
- 地址
192.138.34.17/24
- 网关
192.168.34.1
,网关是一台普通路由器 - 有互联网连接
- 内网服务器:
- linux系统
- 地址
192.168.34.197/24
- 网关为
192.168.34.1
- 有互联网连接
- 运行着一个 socks5 服务,服务地址为
0.0.0.0:1080
,socks5 服务和远端服务器已连接
- 外网服务器:
- linux系统
- 地址为
xx.xx.xx.xx
,负责处理通过内网服务器 socks5 服务发来的流量
测试
接下来的测试按照 xjasonlyu/tun2socks 项目提供的 示例 进行。
下载 wintun
wintun 是一个在 windows 系统中创建三层 TUN 的库,只需下载 dll 文件并放在 tun2socks
同文件夹下。
创建虚拟网卡并设置代理
tun2socks -device wintun -proxy socks5://192.168.34.197:1080 -interface “以太网”
以上命令会开启 tun2socks
进程,创建名为 wintun
的虚拟网卡,并将通过此网卡的流量通过指定的 socks5
服务器代理,通过原有 以太网
网卡转发。
配置虚拟网卡
在新的命令行窗口中键入命令,进行虚拟网卡配置:
netsh interface ipv4 set address name=”wintun” source=static addr=192.168.123.1 mask=255.255.255.0
netsh interface ipv4 set dnsservers name=”wintun” static address=8.8.8.8 register=none validate=no
上述两条命令设置网卡的地址、掩码、DNS 服务器,让他看起来像一个正常的网卡。
配置默认路由
netsh interface ipv4 add route 0.0.0.0/0 “wintun” 192.168.123.1 metric=1
通过上述命令添加一条经过虚拟网卡的默认路由,之后全局流量都会通过虚拟网卡转发。
问题
- 测试时使用了一个不支持 UDP 的 socks5 代理,导致 DNS 解析功能受阻,如果想使用完整全局代理功能,需要另选 socks5 代理软件。
后来使用支持 udp_over_tcp 的代理套了一层,解决了惯用 socks 代理不能代理 UDP 的问题。