在OSX上的TAP接口上过滤以太网数据包(ICMP,Bonjour)

时间:2013-07-19 20:31:29

标签: networking multicast packet ethernet tun

我正在编写一个隧道应用程序,其中第2层接口(TAP)作为端点。在OSX上进行测试的过程中,我注意到隧道在单个OSX机器上运行时以及当我在OSX和Linux机箱之间进行隧道传输时,我在隧道上获得了各种各样的流量。我想过滤掉这个流量,我想知道最好的方法是什么。

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

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

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

  1. 在界面上关闭多播(在OSX上不起作用,见下文)
  2. 使用ebtables
  3. 解析来自隧道应用程序内部接口的数据包并忽略它们
  4. 有更好/更简单的方法吗?

    我尝试在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)
    

1 个答案:

答案 0 :(得分: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为protocol = 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数据包,这不起作用 - 数据包结构有点不同。