【问题标题】:Filtering ethernet packets (ICMP, Bonjour) on a TAP interface on OSX在 OSX 的 TAP 接口上过滤以太网数据包(ICMP、Bonjour)
【发布时间】:2013-07-19 20:31:29
【问题描述】:

我正在编写一个以第 2 层接口 (TAP) 作为端点的小型隧道应用程序。在 OSX 上进行测试的过程中,我注意到我在隧道上收到了各种我没想到的流量,无论是当隧道在单个 OSX 机器上运行时,还是当我在 OSX 和 Linux 机器之间建立隧道时。我想过滤掉这些流量,我想知道最好的方法是什么。

隧道看起来像这样(注意两个端点可以在同一台机器上):

tap0 -> tunnel app -> UDP tunnel -> tunnel app -> tap1

值得注意的流量是目标端口 5353 和 ICMP/IGMP 上的 Bonjour 数据包。在 TAP 接口上启用多播。我想阻止这种交通。我对这样做的想法:

  1. 关闭接口上的多播(在 OSX 上不起作用,见下文)
  2. 使用ebtables
  3. 解析从隧道应用程序内部接口传出的数据包并在那里忽略它们

有没有更好/更简单的方法来做到这一点?

我尝试在 OSX 界面(我们称之为 tap0)上关闭多播,但出现错误。

$ ifconfig tap0 -multicast
ifconfig: -multicast: bad value

编辑:经过一番寻找,UNIX 和 BSD ifconfig 似乎有不同的选项。在 OSX/BSD 的给定接口上是否有其他方法可以阻止多播/ICMP 流量?


这是 ifconfig 输出...

OSX(带有 osxtuntap):

$ ifconfig tap1
tap1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 92:d9:e6:65:5a:8c 
    inet 10.0.0.2 netmask 0xffffff00 broadcast 10.0.0.255
    open (pid 17121)

Linux:

$ ifconfig tunX
tunX      Link encap:Ethernet  HWaddr 4a:29:02:e6:b0:b9  
          inet addr:10.0.0.1  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::4829:2ff:fee6:b0b9/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

【问题讨论】:

    标签: networking multicast packet ethernet tun


    【解决方案1】:

    一种可能性是在 OSX 中使用内置的 ipfw 防火墙。从终端,我们可以只允许一个名为 tap1 的虚拟网络接口上的 tcp 流量:

    sudo ipfw add 9000 allow tcp from any to any via tap1 # allow tcp
    sudo ipfw add 9001 deny ip from any to any via tap1 # block all other incoming and outboung traffic
    

    如果我们不需要规则,我们也可以删除它们:

    sudo ipfw del 9000 9001
    

    或者,也可以只解析以太网帧并将其从 ascii 转换为十六进制或十进制,然后决定在那里处理它。您可以使用以下命令非常轻松地检测 TCP/UDP 数据包(tcp 为 6,udp 为 17)。

    from binascii import hexlify
    ...
    # given some ethernet frame string data
    protocol = int(hexlify(frame[23:24]), 16)
    src_port = int(hexlify(frame[34:36]), 16)
    dst_port = int(hexlify(frame[36:38]), 16)
    

    对于 arp 数据包,这是行不通的——数据包结构有点不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多