如何使用 iptables 通过特定接口路由具有特定目标 IP 的数据包

如何使用 iptables 通过特定接口路由具有特定目标 IP 的数据包

我有一个使用本教程设置为路由器的 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规则之前。

相关内容