如何使用 iptables 发回 TCP 数据包

如何使用 iptables 发回 TCP 数据包

我正在尝试演示使用未安装侦听器的 Ubuntu 18.04 盒(模拟 QNX 设置)的 TCP 通信。考虑到由于某些许可问题,可能无法很快加载和运行侦听器程序。是否可以使用 iptables 接受来自客户端的连接,接收传入的数据包并将其发送回客户端?

如果是,命令是什么?我想使用 netcat 来演示消息的发送和接收。

我已经尝试过以下命令关联。

echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.conf.ens4.route_localnet=1
sudo iptables -A FORWARD -i ens4 -o ens4 -m state --state RELATED,ESTABLISHED -j ACCEPT

我也尝试了下面来自另一个 StackOverflow 问题的命令。

sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination <IP>:80
sudo iptables -t nat -I OUTPUT -p tcp --dport 80 -j DNAT --to-destination <IP>:80

但 netcat 立即退出。不确定它是否尝试过连接。

netcat <IP> 80

除了 iptables 之外的其他想法也受到欢迎。

答案1

对于简单的演示,使用转发流量可能更容易ncat,就像在答案中一样这里基本上只需使用 ncat 作为您的监听器,然后启动另一个 ncat 将任何数据重新发送回您的客户端。(确保您的客户端也在您选择的任何端口上监听此数据)

ncat -l 10.0.0.1 80 --sh-exec "ncat 10.0.0.2 80"

这足以查看您自己发送的流量,但只能在一个方向上起作用。如果您需要查看来回流量(如网络流量),那么您可能需要更高级的功能,例如您尝试过的 iptables 路由。

dnat规则中的代表d目标网络地址转换,它们只重新映射数据包的目标 IP。由于您计划的源和目标是同一个 IP,因此您还需要设置snat规则来重新映射源 IP 地址:

iptables -t nat -A PREROUTING  -p tcp --dst $HOST_IP   --dport 8000 -j DNAT --to-destination $CLIENT_IP
iptables -t nat -A POSTROUTING -p tcp --dst $CLIENT_IP --dport 8000 -j SNAT --to-source $HOST_IP 

我找到了几篇关于此的很好的文章:


客户端测试用例示例:

# listen on port 8000 in background
nc -l 8000 > nc.out &
# verify netcat is listening on client
netstat -ln | grep 8000

# send some data to server via netcat, and you should see job finish if server forwarded successfully
echo hello world | nc 10.0.0.1 8000
[1]+  Done                    nc -l 8000 > nc.out

# and you should see your data captured
cat nc.out
hello world

根据您的发行版,您可能无法监听受保护的端口,如 80(例如 selinux 可能会阻止)。确保您已启用 ip 转发,因为它通常默认关闭:

# check current status
sysctl net.ipv4.ip_forward

相关内容