ubuntu使用tun2socks进行全局代理

tun2socks 是一种实现全局代理的高级技术,它通过创建虚拟网络接口(TUN 设备)和修改路由表,将所有网络流量(包括 TCP/UDP)重定向到 SOCKS 代理。以下是详细实现原理和操作步骤:


  1. 创建虚拟网卡:创建 TUN 虚拟网络设备(如 tun0),作为系统的新网络接口。

  2. 路由重定向:修改系统路由表,将所有流量(或特定流量)指向虚拟网卡。

  3. 流量拦截与转换:tun2socks 监听虚拟网卡:

    • 读取原始 IP 数据包
    • 将 TCP/UDP 流量转换为 SOCKS 协议格式
    • 通过本地 SOCKS 代理(如 127.0.0.1:1080)转发
  4. 响应处理: 将代理返回的数据重新封装为原始 IP 数据包,写回虚拟网卡。


sudo apt update
sudo apt install iproute2 net-tools

# 安装 tun2socks (推荐使用 go 版本)
sudo apt install golang
go install github.com/eycorsican/go-tun2socks/cmd/tun2socks@latest
# 创建 TUN 设备
sudo ip tuntap add dev tun0 mode tun

# 分配 IP 地址(使用私有 IP 段)
sudo ip addr add 10.0.0.1/24 dev tun0

# 启用设备
sudo ip link set dev tun0 up
# 添加默认路由到 TUN 设备
sudo ip route add default via 10.0.0.2 dev tun0

# 排除本地 SOCKS 代理(避免回环)
sudo ip route add 127.0.0.1 via $(ip route show default | awk '{print $3}') dev $(ip route show default | awk '{print $5}')
# 假设 SOCKS5 代理在 127.0.0.1:1080
sudo ~/go/bin/tun2socks -device tun0 -proxy socks5://127.0.0.1:1080
# 方法1:使用 DNS over TCP(推荐)
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

# 方法2:使用 dns2socks 工具
sudo apt install dns2socks
dns2socks 127.0.0.1:1080 8.8.8.8:53 127.0.0.1:53 &
echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf
sudo sysctl -w net.ipv4.ip_forward=1

创建 systemd 服务:

sudo nano /etc/systemd/system/tun2socks.service

内容如下:

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

[Service]
Type=simple
ExecStartPre=/sbin/ip tuntap add dev tun0 mode tun
ExecStartPre=/sbin/ip addr add 10.0.0.1/24 dev tun0
ExecStartPre=/sbin/ip link set dev tun0 up
ExecStartPre=/sbin/ip route add default via 10.0.0.2 dev tun0
ExecStart=/home/$USER/go/bin/tun2socks -device tun0 -proxy socks5://127.0.0.1:1080
ExecStopPost=/sbin/ip link del dev tun0
Restart=always

[Install]
WantedBy=multi-user.target

启用服务:

sudo systemctl daemon-reload
sudo systemctl enable --now tun2socks

# 检查路由
ip route show

# 测试 TCP
curl --connect-timeout 5 http://ipinfo.io

# 测试 UDP (DNS)
dig +tcp @8.8.8.8 google.com  # 必须使用 TCP

  1. 排除特定流量

    # 排除内网流量
    sudo ip route add 192.168.0.0/16 via $(ip route show default | awk '{print $3}')
  2. UDP 支持优化:使用支持 UDP 的 tun2socks 版本:

    go install -tags 'udpgw' github.com/eycorsican/go-tun2socks/cmd/tun2socks@latest
  3. 性能优化

    # 增大 socket 缓冲区
    sudo sysctl -w net.core.rmem_max=26214400
    sudo sysctl -w net.core.wmem_max=26214400
  4. 多协议支持: 直接对接 V2Ray/Xray:

    tun2socks -device tun0 -proxy socks5://127.0.0.1:1080 -udpgw 127.0.0.1:7300

  1. DNS 解析失败

    • 确保使用 TCP DNS (dig +tcp)
    • 检查 /etc/resolv.conf 配置
    • 使用 dns2socksdnscrypt-proxy
  2. 连接速度慢

    # 调整 MTU
    sudo ip link set dev tun0 mtu 1400
  3. 部分应用不工作

    # 检查应用是否使用原始套接字
    sudo tcpdump -i tun0 -n
  4. 服务启动失败: 检查日志:

    journalctl -u tun2socks -f

通过以上配置,所有应用程序(包括命令行工具、GUI 应用、系统服务)的网络流量都将通过 SOCKS 代理,实现真正的系统级全局代理。