Shane Xu's Home

Life is too short for so much sorrow.

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

Comments

comments powered by Disqus