create a TUN device to route TCP traffic through a SOCKS server
标题看上去有些唬人,其实这是 badvpn-tun2socks
命令的手册的第一句话。简单明了的解释了这个工具的作用。
前段时间在用git协议克隆一个github上的项目的时候遇到一个很尴尬的问题,使用git协议的时候不能通过http代理克隆代码,导致速度奇慢。诚然我可以通过先通过https协议克隆代码,然后 git remote set-url
的方式曲线救国,但是最后我还是选择使用了 Surge 这个工具。Surge有个 Enhanced Mode
,能够让所有网络流量(包括udp),都同过socks服务与外界交互。Surge的Enhanced Mode到底是什么呢?实际上Enhanced Mode再启动后,会在系统的路由表中添加一个特殊的默认网关,然后系统就会把所有的网络流量(除了socks服务)发送到这个网关。用命令查看启用Enhanced Mode后的路由表:
$ netstat -rn Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 192.168.2.1 UGSc 93 0 en0 1 198.18.0.1 UGSc 0 0 utun1 2/7 198.18.0.1 UGSc 0 0 utun1 4/6 198.18.0.1 UGSc 0 0 utun1 8/5 198.18.0.1 UGSc 1 0 utun1 16/4 198.18.0.1 UGSc 0 0 utun1 32/3 198.18.0.1 UGSc 3 0 utun1 64/2 198.18.0.1 UGSc 1 0 utun1 ... Internet6: Destination Gateway Flags Netif Expire default fe80::%utun0 UGcI utun0 ...
相当于将socks代理转成了vpn服务了。
那么Linux下有没有类似的工具,经过一番搜搜之后发现了 badvpn 这个项目。这个项目提供了一系列的工具,其中我们这里只使用了 tun2socks
这个命令行工具。
这个工具原本是没法通过socks服务去做udp转发的(通过在目标机器上另外启动一个转发服务可以达成),但是某大神提了一个PR实现了socks5-udp转发功能: bemasc/badvpn@bemasc-udp 。
编译安装badvpn:
1: cd <badvpn-source-dir> 2: mkdir build 3: cd build 4: cmake .. -DCMAKE_INSTALL_PREFIX=<install-dir> 5: make install
经过一番折腾后写下面的脚本: 这里假设socks服务的远程地址是a.b.c.d,原本网络的默认网关是192.168.1.1
1: #!/bin/bash 2: 3: sudo openvpn --mktun --dev tun0 4: sudo ifconfig tun0 10.0.0.1 netmask 255.255.255.0 5: 6: array=( a.b.c.d ) 7: for i in "${array[@]}" 8: do 9: sudo route add $i gw 192.168.1.1 metric 5 10: done 11: 12: sudo route add default gw 10.0.0.2 metric 6 13: 14: badvpn-tun2socks --tundev tun0 --netif-ipaddr 10.0.0.2 --netif-netmask 255.255.255.0 --socks-server-addr 127.0.0.1:7591 --socks5-udp 15:
最后修改下dns服务地址,编辑 /etc/resolv.conf
nameserver 8.8.8.8 nameserver 192.168.1.1