iptables 端口镜像

Par*_*hit 9 linux iptables tcp

我需要能够获取在端口 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
Run Code Online (Sandbox Code Playgroud)

Jon*_*ham 7

除了Caleb的回答之外,如果您正在使用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
Run Code Online (Sandbox Code Playgroud)

使用“netcat”( man nc) 进行测试。在终端窗口中输入以下内容并按以下Enter键:

nc -l 8002
Run Code Online (Sandbox Code Playgroud)

该命令将等待您将在第二个终端窗口中键入的输入。

在第二个终端窗口中输入以下内容并按下Enter键:

nc 127.0.0.1 8001
Run Code Online (Sandbox Code Playgroud)

该命令将等待进一步的输入。输入任何内容并按下Enter键。在Enter第二个终端窗口中按下该键后,您在第二个终端窗口中键入的文本应出现在第一个终端窗口中。Ctrl在第二个窗口中按-c 结束会话。


* RHEL/Centos(6.5 或更早版本)支持此语法:-( 因此您需要使用socattee 并将原始端口上的传入数据包转发到两个新端口。如果您有进程在原始接收端口上侦听,那么您需要重新配置它们以侦听 tee 端口之一,就像socat现在原始端口上的侦听器一样。请参阅此 SE 帖子socat获取端口克隆的示例语法。


Cal*_*leb 6

--tee标志是不是DNAT链的一部分,它是路线的一部分。您只能在声明之后使用它-j ROUTE。您可以从 iptables 获得有关该主题的具体帮助,如下所示:

 $ iptables -j ROUTE help
Run Code Online (Sandbox Code Playgroud)

我正在查看您的 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
Run Code Online (Sandbox Code Playgroud)