it-swarm.com.de

iptables leiten externe Anforderungen an 127.0.0.1 weiter

Ich habe einen Dienst auf 127.0.0.1 mit Port 2222. Ich muss alle Anforderungen an 192.168.2.2:2222 (außerhalb der IP) weiterleiten nur von Subnetz 192.168.1.0/24 bis 127.0.0.1:2222 .

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.

46
SimWhite

Die von Ihnen verwendete iptables-Regel funktioniert, es müssen jedoch noch eine weitere Änderung vorgenommen werden:

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

(Ersetzen von eth0 durch das Nic 192.168.2.2 befindet sich auf)

Standardmäßig ist dieser Wert 0, Der den Kernel anweist, keinen externen Datenverkehr an 127.0.0.0/8 Weiterzuleiten. Dies dient nur der Sicherheit, da dieser Datenverkehr nicht normal ist.


Zusätzlicher Hinweis: Ihre aktuelle iptables-Regel ist zu weit gefasst. Ihre Regel gibt -d 192.168.1.0/24 --dport 2222 Als Zielübereinstimmung an. Wenn Ihr Computer versucht, mit einem anderen Host an Port 2222 (d. H. Ausgehendem Datenverkehr) zu kommunizieren, wird dieser ebenfalls umgeleitet. Sie müssen entweder die Übereinstimmung von -d In -d 192.168.2.2 Ändern oder -i eth0 Hinzufügen (oder was auch immer Ihr Nic ist).

65
Patrick

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

3
dresende

Was ist, wenn die richtige Antwort mit route_localnet Nicht funktioniert?.

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

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

netcat (nc), xinetd und ssh (und vielleicht mehr) sind Beispiele für Programme, die dies tun können (obwohl sie ssh wäre seltsam und unwirksam).

Ich habe dafür eine Konfiguration für xinetd geschrieben. Jetzt 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.ob Ist der Name dieses Hosts auf der externen Netzwerkschnittstelle.)

Lassen Sie uns nach einem service xinetd reload Überprüfen, 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!