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.
źródło
Odpowiedzi:
W końcu udało mi się stworzyć działające rozwiązanie.
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:
Dodano nowy łańcuch. Ten łańcuch zawiera wszystkie dozwolone pary IP-MAC. Nazywa się 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.
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.
Filtr tabeli wygląda teraz w ten sposób. Tak to wygląda, gdy nie ma uruchomionych maszyn wirtualnych (dozwolone).
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.
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.
źródło