iptables leitet externe Anfragen auf 127.0.0.1 um

41

Ich habe einen Dienst, der auf 127.0.0.1 mit Port 2222 ausgeführt wird. Ich muss alle Anforderungen an 192.168.2.2:2222 (außerhalb der IP-Adresse) nur vom Subnetz 192.168.1.0/24 an 127.0.0.1:2222 weiterleiten .

Ich versuche das zu benutzen, aber es funktioniert nicht.

$ iptables -t nat -I PREROUTING -p tcp -d 192.168.1.0/24 --dport 2222 -j DNAT --to-destination 127.0.0.1:2222

Wie kann ich das zum Laufen bringen?

UPD: Adressschema bearbeiten.

SimWhite
quelle
Wir brauchen eine Klarstellung. Woher kommt der Verkehr? Wohin geht der Verkehr ursprünglich? Wohin soll der Verkehr gehen? Wie ich es gelesen habe, soll der Datenverkehr von 192.168.1.0/24 bis 127.0.0.1:2222 zu 12.23.34.45:2222 umgeleitet werden. Bei der Antwort von Warren wird jedoch davon ausgegangen, dass der Datenverkehr von 192.168.1.0/24 bis 12.23.34.45:2222 an 127.0.0.1:222
Patrick,
1
Der Datenverkehr kommt vom Subnetz 192.168.1.0/24 zum Subnetz 192.168.2.2:2222 und sollte auf den Dienst 127.0.0.1:2222 übersetzt werden. Ich habe Adressschema korrigiert.
SimWhite
1
Sie möchten eine Regel, nach der der Datenverkehr 2222über das Subnetz auf die Loopback-Schnittstelle portiert werden kann 192.168.1.0/24? Das ist nicht nur ein einzelner Regeltyp. Siehe hier: debuntu.org/…
slm
Ja. Wie ich verstehe, muss ich Masq-Regel hinzufügen? Die IP-Weiterleitung ist natürlich bereits aktiviert.
SimWhite
Warum sollte man es nicht auf einer "echten" IP ausführen und den Datenverkehr aus unerwünschten Quellen herausfiltern?
Dafür

Antworten:

60

Die von Ihnen verwendete iptables-Regel funktioniert, aber Sie müssen noch eine weitere Änderung vornehmen:

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

(Ersetzen eth0mit dem NIC 192.168.2.2residiert auf)

Standardmäßig lautet dieser Wert 0, der den Kernel anweist, keinen externen Datenverkehr weiterzuleiten, der für bestimmt ist 127.0.0.0/8. Dies dient nur der Sicherheit, da ein solcher Verkehr nicht normal ist.


Zusätzlicher Hinweis: Ihre derzeitige iptables-Regel ist zu weit gefasst. Ihre Regel gibt -d 192.168.1.0/24 --dport 2222an, dass das Ziel übereinstimmt. Wenn Ihr Computer versucht, mit einem anderen Host auf Port 2222 zu kommunizieren (dh ausgehenden Datenverkehr), wird er ebenfalls umgeleitet. Sie müssen entweder die -dÜbereinstimmung ändern -d 192.168.2.2oder hinzufügen -i eth0(oder was auch immer Ihre Nic ist).

Patrick
quelle
8
Diese Information ist überraschend schwer zu finden.
Wren T.
Ja, sehr wertvolle, schwer zu findende Informationen! Danke! Aber ich habe nicht route_localnet. Gab es andere Namen dafür? (in Linux 2.6.30) ls /proc/sys/net/ipv4/conf/lan/: accept_redirects arp_accept arp_filter arp_notify disable_policy force_igmp_version log_martians medium_id proxy_arp secure_redirects shared_media accept_source_route arp_announce arp_ignore bootp_relay disable_xfrm Forwarding mc_forwarding promote_secondaries rp_filter send_redirects Tag
IMZ - Ivan Zakharyaschev
Ich verstehe, der Patch fürroute_localnet ist aktueller (7. Juni 2012) als mein Kernel (2.6.30-std-def-alt15 # 1 SMP Mon Dec 14 08:45:48 UTC 2009). Ok, ich werde einfach die gewünschte Portweiterleitung (von außen nach innen) mit einem Weiterleitungsprozess wie netcat( nc) xinetdoder den Portweiterleitungsoptionen von ssh(letzteres ist natürlich ineffektiv und dumm, aber ich erwähne es, denn nun ja, diese Möglichkeit gibt es).
imz - Ivan Zakharyaschev
2
Meine 2 Cent: Sie können diesen Parameter für alle Schnittstellen mitsysctl -w net.ipv4.conf.all.route_localnet=1
Dmitriusan 10.11.17
Wie bei anderen war diese Information schwer zu bekommen. Danke, wenn ich das früher gefunden hätte, hätte ich mir eine Menge Mühe gespart.
Stephen Simpson
3

Sie können zu localhost umleiten, jedoch nicht zu loopback (127.0.0.0/8). Loopback ist eine Lücke. Sie müssen zu einer Ihrer realen Schnittstellen umleiten. Versuchen Sie es mit REDIRECT.

iptables -t nat -A PREROUTING ..... -j REDIRECT --to-port 222

dresende
quelle
Dies ist wahrscheinlich die beste Antwort ohne die sysctl voodo ...
Lester Cheung
Hilft
In diesem Fall verwenden Sie-j DNAT --to-destination w.x.y.z:222
dresende
2

Was ist, wenn die richtige Antwort mit route_localnetnicht funktioniert? ..

Wenn Ihr Kernel den Patch fürroute_localnet nicht enthält , dann ... aktualisieren Sie den Kernel!

Oder es gibt andere Möglichkeiten, den an einer Schnittstelle ankommenden Datenverkehr an einen anderen Port an einer anderen Schnittstelle weiterzuleiten (insbesondere an localhost), indem ein Prozess ausgeführt wird, der die externe Schnittstelle überwacht und den Datenverkehr weiterleitet.

netcat( nc),, xinetdund ssh(und vielleicht noch mehr) sind Beispiele für Programme, die dazu in der Lage sind (obwohl die Auswahl sshseltsam und ineffektiv wäre).

Ich habe dafür eine Konfiguration geschrieben xinetd. Nun wird dieser Dienst automatisch aufgerufen:

# cat /etc/xinetd.d/z-from-outside 
# default: off
# description: Forward connections to the z port.
service z-from-outside
{
    disable         = no
    socket_type     = stream
    type        = UNLISTED
    wait            = no
    user            = nobody
    bind        = vaio.ob
    port        = 7070
    redirect    = localhost 7070
}
# 

( vaio.obIst der Name dieses Hosts auf der externen Netzwerkschnittstelle.)

service xinetd reloadÜberprüfen wir nach a , ob es zuhört:

# lsof -i -P | fgrep 7070
xinetd    556      root    6u  IPv4 1797906      0t0  TCP vaio.ob:7070 (LISTEN)
sshd    27438 tun_zzoom    4u  IPv4 1059100      0t0  TCP localhost.localdomain:7070 (LISTEN)
# 

Und tatsächlich gehen Verbindungen durch!

imz - Ivan Zakharyaschev
quelle