Mam Raspberry Pi (RPi) i nawiązuję z nim zdalne połączenia za pomocą ssh. Udało mi się poprawnie skonfigurować ssh, aby uzyskać dostęp do RPi zarówno z sieci lokalnej, jak iz Internetu (przy użyciu określonego portu, który otworzyłem na routerze).
Zakładając nazwę użytkownika john
i RPi o nazwie raspi
:
Dostęp do sieci LAN
ssh [email protected]
ssh john@raspi
ssh raspi
Zewnętrzny dostęp do sieci LAN
ssh -p 1234 [email protected]
ssh -p 1234 12.345.67.89
Ale jak mogę to zrobić po prostu ssh raspi
poza moją siecią LAN ?. Czy istnieje sposób skonfigurowania raspi tak, aby wskazywał dwa adresy IP, jeden w sieci LAN i jeden przez Internet?
Zasadniczo chcę uzyskać dostęp do moich RPi w jeden sposób, bez względu na to, czy jestem w domu, czy w pracy.
ssh
ip
openssh
port-forwarding
Aeronaelius
źródło
źródło
Odpowiedzi:
Patrząc bliżej na swoje pytanie, wydaje się, że używasz tego samego komputera zarówno z sieci LAN, jak i spoza niej. Odpowiednio poprawiłem swoją odpowiedź:
W swoim
~/.ssh/config
dodaj:Następnie możesz
ssh raspi-wan
spoza sieci LAN lubssh raspi-lan
z wnętrza sieci LAN bez potrzeby korzystania z serwerów DNS lub edytowania/etc/hosts
dla wszystkich użytkowników, a nawet bez robienia czegokolwiek jako root. Jeśli chcesz, aby nazwaraspi
zmieniała się w różny sposób w zależności od tego, gdzie jesteś, prawdopodobnie będzie potrzebować trochę magii skryptów powłoki, aby wykryć twoją sieć i odpowiednio działać.źródło
-wan
i-lan
postfix. Mojemu ssh jednak nie spodobało sięUsername
pole (Zła opcja konfiguracji). Bez tego działa dobrze.User john
nieUserName
. Poprawiam swoją odpowiedź, aby to odzwierciedlić, a kiedy już w ten sposób skonfigurujesz swoją konfigurację, możesz pominąć nazwę użytkownika wssh
wierszu poleceń.Jest to doskonale wykonalne tylko z konfiguracją ssh, bez konieczności używania osobnych aliasów dla lan i wan lub tworzenia dodatkowego portu do przodu. (Ale oczywiście potrzebujesz sposobu, aby wykryć, czy jesteś w swojej sieci, czy nie)
W
~/.ssh/config
, będziesz chciał dodać coś takiego:Zamiast tego
am_i_outside_of_my_lan
będziesz chciał umieścić polecenie określające, czy jesteś w sieci domowej, czy nie, i zwraca kod wyjścia 0, jeśli jesteś poza nim, i coś innego.host
Warunek jest chyba oczywiste, aleexec
gwarantuje, stan niektórych wyjaśnienie: Pasuje tylko wtedy, gdy podane zwraca polecenie z kodem wyjścia 0, tzn. żaden błąd.Innymi słowy, to, co to robi, polega na tym, że
host raspi
część ogranicza tę regułę do, gdy próbujesz połączyć się z raspi hosta, aexec "am_i_outside_my_lan"
dodatkowo ogranicza ją tak, że ma ona zastosowanie tylko wtedy, gdy łączysz się spoza sieci domowej. Tak więc wewnątrz sieci domowejssh user@raspi
działa dokładnie tak, jak normalnie, ale poza nią reguła jest zgodna, a zamiast niej odpowiadassh -p 1234 [email protected]
.Jeśli chodzi o to, czego użyć zamiast
am_i_outside_of_my_lan
, zależy to całkowicie od twojej konfiguracji. Sugeruję umieszczenie poleceń w osobnym skrypcie zamiast wpisywania go w wierszu, ponieważ cytowanie wydaje się nieco trudne do poprawnego.Osobiście użyłem następującego skryptu Python, aby wykryć, czy jestem w mojej własnej sieci: (Ponieważ moja nazwa domeny rozwiązuje się na lokalny adres IP wewnątrz mojej sieci)
Jeśli nie masz podobnej konfiguracji, być może będziesz musiał zrobić coś innego. (Na przykład możesz spojrzeć na nazwę sieci bezprzewodowej, z którą jesteś podłączony, lub nawet zapytać o usługę what-is-my-ip, aby uzyskać zewnętrzny adres ip sieci, z którą jesteś podłączony)
źródło
Na komputerze (łączącym się ) możesz ustawić nazwę hosta
12.345.67.89
. Otwórz/etc/hosts
plik i ustaw wpis DNS:Komputer przekształci następnie „raspi” w „12.345.67.89” w ramach lokalnego procesu rozpoznawania DNS. Jeśli korzystasz z kilku komputerów, zmiany należy wprowadzić na każdym z nich. Problem polega na tym, że do edycji potrzebny jest dostęp do konta root
/etc/hosts
, a może nie być dostępny wszędzie.Jeśli chcesz, aby „raspi” było rozpoznawane automatycznie z dowolnego miejsca, przepraszam: niemożliwe. Wymagałoby to rejestracji „raspi” jako nazwy domeny, co nie może się zdarzyć, ponieważ „raspi” nie ma TLD i nie zależy od żadnego serwera głównego DNS. Możesz jednak zarejestrować nazwę domeny (powiedzmy
cfbaptista.me
i wskaż jej adres IP WAN. Po przekierowaniu portów będziesz mieć dostęp do Raspberry Pi za pomocą:(ale to wydaje pieniądze za prawie nic ...)
Jeśli chodzi o
user@
część, zależy to od nazwy logowania na różnych komputerach. Jeśli masz taką samą nazwę na komputerze łączącym i na komputerze zdalnym , nie musisz go określać. Jeśli nie, musisz określić, kto jest na zdalnym komputerze.źródło
Cel:
ssh raspi
powinien działać w sieci LAN i w publicznym Internecie.Aby to zrobić, musisz upewnić się, że nazwa odnosi się do wewnętrznego adresu IP w sieci LAN i publicznego adresu IP z zewnątrz.
Po pierwsze, powinieneś uzyskać nazwę domeny taką jak
raspi.yourdomain.com
. Sprawdź http://freedns.afraid.org/, aby uzyskać bezpłatne domeny do użytku hobbystycznego. Wskaż domenę na swój publiczny adres IPW przypadku sieci LAN zalecam uruchomienie DNSMasq. Otwarte oprogramowanie DD-WRT ściśle integruje się z DNSMasq, wykorzystując je do DHCP i DNS. Musisz tylko podać jej domenę wyszukiwania („twojadomena.com”), a ona automatycznie przypisze nazwy DNS na podstawie nazwy żądanej przez każdego klienta. Aby to zadziałało, należy przeczytać nazwę / etc / host rasasy
raspi
.Po skonfigurowaniu raspi.twojadomena.com powinien przejść do lokalnego adresu IP w sieci LAN (upewnij się tylko, że używasz lokalnego DNS na wszystkich swoich komputerach).
Teraz prawdopodobnie nie chcesz udostępniać portu 22 publicznemu internetowi, ponieważ dostaniesz mnóstwo ruchu sniffera. Możesz więc mieć router pokazujący raspi: 22 jako inny port, powiedzmy 1234. Aby używać tego samego portu w sieci publicznej i wewnętrznej, możesz dodać regułę przekierowania portów do raspi. W systemie Linux:
(zmień eth0 na nazwę interfejsu sieciowego, jak pokazano za pomocą
ip link
lubifconfig
, a 1234 na port publiczny)Teraz możesz korzystać
ssh -p 1234 raspi.yourdomain.com
zarówno z publicznego, jak i LAN.Możesz dodać wpis do ~ / .ssh / config na komputerze klienckim, aby go skrócić, tak
ssh raspi
jak wspomniano w @DopeGhoti.Jeśli chcesz udostępnić porty SSH dodatkowych komputerów na tym samym publicznym adresie IP, po prostu powtórz proces z inną nazwą DNS i portem publicznym. Twoje zdrowie!
źródło
Oto zwięzła, działająca wersja odpowiedzi Aleksiego Torhamo, za pomocą curl, aby pobrać bieżący publiczny adres IP, a następnie sprawdzić, czy odpowiada on publicznemu adresowi IP twojego serwera (tj. Jesteś w tej samej sieci lokalnej).
W swoim
~/.ssh/config
dodaniuźródło
ssh
przetworzy wszystkie pasujące dyrektyw, w porządku, więc teoretycznie powinien być w stanie zrobić coś takiegoMatch host raspi / User john / HostName 192.168.2.7
następujeMatch host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]" / HostName 12.345.67.89 / Port 1234
i uzyskać ten sam efekt tylko z jednymcurl
wezwaniem, pozwalając== '12.345.67.89'
przypadek uznać za niepowodzenie drugaMatch
reguła użytkownikaexec
.Match
jest taki sam lub też podany w drugim - jeśli podałeś niestandardowyPort xxxx
w pierwszymMatch
, a chciałeś użyć standardowego portu w drugimMatch
, trzeba by to jawnie zastąpić,Port 22
aby nie używał portuxxxx
).Zakładając, że twoje urządzenie ma adres IP 192.168.1. * Po podłączeniu do sieci LAN, możesz to osiągnąć za pomocą następującej konfiguracji,
~/.ssh/config
dzięki czemu zawsze możesz użyć tego samego polecenia (tylkossh raspi
) do połączenia:źródło
To rozwiązanie zakłada, że twoja sieć domowa ma jeden router, co moim zdaniem jest częstym przypadkiem.
Dodaj do swojego
~/.ssh/config
źródło