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流量:
- 先给路由表起个名字(可选,但方便管理),编辑
/etc/iproute2/rt_tables文件,在末尾加一行:
echo "100 tcptunnel" | sudo tee -a /etc/iproute2/rt_tables
这里100是路由表的编号,tcptunnel是自定义的名称,你可以随便改。
- 给这个路由表添加默认路由(指向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)高,确保标记的流量先匹配到这个规则。
第五步:测试配置是否生效
配置完后,咱们来验证一下:
- 测试非TCP流量:执行
ping google.com,然后用tcpdump -i ens33 icmp抓包,应该能看到ICMP包在ens33上传输,说明ping走的是原来的网卡。 - 测试TCP流量:执行
curl google.com,然后用tcpdump -i tun0 tcp抓包,应该能看到TCP包在tun0上传输,说明TCP流量走了隧道。
让配置永久生效(重启后不丢失)
上面的配置重启后会消失,咱们得把它们持久化:
保存iptables规则:
安装iptables持久化工具:sudo apt install iptables-persistent安装过程中会提示是否保存当前规则,选
Yes即可。之后如果修改了iptables规则,执行sudo iptables-save > /etc/iptables/rules.v4来保存。保存路由和规则:
如果你用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

