Dostęp do bramki z Internetu
Celem tego wpisu jest bardziej techniczne wyjaśnienie tego jak działa tunelowanie połączenia TCP - zdalny tunel do bramki. Jak można automatyzować zdalny dostęp oraz jak sobie radzić z problemami.
Jak to działa
Opis koncepcji
Każde urządzenie posiada swój unikalny identyfikator dom-xxxxxxxxxxx, jest on losowo generowany przy pierwszym uruchomieniu i pozostaje stały przez cały okres użytkowania urządzenia. Gdy włączysz dostęp z Internetu, otwieramy połączenie TCP pomiędzy Twoim urządzeniem a naszym serwerem i tworzymy na serwerze unikalny (na bazie identyfikatora urządzenia), publicznie dostępny adres URL. Adres ten pełni funkcję proxy - wszystkie wywołania do naszego serwera adresowane identyfikatorem bramki przekazujemy do lokalnie działającego serwera na bramce.
Technicznie nasz serwer TCP w chmurze nasłuchuje połączeń od “klienta w Internecie”, czyli z Twojej aplikacji (mobilnej lub przeglądarki, itd…). Nasz serwer TCP otwiera także 10 gniazd z każdym klientem tunel działającym na bramce, do wysyłania danych. Gdy połączenie pochodzi z aplikacji użytkownika, nasz serwer TCP tunel wysyła dane do klienta tunel (działającego na bramce) na jednym z 10 otwartych gniazd. Klient tunel działający na bramce ma też własnego lokalnie działającego klienta HTTP (poza klientem TCP) i do swojego klienta HTTP przesyła dane z TCP. Klient HTTP tunel, wysyła żądanie do twojego lokalnie działającego serwera Asystent domowy i zwraca odpowiedzi do klienta w Internecie (przeglądarki, aplikacji mobilnej itd…).
Wbrew pozorom jest to bardzo proste rozwiązanie, które ma chyba mniej linii kodu niż ten opis
Zalety tego rozwiązania:
- brak potrzeby konfiguracji routera
- nie naruszamy ustawień DNS i zapory sieciowej
- nie potrzebujemy publicznego adresu IP
Wady
- Utrzymanie takiego tunelu przez długi czas jest technicznym wyzwaniem. Jego prawidłowe działanie zależy nie tylko od działania naszego serwera ale też od klienta na bramce (który zestawia połączenie). Może dojść do czasu do czasu (tydzień, miesiąc …) do rozłączenia tunelu, które to rozłączenie staramy się wykrywać i łączyć ponownie.
Jak sobie radzimy z rozłączeniami
Za proces tunnel (tak jak za każdy nasz proces/serwis) odpowiada na bramce PM2, to on pilnuje żeby po rozłączeniu tunelu zestawić go ponownie. Tu widać, że 4 dni po zestawieniu tunelu doszło do jego zerwania, ale PM2 wykonał restart i wszystko działa dalej OK.
Na tą chwilę nie robimy żadnego automatycznego sprawdzenia ani odnawiania tunelu. Zasada jest prosta - jak tunel się rozłączy to PM2 ma go ponownie zestawić. Asystent domowy nie sprawdza czy tunel działa czy nie.
Co jeśli “u mnie nie działa”
-
Na początek sprawdź w ustawieniach, czy masz włączony zdalny dostęp do bramki z Internetu:
-
Jeżeli jest włączony zdalny dostęp a dalej nie działa to sprawdź co się dzieje w logach PM2:
pm2 logs tunnel
- Możesz włączyć logowanie do pliku w tle komendą screen a następnie sprawdzić co się pojawia w logach.
Następnie możesz wysłać nam na info@sviete.pl to co pojawia się w logach - jeśli jest błąd to postaramy się poprawić działanie tego mechanizmu.
- Możesz zautomatyzować włączanie i wyłączanie tunelu zdalnego
Być może w Twojej lokalnej sieci utrzymanie długo działającego tunelu nie jest możliwe, np. tunel staje się bardzo wolny ale PM2 myśli że działa OK bo nie doszło do całkowitego zerwania, więc PM2 nie restartuje usługi tunnel…
Załóżmy, że chcesz korzystać z tunelu tylko jak jesteś poza domem, czyli przykładowo od 8 do 17.
Dodaj w tym celu automatyzację włączająca tunel.
Wyzwalacz to czas:
a akcja do wykonania to przełączenie pola input odpowiadającego w aplikacji za włączenie lub wyłączenie dostępu do bramki z internetu
Analogicznie dodajemy akcję, wyłączenia zdalnego dostępu o godzinie 17 (bo już jesteśmy w domu):
tym razem wybieramy usługę która wyłączy tunel → input_boolean.turn_off
Możemy też dodać opcjonalny warunek, np. jeżeli chcemy żeby wyłączanie/włączanie zdalnego dostępu działało tylko w dni robocze, to w warunkach wybieramy sensor Dzień pracujący:
Czujnik binarny dnia roboczego/pracującego wskazuje, czy bieżący dzień jest dniem roboczym, czy nie. Jest to wbudowana encja w Asystenta domowego która uwzględnia informacje o świętach państwowych w Polsce (z pomocą modułu Python holidays).
Bonus - komendy głosowe
Gdy mamy zdefiniowaną automatyzację to możemy ją uruchomić za pomocą komendy (głosowo lub w polu czatu z asystentem):
uruchom <nazwa automatyzacji>
lub
automatyzacja <nazwa automatyzacji>
np. w naszym przypadku:
Uruchom Wyłącz zdalny dostęp
Oczywiście możemy nasze automatyzacje nazwać jak chcemy i w analogiczny sposób robić inne rzeczy komendami.
Oczywiście jeśli wolisz to możesz dodać własny zdalny dostęp i nie korzystać z naszego tunelu
W dokumentacji wyjaśniamy jak można dodać własny zdalny dostęp do bramki (przekierowanie portów na routerze, TOR, Serveo):
Ważne jest żeby w przypadku korzystania z własnego rozwiązania odpowiednio zabezpieczyć dostęp do bramki, wyjaśniamy to w dokumentacji → Włączenie modułu uwierzytelniania wieloskładnikowego: