
Ich verwende Gentoo Linux und verwende daher einfache iptbales, um meine Firewall und mein Netzwerk zu verwalten. Normalerweise verwende ich wan0 für meinen gesamten Datenverkehr, aber da ich bereits einen Webserver dahinter habe, hätte ich gerne wan1 (Bindung an eine andere Domäne) für meinen zweiten Webserver.
Ich habe drei Schnittstellen:
- eth0 = LAN
- wan0 = Primär verwendetes WAN (Standard-Gateway)
- wan1 = Sekundäres WAN
Einige Infos zu den Gateways
> route -n
Kernel IP Routentabelle
Ziel Router Genmask Flags Metric Ref Use Iface
0.0.0.0 80.108.x.x 0.0.0.0 UG 0 0 0 wan0
192.168.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
80.108.x.0 0.0.0.0 255.255.254.0 U 0 0 0 wan0
84.114.y.0 0.0.0.0 255.255.255.0 U 0 0 0 wan1
127.0.0.0 127.0.0.1 255.0.0.0 UG 0 0 0 lo
Die Standardinitialisierung für NAT/MASQUEARDING ist
sysctl -q -w net.ipv4.conf.all.forwarding=1
iptables -N BLOCK
iptables -A BLOCK -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A BLOCK -m state --state NEW,ESTABLISHED -i eth0 -j ACCEPT
iptables -A BLOCK -m state --state NEW,ESTABLISHED -i lo -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wan0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o wan1 -j MASQUERADE
Hinter diesem Gateway betreibe ich mehrere Webserver. Auf einer Maschine betreibe ich einen HTTP-Server auf Port 8000 statt 80. Wenn ich wan0 als eingehende Schnittstelle verwende, wende ich normalerweise die folgenden Regeln an:
lan_host1="192.168.0.200"
iptables -A FORWARD -i wan0 -p TCP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan0 -p TCP --dport 8000 -j DNAT --to-destination "$lan_host1":80
iptables -A FORWARD -i wan0 -p UDP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan0 -p UDP --dport 8000 -j DNAT --to-destination "$lan_host1":80
Das funktioniert gut. Jetzt möchte ich, dass wan1 verwendet wird, da wan0 an eine IP/Domäne gebunden ist, die ich normalerweise für etwas anderes verwende.
Ich dachte, eine einfache Änderung an wan1 würde es erledigen.
lan_host1="192.168.0.200"
iptables -A FORWARD -i wan1 -p TCP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan1 -p TCP --dport 8000 -j DNAT --to-destination "$lan_host1":80
iptables -A FORWARD -i wan1 -p UDP -d $lan_host1--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i wan1 -p UDP --dport 8000 -j DNAT --to-destination "$lan_host1":80
Aber das funktioniert nicht. Ich vermute, das Problem ist, dass wan0 das Standard-GW ist. Ich vermute also, dass Pakete, die von wan1 empfangen werden, an lan_host1 weitergeleitet werden, aber wenn sie an das Gateway zurückgesendet werden, werden sie über wan0 statt über wan1 gesendet oder verwenden zumindest die IP von wan0.
Irgendwelche Vorschläge, wie ich das schaffen könnte?
Vielen Dank im Voraus, Rob
Antwort1
Da die Antwort von der Konfiguration abhängt, mache ich einige Annahmen. Sie müssen die Antwort an die tatsächliche Konfiguration anpassen.
wan1's LAN und Gateway fürwan1willkürlich gewählt als 84.114.7.0/24 und 84.114.7.254.
Es werden keine Firewall-Regeln berücksichtigt, aber all dies sollte nicht mit ihnen interagieren.
Unter Linuxip link
,ip address
Undip route
sollte immer anstelle von veraltet verwendet werden ifconfig
und kann route
wahrscheinlich route
sowieso keine zusätzlichen Routingtabellen verarbeiten.
Nur zur Erinnerung,iptablesoder eigentlichNetzfilter, routet nicht, kann aber durch seine Aktionen Routing-Entscheidungen des IP-Routing-Stacks ändern. Diesschematischzeigt, wo Routing-Entscheidungen getroffen werden können. Für gerouteten (und nicht lokal erzeugten) Verkehr, der sich nur an einem Ort befindet und Änderungen müssen vor Folgendem erfolgen:Rohmaterial/PREROUTING,mangle/Vorherigesodernat/PRE-ROUTING, mitrohoft unpraktisch undnatürlichnur für begrenzte Fälle, meist verlassenMangel.
Aeinfaches Multihomed-System, um mehrere Wege zum Internet zu nutzen, erfordert in der RegelRichtlinienrouting, wobei sich die Route nicht nur wie üblich mit dem Ziel ändern kann, sondern auch mit der Quelle oder mit anderen Selektoren (wie hier geschehen), die in Richtlinienregeln verwendet werden. Unter Linux können zusätzliche Regeln erstellt werden mitip rule
kann eine andere Routing-Tabelle ausgewählt werden, um z. B. eine andere Standardroute auszuwählen (es wird weiterhin nur eine Standardroute geben, aber einepro Routingtabelle).
Hier also das Prinzip, während man weiterhin aktiv bleibtStrikte Reverse Path Forwarding(rp_filter), ist die Annahme von Paketen vonwan1und leiten Sie sie wie gewohnt weiter aneth0Verwendung einer alternativen Tabelle (die es ermöglicht,rp_filter). Diese zusätzliche Routing-Tabelle sollte die Haupt-Routing-Tabelle duplizieren, aber nur die für den alternativen Pfad erforderlichen Routen verwenden (wan1) und schließt somit die üblichen Routen mit dem „normalen“ Weg nicht ein (wan0). Wenn andere Routen (wie VPNs usw.) in Flüsse einbezogen werden müssen, die durchwan1, besteht die Möglichkeit, dass auch deren Route hinzugefügt werden muss oder dass andere zusätzliche Regeln und Tabellen erstellt werden müssen, um damit umzugehen.
Da Linux im Kernel 3.6 die Verwendung eines Routing-Caches eingestellt hat, gibt es im Routing-Stack nichts, was darauf hinweist, dass Antwortpakete vonhost1an den Kunden durchwan1und sie würden am Ende die Haupt-Standardroute verwenden durchwan0, NATed mit der falschen IP für diese Schnittstelle (Netzfilterist routenagnostisch und hat bereits das NAT ausgewählt, das beim Empfang des ersten Pakets der Verbindung durchgeführt werden soll) und wird wahrscheinlich vom nächsten Router des ISPs, der ebenfalls Strict Reverse Path Filtering durchführt, gelöscht. Es gibt eineNetzfilterFunktion, die es ermöglicht, die Markierung eines Pakets in die Markierung des Conntracks zu kopieren und wieder in das Paket einzufügen: Dies dient als Routenspeicher für die Verbindung.iptablesUndNetzfilter'SKontaktwird für zwei verwandte Funktionen verwendet: zum Markieren des Pakets, um die Routing-Entscheidung zu ändern, und zum Wiederherstellen dieser Markierung auf den Antwortpaketen, die als Teil derselben Verbindung identifiziert werden.
All dies lässt sich in diese Befehle übersetzen:
- Routing-Teil
Für markierte Pakete (beliebiger Markierungswert 101) wird eine zusätzliche Routing-Tabelle verwendet (unabhängiger beliebiger Wert ebenfalls 101):
ip rule add fwmark 101 lookup 101
Füllen Sie die Tabelle mit Einträgen ähnlich demhauptsächlichRouting-Tabelle, minuswan0Einträge:
ip route add table 101 192.168.0.0/16 dev eth0
ip route add table 101 84.114.7.0/24 dev wan1
ip route add table 101 default via 84.114.7.254 dev wan1
- iptables/NetzfilterTeil
Bei den folgenden Befehlen sind diverse Optimierungen möglich, sie können wahrscheinlich noch verbessert werden.
Stellen Sie eine mögliche, bereits gespeicherte vorherige Markierung wieder her, sodass Antwortpakete die gleiche Markierung wie Originalpakete erhalten:
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
Markieren Sie Pakete, die vonwan1um die Routing-Entscheidung oben zu ändern:
iptables -t mangle -A PREROUTING -i wan1 -j MARK --set-mark 101
Wenn eine Markierung vorhanden ist, speichern Sie sie inKontakt(hätte man machen können imnatürlichTabelle, um dies nur einmal pro Verbindungsfluss und nicht für jedes Paket durchzuführen):
iptables -t mangle -A PREROUTING -m mark ! --mark 0 -j CONNMARK --save-mark
Eigentlich wird das immer noch scheiternStrikte Reverse Path Forwardingüberprüfen, da dieseundokumentierte Funktionwurde 2010 hinzugefügt. Es muss hier verwendet werden:
sysctl -w net.ipv4.conf.wan1.src_valid_mark=1