Микроконтролер с UART Wi-Fi модул не е нужно да реализира VPN, за да достигне услуга зад такъв. Модулът вече изпълнява TCP/IP стек и предоставя сокети през серийния порт, а шлюз в същата локална мрежа може да пренесе този трафик през тунела. Дизайнът работи само ако можете да отговорите на четири въпроса по ред, затова го третирайте като контролен списък: адрес, сокет, маршрут, граница. Спрете на първата порта, която се провали, защото следващите не могат да я компенсират.

Дайте на всеки слой една задача

UART връзката пренася AT команди и полезен товар между микроконтролера и модула. Модулът се присъединява към Wi-Fi мрежата и притежава IP връзката, включително своя адрес на източник. Шлюзът притежава тунела, идентификационните данни и политиката за препращане. Разделянето на тези задачи прави дизайна отстраним на всеки етап.

Разделянето променя и начина, по който пишете политиката на шлюза. Правило за източник трябва да назовава LAN адреса на модула, а не въображаем адрес за микроконтролера зад серийната връзка. Микроконтролерът няма собствена IP идентичност в този дизайн, а да се правим, че има, създава правило, което никога не съвпада.

Дайте на модула стабилен адрес чрез който и да е механизъм за резервиране, който мрежата поддържа, или поставете устройствата в отделен сегмент и оставете шлюза да съпоставя по интерфейс. Адрес от пул, който се променя след рестарт, рано или късно ще счупи политика, която е била вярна, когато сте я писали.

Може ли шлюзът да назове адреса на модула?

Преди да се отвори какъвто и да е сокет, потвърдете, че модулът е свързан, има адрес и че шлюзът го вижда на очаквания интерфейс. Това е портата, която най-често се проваля безшумно, защото модулът с готовност ще отчете опит за връзка, който никога не е напуснал локалната мрежа.

AT+CWMODE=1
AT+CWJAP="lab-wifi","passphrase"
AT+CIPSTA?
AT+CIPMUX=0

Режимът на единична връзка запазва последователността от команди проста и е правилната отправна точка за един сензор, който говори с една услуга. Режимът на множество връзки променя синтаксиса на всяка следваща команда, затова решете в кой режим сте, преди да копирате пример от друга версия на фърмуера.

Отворете сокета от модула

След като адресът и режимът са установени, модулът може да отвори TCP връзка към частната услуга. Адресът по-долу е пример от диапазон за документация; заменете го със своя и запазете същата форма.

AT+CIPSTART="TCP","10.90.0.20",9000
AT+CIPSEND=18
{"t":21.4,"rh":48}

Тази AT команда отваря обикновен TCP сокет, а сокетът не е тунел: нищо в него не създава VPN и нищо не криптира полезния товар. TLS режимът на фърмуера е отделна функция със своя команда и своя работа със сертификати и произволен UART модул може да не поддържа нито едно от двете. Проверете справката за AT команди на TCP/IP за вашия фърмуер, вместо да приемате, че синтаксисът по-горе се отнася за него.

Дължината на полезния товар в AT+CIPSEND трябва да съвпада с това, което действително изпращате, иначе модулът ще чака байтове, които никога не идват, и връзката ще изглежда закачена. Този провал изглежда като мрежов проблем и почти винаги е грешка с единица в дължината.

Маршрутизирайте връзката през шлюза

Шлюзът се нуждае от маршрут до частната дестинация, разрешение да препраща от мрежата на устройствата в тунела и обратен път, който достига до модула. Ако отдалечената страна не маршрутизира обратно към подмрежата на устройствата, дизайнът се нуждае от умишлено правило за транслация, а това правило променя идентичността на източника, която услугата вижда.

ip route get 10.90.0.20
sudo tcpdump -ni wg0 'host 10.90.0.20 and port 9000'
sudo conntrack -L | grep 9000

Наблюдавайте първо обратния път. Препратен пакет, който достига до услугата и никога не се връща, дава таймаут при модула без грешка на шлюза, което кара хората да гледат Wi-Fi връзката с часове. Записът в conntrack ви казва дали шлюзът изобщо е видял отговора.

Решете къде всъщност завършва тунелът

Тунелът започва при шлюза. Той не криптира UART връзката и не превръща LAN сегмента между модула и шлюза в част от тунела. Всичко, което се нуждае от защита в този сегмент, се нуждае от собствен механизъм, а обикновеният TCP в този пример не е TLS.

Решете и какво се случва, когато тунелът падне. Ако доставката трябва да е само през VPN, политиката за препращане не бива да позволява същата дестинация по алтернативен път, защото резервен маршрут тихо обезсмисля изискването. Ограничете поведението при повторно свързване, за да не залее откъснат модул серийната връзка или отдалечената услуга с повторения.

Запишете четирите отговора заедно: адреса на модула, целта на сокета, маршрута на шлюза и къде започва криптирането. Следващият човек, който ще отстранява проблеми с това устройство, ще се нуждае от всичките четири и нито един от тях не може да бъде извлечен само от фърмуера.

Подобни статии