我需要能够获取端口 8001 上收到的数据包的副本到端口 8002。我已尝试以下操作,但出现 --tee 未定义的错误。
sudo iptables -t nat -A PREROUTING -p TCP -s 127.0.0.1 --sport 8001 -j DNAT --to-destination 127.0.0.1:8002 --tee
答案1
进一步迦勒的答案,如果您正在使用iptables
不再具有ROUTE
目标的较新版本(v1.4.14),您将需要类似以下内容,并在 Debian Wheezy* 上进行了测试:
iptables -A PREROUTING -t mangle -p tcp ! -s 127.0.0.1 --dport 8001 -j TEE --gateway 127.0.0.1
iptables -A OUTPUT -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002
使用“netcat”( man nc
) 进行测试。在终端窗口中键入以下内容并按 键Enter
:
nc -l 8002
该命令将等待您在第二个终端窗口中键入的输入。
在第二个终端窗口中键入以下内容并按Enter
键:
nc 127.0.0.1 8001
该命令将等待进一步的输入。输入任何内容并按下Enter
按键。在第二个终端窗口中按下该Enter
键后,您在第二个终端窗口中键入的文本应出现在第一个终端窗口中。在第二个窗口中按Ctrl
-c 结束会话。
*这个语法是不是在 RHEL/Centos(6.5 或更早版本)中支持:-( 因此您需要使用socat
tee 并将原始端口上的传入数据包转发到两个新端口。如果您有进程在原始接收端口上侦听,那么您需要将它们重新配置为侦听已发通的端口之一,就像socat
现在原始端口上的侦听器一样。这篇SE帖子例如socat
端口克隆的语法。
答案2
该--tee
标志不是 DNAT 链的一部分,而是 ROUTE 的一部分。您只能在声明后使用它-j ROUTE
。您可以从 iptables 获得有关该主题的具体帮助,如下所示:
$ iptables -j ROUTE help
我正在查看您的 iptables 命令,它对我来说没有任何意义。当您在问题中说“收到的数据包”时,为什么要尝试匹配数据包的源和源端口在您是否正在尝试将传入流量拆分为两个端口,或者将一个端口的输出连接到另一个端口的输入?
如果是前者,实际上有两个步骤。您不能使用 tee 获取数据包的副本并同时破坏数据包以更改端口号。您可以分两步尝试此操作,首先向自己发送数据包的副本,然后仅匹配该副本并修改目标端口。警告:未经测试,请考虑以下伪代码:
$ sudo iptables -A PREROUTING -t mangle -p tcp -s !127.0.0.1/32 --dport 8001 -j ROUTE --gw 127.0.0.1 --tee
$ sudo iptables -A POSTROUTING -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002