Jak zapobiegać fałszowaniu adresów IP za pomocą MAC i ebtables?

10

Próbuję utworzyć reguły parowania IP-MAC w ebtables . Dostępnych jest kilka samouczków i powiązanych pytań [1], ale mam specyficzne ustawienie.

ŚRODOWISKO: Mam wielu fizycznych gospodarzy . Każdy host ma kilka kart Ethernet, połączonych w więź i używanych jako slave do mostu. Na każdym hoście znajduje się wiele maszyn wirtualnych (kvm, qemu, libvirt). Każda maszyna wirtualna jest podłączona do mostu swojego fizycznego hosta przez nowy port o nazwie vnet [0-9] +. Nie ma NAT. Praca w sieci działa dobrze, wszystkie fizyczne hosty mogą być pingowane, wszystkie maszyny wirtualne również. Każda maszyna wirtualna ma własny adres IP i adres MAC.

PROBLEM: W maszynie wirtualnej adres IP można zmienić na inny.

ZNALEZIONE ROZWIĄZANIE: Znane jest rozwiązanie na stronie ebtables [2], ale to rozwiązanie można zastosować, gdy używany jest tylko jeden host. Pozwala na cały ruch i jeśli istnieje pakiet z adresu IP z innym adresem MAC niż dozwolony, pakiet jest odrzucany. Jeśli istnieje więcej niż jeden host, wymaga zarejestrowania wszystkich istniejących par IP-MAC na wszystkich hostach. Istnieje potrzeba rozwiązania polityki odwrotnej.

ROZWIĄZANIE RĘCZNE: Próbowałem używać ebtabli w odwrócony sposób. Oto przykład, co próbowałem.

PRZYKŁAD 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

PRZYKŁAD 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

Rdzeń tego, co chcę, to mieć domyślną DROP zasad i zezwalać tylko na ruch z maszyn wirtualnych z prawidłową parą IP-MAC wdrożoną na danym hoście. Jednak te rozwiązania nie działają.

PYTANIE: Jak zezwolić na ruch na moście tylko dla określonych par IP-MAC działających maszyn wirtualnych i usunąć wszystkie nieznane pary IP-MAC pochodzące z portów vnet [0-9] +?

Dziękuję bardzo za wszelkie odpowiedzi.

Jaskółka oknówka
źródło
2
Ale co, jeśli ktoś sfałszuje swój komputer Mac?
Zoredache,
1
To też jest problem. Ale zgadywanie prawidłowej pary IP-MAC jest bardzo trudne i na czas przekracza poziom bezpieczeństwa mojej usługi.
Martin

Odpowiedzi:

12

W końcu udało mi się stworzyć działające rozwiązanie.

  1. Rozwiązanie wykorzystuje ebtable i pary IP-MAC.
  2. Potrzebna jest tylko domyślna tabela „filtrująca”.
  3. Nie ma potrzeby dodawania żadnych reguł ani zasad do łańcucha INPUT, ponieważ łańcuch INPUT NIE jest związany z uruchomieniem maszyn wirtualnych. Objaśnienie znaczenia łańcuchów INPUT, OUTPUT i FORWARD w tabeli filtrów znajduje się na stronie podręcznika ebtables.
  4. Ponieważ ebtables działa na poziomie ethernetowym, a parowanie IP-MAC można stosować tylko w przypadku pakietów IP, konieczne jest uogólnienie tego w regułach, aby nie blokować ramek ARP i innego istotnego ruchu.

Na początku więc nie ma żadnych zasad, a wszystkie zasady są skonfigurowane do AKCEPTACJI. Brak łańcuchów zdefiniowanych przez użytkownika. Tabela filtrów wygląda następująco:

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

Dodano nowy łańcuch. Ten łańcuch zawiera wszystkie dozwolone pary IP-MAC. Nazywa się VMS.

# ebtables -N VMS

Teraz ważna część. Dla każdej ramki zawierającej pakiet IP (lub jego części), która przechodzi przez mostek z portu vnet [0-9] +, zastosuj zasady łańcucha i reguły łańcucha VMS. Innymi słowy, dla każdego pakietu IP przychodzącego z dowolnej maszyny wirtualnej zastosuj łańcuch VMS.

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

Domyślną polityką łańcucha VMS musi być DROP. W ten sposób każdy pakiet IP przychodzący z dowolnej maszyny wirtualnej jest domyślnie usuwany. Później dodawane są dozwolone wyjątki par IP-MAC. Domyślna zasada DROP powoduje, że cały ruch z dowolnej maszyny wirtualnej o nieznanej parze IP-MAC jest natychmiast usuwany, co uniemożliwia fałszowanie adresów IP.

# ebtables -P VMS DROP

Filtr tabeli wygląda teraz w ten sposób. Tak to wygląda, gdy nie ma uruchomionych maszyn wirtualnych (dozwolone).

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

Załóżmy, że działają dwie maszyny. Jeśli spróbujemy pingować do / z nich, ruch spadnie, a miejsce docelowe będzie nieosiągalne. Jest to pożądany wynik, ponieważ ten ruch nie był jeszcze dozwolony. Wystarczy jedno polecenie, aby zezwolić na każdy ruch maszyny wirtualnej.

# 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

Teraz ruch z dozwolonych maszyn wirtualnych płynie prawidłowo i zapobiega się fałszowaniu adresów IP.

To rozwiązanie może być nieskuteczne, a jeśli masz jakieś uwagi lub ulepszenia, chętnie je wysłucham.

Jaskółka oknówka
źródło