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

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

나는 창조하려고 노력하고있다IP-MAC페어링 규칙ebtables. 사용할 수 있는 튜토리얼과 관련 질문이 거의 없지만 [1] 특정 설정이 있습니다.

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

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

찾은 해결책: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 쌍을 삭제하는 방법은 무엇입니까?

어떤 답변이라도 진심으로 감사드립니다.

답변1

마침내 작동하는 솔루션을 만들었습니다.

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

그래서 처음에는 아무런 규칙도 없고 모든 정책이 ACCEPT로 설정되어 있습니다. 사용자 정의 체인이 없습니다. 필터 테이블은 다음과 같습니다.

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

체인 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

두 대의 실행중인 기계가 있다고 가정하십시오. 해당 항목과 ping을 시도하면 트래픽이 중단되고 대상에 도달할 수 없습니다. 이는 원하는 결과입니다. 이 트래픽은 아직 허용되지 않았습니다. 하나의 명령만으로 모든 가상 머신 트래픽을 허용할 수 있습니다.

# 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 스푸핑이 방지됩니다.

이 솔루션은 완벽하지 않을 수 있으며 의견이나 개선 사항이 있으면 기꺼이 알려드리겠습니다.

관련 정보