如何在无监听程序的Ubuntu 18.04(模拟QNX环境)中实现TCP数据包回传?
当然可以实现!你遇到的核心问题是:没有用户态监听进程时,内核会直接发送RST包拒绝TCP连接,所以netcat才会立刻退出。下面给你两种可行方案,分别对应「能建立完整TCP连接并回显消息」和「仅回传数据包(无需完整连接)」的场景:
方案一:利用内核自带的Echo服务(支持完整TCP连接)
Echo服务是TCP/IP标准服务之一,由内核或xinetd/inetd托管,不需要额外安装程序,刚好符合你不能加载第三方监听程序的要求。
操作步骤:
开启Echo服务
Ubuntu 18.04默认用xinetd管理标准服务,先检查配置文件:sudo nano /etc/xinetd.d/echo把其中的
disable = yes改成disable = no,保存退出后重启xinetd:sudo systemctl restart xinetd(如果系统用的是inetd,编辑
/etc/inetd.conf,去掉echo stream tcp nowait root internal这行的注释,然后重启inetd即可)配置iptables转发规则
把外部请求的目标端口(比如你用的80)转发到本地Echo服务的端口(默认是7):# 开启IP转发 echo 1 > /proc/sys/net/ipv4/ip_forward # 允许本地接口路由外部流量 sudo sysctl -w net.ipv4.conf.ens4.route_localnet=1 # DNAT规则:把80端口的TCP请求转发到本地127.0.0.1:7 sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:7 # 允许Echo服务的流量通过 sudo iptables -A INPUT -p tcp --dport 7 -j ACCEPT sudo iptables -A OUTPUT -p tcp --sport 7 -j ACCEPT测试验证
在客户端运行:nc <你的Ubuntu服务器IP> 80现在输入任意内容,回车后就能收到一模一样的回显,完美实现消息收发!
方案二:用iptables的MIRROR模块(仅回传数据包,无需完整连接)
如果连xinetd都不能启动,那可以用内核的xt_MIRROR模块,它能直接把收到的数据包原封不动回传给客户端,不需要任何用户态进程。
操作步骤:
加载MIRROR模块
sudo modprobe xt_MIRROR添加iptables规则
让目标端口80的TCP数据包全部回传:sudo iptables -A INPUT -p tcp --dport 80 -j MIRROR测试验证
运行nc <服务器IP> 80时,你会看到连接被重置(因为没有完成TCP三次握手),但用tcpdump抓包就能看到:客户端发送的每个数据包都被服务器原样回传了:sudo tcpdump -i ens4 port 80
其他替代思路
如果上述方法都受限,还可以试试:
- 调整内核参数禁用RST包:通过修改
net.ipv4.tcp_rst_timeout等参数,让内核不主动发送RST,但这种方法只能让客户端认为连接已建立,无法实现消息回传。 - 临时使用Netfilter队列模块:加载
nfnetlink_queue模块,配合极简的C程序处理数据包,但这需要编译内核模块,可能不符合你的license限制。
备注:内容来源于stack exchange,提问作者kingvittu

