使用iptables在VPS中修改ICMP(ping)数据包大小的问题咨询
使用iptables在VPS中修改ICMP(ping)数据包大小的问题咨询
你好呀!看了你的问题,你想通过iptables把VPS和特定IP之间的ICMP(ping)数据包大小从默认64字节改成1字节,但之前的命令没生效,对吧?我来帮你分析下问题,再给出可行的方案~
先说说你之前命令的问题
你写的这两条iptables规则:
iptables -A INPUT -p icmp --icmp-type echo-request -s <IP_address> -m length --length 1 -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type echo-reply -d <IP_address> -m length --length 1 -j ACCEPT
其实只是匹配并允许长度为1的ICMP数据包通过,并没有修改现有数据包的长度哦!原来的64字节数据包还是会正常走默认规则(比如默认允许的话),所以你ping的时候看到的还是64字节,这就是为什么你的命令没效果~
怎么实现修改ICMP数据包大小?
首先要明确:iptables本身没有直接修改ICMP数据包内容长度的功能,它主要负责过滤、转发数据包。要修改数据包内容,我们可以分两种情况处理:
方案1:直接控制VPS主动ping的数据包大小
如果你只是想让VPS主动ping特定IP时发送1字节的数据包,根本不需要iptables,直接用ping命令的-s参数就可以:
ping -s 1 <IP_address>
这里的-s 1是指定ICMP数据包的数据部分为1字节,加上8字节的ICMP头部,总长度是9字节(和你想要的1字节数据部分对应)。
方案2:用iptables+NFQUEUE强制修改所有来往特定IP的ICMP包
如果是要强制修改所有来往特定IP的ICMP包(包括外部发给VPS的ping请求,以及VPS发出的回复),那需要借助iptables的NFQUEUE模块,配合用户空间程序来编辑数据包。
举个简单的实现步骤:
- 先配置iptables规则,把目标IP的ICMP包转到NFQUEUE队列:
# 把来自特定IP的echo-request转到队列1 iptables -A INPUT -p icmp --icmp-type echo-request -s <IP_address> -j NFQUEUE --queue-num 1 # 把发给特定IP的echo-reply转到队列2 iptables -A OUTPUT -p icmp --icmp-type echo-reply -d <IP_address> -j NFQUEUE --queue-num 2
- 写一个Python脚本修改数据包长度(需要先安装
python-netfilterqueue和scapy):
from netfilterqueue import NetfilterQueue import scapy.all as scapy def modify_icmp(pkt): scapy_pkt = scapy.IP(pkt.get_payload()) if scapy_pkt.haslayer(scapy.ICMP): # 将ICMP的数据部分改为1字节的空内容 scapy_pkt[scapy.ICMP].load = b'\x00' # 重新计算IP和ICMP的校验和,否则数据包会被丢弃 del scapy_pkt[scapy.IP].chksum del scapy_pkt[scapy.ICMP].chksum pkt.set_payload(bytes(scapy_pkt)) pkt.accept() # 绑定队列1处理输入包 nfq1 = NetfilterQueue() nfq1.bind(1, modify_icmp) # 绑定队列2处理输出包 nfq2 = NetfilterQueue() nfq2.bind(2, modify_icmp) try: nfq1.run() nfq2.run() except KeyboardInterrupt: nfq1.unbind() nfq2.unbind()
这个脚本会把经过队列的ICMP包的数据部分改成1字节,同时重新计算校验和保证数据包能正常传输。
额外提醒
- 修改过小的ICMP包可能会被部分网络设备过滤,导致ping不通;
- 如果你只是想限制VPS接收的ping包大小,也可以用iptables丢弃超过1字节的ICMP包,但这是过滤而非修改,外部默认的64字节ping会被直接丢弃:
iptables -A INPUT -p icmp --icmp-type echo-request -s <IP_address> -m length --length 2:65535 -j DROP
备注:内容来源于stack exchange,提问作者Kingphoenix
相关产品推荐
相关产品推荐

