Deaktivieren von rp_filter auf einer Schnittstelle

9

Ich habe einen Ubuntu 16.04 Server, der als Router mit mehreren (VLAN) Schnittstellen fungiert. Standardmäßig ist rp_filter(Umkehrpfadfilterung) für alle Schnittstellen aktiviert. Ich möchte es so halten, aber eine Ausnahme für genau eine Schnittstelle machen. (Pakete von dieser Schnittstelle sollten eine Quell-IP-Adresse haben dürfen, die keiner Routing-Zieladresse dieser Schnittstelle entspricht.)

ens20.4Angenommen , diese Schnittstelle hat den Namen , ihr vlan-raw-Gerät ist ens20und die Zielschnittstelle (zum Testen des Paketflusses ) wird benannt ens20.2(obwohl sie für jede Zielschnittstelle funktionieren sollte).

Ich habe versucht, die rp_filterEigenschaft ens20.4nur für zu setzen , ohne Erfolg:

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

Zu Testzwecken habe ich daher auch rp_filterdas vlan-raw-Gerät und die Testzielschnittstelle deaktiviert :

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

Immer noch kein Erfolg, Pakete mit einer "gefälschten" Quell-IP-Adresse werden immer noch verworfen. Nur wenn ich rp_filterfür alle Schnittstellen deaktiviere , kommen Pakete durch:

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

Ich möchte jedoch weiterhin die Umkehrpfadfilterung für alle anderen Schnittstellen beibehalten - was fehlt mir?

Cybran
quelle
Einige weitere Tests ergaben, dass die Umkehrpfadfilterung aktiv ist, wenn rp_filter für alle oder die eingehende Schnittstelle auf 1 gesetzt ist. Ich suche immer noch nach einer endgültigen Antwort oder einer Dokumentationsreferenz, die ich bisher nicht finden konnte.
Cybran

Antworten:

12

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

Beachten Sie den letzten Satz, der Ihre Versuche erklären würde:

Der Maximalwert von conf / {all, interface} / rp_filter wird verwendet, wenn die Quellvalidierung auf der {interface} durchgeführt wird.

Das sollte also funktionieren:

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

Jetzt max (conf / {all, ens20.4} / rp_filter == 0: keine Quellenüberprüfung. Überprüfen Sie einfach, ob die anderen Schnittstellen noch geschützt sind.

Sie können auch "lose" rpf mit dem Wert 2 überprüfen. Falls das Paket normalerweise von einer anderen Schnittstelle weitergeleitet werden sollte, wäre dies besser als keine Validierung.

AB
quelle
2
Danke, das erklärt es sehr gut! Besonderer Dank für den "losen" rpf-Vorschlag, der in der Tat die bessere Wahl für mein Setup ist. Außerdem ist es nicht erforderlich, all / rp_filter auf 0 zu setzen, was sehr zu begrüßen ist.
Cybran