我有一个 ubuntu 20 系统,并且我正在尝试在我的系统和远程服务器之间创建一个隧道,因为我的客户端系统不能有任何传入/传出的 TCP 流量。
我创建了一个 tun0 虚拟接口,并且我只希望 TCP 数据包被路由到该接口,因此我的程序可以读取它们,将数据包包装在不同的协议(即 DNS)中并将其发送到我的隧道端点。
我已经将所有流量从我的计算机路由到接口,但这将拒绝我的系统执行其他与 TCP 无关的流量(例如 ping 我的路由器或 google.com)。
我使用的规则:
sudo ip route del default
sudo ip route add default via 10.1.0.1 dev tun0
sudo ip route add 192.168.1.127 via 192.168.1.1 dev ens33
其中 192.168.1.1 是我的默认 gw 10.1.0.1 是我的 tun0 ip 192.168.1.127 是我的服务器的 ip
我怎样才能仅路由 TCP 流量?
答案1
我通过使用不同的路由表并标记要使用该表路由的特定数据包来实现这一点。
要创建到我的 tun 接口 ip 的默认路由:
ip route add default via 10.0.0.1 table 3
标记传出的 TCP 数据包:
iptables -t mangle -A OUTPUT -p tcp -j MARK --set-mark 2
最后,为了确保这些数据包通过表 3 进行路由,表 3 是用于转发标记数据包的 IP 规则:
ip rule add fwmark 2 table 3