Warum funktioniert diese iptables-Regel, dass die Portweiterleitung nicht funktioniert?

3734
videoguy

Ich habe einen Server, an den ich gebunden bin localhost:7060. Es verwendet einen ipv6-Socket anstelle von ipv4. Unten ist netstat outout.

# netstat -an Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 10.200.32.98:1720 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:4122 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:4123 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:4123 127.0.0.1:43051 ESTABLISHED tcp 0 0 10.200.32.98:5555 10.200.32.44:53162 ESTABLISHED tcp6 0 0 :::5060 :::* LISTEN tcp6 0 0 ::ffff:127.0.0.1:7060 :::* LISTEN tcp6 0 0 :::23 :::* LISTEN tcp6 0 0 ::ffff:10.200.32.98:23 ::ffff:10.200.32.142:43505 ESTABLISHED tcp6 0 0 ::ffff:127.0.0.1:43051 ::ffff:127.0.0.1:4123 ESTABLISHED tcp6 0 0 ::ffff:10.200.32.98:23 ::ffff:10.200.32.44:53195 ESTABLISHED udp6 0 0 :::5060 :::* CLOSE #  

Ich möchte eine Portweiterleitungsregel einrichten, die Verbindungen an Port 24 (an allen Schnittstellen, Loopback sowie eth0) akzeptiert und die Daten an weiterleitet localhost:7060.

So richte ich die iptables-Regel ein:

iptables -t nat -A PREROUTING -p tcp --dport 24 -j DNAT --bis 127.0.0.1:7060**

Es funktioniert nicht. Wenn ich aus einer anderen Box telnet, sehe ich folgendes

$ telnet 10.200.32.98 24 Der
Versuch 10.200.32.98 ...

Wenn ich den Server zum Binden ändere *:7060und die folgende Regel setze, scheint es gut zu funktionieren.

iptables -t nat -A PREROUTING -p tcp --dport 24 -j REDIRECT --zu-Port 7060

Dadurch wird mein Server über die WAN-Schnittstelle verfügbar, was mir nicht gefällt.

Ich denke, es hatte etwas mit ipv6-Socket zu tun (tcp6-Zeile in der netstat-Ausgabe). Das Ganze wird auf einem Android-Gerät mit einem benutzerdefinierten Android-Plattform-Image ausgeführt.

Wie bekomme ich das zum Laufen?

5
Wenn Ihr Socket IPv6 ist, müssen Sie eine IPv6-Filterung durchführen. Des Weiteren bin ich der Meinung, dass "ip6tables" NAT noch nicht für Masquerading oder Portforwarding (Ihren Fall) unterstützt. Versuchen Sie, den Socket stattdessen zu einem IPv4-Server zu machen, und prüfen Sie, ob Ihre Regel funktioniert. Garrett vor 12 Jahren 1

2 Antworten auf die Frage

0
Frio

Wenn die Antwortpakete, die von Port 7060 zurückkommen und an den Router gesendet werden, diese Pakete auch benötigen, müssen sie eine Sendemaskenoperation ausführen, um die Quelladresse der Pakete an die Adresse des Routers (127.0.0.1) und den Port als 24 zu maskieren Fügen Sie eine SNAT-iptables-Regel hinzu, damit sie funktioniert.

iptables -t nat -A POSTROUTING -p tcp --sport 7060 -j MASQUERADE --to-ports 24 

Obwohl die Pakete von localhost generiert werden, gehen sie auch in die POSTROUTER-Kette. Der REDIRECT-Vorgang erledigt diese beiden Dinge automatisch für Sie. Wenn sich Ihr Dienst jedoch auf einem anderen Server in Ihrem lokalen Netzwerk befindet, müssen Sie SNAT und DNAT verwenden.

-1
xOneca

Ich denke, Sie müssen --sport 24stattdessen verwenden --dport 24, da der Datenverkehr eingehend und nicht abgehend ist. Obwohl, wie Garret sagte, Sie wahrscheinlich verwenden müssen ip6tables...

falsch, die eingehende Verbindung hat den Zielport 24, daher sollte --dport verwendet werden. Normalerweise wird der Quellport (vom verbindenden Client) für jeden zufällig zugewiesen. hultqvist vor 11 Jahren 1