You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Scapy+NFQUEUE修改IP标识后无法捕获TCP payload求助

排查NetfilterQueue+Scapy无法捕获TCP payload的问题

一、先确认iptables规则是否捕获完整数据包

你的规则可能存在方向或匹配范围问题,导致仅抓到IP头部而非完整数据包。先执行iptables-save查看规则,确保规则针对完整的TCP数据包:

# 针对本机发起的到31112端口的请求,用OUTPUT链
iptables -A OUTPUT -p tcp --dport 31112 -j NFQUEUE --queue-num 1
# 针对外部发往本机31112端口的请求,用INPUT链
iptables -A INPUT -p tcp --dport 31112 -j NFQUEUE --queue-num 1

避免规则中添加了-m iprange等可能截断数据包的限制,确保规则作用于filter表(而非nat或raw表,除非有特殊需求)。

二、检查Scapy的数据包解析逻辑

你当前的代码可能仅解析了IP层,未深入TCP及应用层。修改代码,明确判断并提取TCP payload:

from netfilterqueue import NetfilterQueue
from scapy.all import IP, TCP, conf

# 关闭Scapy的校验和验证,避免因校验和问题跳过解析
conf.checkIPaddr = False
conf.checksum = False

def process_packet(pkt):
    scapy_pkt = IP(pkt.get_payload())
    print(f"Src: {scapy_pkt.src}, Dst: {scapy_pkt.dst}, TTL: {scapy_pkt.ttl}")
    
    # 判断是否包含TCP层,提取payload
    if scapy_pkt.haslayer(TCP):
        tcp_layer = scapy_pkt[TCP]
        # 解码payload,忽略编码错误避免崩溃
        payload = tcp_layer.payload.decode(errors='ignore')
        if payload:
            print(f"TCP Payload:\n{payload}")
    
    # 修改TTL和IP标识
    scapy_pkt.ttl = 40
    scapy_pkt.id = 0xabcd
    # 重新生成数据包并发送
    pkt.set_payload(bytes(scapy_pkt))
    pkt.accept()

nfqueue = NetfilterQueue()
nfqueue.bind(1, process_packet)
try:
    nfqueue.run()
except KeyboardInterrupt:
    pass
nfqueue.unbind()

三、排查IP分片问题

如果数据包被分片,单个分片无法包含完整TCP payload。可以用Scapy的分片重组功能处理:

from scapy.all import defrag

def process_packet(pkt):
    scapy_pkt = IP(pkt.get_payload())
    # 重组所有分片数据包
    defragged_pkt = defrag(scapy_pkt)
    
    if defragged_pkt.haslayer(TCP):
        payload = defragged_pkt[TCP].payload.decode(errors='ignore')
        if payload:
            print(f"Reassembled TCP Payload:\n{payload}")
    
    # 后续修改和发送逻辑...

四、验证原始数据包完整性

如果上述操作仍无法获取payload,可先将原始数据包写入文件,用Wireshark验证是否包含TCP内容:

def process_packet(pkt):
    raw_data = pkt.get_payload()
    with open("captured_packets.bin", "ab") as f:
        f.write(raw_data)
    # 后续解析逻辑...

用Wireshark打开captured_packets.bin,如果文件中没有TCP payload,说明iptables规则未捕获完整数据包;如果有,则是Scapy解析逻辑问题。

五、确认程序运行权限

必须以root权限运行程序,否则NetfilterQueue无法完整处理内核数据包:

sudo python3 your_script.py

内容的提问来源于stack exchange,提问作者aDoN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:15:59