Управљање ESP8266 без прослеђивања порта: излазна MQTT путања
Брокер доступан са интернета омогућава да се кућни уређај контролише преко везе коју је сам отворио. Шта то мења за TLS меморију, теме и понављање.
Уређај стоји иза кућног рутера без прослеђивања порта и без јавне адресе, а ипак мора да прими конфигурацију у року од неколико секунди. Трик није рупа у заштитном зиду. То је веза коју уређај отвара ка споља ка брокеру који може да достигне, а он затим враћа поруке истим успостављеним путем. Свака особина коју људи воле у овом дизајну, и свака замка у њему, долази из тог преокрета.
Шта заправо пролази кроз NAT
Када уређај отвори TCP везу ка брокеру, кућни рутер прави мапирање и одржава га живим док год ток постоји. Одговори на том току враћају се уређају јер мапирање већ постоји. Брокер никада не покреће ништа ка кући, тако да нема нежељеног долазног пакета који би рутер одбио. То је цео мрежни аргумент, и зато овај приступ ради на мрежама које не контролишете.
Уређај мора да одржава везу живу или да је поново успоставља, што постаје питање поузданости када се архитектура устали.
Брокер усмерава теме, не проксира HTTP
MQTT дефинише размене објављивања и претплате: уређај се претплаћује на филтер тема који сме да чита, а овлашћени контролер објављује на одговарајућу тему. Брокер упарује објаве са претплатама и доставља копије. Он не зна шта је захтев прегледача и неће проследити HTTP GET веб серверу уређаја. Ако постојећи фирмвер говори само HTTP, дизајн са брокером захтева измену апликације или намерну компоненту за превођење.
Ни имена тема нису ауторизација. Већина брокера подржава листе контроле приступа по клијенту, а уређаје треба ограничити на њихова сопствена стабла објављивања и претплате уместо да деле један глобални простор имена.
Ресурси уређаја одређују облик TLS-а
ESP8266 има ограничену RAM, а TLS руковање је најскупља ствар коју ради. Arduino језгро испоручује BearSSL управо због овог ограничења, а избор између провере CA и прикивања отиска мења и меморијски отисак и оно што нападач са важећим сертификатом за друго име може да уради. Провера CA брокера је јача опција када то хрпа дозвољава. Величина корисног терета је такође важна: MQTT клијент држи бафер, а поруке веће од њега се тихо одсецају осим ако се бафер намерно повећа.
Keepalive и тајмаути сокета део су истог буџета, јер клијент који никада не примети мртву везу престаје да прима команде без пријаве грешке.
Семантика порука која уједа
Задржану поруку брокер чува и доставља каснијим одговарајућим претплатницима, што је одлично за тренутно стање и опасно за једнократне команде: уређај који се поново повеже може да прими јучерашњу команду као да је нова. QoS 1 гарантује доставу барем једном, тако да су дупликати нормални и апликација мора да буде безбедна при понављању, идеално са идентификатором или временском ознаком коју може да одбије. Последња воља вам даје сигнал стања када уређај падне, али само ако веза заиста не успе уместо да виси.
Понашање чисте сесије одлучује да ли брокер чува ваше претплате док вас нема, а грешка у томе је разлог зашто неки уређаји пропуштају прву поруку после сваког поновног повезивања.
TLS штити део до брокера. То није шифровање корисног терета од краја до краја против оператера брокера, који може да чита све што објавите кроз њега.
Ограничите животни циклус и тестирајте га безопасним подацима
Планирајте поновно повезивање са повлачењем уместо чврсте петље поновних покушаја, претплатите се поново експлицитно ако сесија није трајна, и бележите резултат повезивања да би тихи офлајн уређај оставио доказ. Тестирајте пут поновног повезивања примерним корисним теретима који ништа не раде, јер први производни тест канала команди не треба да буде права команда. Затим потврдите шта ради застарела задржана порука при поновним повезивању, и одлучите да ли је такво понашање прихватљиво за сваку тему.
Овако направљен, дизајн уклања један долазни мрежни захтев и оставља софтвер уређаја, политику брокера и семантику порука као видљив посао уместо скривених претпоставки.