我可以使用原始套接字拦截网络数据包(不仅仅是嗅探)吗?

时间:2016-07-25 14:38:42

标签: linux sockets networking

这是我第一次使用原始套接字(是的,我需要使用它们,因为我必须修改网络头中的字段),我读过的所有文档或教程都描述了一个解嗅包的解决方案,但这不是什么我需要。我需要创建一个脚本拦截数据包,处理它并将其进一步发送到目的地,即除非我的脚本决定,否则数据包不应到达目的地。

为了学习,我创建了一个小型原型来检测ping并且只是打印" PING"。我希望ping无法工作,因为我拦截了数据包,而且我没有包含将它们发送到目的地的逻辑。然而ping工作(再次,它似乎只是嗅探/镜像数据包)。我的目标是ping数据包被捕获"在我的剧本中,我不知道该怎么做。这就是我在当前的python脚本中所做的事情(为了简单起见,我避免编写如何进行解码)

sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0003))
sock.bind((eth0, 0))
packet = sock.recvfrom(65565)
decode_eth(packet)
decode_ip(packet)

if (ipheader.ip_proto == 1):
            print("\nPING")

有人可以解释我如何实现目标或指向正确的文档?

2 个答案:

答案 0 :(得分:0)

您的描述似乎与标题所暗示的不同。我的理解是您希望接收,修改并可能丢弃传入的网络数据包。这要在Linux上完成。在这种情况下,我建议你使用netfilter prerouting hook,这将使事情变得更简单(并且可能更稳定)。 Netfilter有详细记录,可以看到一个很好的概述,包括与您的要求相关的信息here。要使用的重要功能是nf_register_hook(),请阅读this问题的答案,以了解如何进行设置。

答案 1 :(得分:0)

我认为您的Linux机箱配置为路由器(而不是桥接器)。由于您已启用 IP转发,数据包将通过您的Linux。所以有两个解决方案:

解决方案1:

禁用 IP转发,然后从一个接口接收数据包并执行相应的任务(转发到另一个接口或丢弃它)。

解决方案2:

使用NetFilterQueue

将它安装在Linux机器上(在我的示例中为Debian / Ubuntu):

apt-get install build-essential python-dev libnetfilter-queue-dev

使用iptables发送来自输入接口的数据包(在我的示例中为eth0):

iptables -I INPUT -i eth0 -j NFQUEUE --queue-num 1

运行此脚本以处理转发到队列1的数据包:

from netfilterqueue import NetfilterQueue

def print_and_accept(pkt):
    print pkt
    pkt.accept()

nfqueue = NetfilterQueue()
nfqueue.bind(1, print_and_accept)
try:
    nfqueue.run()
except KeyboardInterrupt:
    print

请注意pkt.drop()导致丢弃数据包。你也应该接受/丢弃每个数据包。