Wie kann man IP-Spoofing mit MAC und ebtables verhindern?

Wie kann man IP-Spoofing mit MAC und ebtables verhindern?

Ich versuche zu schaffenIP-MACPaarungsregeln inebtabellen. Es sind einige Tutorials und zugehörige Fragen [1] verfügbar, aber ich habe eine ziemlich spezielle Einstellung.

UMFELD: Ich habeviele physische Hosts. Jeder Host hat mehrere Ethernet-Karten, die in einem Verbund verbunden sind und als Slave für die Bridge verwendet werden. Auf jedem Host gibt es viele virtuelle Maschinen (kvm, qemu, libvirt). Jede virtuelle Maschine ist über einen neuen Port namens vnet[0-9]+ mit einer Bridge ihres physischen Hosts verbunden. Es gibt kein NAT. Die Netzwerkverbindung funktioniert einwandfrei, alle physischen Hosts können angepingt werden, alle virtuellen Maschinen auch. Jede virtuelle Maschine hat ihre eigene IP-Adresse und MAC-Adresse.

PROBLEM:Innerhalb einer virtuellen Maschine kann die IP-Adresse in eine andere geändert werden.

LÖSUNG GEFUNDEN:Es gibt eine bekannte Lösung auf der ebtables-Site [2], aber diese Lösung ist anwendbar, wenn nur ein Host verwendet wird. Sie lässt den gesamten Verkehr zu, und wenn ein Paket von einer IP mit einer anderen MAC als der erlaubten kommt, wird das Paket verworfen. Wenn mehr als ein Host vorhanden ist, müssen alle vorhandenen IP-MAC-Paare auf allen Hosts registriert werden. Es besteht Bedarf für eine Lösung mit umgekehrter Richtlinie.

PERFEKTE LÖSUNG:Ich habe versucht, ebtables invertiert zu verwenden. Hier ist ein Beispiel, was ich versucht habe.

BEISPIEL 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

Beispiel 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

Der Kern dessen, was ich möchte, ist eine Standardrichtlinie DROP, die nur Datenverkehr von virtuellen Maschinen mit korrektem IP-MAC-Paar zulässt, die auf dem angegebenen Host bereitgestellt sind. Diese Lösungen funktionieren jedoch nicht.

FRAGE:Wie lässt man Datenverkehr auf der Brücke nur für bestimmte IP-MAC-Paare laufender virtueller Maschinen zu und löscht alle unbekannten IP-MAC-Paare, die von den Ports vnet[0-9]+ kommen?

Vielen Dank für alle Antworten.

Antwort1

Es ist mir endlich gelungen, eine funktionierende Lösung zu finden.

  1. Die Lösung verwendet ebtables und IP-MAC-Paare.
  2. Die einzige benötigte Tabelle ist die Standard-Filtertabelle.
  3. Es ist nicht erforderlich, der INPUT-Kette irgendwelche Regeln oder Richtlinien hinzuzufügen, da die INPUT-Kette NICHT mit dem Ausführen virtueller Maschinen zusammenhängt. Eine Erklärung der Bedeutung der INPUT-, OUTPUT- und FORWARD-Ketten in der Filtertabelle finden Sie auf der Manpage von ebtables.
  4. Da ebtables auf Ethernet-Ebene arbeitet und die IP-MAC-Paarung nur für IP-Pakete anwendbar ist, muss dies in den Regeln hervorgehoben werden, um ARP-Frames und anderen wichtigen Datenverkehr nicht zu blockieren.

Zu Beginn gibt es also überhaupt keine Regeln und alle Richtlinien sind auf AKZEPTIEREN eingestellt. Es gibt keine benutzerdefinierten Ketten. Die Filtertabelle sieht folgendermaßen aus:

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

Eine neue Kette wird hinzugefügt. Diese Kette enthält alle zulässigen IP-MAC-Paare. Sie wird VMS genannt.

# ebtables -N VMS

Nun zum wichtigen Teil. Für jeden Frame, der ein IP-Paket (oder Teile davon) enthält, das über die Brücke vom Port vnet[0-9]+ geht, gelten die Kettenrichtlinie und die Regeln der Ketten-VMS. Mit anderen Worten: Für jedes IP-Paket, das von einer virtuellen Maschine kommt, gilt die VMS-Kette.

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

Die Standardrichtlinie von Chain-VMS muss DROP sein. Auf diese Weise wird jedes IP-Paket, das von einer virtuellen Maschine kommt, standardmäßig gelöscht. Später werden Ausnahmen für zulässige IP-MAC-Paare hinzugefügt. Die Standardrichtlinie DROP bewirkt, dass der gesamte Datenverkehr von einer virtuellen Maschine mit unbekanntem IP-MAC-Paar sofort gelöscht wird, wodurch IP-Spoofing unmöglich wird.

# ebtables -P VMS DROP

Der Tabellenfilter sieht jetzt so aus. So sieht er auch aus, wenn keine virtuellen Maschinen laufen (erlaubt).

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

Angenommen, es gibt zwei laufende Maschinen. Wenn wir versuchen, einen Ping von/zu ihnen zu senden, wird der Datenverkehr unterbrochen und das Ziel ist nicht erreichbar. Dies ist das gewünschte Ergebnis, da dieser Datenverkehr bisher nicht zugelassen wurde. Nur ein Befehl reicht aus, um den Datenverkehr jeder einzelnen virtuellen Maschine zuzulassen.

# 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

Jetzt fließt der Datenverkehr von zugelassenen virtuellen Maschinen ordnungsgemäß und IP-Spoofing wird verhindert.

Diese Lösung ist möglicherweise nicht perfekt und wenn Sie Kommentare oder Verbesserungen haben, würde ich mich freuen, davon zu hören.

verwandte Informationen