Фильтрация пакетов Ethernet (ICMP, Bonjour) на интерфейсе TAP в OSX

Я пишу небольшое приложение для туннелирования с интерфейсами уровня 2 (TAP) в качестве конечных точек. В ходе тестирования этого на OSX я заметил, что получаю все виды трафика, которые я не ожидал в туннеле, как когда туннель работал на одной машине с OSX, так и когда я туннелировал между OSX и Linux. Я хотел бы отфильтровать этот трафик, и мне интересно, как это сделать лучше всего.

Туннель выглядит следующим образом (обратите внимание, что обе конечные точки могут находиться на одной машине):

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

Примечательным трафиком являются пакеты Bonjour на порту назначения 5353 и ICMP/IGMP. Многоадресная рассылка включена на интерфейсе TAP. Я бы хотел заблокировать такой трафик. Мои мысли по этому поводу:

  1. Отключите многоадресную рассылку на интерфейсе (не работает в OSX, см. ниже)
  2. Используйте ebtables
  3. Разбирать пакеты, исходящие от интерфейса внутри приложения туннеля, и игнорировать их там.

Есть ли лучший/более простой способ сделать это?

Я попытался отключить многоадресную рассылку на интерфейсе OSX (назовем это tap0), но получаю сообщение об ошибке.

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

РЕДАКТИРОВАТЬ: после небольшого поиска оказалось, что UNIX и BSD ifconfig имеют разные параметры. Есть ли другой способ заблокировать многоадресный/ICMP-трафик на заданном интерфейсе в OSX/BSD?


вот вывод 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)

Линукс:

$ 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)

person nflacco    schedule 19.07.2013    source источник


Ответы (1)


Одна из возможностей — использовать встроенный брандмауэр ipfw в OSX. С терминала мы могли бы разрешить только tcp-трафик на виртуальном сетевом интерфейсе с именем tap1:

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

Как вариант, можно просто разобрать кадр ethernet и преобразовать его из ascii в шестнадцатеричный или десятичный, а потом решить, что с ним там делать. Вы можете очень легко обнаружить пакеты TCP/UDP с помощью приведенного ниже (протокол = 6 для tcp и 17 для 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 это не сработает — структура пакета немного другая.

person nflacco    schedule 21.07.2013