pcap和iptables的争斗

pcap和iptables的争斗,iptables,pcap,Iptables,Pcap,我已在计算机上设置了DNS服务器。我想在机器发送之前捕获DNS回复,并更改其中的一些字段,然后发送数据包 我只能更改我的pcap代码(用C编写)捕获的数据包中的字段,这看起来像是一个副本,因为原始数据包也会被传输 我尝试使用iptables删除来自机器的数据包,但它也会删除pcap注入的数据包 有办法解决这个问题吗 谢谢如果您正在寻找仅适用于pcap的解决方案,则必须截获DNS请求数据包,对其进行检查,并在DNS服务器答复之前汇编正确的答复。这看起来不太可靠,因为如果DNS服务器缓存了一个条目,

我已在计算机上设置了DNS服务器。我想在机器发送之前捕获DNS回复,并更改其中的一些字段,然后发送数据包

我只能更改我的pcap代码(用C编写)捕获的数据包中的字段,这看起来像是一个副本,因为原始数据包也会被传输

我尝试使用iptables删除来自机器的数据包,但它也会删除pcap注入的数据包

有办法解决这个问题吗


谢谢

如果您正在寻找仅适用于pcap的解决方案,则必须截获DNS请求数据包,对其进行检查,并在DNS服务器答复之前汇编正确的答复。这看起来不太可靠,因为如果DNS服务器缓存了一个条目,那么它很可能会在组装数据包并发送出去的自定义代码完成之前回复

最可靠的方法是编写一个内核模块,它是netfilter挂钩。Netfilter挂钩能够检查数据包,并在数据包离开机器之前的几个点上影响数据包的处理。将其挂在NF_IP_LOCAL_OUT级别。然后,您可以检查传出的数据包,并查看它是否是符合您的条件的DNS回复。下一部分我还没有完成,但是由于您可以直接访问skb(套接字缓冲区)作为自定义钩子函数的输入参数,因此您可以在那里修改数据包并返回NF_ACCEPT以将响应传递给客户端。如果您需要对请求本身进行一些处理,您可以将其挂接到NF_IP_LOCAL_中,并以多种方式处理它,包括将其传递给用户空间程序

Google上有许多Linux内核编程示例(搜索:Linux内核模块编程)和netfilter挂钩示例。

一个更简单的解决方案(到目前为止)是修改名称服务器的源代码。。。