MAC 및 ebtable을 사용하여 IP 스푸핑을 방지하는 방법은 무엇입니까?


10

ebtables 에서 IP-MAC 페어링 규칙 을 만들려고합니다 . 사용할 수있는 자습서와 관련 질문은 거의 없지만 [1] 특정 설정이 있습니다.

환경 : 물리적 호스트많이 있습니다 . 각 호스트에는 이더넷 카드가 거의 없으며 본드로 결합되어 브리지의 슬레이브로 사용됩니다. 각 호스트에는 많은 가상 머신이 있습니다 (kvm, qemu, libvirt). 각 가상 머신은 vnet [0-9] +라는 새 포트를 통해 물리적 호스트의 브리지에 연결됩니다. NAT가 없습니다. 네트워킹은 잘 작동하고 모든 물리적 호스트는 핑할 수 있으며 모든 가상 머신도 가능합니다. 각 가상 머신에는 고유 한 IP 주소와 MAC 주소가 있습니다.

문제 : 가상 머신 내부에서 IP 주소를 다른 것으로 변경할 수 있습니다.

FOUND SOLUTION : ebtables 사이트 [2]에 알려진 솔루션이 있지만이 솔루션은 하나의 호스트 만 사용할 경우 적용 할 수 있습니다. 모든 트래픽을 허용하며 허용 된 것보다 다른 MAC을 가진 IP의 패킷이 있으면 패킷이 삭제됩니다. 호스트가 둘 이상 있으면 모든 기존 IP-MAC 쌍을 모든 호스트에 등록해야합니다. 리버스 정책 솔루션이 필요합니다.

파괴 된 해결책 : ebtables를 거꾸로 사용하려고했습니다. 여기 내가 시도한 예가 있습니다.

실시 예 1

Bridge table: filter
Bridge chain: INPUT, entries: 2, policy: DROP
-i bond0 -j ACCEPT 
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT 
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

실시 예 2

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: DROP
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT 
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

내가 원하는 것의 핵심은 기본 정책 DROP을 갖고 주어진 호스트에 올바른 IP-MAC 쌍이 배포 된 가상 시스템의 트래픽 만 허용하는 것입니다. 그러나 이러한 솔루션은 작동하지 않습니다.

질문 : 실행중인 가상 머신의 지정된 IP-MAC 쌍에 대해서만 브리지의 트래픽을 허용하고 vnet [0-9] + 포트에서 들어오는 알 수없는 IP-MAC 쌍을 모두 삭제하는 방법은 무엇입니까?

답변 주셔서 감사합니다.


2
그러나 누군가가 자신의 Mac을 위조한다면 어떻게 될까요?
Zoredache

1
글쎄, 그것도 문제이다. 그러나 올바른 IP-MAC 쌍을 추측하는 것은 매우 어렵고 적시에 내 서비스의 보안 수준을 초과합니다.
Martin

답변:


12

마침내 작업 솔루션을 만들었습니다.

  1. 솔루션은 ebtables 및 IP-MAC 쌍을 사용합니다.
  2. 필요한 테이블 만 기본 '필터'테이블입니다.
  3. INPUT 체인은 가상 머신 실행과 관련이 없으므로 INPUT 체인에 규칙이나 정책을 추가 할 필요가 없습니다. 필터 테이블에서 INPUT, OUTPUT 및 FORWARD 체인의 의미에 대한 설명은 ebtables 맨 페이지에 있습니다.
  4. ebtables는 이더넷 수준에서 작동하며 IP-MAC 페어링은 IP 패킷에만 적용 할 수 있으므로 ARP 프레임 및 기타 중요한 트래픽을 차단하지 않기 위해 규칙에서이를 구현해야합니다.

따라서 처음에는 규칙이 없으며 모든 정책이 수락으로 설정됩니다. 사용자 정의 체인이 없습니다. 필터 테이블은 다음과 같습니다.

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

새로운 체인이 추가됩니다. 이 체인에는 허용되는 모든 IP-MAC 쌍이 포함되어 있습니다. 이를 VMS라고합니다.

# ebtables -N VMS

이제 중요한 부분입니다. 포트 vnet [0-9] +에서 브리지로 연결되는 IP 패킷 (또는 해당 부분)을 포함하는 모든 프레임에 대해 체인 정책 및 체인 VMS 규칙을 적용하십시오. 즉, 모든 가상 머신에서 오는 모든 IP 패킷에 대해 VMS 체인을 적용하십시오.

# ebtables -A FORWARD -p ip -i vnet+ -j VMS

chain VMS의 기본 정책은 DROP이어야합니다. 이런 식으로 모든 가상 머신에서 들어오는 모든 IP 패킷은 기본적으로 삭제됩니다. 나중에 허용 된 IP-MAC 쌍 예외가 추가됩니다. 기본 정책 DROP은 알 수없는 IP-MAC 쌍을 가진 가상 시스템의 모든 트래픽이 한 번에 삭제되므로 IP 스푸핑이 불가능합니다.

# ebtables -P VMS DROP

테이블 필터는 이제 이런 식으로 보입니다. 또한이 방법은 실행중인 가상 머신이 없을 때 나타납니다 (허용됨).

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: ACCEPT
-p IPv4 -i vnet+ -j VMS
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
Bridge chain: VMS, entries: 0, policy: DROP

두 개의 실행중인 시스템이 있다고 가정하십시오. 우리가 그들과 핑을 시도하면 트래픽이 끊어지고 목적지에 도달 할 수 없습니다. 이 트래픽은 아직 허용되지 않았으므로 원하는 결과입니다. 하나의 명령만으로도 모든 가상 머신 트래픽을 허용 할 수 있습니다.

# ebtables -A VMS -p ip --ip-src 192.168.11.125 -s 54:52:00:cc:35:fa -j ACCEPT
# ebtables -A VMS -p ip --ip-src 192.168.11.122 -s 54:52:00:98:d7:b6 -j ACCEPT

이제 허용 된 가상 머신의 트래픽이 올바르게 흐르고 IP 스푸핑이 방지됩니다.

이 솔루션은 완벽하지 않을 수 있으며 의견이나 개선 사항이 있으면 기꺼이들을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.