You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 20系统仅将TCP出站流量路由至tun0虚拟接口的配置方案咨询

Ubuntu 20系统仅将TCP出站流量路由至tun0虚拟接口的配置方案咨询

嗨,我完全理解你现在的困扰:之前把默认路由全指向tun0后,非TCP流量(比如ping)都没法正常走原来的网卡了,想要只让TCP流量走隧道,其他流量保持正常的默认网络。咱们可以用策略路由+iptables标记的方案来实现,这是最靠谱的方式——因为直接的路由规则没法单独匹配协议类型,得先给TCP流量打标记,再让策略路由根据标记走专门的路由表。

下面是具体的配置步骤,你可以一步步来:

第一步:先恢复原有默认路由(如果之前删了的话)

先把之前的错误配置还原,让非TCP流量能正常走原来的网卡:

sudo ip route add default via 192.168.1.1 dev ens33

如果之前删了默认路由,这一步会帮你恢复;如果没删,执行也不会有问题(重复添加会提示已存在)。

第二步:创建专门的TCP流量路由表

我们需要新建一个独立的路由表,专门用来处理要走tun0的TCP流量:

  1. 先给路由表起个名字(可选,但方便管理),编辑/etc/iproute2/rt_tables文件,在末尾加一行:
echo "100 tcptunnel" | sudo tee -a /etc/iproute2/rt_tables

这里100是路由表的编号,tcptunnel是自定义的名称,你可以随便改。

  1. 给这个路由表添加默认路由(指向tun0),同时要确保到隧道端点的流量不走隧道(不然会陷入循环):
# 让TCP流量默认走tun0
sudo ip route add default via 10.1.0.1 dev tun0 table tcptunnel
# 确保到隧道服务器192.168.1.127的流量走原来的ens33
sudo ip route add 192.168.1.127/32 via 192.168.1.1 dev ens33 table tcptunnel

第三步:用iptables给TCP出站流量打标记

接下来,我们需要给所有出站的TCP流量打上一个标记,这样策略路由就能识别它们并引导到刚才的tcptunnel路由表:

sudo iptables -t mangle -A OUTPUT -p tcp -j MARK --set-mark 0x1

这里0x1是我们自定义的标记值(你也可以用其他数值,只要后续规则对应上就行),mangle表专门用来修改数据包的标记信息。

第四步:添加策略路由规则,让带标记的流量走指定路由表

现在告诉系统:所有带有0x1标记的流量,都用tcptunnel路由表:

sudo ip rule add fwmark 0x1 table tcptunnel pref 100

pref 100是设置规则的优先级,数值越小优先级越高,这里设100比默认规则(优先级32766)高,确保标记的流量先匹配到这个规则。

第五步:测试配置是否生效

配置完后,咱们来验证一下:

  1. 测试非TCP流量:执行ping google.com,然后用tcpdump -i ens33 icmp抓包,应该能看到ICMP包在ens33上传输,说明ping走的是原来的网卡。
  2. 测试TCP流量:执行curl google.com,然后用tcpdump -i tun0 tcp抓包,应该能看到TCP包在tun0上传输,说明TCP流量走了隧道。

让配置永久生效(重启后不丢失)

上面的配置重启后会消失,咱们得把它们持久化:

  1. 保存iptables规则:
    安装iptables持久化工具:

    sudo apt install iptables-persistent
    

    安装过程中会提示是否保存当前规则,选Yes即可。之后如果修改了iptables规则,执行sudo iptables-save > /etc/iptables/rules.v4来保存。

  2. 保存路由和规则:
    如果你用Netplan(Ubuntu 20默认用Netplan),可以把路由和规则写到Netplan配置文件里,这样更规范。比如编辑/etc/netplan/01-netcfg.yaml(文件名可能不同,看你系统里的),添加以下内容(注意YAML的缩进,必须用空格):

    network:
      version: 2
      ethernets:
        ens33:
          addresses: [你的ens33IP/24]  # 替换成你实际的IP,比如192.168.1.100/24
          gateway4: 192.168.1.1
          nameservers:
            addresses: [8.8.8.8, 1.1.1.1]
      routing-policy:
        - from: 0.0.0.0/0
          fwmark: 0x1
          table: 100
      routes:
        - to: 0.0.0.0/0
          via: 10.1.0.1
          dev: tun0
          table: 100
        - to: 192.168.1.127/32
          via: 192.168.1.1
          dev: ens33
          table: 100
    

    然后执行sudo netplan apply让配置生效,重启后也会保留。

备注:内容来源于stack exchange,提问作者YMeC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 08:32:39