Przejdź do głównej zawartości

Raspberry Pi, noVNC i ngrok - zdalny dostęp przez Internet

· 5 min aby przeczytać
Raspberry Pi, noVNC i ngrok - zdalny dostęp przez Internet

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
informacja

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"
informacja

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.