我已经在 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 等),但都无法正常工作。