2016-07-25 39 views
2

这是我第一次使用原始套接字(是的,我需要使用它们,因为我必须修改网络标头内的字段),并且我所阅读的所有文档或教程都描述了一个嗅探数据包的解决方案,但这不完全是我需要。我需要创建一个拦截数据包的脚本,对其进行处理并将其发送到目的地,即数据包不应到达目的地,除非我的脚本决定这样做。我可以使用原始套接字拦截网络数据包吗(不仅是嗅探)?

为了学习,我创建了一个小型原型,它检测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") 

有人能解释我如何能实现我的目标或指向我正确的文件?

回答

0

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

0

我想你的Linux机器被配置成一个路由器(不是网桥)。数据包将通过您的Linux,因为您已启用IP转发。所以有两个解决办法:

解决方案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 

运行此脚本处理转发到队列No.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()导致丢弃数据包。你也应该接受/放弃每一个数据包。