Ich habe derzeit einen Debian-PC und einen Raspbian Raspberry Pi in meinem Heimnetzwerk hinter meinem Router. Der Router hat einen Port für mich geöffnet, an dem ich ssh in das rPi einführen kann, wenn ich nicht da bin, und wenn ich einmal im Netzwerk bin, kann ich alles tun, was ich im Heimnetzwerk tun möchte.
Auf Reisen scheint die Festplatte meines Debian-PCs gestorben zu sein; Zumindest weigert es sich, hochzufahren.
Ich habe keine Boot-CDs zum Einlegen hinterlassen, da ich die Box immer über PXE gebootet habe. Mein Tomato-Heimrouter ist so konfiguriert, dass er auf eine VM auf meinem Laptop verweist, um die für das Booten eines Linux-Installationsprogramms erforderlichen BOOTP- und TFTP-Images bereitzustellen. System Rescue CD oder Trinity Rescue Kit.
Dieser Laptop ist jetzt mit mir unterwegs.
Kann ich die SSH-Portweiterleitung von meinem Laptop aus einrichten, wenn ich eine Verbindung zu meinem Heim-rPi herstelle und die IP-Adresse vorübergehend auf [Ich denke] umkonfiguriere, dhcp-bootso dass mein Debian-PC PXE-Start mit meiner Remote-Laptop-VM über das Internet ausführen kann?
UPDATE 3. August: Dem folgenden Vorschlag von Matt zu folgen, war ein guter Anfang, aber immer noch nicht vollständig. Ich bin immer noch nicht weiter als vorher.
Der TFTP-Server wartet auf UDP-Port 69, verwendet jedoch die -ROption, sshnur TCP weiterzuleiten.
Dies und das war eine Möglichkeit, um fortzufahren, indem Pipes um den Tunnel herum eingerichtet wurden, um den UDP-Verkehr vor dem Tunnel in TCP und TCP nach dem Tunnel wieder in UDP umzuwandeln. In Kommentaren wurde jedoch darauf hingewiesen, dass dies nicht der beste Weg ist. Das hat auch bei mir nicht funktioniert.
Die Verwendung von socat anstelle der Pipes schien weniger kontrovers zu sein, also dachte ich, ich würde es versuchen, aber das funktionierte auch nicht.
Um zu erfassen, was ich bisher gemacht habe, habe ich versucht, das Problem lokal auf meinem Laptop wie folgt zu replizieren.
Ich habe bereits eine VM, auf der der TFTP-Server auf Port 69 ausgeführt wird, der zumindest eine pxelinux.0Datei bedienen kann.
Ich habe eine neue VM erstellt, die ein ISO-Image der System Rescue CD startet. Beim Booten dieser VM habe ich sie als DHCP-Server eingerichtet:
Hinweis: Ich habe jetzt zwei DHCP-Server in diesem "fremden" Netzwerk - der Router, der meinem Laptop seine IP-Adresse zur Verfügung gestellt hat, und nun diese VM, bis sie heruntergefahren ist. Dies führt zu einer Race-Bedingung, da meine PXE-Boot-VM möglicherweise eine Antwort von einem der DHCP-Server empfängt. Ich hoffe, dass die Antwort meiner VM die erste ist, die die PXE-VM erreicht, damit sie die next-serverobige Anweisung erhalten kann.
In der Praxis mit meinen begrenzten Übungen scheint dies kein Problem zu sein, aber ich möchte meine VM nicht zu lange aufhalten, damit ich hier niemanden störe.
Wie bereits erwähnt, habe ich bei laufendem DHCP-Server meine dritte VM ohne Festplatte gestartet, die für den PXE-Startvorgang eingerichtet wurde, um den PXE-Startvorgang auszuführen.
Der .252-Host war mein PXE-Server, sodass die PXE-Boot-VM sie erreichen konnte, die erforderlichen Dateien über TFTP abrufen konnte und wie üblich mit dem Booten begann.
Als der Nennfall funktionierte, entschied ich mich, den SSH-Tunnel in die Mischung einzuführen, wie Matt es vorgeschlagen hatte.
# vi /etc/dhcp/dhcpd.conf
Ich next-serverhabe die IP-Adresse der System Rescue CD-VM selbst geändert :
Das hat immer noch nicht funktioniert, also habe ich mit rm /tmp/fifobeiden Boxen aufgeräumt .
Als Nächstes fuhr ich mit dem socatVersuch fort, aber das hatte ähnliche Ergebnisse. Ich habe den SSH-Tunnel auch dort mit den gleichen Ergebnissen aus der Gleichung herausgenommen.
Dieses Mal konnte ich die System Rescue CD-VM nicht verwenden, da sie nicht socatinstalliert war. Daher habe ich eine andere VM verwendet.
Zunächst wollte ich überprüfen, ob der tatsächliche TFTP-Server noch verfügbar war:
$ tftp 192.168.1.252 tftp> get pxelinux.0 tftp> quit
Sicher genug, ich habe eine Nicht-Null-Byte-Datei heruntergeladen.
Dies funktionierte nicht, wenn ich eine Box mit nichts auf dem TFTP-Port abhörte:
$ tftp localhost tftp> get pxelinux.0 Transfer timed out. tftp> quit boots$ rm pxelinux.0
Beachten Sie, dass die .252-Box der TFTP-Server ist.
Das hat immer noch nicht funktioniert:
$ tftp localhost tftp> get pxelinux.0 Transfer timed out. tftp> quit boots$ rm pxelinux.0
Also habe ich Wireshark sowohl auf den .7- als auch auf den .252-Boxen ausgeführt und habe UDP-Verkehr und insbesondere TFTP-Verkehr betrachtet.
Hier sind meine Capture-Filter für die beiden Wireshark-Instanzen:
.7: udp und host 192.168.1.252 und port nicht 123
.252: UDP und Host 192.168.1.7 und Port nicht 123
Als ich das ausführte, sah ich viel TFTP-Verkehr auf einem anderen Port als 69. In diesem Fall gingen Datenpakete von Port 60862 auf dem Quellhost auf 44792 auf dem Ziel, und Bestätigungen kehrten auf diesen Ports zurück.
Eine Übertragungsanforderung wird immer als Zielport 69 initiiert, die Datenübertragungsports werden jedoch während der Übertragungsinitialisierung unabhängig von Sender und Empfänger ausgewählt. Die Ports werden nach den Parametern des Netzwerkstapels zufällig ausgewählt, typischerweise aus dem Bereich der kurzlebigen Ports.
Wenn ich das richtig verstanden habe, muss ich mehr als nur Port 69 tunneln. Welche zusätzlichen Befehle benötigen ich, um diese Ports weiterzuleiten? Gibt es eine einfache Möglichkeit, dies zu erreichen?
Update 5 Aug: Ich habe vorher ein anderes Problem.
In Bezug auf das oben aufgeführte Element habe ich versucht, etwas mehr mit TFTP herumzuspielen und die Pakete in Wireshark zu betrachten. Anscheinend bekomme ich das erste Paket von Port 69 von einem beliebigen Quellport. Im letzten Fall war dies Port 48723.
Es stellt sich heraus, dass der TFTP-Server UDP-Pakete über diesen Port von einem anderen Port zurücksendet. Wenn ich das erste Paket an Port 69 überwachen kann, kann ich dies sehen und erwarte, dass ich schnell einen anderen Tunnel auf diesem Port einrichten kann, bevor er das Zeitlimit überschreitet. Der Prozess wird also ein wenig manuell sein, aber ich könnte es tun in der Lage, es abzuziehen.
Jetzt, wo ich genau hinschaue, sieht es so aus, als ob ich das erste Paket überhaupt nicht bekomme socat.
Wenn ich keinen Tunnel habe, sehe ich das ursprüngliche Paket auf Port 69 ohne Probleme.
Wenn ich stattdessen einen direkten socatSSH-Tunnel wie folgt aufstelle, sehe ich kein Paket.
Update: Ein kleiner Schritt vorwärts. Ich habe den Verdacht, dass ich mit meinem socatBefehl etwas falsch gemacht habe .
Ich habe einen anderen einfachen Test nur auf meinem Laptop ausprobiert.
Fenster 1:
$ sudo nc -v -l -u 69
Wireshark:
Hören Sie sich die Schnittstelle an
Erfassungsfilter: UDP und Port 69
Fenster 2:
$ nc -u 127.0.0.1 69
Während ich in Fenster 2 tippte, sah ich die Ausgabe in Fenster 1 und sah Pakete, die in Wireshark erfasst wurden.
Dann wiederholte ich mit der Netzwerkkarte meines Laptops:
Fenster 1:
$ sudo nc -v -l -u 69
Wireshark:
Hören Sie sich das Interface wlan0 an
Erfassungsfilter: UDP und Port 69
Fenster 2:
$ nc -u 127.0.0.1 69
Es stellte sich heraus, dass in Wireshark keine Pakete erfasst wurden, obwohl die Meldungen in Fenster 1 angezeigt wurden. Ich erinnerte mich, dass ich Docker vor einiger Zeit eingerichtet hatte, also hatte ich eine Docker0-Brücke. Ich habe auch ein paar Virtualisierungsprodukte, also störten sie vielleicht.
Ich habe das Wireshark-Capture erneut mit:
Hören Sie sich die Schnittstelle an
Erfassungsfilter: UDP und Port 69
Dieses Mal bekam ich alles, was ich wollte. Vielleicht war mein Problem die ganze Zeit die Wireshark-Capture-Schnittstelle.
Stoppen Sie die Netcat-Fenster und machen Sie jetzt einen Schritt zurück:
Das war's! Ich bekomme meine Pakete jetzt in Wireshark!
Ich sehe die Leseanforderungsnachrichten erfasst und es stellt sich heraus, dass alle fünf Versuche / Wiederholungen von demselben Quellport stammen.
Nun ist es Zeit zu sehen, ob ich eine zusätzliche socatSitzung für diesen Quellport manuell einrichten kann . Auf dem TFTP-Server selbst habe ich zusätzlich ausgeführt:
$ for f in 52163; do socat -d -d -d -d udp4-recvfrom:$,reuseaddr,fork udp:192.168.1.7:$; done
Beachten Sie, dass dies die IP-Adresse meines Laptops hatte. (Die for-Schleife dient lediglich der Bequemlichkeit, sodass ich die Portnummer nur einmal im Befehl angeben muss.)
Es stellt sich heraus, dass jeder der Quellports gleich ist, unabhängig davon, wie oft ich den PXE- get pxelinux.0Befehl ausführt . Die Quellportnummer ändert sich, wenn ich TFTP verlasse und TFTP erneut starte.
Ich habe Wireshark sowohl auf meinem Laptop als auch auf der TFTP-Box ausgeführt. Ich sehe jetzt Pakete auf dem Wireshark meines Laptops, aber nicht auf dem TFTP-Wireshark.
Ich vermute, mit meinem socatBefehl stimmt etwas nicht, aber ich weiß nicht, was es ist:
Update: Jetzt, da ich die Grundlagen für netcat habe, dachte ich, ich würde einen Schritt nach oben machen, indem ich socatin den Mix einführe, aber immer noch keinen ssh-Tunnel.
Ich habe meinen lokalen Laptop, und jetzt nennen wir den TFTP-Server die Remote-Box, obwohl es nur eine VM auf meinem Laptop ist.
Wireshark läuft auf einer Remote-Box und erfasst den UDP-Verkehr.
In Fenster 2 habe ich drei Zeilen eingegeben und nach jeder Eingabe die Eingabetaste gedrückt: "Eins", "Zwei" und "Drei".
In Wireshark sehe ich drei Pakete auf dem TFTP-Port, daher muss der TFTP-Server diese Mülldaten abrufen. Interessant ist hier, dass jedes der drei Pakete einen anderen Quellport hat.
Als Nächstes habe ich netcat beendet und stattdessen den TFTP-Client mit der lokalen IP-Adresse anstelle von "localhost" ausgeführt, da ich heute davon verbrannt wurde:
local$ tftp 127.0.0.1 tftp> get pxelinux.0
Jetzt bekomme ich das TFTP Read Request-Paket von meinem lokalen Laptop !!
(Zu Ihrer Information vor dem Erfassen meiner Notizen habe ich "tftp localhost" ausgeführt und wieder nichts erhalten. Es sieht aus wie das in meiner anderen Frage erwähnte IPv4 / IPv6-Problem .)
Ich erhalte die Leseanforderungspakete in Wireshark zusammen mit dem ersten Datenpaket, das nicht erreichbar ist, da über den Quellport kein Tunnel zurückgeführt wird. Zumindest bekomme ich die UDP-Pakete über den Tunnel an den TFTP-Server !
Jetzt musste ich ein bisschen über diese Rückreise nachdenken. Mit socatin der Mitte, es sieht aus wie ich bin immer fünf Übertragungsversuche von diesem TFTP - Client, bevor es mal aus; Ich weiß nicht, wie sich der TFTP-Client in der NIC-Firmware verhält.
Für jeden dieser Versuche scheint es, als würde ich jetzt einen anderen Quellport erhalten, da die Verbindung zum TFTP-Server von socatund nicht zum TFTP-Client meines Laptops kommt. Wieder weiß ich nicht, wie sich der in der NIC-Firmware eingebaute TFTP-Client verhält.
Selbst wenn ich den Verkehr überwache und schnell einen Rücktunnel aufbaue, nachdem ich den Verkehr in Wireshark gesehen habe, bin ich mir nicht sicher, ob das zu spät ist.
Ich vermute, das Gleiche wird wahr sein, wenn ich Pfeifen anstelle von benutzt habe socat.
Update: Ich denke, ich bin bereit, dies aufzugeben, aber aus Spaß habe ich gedacht, ich würde in die Originalverpackung zurückkehren und versuchen, ein paar Pakete einzufangen, da ich genug habe, um wenigstens eine Reise in Gang zu bringen.
Meine Vorstellung von "local" und "remote" ist jetzt umgekehrt, da mein TFTP-Server lokal ist, während mein toter PC remote ist.
Ich habe mir Sorgen gemacht, dass sich der Quellport geändert hat socat, also war ich neugierig, die Pfeifen erneut zu versuchen. Ich ging zurück zu meinem Testaufbau.
Ich halte meine lokalen und Remote-Versionen für die Konsistenz mit der Produktionsumgebung, auch wenn dies für meine Testumgebung rückwärts ist.
Ich habe ein einfaches TFTP aus meinem TFTP-Client wieder versucht. Dieses Mal habe ich in Wireshark festgestellt, dass der Quellport für jedes Paket gleich ist! Vielleicht gibt es noch Hoffnung !!
Denken Sie daran, dass die UDP-Pakete unterhalb der Größe der MTU bleiben. Ich glaube, ich habe irgendwo gelesen, dass sie für TFTP sein werden.
Ich muss meine Pfeifen aufräumen:
local$ rm /tmp/fifo remote$ rm /tmp/fifo
Ich wollte das jetzt in der Produktion ausprobieren.
Als ich den PC hochgefahren hatte, bekam ich laut Wireshark ein ganzes TFTP-Paket zum PXE-Server, aber ich erhielt keine Wiederholungsversuche. Ich hatte gehofft, auch die Wiederholungen zu bekommen und dass alle den gleichen Quellport hätten.
Ich habe die ncEinstellungen auf der linken Seite der Pipes geändert -k, um anzugeben, dass sie am Leben bleiben sollen, und habe dann einen Neustart durchgeführt, aber immer noch nur das erste Paket erhalten.
Ich muss meine Pfeifen aufräumen:
local$ rm /tmp/fifo remote$ sudo rm /tmp/fifo
/ edit: Nevermind, ich glaube, ich habe dein Szenario jetzt verstanden. Verwenden Sie trotzdem ein ordnungsgemäßes VPN. Vielleicht können Sie es mit SSH zum Laufen bringen. Wenn Sie jedoch das * richtige * Tool für den Job verwenden, wird dies wesentlich einfacher.
Daniel B vor 7 Jahren
0
-R remote_socket:local_socket Specifies that connections to the given TCP port or Unix socket on the remote (server) host are to be forwarded to the given host and port
Because port 69 is a privileged port, you must also know that:
Privileged ports can be forwarded only when logging in as root on the remote machine.
First modify dnsmasq.conf and change your dhcp-boot option; the destination port will be the raspberry pi.
From your local laptop,
$ ssh root@port.forwarded.pi -R 69:69
Once this port forward is established, attempt to reboot the Debian machine.
On PXE Boot, the machine should get the DHCP boot option pointing to the pi.
The TFTP request over port 69 will enter the port opened by the SSH tunnel, sending that packet out onto 127.0.0.1:69 on your local laptop.
Assuming you are running the TFTP server on port 69, the image should be downloaded.
Da ich auf Debian bin, glaube ich, dass ich stattdessen `-R 69: localhost: 69` brauchen würde, aber ich bin gestern abend mit einem Problem konfrontiert: Ich glaube, der TFTP-Server hört auf UDP 69 gemäß` ps -ef | grep 69`, während dies TCP 69 angibt. Bisher hat dies nicht funktioniert.
jia103 vor 7 Jahren
0