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

Networking 在OSX上的TAP接口上过滤以太网数据包(ICMP,Bonjour),networking,multicast,packet,ethernet,tun,Networking,Multicast,Packet,Ethernet,Tun,我正在编写一个以第2层接口(TAP)为端点的小型隧道应用程序。在OSX上测试这一点的过程中,我注意到我在隧道上获得了各种各样的流量,这是我没有预料到的,无论是在单个OSX机器上运行隧道时,还是在OSX和Linux机器之间进行隧道传输时。我想过滤掉这些流量,我想知道最好的方法是什么 隧道如下所示(请注意,两个端点可以位于同一台计算机上): 值得注意的流量是目标端口5353和ICMP/IGMP上的Bonjour数据包。在TAP接口上启用多播。我想堵住这种交通。我的想法是: 在接口上关闭多播(在OSX

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

隧道如下所示(请注意,两个端点可以位于同一台计算机上):

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

  • 在接口上关闭多播(在OSX上不起作用,请参见下文)
  • 使用
    ebtables
  • 解析来自tunnel应用程序内部接口的数据包,并在那里忽略它们
  • 有没有更好/更简单的方法

    我曾尝试在OSX接口上关闭多播(我们称之为tap0),但出现了一个错误

    $ ifconfig tap0 -multicast
    ifconfig: -multicast: bad value
    
    编辑:在仔细研究之后,似乎UNIX和BSD ifconfig有不同的选项。在OSX/BSD中,是否有其他方法阻止给定接口上的多播/ICMP通信


    这是ifconfig输出

    OSX(带OSXtentap):


    一种可能性是在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)


    对于arp数据包,这将不起作用-数据包结构有点不同。

    一种可能性是在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)

    对于arp数据包,这将不起作用-数据包结构有点不同

    sudo ipfw del 9000 9001
    
    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)