PeterPawn
IPPF-Urgestein
- Mitglied seit
- 10 Mai 2006
- Beiträge
- 15,590
- Punkte für Reaktionen
- 1,916
- Punkte
- 113
Auch wenn der Urheber dieser Vorschläge mich offenbar ignoriert (vielleicht stehe ich in seiner Ignore-Liste, aber zumindest hat er ja das Masquerading anstelle von "plain routing" aus #7 aufgegriffen in #9), habe ich dennoch einfach mal selbst probiert, was denn wohl passiert, wenn man die vorgeschlagenen Kommandos (die mir sehr "suspekt" erscheinen aus meiner eigenen Erfahrung) ausführen will:Code:iptables -t nat -I POSTROUTING 3 -o eth1 -j SNAT --to-source 192.168.0.1:80 iptables -t nat -I POSTROUTING 4 -o eth1 -j SNAT --to-source 192.168.0.1:443
Rich (BBCode):
vidar:~ # id
uid=0(root) gid=0(root) groups=0(root)
vidar:~ # iptables -t nat -I POSTROUTING 1 -o eth0 -j SNAT --to-source 192.168.0.1:80
iptables v1.8.11 (legacy): Need TCP, UDP, SCTP or DCCP with port specification
Try `iptables -h' or 'iptables --help' for more information.
vidar:~ #
root bin, es also auch ohne sudo nicht an mangelnden Rechten scheitert. Auch die eingesetzte Version ist - nach der Website des Projekts: https://www.netfilter.org/projects/iptables/downloads.html - die aktuelle, es scheitert also auch nicht an veralteter Software.Was mache ich denn dann falsch? Hat vielleicht die
man-Page für die SNAT-Extension doch recht und die Angabe von Ports ist an die Angabe eines (diese Ports auch benutzenden) Protokolls gebunden?
Rich (BBCode):
vidar:~ # man iptables-extensions | sed -n -e "/SNAT$/,+6p"
SNAT
This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.
It specifies that the source address of the packet should be modified (and all future packets in this connection will also be mangled),
and rules should cease being examined. It takes the following options:
--to-source [ipaddr[-ipaddr]][:port[-port]]
which can specify a single new source IP address, an inclusive range of IP addresses.
Optionally a port range, if the rule also specifies one of the following protocols: tcp, udp, dccp or sctp.
If no port range is specified, then source ports below 512 will be mapped to other ports below 512: those
between 512 and 1023 inclusive will be mapped to ports below 1024, and other ports will be mapped to
1024 or above. Where possible, no port alteration will occur.
vidar:~ #
-p tcp wurde nur versehentlich vergessen (TCP wäre für das Webinterface des ZTE-Routers ja ausreichend).Was bewirkt diese Regel denn dann, wenn sie für das Interface
eth1 mit der IP-Adresse 192.168.0.133 zur Anwendung kommen sollte und der von eth0 aus zu routende Traffic seinerseits das Ziel 192.168.0.1 adressiert? Es würde die Quell-Adresse im IP-Paket ("source address", das sind 4 Byte ab Offset 12 im IP-Header: https://en.wikipedia.org/wiki/IPv4#Header) durch die angegebene Adresse ersetzt (und meinetwegen auch noch die (Quell-)Portnummer), womit das Paket dann (angenommen es ist unverschlüsselter HTTP-Traffic auf TCP-Port 80 an die IP-Adresse 192.168.0.1) in BEIDEN Adressfeldern im IP-Header identische Angaben enthält und der arme Router würde jetzt - wenn das Paket ihn erreicht und er es verarbeitet, sprich sein SYN-Paket als Antwort senden will - seinerseits versuchen, eine Antwort an seine eigene IP-Adresse auf dem Standard-Port für HTTP zu senden.Nun ist ein
SNAT-Target ja glücklicherweise ein "finales", d.h. die Verarbeitung weiterer Regeln wird abgebrochen (grün markiert in der o.a. man-Page) - die zweite Regel käme so also niemals wirklich zur Ausführung.Auch die anderen beiden Vorschläge:
ergeben - abseits der Syntax-Fehler, egal ob mit oder ohne Protokoll-Angabe bzw. Portnummern - für mich keinen Sinn, auch wenn sie wohl nicht länger "erforderlich" sein sollen:Code:iptables -t nat -I POSTROUTING 1 -o eth0 -j SNAT --to-source 192.168.0.1:80 iptables -t nat -I POSTROUTING 2 -o eth0 -j SNAT --to-source 192.168.0.1:443
Wenn hier tatsächlich nur HTTP- oder HTTPS-Traffic von und zurTeste auch ohne source-NAT für das eth0-Interface auf deinem PI (... d. h. source-NAT nur für das eth1-Interface des PI).
192.168.0.1 "geroutet" werden soll (mit Masquerading, denn auch SNAT ist ja (statisches) Masquerading), dann hätten die auf eth0 ausgegebenen Pakete, die ihren Ursprung beim ZTE-Router haben, ja bereits die Absender-Adresse 192.168.0.1 und eine der beiden (Absender-)Portnummern (80 bei HTTP, 443 bei HTTPS), denn der Router antwortet in aller Regel mit Paketen von demselben Endpunkt (das ist die Kombination aus IP-Adresse und Portnummer), an den auch die Anfragen gerichtet waren (sonst hätte der Client ja auch Probleme, die passende Verbindung für ein Paket zu finden). Für solche Pakete würden die o.a. Regeln also (gesetzt den Fall, sie wären irgendwie syntaktisch richtig eingegeben, was machbar ist, wenn man etwas ergänzt oder wegläßt) ebenfalls gar nichts bewirken, da nur die bereits vorhandenen Angaben mit denselben Daten noch einmal überschrieben würden.Für alle anderen Datenpakete (if any, auch wenn's hier nicht Teil der Aufgabenstellung war), die aus dem Netz
192.168.0.0/24 über den RasPi an das Netz 192.168.178.0/24 gehen sollen, wären diese Regeln aber absolutes Gift, denn ich kann da keinerlei "Filterbedingungen" sehen, mit denen diese Aktionen auf irgendwelchen bestimmten(!) Traffic beschränkt würden - im Ergebnis wird selbst bei jedem ICMP-Paket, das über den RasPi geroutet werden soll (wenn man sich nicht doch zur zusätzlichen(!) Angabe von -p tcp entscheiden sollte, was es dann zumindest auf TCP-Pakete beschränken würde, aber auch die kriegen dann gnadenlos immer die angegebene Portnummer als Absender aufs Auge gedrückt), die Absender-Adresse ausgetauscht und das wird wohl eher nicht der "gewünschte" Effekt sein.Bei einem
MASQUERADE-Target wird automatisch die IP-Adresse des ausgehenden Interfaces (hier also eth1 auf dem RasPi) als Absender-Adresse im Paket eingetragen (die Suche danach kostet (ein wenig) zusätzliche Zeit und beschränkt den möglichen Durchsatz), womit das Ziel dann auch weiß, wohin es ein Antwort-Paket senden soll. Bei einem SNAT-Target wird aber mit der Angabe von --to-source (eigentlich auch nicht wirklich mißverständlich benannt) nicht angegeben, WOHIN das Paket gesendet werden soll (und ggf. noch an welchen Port), sondern WIE das Datenpaket in den Absender-Angaben ("source address - and optionally port number") manipuliert werden soll, bevor es an den Hardware-Treiber zur Ausgabe geht.Es würde mich also (erneut) schwer verwundern, wenn mit den angegebenen Kommandos noch IRGENDETWAS über den RasPi geroutet werden könnte - selbst wenn man die Syntax-Fehler in den Kommandos ausmerzt.da werde ich das mal, morgen oder übermorgen, mit den anderen Regeln testen.
Aber ich wurde ja schon einmal überrascht - zum Event-Log von Deinem Test heute vormittag hätte ich noch die Nachfrage, ob da um 10:12 Uhr schon wieder die "primäre" Verbindung aktiviert wurde. Wenn ja, was genau hast Du denn in der Zeit (knapp 4 Minuten), wo die Ersatzverbindung aktiv war, alles getestet - außer die Support-Daten von der FRITZ!Box gezogen?
Ich habe jetzt leider zu lange für diesen Beitrag gebraucht und mir läuft gerade etwas die Zeit weg - ich sehe mir die bereitgestellten Support-Daten (danke dafür) aber noch an (EDIT: heruntergeladen habe ich sie schon), wenn ich die Zeit dafür habe. Mich interessiert schon sehr, was jetzt mit dem Routing passiert bzw. was genau sich ändert, wenn die Ersatzverbindung aktiviert wird. So weit ich das verfolgt habe, hat das noch niemand untersucht (oder es zumindest noch nicht - hier - beschrieben/erklärt).
Zuletzt bearbeitet:
