2013-07-19 1 views
1

끝점으로 레이어 2 인터페이스 (TAP)가있는 약간의 터널링 앱을 작성하고 있습니다. OSX에서이를 테스트하는 과정에서 터널이 단일 OSX 머신에서 실행될 때와 OSX과 Linux 박스 사이를 터널했을 때 터널에서 예상하지 못한 모든 종류의 트래픽이 발생했다는 것을 알았습니다. 이 트래픽을 필터링하고 싶습니다.이 작업을 수행하는 가장 좋은 방법은 무엇인지 궁금합니다.OSX의 TAP 인터페이스에서 이더넷 패킷 (ICMP, Bonjour) 필터링

터널은 (동일한 시스템에있을 수 있습니다 모두 엔드 포인트에주의) 다음과 같습니다

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

주목할만한 트래픽이 대상 포트 5353 및 ICMP/IGMP에 봉쥬르 패킷입니다. 멀티 캐스트는 TAP 인터페이스에서 활성화됩니다. 이런 종류의 트래픽을 차단하고 싶습니다. 이 일에 내 생각 :

    인터페이스에서 멀티 캐스트를 끄고
  1. 은 터널 응용 프로그램 내부의 인터페이스를 오는 패킷을 분석
  2. 사용 ebtables
  3. (아래 참조, OSX에서 작동하지 않습니다) 무시 그들 거기에

더 나은/쉬운 방법이 있나요?

OSX 인터페이스에서 멀티 캐스트를 해제하려고 시도했지만 (tap0이라고 부르 자) 오류가 발생합니다.

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

EDIT : 조금 더 사냥을 한 후에는 UNIX와 BSD ifconfig에 다른 옵션이 있습니다. OSX/BSD의 주어진 인터페이스에서 멀티 캐스트/ICMP 트래픽을 차단하는 또 다른 방법이 있습니까?

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

리눅스 : 여기


은 (osxtuntap와)

OSX ...은 ifconfig 출력의

$ 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의 방화벽. 그것을

sudo ipfw del 9000 9001 

을 다른 방법 : 터미널에서, 우리는 가상 네트워크 인터페이스라고 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 

그리고 우리가 그들을 필요하지 않은 경우 우리는 또한 규칙을 삭제할 수 있습니다 이더넷 프레임을 구문 분석하고 ASCII에서 16 진수 또는 10 진수로 변환 한 다음 그곳에서 처리 할 작업을 결정할 수 있습니다. 아래에서 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 패킷의 경우 패킷 구조가 약간 다릅니다.