Come prevenire lo spoofing IP usando MAC ed ebtables?


10

Sto cercando di creare regole di associazione IP-MAC in ebtables . Sono disponibili alcuni tutorial e domande correlate [1] ma ho un tipo di impostazione specifica.

AMBIENTE: ho molti host fisici . Ogni host ha poche schede Ethernet, unite in bond e usate come slave per bridge. Esistono molte macchine virtuali su ciascun host (kvm, qemu, libvirt). Ogni macchina virtuale è connessa a un bridge del suo host fisico tramite una nuova porta chiamata vnet [0-9] +. Non c'è NAT. La rete funziona bene, è possibile eseguire il ping di tutti gli host fisici, anche di tutte le macchine virtuali. Ogni macchina virtuale ha il proprio indirizzo IP e indirizzo MAC.

PROBLEMA: all'interno di una macchina virtuale, l'indirizzo IP può essere cambiato in un altro.

TROVATA SOLUZIONE: esiste una soluzione nota sul sito ebtables [2], ma questa soluzione è applicabile quando viene utilizzato un solo host. Permette tutto il traffico e se esiste un pacchetto da IP con un MAC diverso da quello consentito, il pacchetto viene eliminato. Se sono presenti più host, è necessario che tutte le coppie IP-MAC esistenti siano registrate su tutti gli host. È necessaria una soluzione di politica inversa.

SOLUZIONE ARTIGIANALE: ho provato a usare ebtables in modo invertito. Ecco un esempio di quello che ho provato.

ESEMPIO 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

ESEMPIO 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

Il nucleo di ciò che voglio è avere il DROP di politica predefinito e consentire il traffico da macchine virtuali con una coppia IP-MAC corretta distribuita su un determinato host. Tuttavia, tali soluzioni non funzionano.

DOMANDA: Come consentire il traffico sul bridge solo per coppie IP-MAC specifiche di macchine virtuali in esecuzione e eliminare tutte le coppie IP-MAC sconosciute provenienti dalle porte vnet [0-9] +?

Grazie mille per qualsiasi risposta.


2
Ma cosa succede se qualcuno forgia il suo mac?
Zoredache,

1
Bene, anche questo è un problema. Ma indovinare la corretta coppia IP-MAC è molto difficile e supera tempestivamente il livello di sicurezza del mio servizio.
Martin,

Risposte:


12

Sono finalmente riuscito a creare una soluzione funzionante.

  1. La soluzione utilizza ebtables e coppie IP-MAC.
  2. L'unica tabella necessaria è la tabella 'filtro' predefinita.
  3. Non è necessario aggiungere regole o criteri alla catena INPUT, poiché la catena INPUT NON è correlata all'esecuzione di macchine virtuali. La spiegazione del significato delle catene INPUT, OUTPUT e FORWARD nella tabella dei filtri è nella manpage ebtables.
  4. Poiché ebtables funziona a livello di Ethernet e l'associazione IP-MAC è applicabile solo per i pacchetti IP, è necessario enfatizzarlo nelle regole per non bloccare i frame ARP e altro traffico vitale.

Quindi, all'inizio, non ci sono regole e tutte le politiche sono impostate su ACCEPT. Non ci sono catene definite dall'utente. La tabella dei filtri è simile alla seguente:

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

Viene aggiunta una nuova catena. Questa catena contiene tutte le coppie IP-MAC consentite. Si chiama VMS.

# ebtables -N VMS

Ora, la parte importante. Per ogni frame contenente il pacchetto IP (o le sue parti) che passa attraverso il bridge dalla porta vnet [0-9] +, applica la politica della catena e le regole della catena VMS. In altre parole, per ogni pacchetto IP proveniente da qualsiasi macchina virtuale, applicare la catena VMS.

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

La politica predefinita della catena VMS deve essere DROP. In questo modo, ogni pacchetto IP proveniente da qualsiasi macchina virtuale viene eliminato per impostazione predefinita. Successivamente, vengono aggiunte le eccezioni consentite per le coppie IP-MAC. Il criterio predefinito DROP causa che tutto il traffico proveniente da qualsiasi macchina virtuale con coppia IP-MAC sconosciuta venga eliminato contemporaneamente, rendendo impossibile lo spoofing IP.

# ebtables -P VMS DROP

Il filtro tabella ora appare in questo modo. Inoltre, in questo modo appare quando non ci sono macchine virtuali in esecuzione (consentite).

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

Supponiamo che ci siano due macchine in esecuzione. Se proviamo a eseguire il ping verso / da loro, il traffico viene interrotto e la destinazione non è raggiungibile. Questo è il risultato desiderato, a partire da questo traffico non è stato ancora permesso. È sufficiente un solo comando per consentire il traffico di ogni macchina virtuale.

# 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

Ora, il traffico proveniente dalle macchine virtuali consentite sta andando bene e lo spoofing IP è impedito.

Questa soluzione potrebbe non essere perfetta e se hai commenti o miglioramenti, li ascolterò volentieri.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.