我有一个有趣的问题。
我有一台客户端机器 IP 10.10.10.55,需要连接到服务器机器 IP 10.10.10.5 它们都是 Windows 机器,并且都通过 IP 为 10.10.10.111 的网关 Linux 机器
客户端向服务器发出许多请求,出于测试目的,我希望服务器认为许多不同的 IP 正在访问它。
所以我想到使用 iptables 来从客户端模拟许多源 IP。
我制作了如下表格:
PORT | IP
1020 | 10.10.10.20
1021 | 10.10.10.21
... etc ...
然后我从不同的端口向服务器发送连接,以便网关上的 iptables 可以修改它们。
iptables -t nat -A POSTROUTING -p tcp --dport 1020 -j SNAT --to-source 10.10.10.20
iptables -t nat -A POSTROUTING -p tcp --dport 1021 -j SNAT --to-source 10.10.10.21
... etc ...
现在,问题是我实际上只需要通过端口 1418 访问服务器。这意味着我还必须修改目标端口。但这必须在 PREROUTING 中进行,这意味着我无法在 POSTROUTING 中捕获端口。
iptables -t nat -A PREROUTING -d 10.10.10.5 -p tcp -j DNAT --to-destination 10.10.10.5:1418
所以,我在这里被难住了。
我如何使用 iptables 来获得我想要的结果?我想过做某种回送。我修改预路由中的目标地址以返回网关,并更改源地址。然后当它第二次进入时,它会再次更改目标地址/端口。
iptables -t nat -A PREROUTING -s 10.10.10.55 -d 10.10.10.5 -p tcp -j DNAT --to-destination 10.10.10.111
iptables -t nat -A POSTROUTING -p tcp --dport 1020 -j SNAT --to-source 10.10.10.20
iptables -t nat -A PREROUTING -s 10.10.10.20 -d 10.10.10.111 -p tcp -j DNAT --to-destination 10.10.10.5:1418
但这根本行不通。我确信这一定有办法。谢谢帮助。
输出自iptables -L -v -n
(按照标签要求):
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
答案1
我找到了使用 MARK 选项的解决方案。
对于每个端口我制定如下规则:
iptables -t nat -A PREROUTING -s 10.10.10.55 -d 10.10.10.5 -p tcp --dport 1020 -j MARK --set-mark 1020
还有一个是这样的:
iptables -t nat -A POSTROUTING -m mark --mark 1020 -j SNAT --to-source 10.10.10.20
我还有这条规则可以覆盖目的地,以便它始终能够到达它需要去的地方。
iptables -t nat -A PREROUTING -s 10.10.10.55 -d 10.10.10.5 -p tcp -j DNAT --to-destination 10.10.10.5:1418
我还需要制定一条规则来确保能够收到答复!
iptables -t nat -A PREROUTING -d 10.10.10.20 -j DNAT --to-destination 10.10.10.55
差不多就是这样了!