
Ich habe Server hinter zwei verschiedenen öffentlichen IPs und führe DNAT aus, um den Datenverkehr je nach Port an unterschiedliche interne Server zu senden.
------------------------- -----------------------
| server a (port 80/tcp)| | router A |
| (eth0) 192.168.1.123|..................|192.168.1.1 (eth1) |
------------------------- : | (eth0) 1.2.3.4|............
: ----------------------- :
: :
: ----------------------- :.... INTERNET
------------------------- : | router B | :
| server a (port 25/tcp)| : | (eth0) 2.3.4.5|...........:
| (eth0) 192.168.1.234|..................|192.168.1.2 (eth1) |
------------------------- -----------------------
Auf den Routern A und BI sind die Weiterleitung und folgende iptables aktiviert:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 25 -j DNAT --to 192.168.1.234
iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.123
Tatsächlich habe ich auf den Servern A und B folgende Route hinzugefügt:
route add default gw 192.168.1.1
Der gesamte interne Datenverkehr zum Internet läuft also über Router A und der gesamte Datenverkehr zu Port 25 und 80 wird korrekt an Server A und B gesendet, die Verbindung funktioniert jedoch nur, wenn der Datenverkehr über Router A kommt. Der Datenverkehr über Router B kommt zwar bei den Servern an, wird jedoch über Router A statt über B zurückgeleitet, sodass die Verbindung nicht funktioniert.
Ich habe auf den Servern eine neue Route hinzugefügt:
route add default fw 192.168.1.2
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
0.0.0.0 192.168.1.2 0.0.0.0 UG 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
Aber die Verbindungen funktionieren immer noch nicht.
Wie kann ich das schaffen?
Es ist nicht wichtig, den Datenverkehr (intern -> extern) auszugleichen, aber ich möchte, dass alle eingehenden Verbindungen aus dem Internet zu den externen IPs korrekt hergestellt werden.
HINWEIS: Ich habe auch versucht, den DNAT auf einem der Router mit der externen IP des anderen Routers durchzuführen, aber sie befinden sich in unterschiedlichen Netzwerken und es hat nicht funktioniert:
iptables -t nat -I PREROUTING -p tcp --dport 25 -d ${ExternalIPA} -i eth0 -j DNAT --to ${ExternalIPB}
Antwort1
Ihr aktuelles Setup wird nicht wie vorgesehen funktionieren. Sie benötigen eine virtuelle IP, die über Router-A
und schwebt Router-B
. Dies wird auch den Lastausgleich zwischen den beiden Routern auf einfache Weise ermöglichen. In diesem Beispiel verwende ich den IndustriestandardVRRPauf einem Linux-Router (Ubuntu-16).
Hier ist die Vorgehensweise:
Führen Sie unter Linux Router-A
und Router-B
die folgenden Befehle aus:
$ sudo echo "net.ipv4.ip_nonlocal_bind=1" >> /etc/sysctl.conf
$ sudo sysctl -p
Installieren Sie Keepalived auf beiden Routern
$ sudo apt-get update
$ sudo apt-get install keepalived -y
Gehen Sie dann zu , Router-A
das als fungiert MASTER
. Erstellen Sie eine neue Konfigurationsdatei /etc/keepalived/keepalived.conf
mit folgenden Einträgen:
vrrp_instance VI_1 {
interface eth1
state MASTER
virtual_router_id 50
priority 101
authentication {
auth_type AH
auth_pass pass123
}
virtual_ipaddress {
192.168.1.99
}
}
Gehen Sie dann zu Router-B
dem Eintrag, der als fungieren soll BACKUP
, und machen Sie dasselbe mit der neuen Konfigurationsdatei /etc/keepalived/keepalived.conf
:
vrrp_instance VI_1 {
interface eth1
state BACKUP
virtual_router_id 50
priority 100
authentication {
auth_type AH
auth_pass pass123
}
virtual_ipaddress {
192.168.1.99
}
}
Erläuterung:
net.ipv4.ip_nonlocal_bind=1
teilt dem Kernel mit, dass die virtuelle IP NICHT an eine physische Schnittstelle gebunden sein darf.
vrrp_instance VI_1
muss auf beiden Routern übereinstimmen. Dies ist ein Identifikator, da Sie mehrere VRRPs auf demselben Router laufen lassen können.
interface eth1
ist die Schnittstelle, die zum LAN zeigt (zu den internen Servern zeigt).
state MASTER
Router-A
und so state BACKUP
weiter Router-B
ist selbsterklärend.
virtual_router_id 50
muss auf beiden Routern übereinstimmen. Dies ist eine Kennung.
priority 101
immer Router-A
weiter (Router-A hat in diesem Fall priority 100
eine Router-B
höhere Priorität).
authentication
muss auf beiden Routern übereinstimmen. In diesem Fall habe ich einen Pre-Shared Key vonpassw123
virtual_ipaddress
ist die Floating-IP-Adresse, die VRRP verwenden wird. Diese IP muss auf beiden Routern übereinstimmen. Diese IP darf von keinem Gerät im LAN-Segment verwendet werden. In diesem Fall habe ich gewählt192.168.1.99
Keepalived-Dienst aktivieren
$ sudo systemctl enable keepalived
Keepalived-Dienst starten
$ sudo systemctl start keepalived
Zeit, die iptables-Regeln auf beiden Routern zu manipulieren.
Löschen Sie alle NAT-Regeln von beiden Routern (beseitigen Sie defekte NAT-Regeln).
$ sudo iptables -t nat -F
$ sudo iptables -t mangle -F
Fügen Sie dann die richtigen NAT-Regeln hinzu:
Router-A
$ sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 192.168.1.99
$ sudo iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 25 -j DNAT --to 192.168.1.234
Router-B
$ sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 192.168.1.99
$ sudo iptables -t nat -A PREROUTING -d ${externalIP} -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.123
Das ist alles, was Sie auf der Router-Seite brauchen. Wechseln Sie nun zu den Servern (Server-A und Server-B), löschen Sie das vorhandene Standard-Gateway ( 192.168.1.1
) und weisen Sie das neue Gateway zu ( 192.168.1.99
)
$ sudo ip route del 0/0
$ sudo route add default gw 192.168.1.99
Wenn Verbindungen vom Internet hergestellt werden, leiten die beiden Server (Server-A und Server-B) den Verkehr an die virtuelle IP ( 192.168.1.99
) weiter, die über dem Server schwebt Router-A
.Router-B
Antwort2
Schließlich habe ich es geschafft, es ohne virtuelle IP zum Laufen zu bringen, indem ich im Wesentlichen CONNNMARK verwendet und verschiedene Routen hinzugefügt habe:
NOTIZ:
- Router A eth1 MAC = AA:AA:AA:AA:AA:AA
- Router B eth1 MAC = BB:BB:BB:BB:BB:BB
Ich muss auf allen Servern, die asymmetrische Routen verwenden, folgende Routen und Iptables hinzufügen:
# add the two routing tables
ip route add to default table 11 via 192.168.1.1 dev eth0
ip route add to default table 33 via 192.168.1.2 dev eth0
# add the mark to the routing tables
ip rule add priority 99 table 11 fwmark 11
ip rule add priority 99 table 33 fwmark 33
# mark the packets that came from the different routes
iptables -t mangle -A OUTPUT ! -d 192.168.1.0/24 -m addrtype --dst-type UNICAST -j CONNMARK --restore-mark
iptables -A INPUT -i eth0 ! -s 192.168.1.0/24 -m addrtype --src-type UNICAST -m mac --mac-source AA:AA:AA:AA:AA:AA -j CONNMARK --set-mark 33
iptables -A INPUT -i eth0 ! -s 192.168.1.0/24 -m addrtype --src-type UNICAST -m mac --mac-source BB:BB:BB:BB:BB:BB -j CONNMARK --set-mark 11
Jetzt funktioniert alles einwandfrei. Alle Verbindungen vom Internet zu den externen IP-Adressen werden über den Router geleitet, der die DNAT-Verbindung verwaltet.