Weiterleiten eines Localhost: Port an einen externen IP: NewPort

8

Auf unserem Linux-Server läuft eine Anwendung. Wenn wir von dieser Anwendung aus versuchen, auf localhost (127.0.0.1): localport zuzugreifen, sollte es an eine externe IP weitergeleitet werden. Benutzer werden nur an einem bestimmten Port versuchen, auf den lokalen Host zuzugreifen, der automatisch weitergeleitet wird. Ich habe die nat-Tabelle von iptables gelesen, aber PREROUTING und POSTROUTING sind nicht anwendbar, wenn dies richtig ist, da ich von localhost selbst auf einen Port auf localhost zugreife, der die Netzwerkschnittstelle überhaupt nicht berührt. Die Frage nach der OUTPUT-Tabelle mag nützlich sein, aber als ich einige Kombinationen ausprobierte, funktionierte sie nicht. Benutze ich das Richtige oder ist es überhaupt nicht möglich, es zu tun?

Kann mich jemand in die richtige Richtung weisen?

keerthi
quelle
Der lokale Verkehr läuft (normalerweise lo) über die Loopback-Schnittstelle . Sie sollten in der Lage sein, iptables-Regeln darüber einzurichten.
John WH Smith
user40524 - Ich frage mich, warum Sie den Stil geändert und auch "Danke" entfernt haben. Gibt es einen bestimmten Grund dafür, dass es sich um den Stil handeln muss, als den Sie ihn bearbeitet haben?
Keerthi
Schauen Sie hier
John WH Smith

Antworten:

13

Ich habe mir vorgenommen, dies selbst zu tun.

Um dies zu erreichen, sollten 2 Regeln und ein Flag gesetzt werden.

Das hier verwendete Beispiel ist für "telnet localhost XXXX", sollte Pakete an Ext.er.nal.IP weiterleiten: JJJJ.

sysctl -w net.ipv4.conf.all.route_localnet = 1

Dieses Flag existiert leider nur auf den neuesten Linux-Kerneln und ist auf einem alten Kernel nicht verfügbar (es gibt auch kein alternatives Flag im alten Kernel). Ich bin mir nicht ganz sicher, von welchem ​​Kernel die Flagge verfügbar ist. Ich glaube, es ist auf Kernel-Versionen 3.XX verfügbar. Dieses Flag dient dazu, die Loopback-Adressen als geeignete Quell- oder Zieladresse zu betrachten. Quelle: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt

iptables -t nat -A OUTPUT -p tcp --dport XXXX -j DNAT - zum Ziel Ext.er.nal.IP: YYYY

Der obige Befehl ändert die Pakete, die an localhost: XXXX gesendet werden, mit der Ziel-IP als Ext.er.nal.IP: YYYY

iptables -t nat -A POSTROUTING -j MASQUERADE

Der Befehl ändert die Quell-IP als öffentliche IP Ihres Computers.

Sie können Ihre Regeln etwas strenger gestalten, indem Sie mit -s, -d, -i und -o die entsprechenden Quell- und Ziel-IPs und -Schnittstellen hinzufügen. Siehe "man iptables".

Vielen Dank an John WH Smith und Wurtel. Vorschläge waren sehr hilfreich.

keerthi
quelle
Ich danke dir sehr! Es hat mir sehr geholfen.
Nikmoon
6

Der einfachste Weg, dies zu erreichen, ist die Installation von netcatund inetd(Debian hat dies in openbsd-inetd).

Fügen Sie eine Zeile hinzu zu /etc/inetd.conf:

127.0.0.1:1234 stream tcp nowait root /bin/nc nc ex.ter.nal.ip 1234

Ersetzen Sie die 1234durch die echte Portnummer und ex.ter.nal.ipdurch die echte externe IP-Adresse. Möglicherweise müssen Sie .1000der nowaitOption eine größere Anzahl hinzufügen, wenn mehr als 128 Verbindungen pro Minute hergestellt werden müssen. Dies soll verhindern, dass außer Kontrolle geratene Verbindungen Ihr System unnötig laden.

Ich habe auch -q 4 -w 10als ncOptionen wie die in meiner Situation hilft, aber man braucht es nicht.

inetdNach dem Ändern der inetd.confDatei neu laden .

Doing es auf diese Weise Anwendungen ncgestartet , indem inetdals Relais - Prozess, die recht gut funktioniert.

wurtel
quelle
Ihr Vorschlag ist sehr hilfreich. Unser Server hat xinetd, was kein Problem ist. Ich habe die conf-Datei konfiguriert, es aber nicht geschafft, dass sie noch funktioniert. Der Grund, warum es nicht funktioniert, kann nicht gefunden werden. Ich möchte vermeiden, eine andere Anwendung zum Weiterleiten von Anfragen zu verwenden, da diese Ressourcen beansprucht. Unsere Anwendung kann mehr als 500 Verbindungen herstellen, die ohne Unterbrechung kontinuierlich ausgeführt werden sollen. Ich denke, xinetd erstellt für jede Verbindung einen Prozess, der möglicherweise mehr als 500 Threads aufnehmen kann. Gibt es einen Weg durch iptables selbst? (Blick auf John WH Smiths Vorschlag)
Keerthi
Ich habe es einmal versucht, iptablesaber ziemlich bald aufgegeben und meinen inetdTrick angewendet . Ich habe nur ein wenig Forschung getan und offenbar muss es in der getan werden natTisch OUTPUTKette mit einem-j DNAT --to-destination ex.ter.nal.ip:port
wurtel