![如何使用 iptables 通过特定接口路由具有特定目标 IP 的数据包](https://linux22.com/image/715306/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20iptables%20%E9%80%9A%E8%BF%87%E7%89%B9%E5%AE%9A%E6%8E%A5%E5%8F%A3%E8%B7%AF%E7%94%B1%E5%85%B7%E6%9C%89%E7%89%B9%E5%AE%9A%E7%9B%AE%E6%A0%87%20IP%20%E7%9A%84%E6%95%B0%E6%8D%AE%E5%8C%85.png)
我有一个使用本教程设置为路由器的 Linux 机器:https://help.ubuntu.com/community/Router
该机器上有 2 个网络接口和一个 VPN:eth0 是主互联网接口,eno1 是内联网,tun0 是 VPN 接口。
按照教程,我使用以下脚本通过 vpn 路由来自 eno1 的所有内容:
iptables-restore <<-EOF
*nat
-A POSTROUTING -o tun0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A FORWARD -i tun0 -o eno1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i eno1 -o tun0 -j ACCEPT
-A FORWARD -j LOG
COMMIT
EOF
效果很好。但现在我想通过 eth0 路由来自 eno1 且目标 IP 为 203.205.147.173 的所有数据包。
我应该在脚本中添加什么样的 iptables 规则?
编辑
我已将脚本更改如下,将所有数据包标记为 203.205.147.173:
iptables-restore <<-EOF
*nat
-A POSTROUTING -o tun0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A FORWARD -i tun0 -o eno1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i eno1 -o tun0 -j ACCEPT
-A FORWARD -j LOG
COMMIT
*mangle
-A PREROUTING -i "$INTIF" -d 203.205.0.0/16 -j MARK --set-mark 0x15
COMMIT
EOF
然后我创建表X:
sudo nano /etc/iproute2/rt_tables
,然后1 tableX
在文件末尾添加。
然后添加规则和路由:
sudo ip rule add fwmark 0x15 lookup tableX
sudo ip route add default via 192.168.5.1 dev eth0 table tableX
sudo ip route add 203.205.0.0/16 via 192.168.5.1 dev eth0 table tableX
但traceroute 203.205.147.173
超时:
traceroute to 203.205.147.173 (203.205.147.173), 64 hops max, 52 byte packets
(192.168.8.1) 2.384 ms 1.060 ms 1.027 ms
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
7 * * *
8 * * *
我认为我没有向 tableX 添加正确的路由。关于如何初始化 tableX 有什么建议吗?
请注意,eth0 路由器 ip 为 192.168.5.1,eno1 路由器 ip 为 192.168.8.1
答案1
iptables 本身不路由任何内容,但可以通过防火墙标记影响路由决策。您可以使用 ip 工具添加另一个路由表(类似于ip route add <route> ... table X
,然后添加规则以通过防火墙标记路由数据包(ip rule add fwmark 0x1 lookup X
),并使用 iptables 规则标记数据包(iptables -t mangle -A PREROUTING ... -j MARK --set-mark 0x1
)。完成这些步骤后,标记的数据包将通过路由表 X 进行路由。您可以从 LARTC(linux 高级路由和流量控制)获取更多信息。
答案2
您需要添加如下一行:
-A FORWARD -i eno1 -o eth0 -d 203.205.147.173 -j ACCEPT
您可能需要将其添加在LOG
规则之前。