【问题标题】:Can I intercept network packets with a raw socket (not only sniff)?我可以使用原始套接字(不仅是嗅探)拦截网络数据包吗?
【发布时间】:2016-08-12 20:38:09
【问题描述】:

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

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

谁能解释我怎样才能实现我的目标或为我指出正确的文档?

【问题讨论】:

    标签: linux sockets networking


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我假设您的 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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-24
        • 1970-01-01
        • 1970-01-01
        • 2014-02-14
        • 1970-01-01
        • 2010-12-10
        相关资源
        最近更新 更多