In einem Linux-System, das als Gateway in meinem LAN fungiert, möchte ich den Datenverkehr basierend auf Quell-IP-Adressen weiterleiten.
Ich habe zwei Netzwerkkarten und eine dieser Karten hat zwei verschiedene Standard-Gateways.
Ich weiß, dass ich auf einem System nur ein Standard-Gateway haben kann und dass die Routenauswahl auf der Zieladresse basiert.
Ich möchte sicherstellen, dass der PC mit der IP 192.168.3.5 über das Gateway 172.16.62.254 erreichbar ist.
Hinter eth0 befindet sich ein VPN, mit dem ich auf das Internet zugreifen kann
Die Einstellung der Netzwerkschnittstellen ist:
DEVICE=eth0
TYPE=Ethernet
IPADDR=172.16.61.2
PREFIX=24
IPADDR2=172.16.61.3
PREFIX2=24
GATEWAY=172.16.61.1
DEVICE=eth0:1
TYPE=Ethernet
DEFROUTE=no
IPADDR=172.16.62.100
PREFIX=24
#GATEWAY=172.16.62.254
DEVICE=eth1
TYPE=Ethernet
IPADDR=192.168.3.1
NETMASK=255.255.255.0
Die Routingtabelle lautet:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
172.16.62.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
172.16.61.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 172.16.61.1 0.0.0.0 UG 0 0 0 eth0
Die IP-Adressen der beiden Gateways sind:
172.16.61.1
172.16.62.254
Der PC mit IP-Adresse192.168.3.2muss GW erreichen172.16.61.1,
der PC mit IP-Adresse192.168.3.5muss GW 1 erreichen72.16.62.254
Um den Zugriff auf die beiden Gateways zu ermöglichen, führe ich eine Übersetzung der IP-Adressen über iptables durch:
iptables -t nat -A POSTROUTING -s 192.168.3.2 -j SNAT --to-source 172.16.61.3
und umgekehrt
iptables -t nat -A PREROUTING -d 172.16.61.3 -j DNAT --to-destination 192.168.3.2
Die Idee, Pakete über das Gateway 172.16.62.254 zu routen, besteht darin,iptablesum Pakete zu markieren, deren Quell-IP-Adresse 192.168.3.5 oder 172.16.62.100 ist, und sie dann mit iproute2 zu routen, wofür ich die folgenden Schritte ausgeführt habe:
In/etc/iproute2/rt_tablesIch habe die Zeile hinzugefügt
200 route254
Ich habe die Pakete gekennzeichnet mit:
iptables -t mangle -A OUTPUT -s 192.168.3.5 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -s 172.16.62.100 -j MARK --set-mark 0x1
Ich habe das Routing wie folgt konfiguriert:
ip route add default via 172.16.62.254 dev eth0:1 table route254
ip route add 172.16.62.0/24 dev eth0:1 src 172.16.62.100 table route254
ip rule add from 172.16.62.100/32 table route254
ip rule add to 172.16.62.100/32 table route254
ip rule add prio 199 fwmark 0x1 lookup route254
Was ich herausgefunden habe ist, dass die Erreichbarkeit des PCs mit der Adresse 192.168.3.2 funktioniert, der PC ist also von außen erreichbar, der PC mit der Adresse 192.168.3.5 hingegen nicht.
Die Ausgabe von tcpdump im Fall des PCs mit der Adresse 192.168.3.2 ist
18:38:31.317553 IP x.x.x.x.45053 > 172.16.61.3.ftp: S 3190836796:3190836796(0) win 5840 <mss 1380,sackOK,timestamp 2834368503 0,nop,wscale 7>
18:38:31.317832 IP x.x.x.x.45053 > 192.168.3.2.ftp: S 3190836796:3190836796(0) win 5840 <mss 1380,sackOK,timestamp 2834368503 0,nop,wscale 7>
18:38:31.317732 IP 192.168.3.2.ftp > x.x.x.x.45053: S 1998545683:1998545683(0) ack 3190836797 win 28960 <mss 1460,sackOK,timestamp 1123125 2834368503,nop,wscale 7>
18:38:31.317778 IP 172.16.61.3.ftp > x.x.x.x.45053: S 1998545683:1998545683(0) ack 3190836797 win 28960 <mss 1460,sackOK,timestamp 1123125 2834368503,nop,wscale 7>
18:38:31.368562 IP x.x.x.x.45053 > 172.16.61.3.ftp: . ack 1 win 46 <nop,nop,timestamp 2834368531 1123125>
18:38:31.368580 IP x.x.x.x.45053 > 192.168.3.2.ftp: . ack 1 win 46 <nop,nop,timestamp 2834368531 1123125>
18:38:33.257206 IP x.x.x.x.45053 > 172.16.61.3.ftp: P 1:3(2) ack 1 win 46 <nop,nop,timestamp 2834370444 1123125>
Die Ausgabe von tcpdump im Fall des PCs mit der Adresse 192.168.3.5 ist
12:49:04.047809 IP x.x.x.x.60804 > 172.16.62.100.ftp: S 790746700:790746700(0) win 5840 <mss 1380,sackOK,timestamp 2986198269 0,nop,wscale 7>
12:49:04.048069 IP x.x.x.x.60804 > 192.168.3.5.ftp: S 790746700:790746700(0) win 5840 <mss 1380,sackOK,timestamp 2986198269 0,nop,wscale 7>
12:49:04.047884 IP 192.168.3.5.ftp > x.x.x.x.60804: S 3787612501:3787612501(0) ack 790746701 win 28960 <mss 1460,sackOK,timestamp 922143 2986198269,nop,wscale 7>
12:49:04.047909 IP 172.16.62.100.ftp > x.x.x.x.60804: S 3787612501:3787612501(0) ack 790746701 win 28960 <mss 1460,sackOK,timestamp 922143 2986198269,nop,wscale 7>
12:49:05.448336 IP 192.168.3.5.ftp > x.x.x.x.60804: S 3787612501:3787612501(0) ack 790746701 win 28960 <mss 1460,sackOK,timestamp 923544 2986198269,nop,wscale 7>
12:49:05.448351 IP 172.16.62.100.ftp > x.x.x.x.60804: S 3787612501:3787612501(0) ack 790746701 win 28960 <mss 1460,sackOK,timestamp 923544 2986198269,nop,wscale 7>
12:49:07.048100 IP x.x.x.x.60804 > 172.16.62.100.ftp: S 790746700:790746700(0) win 5840 <mss 1380,sackOK,timestamp 2986201269 0,nop,wscale 7>
12:49:07.048128 IP x.x.x.x.60804 > 192.168.3.5.ftp: S 790746700:790746700(0) win 5840 <mss 1380,sackOK,timestamp 2986201269 0,nop,wscale 7>
Um zu prüfen, ob die Pakete tatsächlich markiert waren, habe ich Folgendes verwendet:
iptables -A INPUT -m mark ! --mark 0 -m limit --limit 8/min --limit-burst 12 -j LOG --log-prefix "IPTables-Marks: "
aber ich habe keinen Eintrag in der Logdatei
Wie kann ich dem PC mit der IP-Adresse 192.168.3.5 Zugriff auf das Gateway 172.16.62.254 gewähren und ihn darüber erreichbar machen?