Dostęp do bramki z Internetu - jak działa zdalny tunel i jak go automatyzować

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 :wink:

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.

image

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”

  1. Na początek sprawdź w ustawieniach, czy masz włączony zdalny dostęp do bramki z Internetu:

  2. Jeżeli jest włączony zdalny dostęp a dalej nie działa to sprawdź co się dzieje w logach PM2:

pm2 logs tunnel
  1. 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.

  1. 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:

1polubienie

Bardzo fajnie opisane - kontynuując czy można włączyć domyślnie w apce dostęp zdalny, a w razie braku przejdzie na dostęp lokalny? Teraz jest odwrotnie i przy przejściu przez granicę zasięgu WIFI (ogród, wyjście z domu itp) dostęp się gubi.

Możesz podać URL zamiast identyfikatora bramki i zawsze będzie połączenie przez tunel:
image

Na tą chwilę, jeżeli straci się połączenie z domowym wifi to można włączyć sprawdzanie połączenia i przejście na tunel przytrzymując ikonkę z połączeniem (z domkiem albo chmurką)

image

po tym Jolka powie “sprawdzam połączenie” i podłączy się do bramki

image

Sprawdzenie połączenia robimy też podczas uruchomienia aplikacji.

W przyszłości może przechwycimy w aplikacji, że doszło do rozłączenia z wifi i wtedy automatycznie sprawdzimy połączenie i przełączymy na tunel… jeszcze pomyślimy ale coś da się tu usprawnić.

1polubienie

czy można to zautomatyzaowac na podstawie gps czy cos zamiast na podstawie czasu? bo skoro nie da się przy zmianie sieci wifi na transmisje danych jak dobrze zrozumiałem aby tunel zmieniał swój status

Zauważyłem u siebie, że jak skanuję telefonem kod QR z tej zakładki bramki powinienem na aplikacji mobilnej mieć dostęp lokalny a mam zdalny a skanując kod QR z zakładki dostępu zdalnego dostaję ID bramki
na telefonie. Poza tym u mnie na stałe wyświetla się na telefonie ikonka
dostępu zdalnego a nigdy lokalnego.

identyfikator