UDP sendto schlägt fehl, wenn bestimmte Routingtabellen verwendet werden

414
IMerin

Ich habe ein System mit mehreren Schnittstellen. Ich habe alle diese Schnittstellen mit ein paar sysctlOptionen und Routing-Tabellen und Regeln voneinander getrennt .

Jede Schnittstelle verfügt über eine eigene Routing-Tabelle, die eine Standardroute definiert.

Jede Routing-Tabelle enthält vier Regeln, die festlegen, welche Pakete in welche Tabelle gehen sollen.

Nehmen wir zur Vereinfachung an, ich habe eth0 (192.168.1.1)und eth1 (192.168.1.2).

vom 192.168.1.1Tischeth0

zum 192.168.1.1Tischeth0

iif eth0 table eth0

oif eth0 table eth0

Denn eth2es ist dasselbe.

Die sysctlOptionen sind:

net.ipv4.conf.all.arp_filter = 1 net.ipv4.conf.all.arp_ignore = 2 net.ipv4.conf.all.arp_announce = 1 net.ipv4.conf.all.rp_filter = 1 

Dies funktioniert für 99% meiner beabsichtigten Anwendungsfälle hervorragend, aber einer schlägt fehl. Wenn ein Paket aus einem nicht gebundenen Socket generiert wird, z. B. beim Beantworten eines UDP-Clients mit "sendto", schlägt der Anruf mit "Network Unreachable" fehl. Wenn eine bestimmte IP-Adresse vor dem Aufruf von sendto gebunden ist, ist der Anruf wie erwartet erfolgreich.

Wenn Sie in solchen Situationen keine Standardroute einrichten, können Sie das Richtlinienrouting (z. B. iptables, ip rule) verwenden, um dieses Problem zu lösen.

Vielen Dank

0
Eine Lösung mit einer Markierung mit iptables hilft nicht. iptables Ausgabe-Mangle-Hook geschieht * nach * der ersten Routensuche ("Routing-Entscheidung") und löst eine * zweite * Suche ("Weiterleitungsüberprüfung") aus. Die Verwendung der Markierung von iptables hilft hier also nicht, da "Network is unerreichbar" beim ersten Suchvorgang ausgeführt wird und die Mangle-Tabelle niemals verwendet wird. Sehen Sie dieses Bild: https://en.wikipedia.org/wiki/Netfilter#/media/File:Netfilter-packet-flow.svg A.B vor 6 Jahren 0
Wenn Sie jedoch diese Standardroute für alle Catches hinzufügen, selbst wenn Sie sie niemals verwenden möchten, können Sie die Markierung + IP-Regel fwmark von iptables verwenden (anhand der Überprüfung der ausgelösten Weiterleitung). Ich weiß nicht, ob es eine Lösung gibt, indem iptables für dieses Problem verwendet wird, aber eine Standardroute ist immer noch erforderlich, wenn iptables beteiligt ist A.B vor 6 Jahren 0
Vielen Dank. Gibt es eine Lösung, die keine IP-Tabellen enthält? Ich frage mich, warum das Routing-Lookup fehlschlägt, wenn die Quelladresse angegeben wird, und ich habe eine Regel, in der alle Pakete der Quelladresse X angegeben werden. Tabelle Y verwenden IMerin vor 6 Jahren 0
was ist damit? `ip link add dummy0 Dummy '; `ip link set dummy0 up`; `ip route add default dev dummy0`. Offensichtlich geht kein Paket an den falschen Ort. In meinem Test mit socat bin ich von "Network is unerreichbar" zur Antwort mit der Quelle 192.168.1.1 gegangen, wenn ich aus demselben LAN über eth0 bis 192.168.1.1 kontaktiert habe. Nun scheint es ein einfacher Fall zu sein. Gibt es einen konkreten Fall? Sie haben übrigens keine Route in die Frage geschrieben, daher kann ich hier nicht mehr tun A.B vor 6 Jahren 0
ok Dinge funktionieren gut für die Beantwortung (einschließlich des UDP-Falls). Beim Einleiten einer ausgehenden Verbindung ohne Angabe einer IP-Adresse wird jedoch die IP-Adresse (192.168.1.1) der ersten Schnittstelle und das Standard-Dummy0 für die Routenschnittstelle ausgewählt. Wenn ich dann das Paket markiere, löst es eine Umleitungsüberprüfung aus und folgt schließlich den erwarteten Regeln (also wechselt zu eth0), nicht einmal die Notwendigkeit, eine fwmark-Regel hinzuzufügen, die Umleitungsroutine alleine macht es. A.B vor 6 Jahren 0

0 Antworten auf die Frage