我需要能够将在端口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
我需要能够将在端口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
Answers:
该--tee
标志不是DNAT链的一部分,它是ROUTE的一部分。您只能在声明之后使用它-j ROUTE
。您可以从iptables获得关于该主题的特定帮助,如下所示:
$ iptables -j ROUTE help
我正在查看您的iptables命令,对我来说这没有任何意义。为什么想要当你的问题,你说“收到packegs来匹配数据包的源和源端口的端口”?您是在尝试将传入流量拆分为两个端口,还是将一个端口的输出连接到另一个端口的输入?
如果是前者,实际上有两个步骤。您不能使用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
ROUTE
以上答案中使用的目标在撰写本文时已过时,并且在最新发行版的iptables中不可用。见serverfault.com/questions/333155/...
除了Caleb的回答,如果您使用的是较新的版本iptables
(v1.4.14),该版本不再具有ROUTE
目标,您将需要以下类似内容,并在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将原始端口上的传入数据包发送和转发到两个新端口。如果您有进程在原始接收端口上进行侦听,则您需要重新配置他们的tee'd港口之一聆听socat
现在是原来的端口上监听。见这SE后例如socat
端口克隆语法。
nc -l -p 8002
iptables
太旧了;请参阅通过两个Internet连接发送重复的数据包。