Disabilitazione di rp_filter su un'unica interfaccia


9

Ho un server Ubuntu 16.04 che funge da router con interfacce multiple (VLAN). Per impostazione predefinita, rp_filter(filtro del percorso inverso) è abilitato per tutte le interfacce. Voglio mantenerlo così, ma faccio un'eccezione esattamente per un'interfaccia. (I pacchetti da questa interfaccia dovrebbero avere un indirizzo IP di origine che non corrisponde a nessun indirizzo di destinazione del routing di questa interfaccia.)

Supponiamo che questa interfaccia abbia il nome ens20.4, il suo dispositivo vlan-raw-device ens20e che l'interfaccia di destinazione (per testare il flusso di pacchetti) sia denominata ens20.2(sebbene dovrebbe funzionare per qualsiasi interfaccia di destinazione).

Ho provato a impostare la rp_filterproprietà ens20.4solo per , senza successo:

echo 0 > /proc/sys/net/ipv4/conf/ens20.4/rp_filter

Quindi, a scopo di test, ho disabilitato anche rp_filterper il dispositivo vlan-raw-device e l'interfaccia di destinazione del test:

echo 0 > /proc/sys/net/ipv4/conf/ens20/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens20.2/rp_filter

Ancora senza successo, i pacchetti con un indirizzo IP di origine "contraffatto" vengono comunque eliminati. Solo se disabilito rp_filterper tutte le interfacce, i pacchetti ottengono:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

Tuttavia, voglio ancora mantenere il filtro del percorso inverso per tutte le altre interfacce: cosa mi sto perdendo?


Alcuni altri test hanno rivelato che il filtro del percorso inverso è attivo se rp_filter è impostato su 1 per tutte o per l'interfaccia in entrata. Sto ancora cercando una risposta definitiva o un riferimento alla documentazione, che non sono riuscito a trovare finora.
Cybran,

Risposte:


12

Informazioni lì: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/tree/Documentation/networking/ip-sysctl.txt?h=v4.9#n1090

Nota l'ultima frase che spiegherebbe i tuoi tentativi:

Il valore massimo da conf / {all, interface} / rp_filter viene utilizzato quando si esegue la convalida del codice sorgente {interfaccia}.

Quindi questo dovrebbe funzionare:

for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
    echo 1 > "$i"
done
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens20.4/rp_filter

Ora max (conf / {all, ens20.4} / rp_filter == 0: nessuna convalida del codice sorgente. Ricontrolla solo che le altre interfacce siano ancora protette.

Puoi anche controllare "loose" rpf con il valore 2. Nel caso in cui il pacchetto debba normalmente essere instradato da un'altra interfaccia, sarebbe meglio di nessuna convalida.


2
Grazie, questo lo spiega molto bene! Un ringraziamento speciale per il suggerimento "sciolto" di rpf, che è davvero la scelta migliore per la mia configurazione. Inoltre, non è necessario impostare all / rp_filter su 0, il che è il benvenuto.
Cybran,
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.