Verwenden Sie iptables, um ipv6 an ipv4 weiterzuleiten?

15

Derzeit habe ich ein Setup, bei dem aufgrund der Konfiguration, deren Behebung ewig dauern würde, ein Server vorhanden ist, auf den nur ipv4 zugreifen kann. Ich habe jedoch auch einen Server, auf den ipv6 zugreifen kann. Ich habe mich gefragt, ob ich iptables verwenden kann, um den IPv6-Verkehr auf einem bestimmten Port von einem der Server auf einen anderen Server mit IPv4-Verkehr weiterzuleiten.

Eli
quelle
2
Was Sie suchen, heißt NAT64, was iptables (noch) nicht tun wird.
Chris S
Chris hat Recht - die NAT64-RFCs wurden gerade veröffentlicht, ich würde es eine Weile dauern, bis irgendetwas das wirklich unterstützt. Das heißt, Sie können Ihr Ziel möglicherweise auf andere Weise erreichen, aber wir haben nicht genug Details, um es sicher zu wissen. Wenn es sich beispielsweise um einen HTTP-Server handelt, können Sie die Anforderungen zwischen Protokollen umkehren.
Shane Madden

Antworten:

16

IPtables kann dies derzeit nicht ausführen. Sie benötigen daher einen Userspace-Prozess, um die Verbindungen per Proxy zu übertragen. socat ist dafür ein geeignetes Werkzeug:

socat TCP6-LISTEN:1234,fork TCP4:1.2.3.4:1234
mgorven
quelle
1
Danke, das war hilfreich! Falls jemand nach einer UDP-Lösung sucht: socat UDP6-RECVFROM: 64444, fork UDP4-SENDTO: localhost: 64443 hat für mich gearbeitet
Alexander
10

Wie in den Kommentaren zu Ihrer Frage erwähnt , ist NAT64 auch nach 3 Jahren noch lange nicht bereit.

Sie könnten es jedoch versuchen 6tunnel, wie durch Verwirrung nahegelegt.

Glücklicherweise ist es in den Debian- und Ubuntu-Repositories vorhanden, so dass Sie es sehr einfach mit installieren können sudo apt-get install 6tunnel. Wenn Sie ein anderes System verwenden, müssen Sie es aus dem Quellcode erstellen .

Es ist wirklich nicht schwer, aus dem Quellcode zu erstellen, sondern es müssen lediglich einige Befehle ausgeführt werden (als root):

git clone https://github.com/wojtekka/6tunnel && cd 6tunnel && ./autogen.sh && make && make install

Hier ist die Syntax vereinfacht:

6tunnel [-4|-6] [-l local-host] original-port destination-host destination-port
  • Das [-4|-6]ist optional und lässt Sie angeben, ob Sie IPv4 bzw. IPv6 binden (abhören) möchten.
  • -list auch optional. Hier können Sie auswählen, an welche Adresse (IPv4 oder IPv6) Sie binden möchten.
  • Der ursprüngliche Port ist der Port, an den Sie binden.
  • Der Zielhost ist der Ort, an den Sie den Datenverkehr weiterleiten. Dies kann überall sein: localhost oder irgendwo anders in Ihrem Netzwerk oder im Internet.
  • Der Zielport ist der Port auf dem Zielhost, der Ihren weitergeleiteten Datenverkehr empfängt.

Wenn Sie beispielsweise zulassen möchten, dass auf einen IPv4-Server, der Port 1337 überwacht, über IPv6 zugegriffen werden kann, verwenden Sie Folgendes:

6tunnel -6 1337 localhost 1337

Der obige Befehl überwacht Port 1337 auf IPv6 und leitet den Datenverkehr über IPv4 an Port 1337 auf demselben Computer weiter. Es wird dann im Hintergrund ausgeführt, sodass Sie sich darüber keine Gedanken machen müssen.

Eigentlich sollten Sie einen Cron-Job einrichten, um sicherzustellen, dass er noch ausgeführt wird. 6tunnelbietet ein Beispiel für Ihre Bequemlichkeit! Es sollte auch keine schlechte Idee sein, es beim Booten laufen zu lassen.

Weitere Dokumentation erhalten Sie, wenn Sie 6tunnel -hoder ausführen man 6tunnel.

Léo Lam
quelle
Das Posten als neue Antwort, da sich das Bearbeiten der aktuellen Antwort durch Verwirrung zu sehr ändern würde und als vorgeschlagene Änderung abgelehnt werden könnte!
Léo Lam
5

Neuere Versionen von xinetdkönnen auch IPv6 abhören und die Verbindung dann an eine IPv4-Adresse weiterleiten.

Eine Beispielkonfiguration, die auf IPv6-Verbindungen an Port 3389 wartet und diese an Port 3389 einer internen IPv4-Adresse weiterleitet:

service rdp_port_forward
{
    flags           = IPv6
    disable         = no
    type            = UNLISTED
    socket_type     = stream
    protocol        = tcp
    user            = nobody
    wait            = no
    redirect        = 10.187.20.42 3389
    port            = 3389
}

Dies kann in eingeschränkteren Umgebungen hilfreich sein, da xinetdes wahrscheinlich mit Ihrem Basissystem installiert wird oder in genehmigten Vendor-Repositorys verfügbar ist.

Michael Hampton
quelle
3

Ich wollte Leo Lams Antwort kommentieren und meine Meinung verbessern, aber ich habe nicht genug Ansehen. Zunächst einmal: Vielen Dank Leo Lam!

Für alle, die diesem Thread folgen: Mein ISP hat mit Dual Stack Lite meine Verbindung von IPv4 auf IPv6 geändert, was bedeutet, dass ich keine eigene IPv4-Adresse mehr habe. Dies war ein Problem, da ich von jedem Ort, an dem IPv6 nicht unterstützt wird, auf meine IP-Kamera zugreifen möchte. Um dies zu beheben, habe ich Folgendes versucht:

  1. Aktivieren der IPv6-Weiterleitung für Port 99 in meinem Router an meinen Ubuntu-Computer.
  2. Ubuntu-Maschine (Heimnetzwerk): sudo 6tunnel -6 99 192.168.178.35 80
  3. vServer Debian mit statischer IPv4- und IPv6-Adresse: sudo 6tunnel -4 99 IPV6PREFIXROUTER:IPV6INTERFACEIDUUBUNTUMACHINE 99
  4. vServer Debian: Eingehende TCP-Verbindungen auf Port 99 in iptables zulassen

Das IPv6-Präfix wurde in meinem Router angegeben und die Schnittstellen-ID wurde im IPv6-Weiterleitungsprozess zugeordnet.

Jetzt kann ich von überall mit der vServer-Domain example.com:99 auf die Kamera zugreifen. Perfekt! Ich plane, entweder eine Himbeere zu bekommen, die diesen Job erfüllt, oder eine Bananen-Pi-M3 für andere Aufgaben.

Crumar
quelle
1
Jetzt wissen Sie, was zu tun ist, wenn Sie eine andere IP-Kamera benötigen. Es ist 2015; Der Kauf eines Geräts, das IPv6 nicht unterstützt, ist reine Geldverschwendung.
Michael Hampton
Es ist nicht so, dass die Kamera ein paar Jahre alt ist: p
Crumar
2

Mehr zum Nutzen der Leute, die diese Seite als das OP notwendigerweise finden (ich kam hierher auf der Suche nach einer Lösung für die IPv6-Konnektivität für eine IPv4 (Twisted) -Anwendung), eine Möglichkeit ist die Anwendung 6tunnel, lauscht auf IPv6 und leitet Anfragen an eine andere Schnittstelle weiter und Hafen.

Verwirrung
quelle