Portweiterleitung mit zwei Routern

Portweiterleitung mit zwei Routern

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-Aund 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-Aund Router-Bdie 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-Adas als fungiert MASTER. Erstellen Sie eine neue Konfigurationsdatei /etc/keepalived/keepalived.confmit 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-Bdem 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=1teilt dem Kernel mit, dass die virtuelle IP NICHT an eine physische Schnittstelle gebunden sein darf.

vrrp_instance VI_1muss auf beiden Routern übereinstimmen. Dies ist ein Identifikator, da Sie mehrere VRRPs auf demselben Router laufen lassen können.

interface eth1ist die Schnittstelle, die zum LAN zeigt (zu den internen Servern zeigt).

state MASTERRouter-Aund so state BACKUPweiter Router-Bist selbsterklärend.

virtual_router_id 50muss auf beiden Routern übereinstimmen. Dies ist eine Kennung.

priority 101immer Router-Aweiter (Router-A hat in diesem Fall priority 100eine Router-Bhöhere Priorität).

authenticationmuss auf beiden Routern übereinstimmen. In diesem Fall habe ich einen Pre-Shared Key vonpassw123

virtual_ipaddressist 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

Referenz:https://www.keepalived.org/manpage.html

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.

verwandte Informationen