Zdalny dostęp do naszego Raspberry Pi możemy uzyskać na wiele sposobów, np. za pomocą Raspberry Pi Connect. Niestety, to rozwiązanie nie działa z Raspberry Pi 3. W tym poście przedstawię, jak można zrealizować taki dostęp za pomocą noVNC oraz ngrok, które działają dla wszystkich wersji Raspberry Pi i nie tylko.
Instalacja i konfiguracja ngrok
Ngrok to narzędzie, które umożliwia łatwe tworzenie tuneli do lokalnych serwerów, pozwalając na ich dostęp z internetu. Jest szczególnie przydatne, gdy chcemy testować aplikacje webowe, integracje webhooków lub API na swoich lokalnych maszynach, bez potrzeby wdrażania ich na serwer zewnętrzny.curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc \
| sudo tee /etc/apt/trusted.gpg.d/ngrok.asc >/dev/null \
&& echo "deb https://ngrok-agent.s3.amazonaws.com buster main" \
| sudo tee /etc/apt/sources.list.d/ngrok.list \
&& sudo apt update \
&& sudo apt install ngrok
Po zainstalowaniu ngrok, możemy dodać nasz token, który znajduje się tutaj.
ngrok config add-authtoken <YOUR_TOKEN>
Konfiguracja VNC
Na początku musimy włączyć obsługę VNC
sudo raspi-config
Interfacing Options -> VNC -> enabled
Następnie ustawić hasło
sudo vncpasswd -service
Jeśli wszystko przebiegło pomyślnie to w terminalu powinnien ukazać się poniższy komunikat
Successfully set "Password" parameter in /root/.vnc/config.d/vncserver-x11
Aby połączyć się przez ngrok z naszym serwerem VNC, konieczne jest modyfikacja dwóch poniższych parametrów w konfiguracji VNC.
Authentication=VncAuth
- To ustawienie określa, że do uwierzytelniania połączeń VNC będzie używany mechanizm VNC Authentication (VncAuth). W tym trybie użytkownik będzie musiał podać hasło, które zostało ustawione na serwerze VNC (np. za pomocą komendy vncpasswd). Jest to najczęściej używany sposób zabezpieczania połączeń VNC.
Encryption=PreferOff
- To ustawienie sugeruje, że szyfrowanie połączeń VNC jest preferowane, aby było wyłączone, ale serwer może dostosować się do klienta, który wymaga szyfrowania. Innymi słowy, serwer VNC będzie próbował nawiązać nieszyfrowane połączenie, ale jeśli klient VNC wymaga szyfrowania, serwer może się na nie zgodzić.
- "PreferOff" oznacza preferencję wyłączenia szyfrowania, ale nie jest to sztywna reguła. Jeśli klient VNC wymaga szyfrowania, może być używane.
W tym celu należy w pliku vncserver-x11
sudo nano /root/.vnc/config.d/vncserver-x11
dodać poniższe wpisy
Authentication=VncAuth
Encryption=PreferOff
a następnie zrestartować serwis
sudo systemctl restart vncserver-x11-serviced.service
Instalacja noVNC
noVNC to narzędzie umożliwiające dostęp do zdalnego pulpitu za pośrednictwem przeglądarki internetowej, bez potrzeby instalowania dodatkowego oprogramowania na komputerze klienta. Wykorzystuje on protokół VNC (Virtual Network Computing) do komunikacji z serwerem, a do przesyłania obrazu i interakcji z użytkownikiem używa technologii webowych, takich jak HTML5 i WebSockets.Pobranie oraz uruchomienie noVNC można wykonać za pomocą poniższych komend
git clone https://github.com/novnc/noVNC.git
cd ./noVNC
git checkout v.1.4.0
./utils/novnc_proxy --vnc localhost:5900
Potrzebujemy jeszcze adres IP naszego Raspberry Pi
ifconfig | grep 192
Od teraz nasz pulpit jest dostępny w sieci lokalnej pod poniższym adresem
192.168.18.5:6080/vnc.html
Aby nie wpisywać za każdym razem w adresie frazy vnc.html
, należy stworzyć plik index.html
.
cp ./vnc.html ./index.html
Teraz nasz endpoint wygląda tak: 192.168.18.5:6080
Dostęp do noVNC przez Internet
Teraz najważniejsza część, czyli wystawienie naszego noVNC do Internetu.
Pierwszym krokiem jest wygenerowanie domeny tutaj
Następnie wystawienie portu 6080 pod wcześniej wygenerowaną domeną, dodatkowo zabezpieczoną hasłem
ngrok http 6080 --domain=your-random-generated-domain.ngrok-free.app --basic-auth "pi:YOUR_STRONG_PASSWORD"
Ngrok w darmowej wersji wspiera różne formy autoryzacji takie jak Basic Auth, czy oAuth.
Po wykonaniu powyższych kroków będziesz mógł uzyskać zdalny dostęp do swojego Raspberry Pi za pomocą noVNC i ngrok, niezależnie od wersji urządzenia wchodząc na poniższy link z dowolnego urządzenia podłączonego do Internetu.
https://your-random-generated-domain.ngrok-free.app/vnc.html
Debugowanie VNC
Jeśli podczas łączenia z serwerem VNC lub logowanie wystąpią jakieś błędy, to możemy znaleźć przydatne informacje w logach.
sudo tail -f /var/log/vncserver-x11.log
Po pomyślnym zalogowaniu do VNC, logi powinny wyglądać podobnie do poniższych:
Connections: disconnected: 127.0.0.1::50088 (TCP) ([EndOfStream] Disconnection by client)
SMsgWriter: framebuffer updates 16
SMsgWriter: ZRLE rects 33, bytes 774432, pixels 816312
SMsgWriter: CopyRect rects 0, bytes 0, pixels 0
SMsgWriter: raw bytes equivalent 3265644, compression ratio 4.22
Agent: SServerAgent: Stopping desktop
Connections: connected: 127.0.0.1::33436 (TCP)
SConnection: Client needs protocol version 3.8
SProtoV4Down: Client requests security type RA2ne_128(6)
SecTypeRA2: using AES-128
SConnection: Authentication successful
Connections: authenticated: 127.0.0.1::33436 (TCP), as (anonymous) (d permissions)
SConn: Pixel buffer 1024x768 at 0,0 depth 24
SConn: Server default pixel format depth 24 (32 bpp) little-endian rgb888
Agent: SServerAgent: Starting desktop
Agent: PixelBufferX11: Using shared memory Pixmap
Agent: SServerAgent: setPixelBuffer 1024x768 at 0,0 pf depth 24 (32 bpp) little-endian rgb888
SConn: Client pixel format depth 24 (32 bpp) little-endian bgr888
SConnection: Encodings CopyRect(1) [unknown encoding 7](7) [unknown encoding -260](-260) ZRLE(16) JPEG(21) Hextile(5) RRE(2) Raw(0) [unknown encoding -26](-26) [unknown encoding -254](-254) DesktopSize(-223) [unknown encoding -224](-224) [unknown encoding -258](-258) [unknown encoding -261](-261) [unknown encoding -308](-308) [unknown encoding -309](-309) [unknown encoding -312](-312) [unknown encoding -313](-313) [unknown encoding -307](-307) [unknown encoding -1063131698](-1063131698) [unknown encoding 1464686180](1464686180) Cursor(-239)
SConnection: Current encoding ZRLE
Limity ngrok dla darmowego konta
Ngrok posiada limity dla darmowego konta:
- 1GB transferu danych
- 20 000 requestów HTTPS
- wsparcie tylko dla HTTPS (nie ma TCP, więc nie można połączyć się bezpośrednio klientem VNC np. VNC viewer)
Aktualne zużycie zasobów można sprawdzić tutaj.
Podsumowanie
Zdalny dostęp do Raspberry Pi można łatwo uzyskać za pomocą noVNC i ngrok, co czyni to rozwiązanie uniwersalnym i działającym dla wszystkich wersji Raspberry Pi. Dzięki szczegółowym instrukcjom dotyczącym instalacji i konfiguracji, proces ten jest prosty nawet dla mniej doświadczonych użytkowników. Wykorzystanie ngrok do tworzenia tuneli internetowych oraz noVNC do obsługi pulpitu przez przeglądarkę eliminuje potrzebę instalacji dodatkowego oprogramowania klienckiego. Mimo to, należy pamiętać o ograniczeniach darmowego konta ngrok, takich jak limit transferu danych i liczba requestów, co może wpłynąć na długoterminowe użytkowanie.