GHL's Notes/

如何用 tun2socks 更优雅的实现Linux全局代理

前面一篇文章说过,用 iptables+redsocks实现全局代理,但用久了我才发现这玩意容易卡一些奇奇怪怪的错误,后来我才想起有tun2socks这东西,并且优雅简单,更方便。

本教程不适合CentOS用户
请不要模仿该教程,Linux下我并不推荐使用这种方式,我推荐使用Linux版的Clash For Windows或者Clash Core+Dashboard

tun2socks

tun2socks分支有相当多,如下

  1. go-tun2socks(Golang版本)
  2. badvpn-tun2socks(C版本)

我个人习惯用badvpn的版本,因为占内存小,golang缺点就是流量一大内存占用也跟着大,非常坑爹。

安装

badvpn安装很简单,官方有binary源
badvpn下载binary源

不过更新速度好像比较慢,还是直接编译源码方便

先安装依赖

apt install libnss3-dev build-essential make cmake net-tools git

然后一键编译

git clone https://github.com/ambrop72/badvpn.git && cd badvpn && mkdir build && cd build && cmake .. -DCMAKE_INSTALL_PREFIX=/usr && make install

编译完了就能用了。但还需要自己添加一个tun网卡,需要开启Linux tun/tap支持

为了偷懒,我把这些写成一键脚本

新建一个文件,自动添加网卡,这样就不需要每次手动添加了,或者自己去新建一个/etc/network/里面的配置文件,/etc/init.d/tun2s,名字随意,一定要在/etc/init.d/目录

给这个文件添加以下内容

#!/bin/bash
### BEGIN INIT INFO
# Provides:          tun2s
# Required-Start:    $network $syslog
# Required-Stop:     $syslog 
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: fast and reliable load balancing reverse proxy
# Description:       This file should be used to start and stop haproxy.
### END INIT INFO

ip tuntap add dev tun2 mode tun
ifconfig tun2 192.168.168.0/24 netmask 255.255.255.0
route add default gw 192.168.168.2

192.168.168.0那个可以改,如果被占用你就改个其他的

然后再新建一个文件,/etc/systemd/system/tun2socks.service,使用systemd守护tun2socks防止挂彩

添加以下内容

[Unit]
Description=tun2socks
After=network.target
Wants=network.target

[Service]
Type=simple
#PIDFile=/run/tun2socks.pid
User=root
Group=root
ExecStart=/usr/bin/badvpn-tun2socks --netif-ipaddr 192.168.168.2 --netif-netmask 255.255.255.0 --socks-server-addr "192.168.xx.1:8888" --tundev "tun2" 
Restart=always
# Don't restart in the case of configuration error
RestartPreventExitStatus=23

[Install]
WantedBy=multi-user.target

tun2改成你tun网卡名字,netif改成你在上面填的虚拟子网段,socks-server-addr改成你的虚拟机网段,:8888改成你的socks5端口

然后添加开机启动

update-rc.d tun2s(或者你自己改的名字) defaults
systemctl enable tun2socks

搞定了,简单快速。要jb iptables转发来转发去

留下一条评论

共有 12 条评论

  1. IronMan:

    你这里的 socks-server-addr 参数不能指定本地机器上的 socks5 端口吧?我想让流量转发到本地的 Clash 的 socks 端口上面去。

    November 2nd, 2020 at 10:37 pm 回复
    1. GHL:

      可以的,改成127.0.0.1:8888就是本地的clash了。

      November 5th, 2020 at 05:59 pm 回复
  2. um:

    编译完了,然后文件也丢进去了。最后自启动也OK。不过无效啊。
    看 ifconfig 里面网卡没有那个 /etc/init.d/tun2s 的配置网卡,是还需要什么操作吗?

    February 9th, 2021 at 02:43 pm 回复
    1. GHL:

      你的问题可能是你没有开启tun/tap支持,一般那个脚本会自动生成一个网卡的。可以输入命令cat /dev/net/tun检测是否开启tun/tap支持,如果返回cat: /dev/net/tun: File descriptor in bad state,就是已经开启,建议把错误发到留言来

      March 7th, 2021 at 02:18 am 回复
    2. jun:

      你的环境里,代理服务器和你的机子在同一个网段?

      May 18th, 2021 at 08:01 pm 回复
  3. tomassky:

    您好,想请假在,在socks-server-addr中设置本地的clash不会形成一个回环吗,同样的在iptables+redsocks中,redsocks.conf文件指定服务器为本地127.0.0.1,也会形成一个回环,请问怎么解决呢?感谢回答

    October 5th, 2021 at 12:29 am 回复
    1. tomassky:

      能否以邮件回复我呢,期待并感谢您的回复

      October 5th, 2021 at 12:32 am 回复
      1. GHL:

        你好!由于这篇教程是我学习tun2socks时候写的,目前已经过时了。如果您需要在Linux上使用clash,我推荐您用Linux版本的clash for Windows。

        另外回答下您提出的问题,iptables+redsocks方法有对127.0.0.1进行回环处理,请看一下ufw的规则,tun2socks,只是将网卡出流量进行处理,因此我相信他不会涉及到回环问题。

        October 5th, 2021 at 12:46 pm 回复
        1. tomassky:

          感谢您的回复,clash for window没有arm架构版本的,我只能去找clash,发现目前clash的全局代理模式目前暂未发现有很好的文档说明,所以目前是想通过tun2socks来实现全局。

          October 6th, 2021 at 01:55 am 回复
          1. tomassky:

            目前遇到的回环情况,无论是在通过iptables去做全局代理,还是tun+路由表的形式,当我把代理服务器设置为127.0.0.1本地的服务器时候,一请求,就会发生大量的数据包;而当我把代理服务器设置为局域网内其他的设备时,就不会出现这样的情况,感觉唯一可能就是回环....

            October 6th, 2021 at 01:57 am
          2. GHL:

            您好,感谢回复。我没有想到我这篇随便写出来的文章会有这么多人参考,我会重新写一篇较为新的教程,新教材会设法避免您提到的问题

            October 6th, 2021 at 10:49 am
          3. tomassky:

            大哥,回环问题已解决,通过策略路由,具体可以看clash的这边[https://comzyh.gitbook.io/clash/real-ip-tun-example],不过还是期待大哥新的教材

            October 8th, 2021 at 10:57 pm