2013-07-19 33 views
1

我正在编写一个带有第2层接口(TAP)的小隧道应用程序作为端点。在OSX上进行测试的过程中,我注意到当隧道在单台OSX机器上运行时,以及在OSX和Linux机箱之间隧道传输时,我得到了隧道上所没有的各种流量。我想过滤流量,我想知道做这件事的最好方法是什么。在OSX上的TAP接口上过滤以太网数据包(ICMP,Bonjour)

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

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) 

回答

1

一种可能性是使用内置的ipfw OSX中的防火墙。从终端,我们可以允许在虚拟网络接口称为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数据包,下面(protocol = 6 for tcp,17 for udp)。

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数据包,这不起作用 - 数据包结构有点不同。