Umieść VPN za modułem Wi-Fi UART, a nie w nim
Moduł Wi-Fi UART potrzebuje gniazda TCP, a tunel należy do bramy. Nazwij jego adres, utrzymuj otwartą drogę powrotną i wiedz, gdzie zaczyna się szyfrowanie.
Mikrokontroler z modułem Wi-Fi UART nie musi implementować VPN, aby dotrzeć do usługi za nim. Moduł już obsługuje stos TCP/IP i udostępnia gniazda przez port szeregowy, a brama w tej samej sieci lokalnej może przenieść ten ruch przez tunel. Projekt działa tylko wtedy, gdy potrafisz odpowiedzieć po kolei na cztery pytania, więc traktuj go jak listę kontrolną: adres, gniazdo, trasa, granica. Zatrzymaj się na pierwszej bramie, która zawiedzie, bo kolejne nie mogą tego zrekompensować.
Przydziel każdej warstwie jedno zadanie
Łącze UART przenosi polecenia AT i ładunek między mikrokontrolerem a modułem. Moduł dołącza do sieci Wi-Fi i posiada połączenie IP, wraz z własnym adresem źródłowym. Brama posiada tunel, dane logowania i politykę przekazywania. Właśnie rozdzielenie tych zadań sprawia, że projekt da się debugować na każdym etapie.
Rozdzielenie zmienia też sposób pisania polityki bramy. Reguła źródłowa powinna nazywać adres LAN modułu, a nie wymyślony adres dla mikrokontrolera za łączem szeregowym. Mikrokontroler nie ma własnej tożsamości IP w tym projekcie, a udawanie, że ma, tworzy regułę, która nigdy nie pasuje.
Nadaj modułowi stały adres przez dowolny mechanizm rezerwacji obsługiwany przez sieć albo umieść urządzenia we własnym segmencie i pozwól bramie dopasowywać według interfejsu. Adres z puli, który zmienia się po restarcie, w końcu złamie politykę, która była poprawna, gdy ją pisałeś.
Czy brama może nazwać adres modułu?
Zanim otworzy się jakiekolwiek gniazdo, potwierdź, że moduł jest skojarzony, ma adres i że brama widzi go na oczekiwanym interfejsie. To brama, która najczęściej zawodzi po cichu, bo moduł chętnie zaraportuje próbę połączenia, która nigdy nie opuściła sieci lokalnej.
AT+CWMODE=1 AT+CWJAP="lab-wifi","passphrase" AT+CIPSTA? AT+CIPMUX=0
Tryb jednego połączenia utrzymuje prostą sekwencję poleceń i jest właściwym punktem wyjścia dla jednego czujnika rozmawiającego z jedną usługą. Tryb wielu połączeń zmienia składnię każdego kolejnego polecenia, więc zdecyduj, w którym jesteś, zanim skopiujesz przykład z innej wersji oprogramowania sprzętowego.
Otwórz gniazdo z modułu
Gdy adres i tryb są ustalone, moduł może otworzyć połączenie TCP do usługi prywatnej. Adres poniżej jest przykładem z zakresu dokumentacyjnego; zastąp go swoim i zachowaj ten sam kształt.
AT+CIPSTART="TCP","10.90.0.20",9000
AT+CIPSEND=18
{"t":21.4,"rh":48}
To polecenie AT otwiera zwykłe gniazdo TCP, a gniazdo nie jest tunelem: nic w nim nie tworzy VPN i nic nie szyfruje ładunku. Tryb TLS oprogramowania sprzętowego to osobna funkcja z własnym poleceniem i własną obsługą certyfikatów, a dowolny moduł UART może nie obsługiwać żadnego z nich. Sprawdź dokumentację poleceń AT TCP/IP dla swojego oprogramowania sprzętowego, zamiast zakładać, że powyższa składnia go dotyczy.
Długość ładunku w AT+CIPSEND musi odpowiadać temu, co faktycznie wysyłasz, inaczej moduł będzie czekał na bajty, które nigdy nie przyjdą, a połączenie będzie wyglądać na zawieszone. Ta awaria wygląda jak problem sieciowy i prawie zawsze jest błędem o jeden w długości.
Poprowadź połączenie przez bramę
Brama potrzebuje trasy do celu prywatnego, zgody na przekazywanie z sieci urządzeń do tunelu i drogi powrotnej, która dotrze do modułu. Jeśli strona zdalna nie routuje z powrotem do podsieci urządzeń, projekt potrzebuje celowej reguły translacji, a ta reguła zmienia tożsamość źródła, którą widzi usługa.
ip route get 10.90.0.20 sudo tcpdump -ni wg0 'host 10.90.0.20 and port 9000' sudo conntrack -L | grep 9000
Najpierw obserwuj drogę powrotną. Przekazany pakiet, który dotrze do usługi i nigdy nie wróci, powoduje przekroczenie czasu w module bez żadnego błędu na bramie, co każe ludziom godzinami patrzeć na łącze Wi-Fi. Wpis conntrack mówi, czy brama w ogóle zobaczyła odpowiedź.
Zdecyduj, gdzie tunel naprawdę się kończy
Tunel zaczyna się na bramie. Nie szyfruje on łącza UART i nie czyni segmentu sieci lokalnej między modułem a bramą częścią tunelu. Wszystko, co w tym segmencie wymaga ochrony, wymaga własnego mechanizmu, a zwykłe TCP w tym przykładzie nie jest TLS.
Zdecyduj też, co się dzieje, gdy tunel padnie. Jeśli dostarczanie ma odbywać się tylko przez VPN, polityka przekazywania nie może pozwalać na ten sam cel przez drogę alternatywną, bo trasa zapasowa po cichu niweczy wymóg. Ogranicz zachowanie przy ponownym łączeniu, aby odłączony moduł nie zalał łącza szeregowego ani zdalnej usługi kolejnymi próbami.
Zapisz cztery odpowiedzi razem: adres modułu, cel gniazda, trasę bramy i miejsce, w którym zaczyna się szyfrowanie. Następna osoba debugująca to urządzenie będzie potrzebować wszystkich czterech, a żadnej nie da się wywnioskować wyłącznie z oprogramowania sprzętowego.