Wie kann ich mit iproute2 ein Subnetz an eine andere Schnittstelle routen?

524
KingPrawn

Ich versuche also, das Routing mit iproute einzurichten, sodass ein bestimmtes Client-Subnetz über eine andere Schnittstelle auf einen Firewall-Uplink zugreifen kann.

Der Server verfügt über vier Schnittstellen:

2: enp2s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether a0:36:9f:e6:7a:9e brd ff:ff:ff:ff:ff:ff inet 10.20.30.1/16 brd 10.20.255.255 scope global enp2s0f0 valid_lft forever preferred_lft forever inet6 fe80::a236:9fff:fee6:7a9e/64 scope link  valid_lft forever preferred_lft forever 3: enp2s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether a0:36:9f:e6:7a:9f brd ff:ff:ff:ff:ff:ff inet 10.132.128.70/26 brd 10.132.128.127 scope global enp2s0f1 valid_lft forever preferred_lft forever inet6 fe80::a236:9fff:fee6:7a9f/64 scope link  valid_lft forever preferred_lft forever 4: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether ac:1f:6b:00:d1:ce brd ff:ff:ff:ff:ff:ff inet 10.132.128.71/26 brd 10.132.128.127 scope global eno1 valid_lft forever preferred_lft forever inet6 fe80::ae1f:6bff:fe00:d1ce/64 scope link  valid_lft forever preferred_lft forever 5: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether ac:1f:6b:00:d1:cf brd ff:ff:ff:ff:ff:ff inet 172.16.10.1/21 brd 172.16.15.255 scope global eno2 valid_lft forever preferred_lft forever inet6 fe80::ae1f:6bff:fe00:d1cf/64 scope link  valid_lft forever preferred_lft forever 

Clients können eine Verbindung zum 10.20.0.0/16-Subnetz herstellen und erhalten eine IP-Adresse über DHCP. Sie sollten dann über die Schnittstelle enp2s0f1 auf das Internet zugreifen können. Diese Schnittstelle ist ein Firewall-Internet-Uplink mit dem Gateway um 10.132.128.65. Ich habe keine Kontrolle über die Firewall.

Die Routing-Regeln und Tabellen sehen folgendermaßen aus:

Tisch lokal:

broadcast 10.20.0.0 dev enp2s0f0 proto kernel scope link src 10.20.30.1  local 10.20.30.1 dev enp2s0f0 proto kernel scope host src 10.20.30.1  broadcast 10.20.255.255 dev enp2s0f0 proto kernel scope link src 10.20.30.1  broadcast 10.132.128.64 dev eno1 proto kernel scope link src 10.132.128.71  broadcast 10.132.128.64 dev enp2s0f1 proto kernel scope link src 10.132.128.70  local 10.132.128.70 dev enp2s0f1 proto kernel scope host src 10.132.128.70  local 10.132.128.71 dev eno1 proto kernel scope host src 10.132.128.71  broadcast 10.132.128.127 dev eno1 proto kernel scope link src 10.132.128.71  broadcast 10.132.128.127 dev enp2s0f1 proto kernel scope link src 10.132.128.70  broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1  local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1  local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1  broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1  broadcast 172.16.0.0 dev tap0 proto kernel scope link src 172.16.0.66  local 172.16.0.66 dev tap0 proto kernel scope host src 172.16.0.66  broadcast 172.16.3.255 dev tap0 proto kernel scope link src 172.16.0.66  broadcast 172.16.8.0 dev eno2 proto kernel scope link src 172.16.10.1  local 172.16.10.1 dev eno2 proto kernel scope host src 172.16.10.1  broadcast 172.16.15.255 dev eno2 proto kernel scope link src 172.16.10.1 

Tischhaupt:

10.20.0.0/16 dev enp2s0f0 scope link src 10.20.30.1  10.132.128.64/26 dev eno1 proto kernel scope link src 10.132.128.71  10.132.128.64/26 dev enp2s0f1 proto kernel scope link src 10.132.128.70  172.16.0.0/22 dev tap0 proto kernel scope link src 172.16.0.66  172.16.8.0/21 dev eno2 proto kernel scope link src 172.16.10.1 

Tabellenvorgabe:

default via 10.132.128.65 dev eno1 onlink 

Ich habe versucht, die Route folgendermaßen einzurichten:

echo 200 clients >> /etc/iproute2/rt_tables ip rule add from 10.20.0.0/16 lookup clients ip route add default via 10.132.128.70 dev enp2s0f1 table clients ip route flush cache 

aber das hat nicht funktioniert. Ich habe also versucht, die Routing-Regel in zu ändern

from 10.20.30.1 lookup clients //and from iif enp2s0f0 lookup clients 

aber ich bekomme immer noch keine verbindung zur schnittstelle. Ich teste mit

ping -I enp2s0f0 10.132.128.70 

Da die Regel in Ordnung erscheint, habe ich verschiedene Routen ausprobiert:

ip route add 10.20.0.0/16 dev enp2s0f0 table clients ip route add 10.132.128.64/26 via 10.132.128.65 dev enp2s0f1 table clients ip route add 10.132.128.64/26 via 10.20.30.1 dev enp2s0f1 table clients ip route add default 10.20.0.0/16 via 10.132.128.65 dev enp2s0f1 table clients 

Wie Sie vielleicht schon erraten haben, verwirre ich mich gerade. Wenn ich es richtig verstanden habe, funktioniert es so:

ip route add via dev table clients 

Oder habe ich das falsch verstanden? Eine andere Sache ist, wenn ich a

ip route get 10.132.128.65 // where we want to end up 

Das Ergebnis ist

10.132.128.65 dev eno1 src 10.132.128.71  cache  

Die Route in der Standardtabelle scheint also die Regel für die Client-Tabelle zu überschreiben. Die Client-Tabellenregel ist jedoch aktiv, da Änderungen in der Client-Tabelle die Konnektivität für die Clients im 10.20.0.0/16-Netzwerk ändern.

Sollte etwas fehlen, gebe ich Ihnen gerne Auskunft.

Danke im Voraus!

0

1 Antwort auf die Frage

0
vera

Ihre folgende Konfiguration scheint in Ordnung zu sein:

echo 200 clients >> /etc/iproute2/rt_tables ip rule add from 10.20.0.0/16 lookup clients ip route add default via 10.132.128.70 dev enp2s0f1 table clients 

Ich gehe davon aus, dass Sie Ping von Ihrem Router und nicht von einem Ihrer Clients aus testen. Dann ist Ihr Ping-Befehl ping -I enp2s0f0 10.132.128.70falsch. Tatsächlich ist 10.132.128.70 eine lokale Adresse (eine Adresse Ihres Routers). Icmp-Anforderungen bleiben dann lokal und werden nicht an enp2s0f1 oder eno1 weitergeleitet.

Stattdessen könnten Sie es versuchen

ping -I enp2s0f0 10.132.128.65 

Abhängig von der Firewall werden möglicherweise Ping- / ICMP-Antworten angezeigt oder nicht, Sie können jedoch zumindest prüfen, ob Pakete über die rechte Schnittstelle gesendet werden (enp2s0f1). Um dies sicherzustellen, können Sie tcpdump verwenden :

tcpdump -i enp2s0f1 ip host 10.132.128.65