如何使用 iptables 将出站流量重定向到另一个 IP

lal*_*ala 5 ubuntu iptables iptables-redirect

我有 server1 (192.168.0.1:8080) 和 server2 (192.168.0.2:8765)。我需要使用 iptables 将 OUTBOUND 流量从 server1 端口 8080 重定向到 server2。

在 server1 上我设置:

echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A OUTPUT -p tcp --sport 8080 -m owner --uid-owner nobody -j ACCEPT
iptables -t nat -A OUTPUT -p tcp --sport 8080 -m owner --uid-owner tomcat7 -j DNAT --to-destination 192.168.0.2:8765
Run Code Online (Sandbox Code Playgroud)

但它不起作用。没有-m-uid-owner参数也不起作用。

小智 8

我使用如下规则将用于给定主机:端口的输出流量重定向到另一个主机:端口。(它是为了模拟 VM 集群中的嵌入式系统(具有固定地址)。)

iptables -t nat -A OUTPUT -p tcp -d 192.168.1.101 --dport 1234 -j DNAT --to-destination 192.168.1.102:4321
Run Code Online (Sandbox Code Playgroud)

如果您安装了上述规则:

root@archive:~# telnet 192.168.1.101 8888
Run Code Online (Sandbox Code Playgroud)

您将看到流向指定地址的流量:

root@archive:~# tcpdump -i eth2 host 192.168.1.102 or host 192.168.1.101
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 262144 bytes
21:04:27.953124 IP archive.34496 > 192.168.1.101.8888: Flags [S], seq 2498286032, win 29200, options [mss 1460,sackOK,TS val 961612280 ecr 0,nop,wscale 7], length 0
21:04:28.949044 IP archive.34496 > 192.168.1.101.8888: Flags [S], seq 2498286032, win 29200, options [mss 1460,sackOK,TS val 961612530 ecr 0,nop,wscale 7], length 0
Run Code Online (Sandbox Code Playgroud)

如果你:

root@archive:~# telnet 192.168.1.101 1234
Run Code Online (Sandbox Code Playgroud)

您应该会看到流向转换地址的流量:

21:04:50.321139 IP archive.53164 > 192.168.1.102.4321: Flags [S], seq 2332928074, win 29200, options [mss 1460,sackOK,TS val 961617873 ecr 0,nop,wscale 7], length 0
21:04:52.325090 IP archive.53164 > 192.168.1.102.4321: Flags [S], seq 2332928074, win 29200, options [mss 1460,sackOK,TS val 961618374 ecr 0,nop,wscale 7], length 0
Run Code Online (Sandbox Code Playgroud)

您问题中的规则指定了一个源端口(--sport)。对于 OUTBOUND 流量,您通常不知道源端口 - 它通常在套接字绑定/连接时动态分配。例如:上述转储中的 34496 和 53164。