调试数据包丢失的原因

调试数据包丢失的原因

我已经在 stackoverflow 上开始,然后经过一些调查后向超级用户询问,因为它看起来像网络或内核(错误)配置,但可能需要一些经验丰富的网络工程师来帮忙:)

我在 NFQUEUE 的帮助下处理数据包,iptables 中只有一条规则:

iptables -A OUTPUT -p tcp -m tcp --dport 80 -j NFQUEUE --queue-num 1

该脚本很简单(python,需要pypacker):

import re, time

from pypacker import interceptor
from pypacker.layer3 import ip
from pypacker.layer4 import tcp

def handle_packet(ll_data, ll_proto_id, data, ctx, *args):
    ip_part = ip.IP(data)
    tcp_part=ip_part[tcp.TCP]

    if body := tcp_part.body_bytes:        
        new_body=re.sub(b'/[a-z]+', b'/uuid', tcp_part.body_bytes)
        if new_body != tcp_part.body_bytes:
            tcp_part.body_bytes=new_body
            data=ip_part.bin() # Will be returned

    return data, interceptor.NF_ACCEPT

ictor = interceptor.Interceptor()
ictor.start(handle_packet, queue_ids=[0, 1, 2])
time.sleep(180)
ictor.stop()

使用 curl 进行测试:

curl http://httpbin.org/ip

当我增加长度时,响应数据包(200 OK)被丢弃(如果我配置了 PREROUTING 规则,我会在 tcpdump 和 nfqueue 中看到它)。当修改后的数据包的长度相同或更小时(例如,请求 /ipip 或 /ipaaa),将返回响应。

有人能告诉我在哪里可以找到解决方案吗?不幸的是,dropwatch 只说了这一点:

1 drops at _einittext+1dacb95a (0xffffffffa002584c)

我尝试过在不同的服务器(gentoo、ubuntu)上使用不同的内核和设置(尝试使用连接跟踪、禁用 rp_filter 等),但都无法正常工作。

相关内容