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

Lio*_*nel 5 ubuntu router iptables

我使用本教程将 linux box 设置为路由器:https : //help.ubuntu.com/community/Router

那台机器上有 2 个网络接口和一个 VPN:eth0 是主要的 Internet 接口,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
Run Code Online (Sandbox Code Playgroud)

这很好用。但现在我想通过 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
Run Code Online (Sandbox Code Playgroud)

然后我创建表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
Run Code Online (Sandbox Code Playgroud)

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  * * *
Run Code Online (Sandbox Code Playgroud)

我想我没有向 tableX 添加正确的路线。关于如何初始化 tableX 的任何建议?

请注意,eth0 路由器 ip 为 192.168.5.1,而 eno1 路由器 ip 为 192.168.8.1

Kha*_*led 0

您需要添加一行,例如:

-A FORWARD -i eno1 -o eth0 -d 203.205.147.173 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

您可能需要将其添加到LOG规则之前。