Ich habe einen Raspberry Pi (RPi) und stelle mit ssh Remoteverbindungen her. Ich habe es geschafft, ssh korrekt einzurichten, sodass ich sowohl über ein lokales Netzwerk als auch über das Internet (über einen bestimmten Port, den ich an meinem Router geöffnet habe) auf das RPi zugreifen kann.
Angenommen, ein Benutzername john
und ein RPi heißen raspi
:
Innerhalb des LAN-Zugangs
ssh [email protected]
ssh john@raspi
ssh raspi
Außerhalb des LAN-Zugangs
ssh -p 1234 [email protected]
ssh -p 1234 12.345.67.89
Aber wie kann ich das einfach ssh raspi
von außerhalb meines LANs tun ? Gibt es eine Möglichkeit, raspi so zu konfigurieren, dass es auf zwei IP-Adressen verweist, eine in einem LAN und eine über das Internet?
Grundsätzlich möchte ich auf eine einzige Weise auf mein RPi zugreifen, egal ob ich zu Hause oder auf der Arbeit bin.
ssh
ip
openssh
port-forwarding
Aeronaelius
quelle
quelle
Antworten:
Bei näherer Betrachtung Ihrer Frage scheint es, dass Sie denselben Computer sowohl innerhalb als auch außerhalb des LAN verwenden. Ich habe meine Antwort entsprechend überarbeitet:
Fügen Sie in Ihrem
~/.ssh/config
hinzu:Dann können Sie
ssh raspi-wan
von außerhalb des LAN oderssh raspi-lan
von innerhalb des LAN aus arbeiten, ohne sich mit DNS-Servern herumschlagen oder/etc/hosts
für alle Benutzer bearbeiten zu müssen oder sogar etwas als Root tun zu müssen. Wenn Sie möchten, dass der Name jeraspi
nach Standort unterschiedlich aufgelöst wird, ist wahrscheinlich etwas Shell-Scripting-Magie erforderlich, um Ihr Netzwerk zu erkennen und entsprechend zu handeln.quelle
-wan
und ein-lan
Postfix einzuschließen . Mein ssh mochte dasUsername
Feld jedoch nicht (schlechte Konfigurationsoption). Es funktioniert gut ohne es.User john
nichtUserName
. Ich korrigiere meine Antwort, um dies widerzuspiegeln, und sobald Sie Ihre Konfiguration festgelegt haben, können Sie den Benutzernamen in derssh
Befehlszeile weglassen .Dies ist perfekt mit nur der SSH-Konfiguration möglich, ohne dass separate Aliase für LAN und WAN verwendet oder zusätzliche Ports für die Weiterleitung erstellt werden müssen. (Aber Sie brauchen natürlich eine Möglichkeit, um festzustellen, ob Sie sich in Ihrem LAN befinden oder nicht)
In
~/.ssh/config
möchten Sie Folgendes hinzufügen:Anstelle der
am_i_outside_of_my_lan
Sie wollen einen Befehl setzen, ob Sie , wenn Sie außerhalb, und etwas anderes sonst sind in Ihrem Heimnetzwerk oder nicht, und kehrt mit 0 Exit - Code bestimmt.Die
host
Bedingung ist wahrscheinlich selbsterklärend, aber dieexec
Bedingung verdient eine Erklärung: Sie stimmt nur überein, wenn der angegebene Befehl mit dem Exit-Code 0 zurückgegeben wird, d. H. kein Fehler.Mit anderen Worten, dies ist der
host raspi
Teil, auf den diese Regel beschränkt ist, wenn Sie versuchen, eine Verbindung zum Host-Raspi herzustellen, und derexec "am_i_outside_my_lan"
weitere, der sie so einschränkt, dass sie nur gilt, wenn Sie eine Verbindung von außerhalb Ihres Heimnetzwerks herstellen. Innerhalb Ihres Heimnetzwerksssh user@raspi
macht es also genau das, was es normalerweise tun würde, aber außerhalb davon stimmt die Regel überein und es macht stattdessen das Äquivalent vonssh -p 1234 [email protected]
.Was anstelle von verwendet werden
am_i_outside_of_my_lan
soll, hängt ganz von Ihrem Setup ab. Ich schlage vor, die Befehle in einem separaten Skript zu platzieren, anstatt zu versuchen, sie inline zu schreiben, da das Zitieren etwas schwierig zu sein scheint.Persönlich habe ich das folgende Python-Skript verwendet, um festzustellen, ob ich mich in meinem eigenen Netzwerk befinde: (Da mein Domain-Name in eine lokale IP in meinem eigenen Netzwerk aufgelöst wird)
Wenn Sie kein ähnliches Setup haben, müssen Sie möglicherweise etwas anderes tun. (Sie können beispielsweise den Namen des drahtlosen Netzwerks anzeigen, mit dem Sie verbunden sind, oder sogar einen Dienst für meine IP-Adresse abfragen, um die externe IP-Adresse des Netzwerks abzurufen, mit dem Sie verbunden sind.)
quelle
Auf Ihrem Computer (die Connect- ing ein), können Sie einen Hostnamen für gesetzt
12.345.67.89
. Öffnen Sie Ihre/etc/hosts
Datei und legen Sie einen DNS-Eintrag fest:Ihr Computer wandelt dann "raspi" als Teil eines lokalen DNS-Auflösungsprozesses in "12.345.67.89" um. Wenn Sie mehrere Maschinen verwenden, muss die Änderung an jeder einzelnen Maschine vorgenommen werden. Das Problem ist: Zum Bearbeiten
/etc/hosts
ist Root-Zugriff erforderlich , und Sie haben ihn möglicherweise nicht überall.Wenn Sie möchten, dass "raspi" von überall automatisch erkannt wird, dann tut mir leid: nicht möglich. Dies würde die Registrierung von "raspi" als Domainnamen erfordern, was nicht passieren kann, da "raspi" keine TLD hat und nicht von einem DNS-Root-Server abhängt. Sie können jedoch einen Domainnamen registrieren (z. B.
cfbaptista.me
auf Ihre WAN-IP-Adresse verweisen). Mit einigen Portweiterleitungen können Sie auf Ihren Raspberry Pi zugreifen mit:(Trotzdem gibt das Geld für fast nichts aus ...)
Das
user@
Teil hängt von Ihrem Anmeldenamen auf den verschiedenen Computern ab. Wenn Sie auf dem Verbindungscomputer und auf dem Remote- Computer denselben Namen haben, müssen Sie diesen nicht angeben. Wenn nicht, müssen Sie angeben, wer Sie auf dem Remotecomputer sind .quelle
Ziel:
ssh raspi
sollte im LAN und im öffentlichen Internet funktionieren.Dazu müssen Sie sicherstellen, dass der Name in die interne IP im LAN und die öffentliche IP von außen aufgelöst wird.
Zunächst sollten Sie einen Domainnamen wie erhalten
raspi.yourdomain.com
. Unter http://freedns.afraid.org/ finden Sie kostenlose Domains für Hobbyzwecke. Zeigen Sie mit der Domain auf Ihre öffentliche IPFür das LAN empfehle ich, DNSMasq auszuführen. Die offene DD-WRT-Firmware ist eng in DNSMasq integriert und wird für DHCP und DNS verwendet. Sie müssen ihm nur Ihre Suchdomain ("yourdomain.com") mitteilen und es werden automatisch DNS-Namen basierend auf dem angeforderten Namen jedes Clients zugewiesen. Damit dies funktioniert, sollte raspis / etc / hostname lauten
raspi
.Sobald dies eingerichtet ist, sollte raspi.yourdomain.com in die lokale IP in Ihrem LAN aufgelöst werden (stellen Sie einfach sicher, dass Sie das lokale DNS auf allen Ihren Computern verwenden).
Jetzt möchten Sie Port 22 wahrscheinlich nicht dem öffentlichen Internet aussetzen, da Sie eine Menge Schnüfflerverkehr erhalten. Möglicherweise stellt Ihr Router raspi: 22 als einen anderen Port bereit, z. B. 1234. Um denselben Port sowohl in öffentlichen als auch in internen Netzwerken zu verwenden, können Sie raspi eine Portumleitungsregel hinzufügen. Unter Linux:
(Ändern Sie eth0 in den Namen Ihrer Netzwerkschnittstelle, wie durch
ip link
oder gezeigtifconfig
, und 1234 in Ihren öffentlichen Port.)Jetzt können Sie sowohl
ssh -p 1234 raspi.yourdomain.com
aus dem öffentlichen als auch aus dem LAN.Sie können einen Eintrag zu ~ / .ssh / config auf Ihrem Client-Computer hinzufügen, um diesen auf nur zu verkürzen
ssh raspi
, wie von @DopeGhoti erwähnt.Wenn Sie die SSH-Ports zusätzlicher Computer auf derselben öffentlichen IP-Adresse verfügbar machen möchten, wiederholen Sie den Vorgang einfach mit einem anderen DNS-Namen und einem anderen öffentlichen Port. Prost!
quelle
Hier ist eine kurze, funktionierende Version von Aleksi Torhamos Antwort, bei der Curl verwendet wird, um Ihre aktuelle öffentliche IP-Adresse abzurufen und dann zu überprüfen, ob sie mit der öffentlichen IP-Adresse Ihres Servers übereinstimmt (dh Sie befinden sich im selben lokalen Netzwerk).
In Ihrem
~/.ssh/config
hinzufügenquelle
ssh
, alle passenden Richtlinien, um verarbeiten, so in der Theorie sollten Sie in der Lage sein , so etwas wie zu tun ,Match host raspi / User john / HostName 192.168.2.7
gefolgt vonMatch host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]" / HostName 12.345.67.89 / Port 1234
und den gleichen Effekt mit nur einem bekommencurl
Aufruf, lassen der== '12.345.67.89'
Fall durch den Ausfall der zweiten angenommen wirdMatch
Herrschaftexec
.Match
entweder dasselbe oder auch im zweiten Argument ist - wenn SiePort xxxx
im ersten einen Nicht-Standard angegeben haben und im zweitenMatch
den Standard-Port verwenden möchtenMatch
, Sie müssten es explizit mit einem überschreiben,Port 22
damit es den Port nicht weiter verwendetxxxx
.)Angenommen, Ihr Computer verfügt über die IP-Adresse 192.168.1. *, Wenn Sie mit Ihrem LAN verbunden sind, können Sie dies mit der folgenden Konfiguration erreichen,
~/.ssh/config
sodass Sie immer denselben Befehl (nurssh raspi
) zum Herstellen einer Verbindung verwenden können:quelle
Bei dieser Lösung wird davon ausgegangen, dass Ihr Heimnetzwerk über einen einzigen Router verfügt, was meiner Meinung nach häufig der Fall ist.
Fügen Sie Ihrem hinzu
~/.ssh/config
quelle