ESP8266-beheer sonder port forwarding: 'n MQTT-pad na buite
'n Broker wat van die internet af bereikbaar is, laat 'n toestel in die huis beheer word oor 'n verbinding wat dit self oopgemaak het. Wat dit verander vir TLS-geheue, topics en herhaling.
Die toestel sit agter 'n tuisrouter sonder port forwarding en sonder 'n publieke adres, en dit moet steeds binne sekondes konfigurasie ontvang. Die truuk is nie 'n gat in die firewall nie. Dit is 'n verbinding wat die toestel na buite oopmaak na 'n broker wat dit kan bereik, wat dan boodskappe terugstuur oor dieselfde gevestigde pad. Elke eienskap wat mense aan hierdie ontwerp waardeer, en elke valstrik daarin, kom uit daardie omkering.
Wat werklik deur die NAT kom
Wanneer die toestel 'n TCP-verbinding na die broker oopmaak, skep die tuisrouter 'n kartering en hou dit lewendig vir die duur van die vloei. Antwoorde op daardie vloei keer na die toestel terug omdat die kartering reeds bestaan. Die broker begin nooit iets teenoor die huis nie, so daar is geen onversoekte inkomende pakket vir die router om te verwerp nie. Dit is die hele netwerkargument, en dit is waarom die benadering werk op netwerke wat jy nie beheer nie.
Die toestel moet die verbinding lewendig hou of dit weer vestig, wat die betroubaarheidsvraag word sodra die argitektuur vasstaan.
Die broker roeteer topics, dit proxy nie HTTP nie
MQTT definieer publiseer- en inteken-uitruilings: die toestel teken in op 'n topic-filter wat dit mag lees, en 'n gemagtigde beheerder publiseer na 'n ooreenstemmende topic. Die broker pas publikasies by intekeninge en lewer afskrifte. Dit weet nie wat 'n blaaierversoek is nie, en dit sal nie 'n HTTP GET na die toestel se webbediener aanstuur nie. As die bestaande firmware slegs HTTP praat, het die broker-ontwerp 'n toepassingsverandering of 'n doelbewuste vertalingskomponent nodig.
Topikname is ook nie magtiging nie. Die meeste brokers ondersteun toegangsbeheelyste per kliënt, en toestelle moet beperk word tot hul eie publiseer- en intekenbome eerder as om een globale naamruimte te deel.
Toestelhulpbronne bepaal die TLS-vorm
Die ESP8266 het beperkte RAM, en 'n TLS-handdruk is die duurste ding wat dit doen. Die Arduino-kern lewer BearSSL juis vir hierdie beperking, en die keuse tussen die verifikasie van 'n CA en die vaspen van 'n vingerafdruk verander beide die geheuevoetspoor en wat 'n aanvaller met 'n geldige sertifikaat vir 'n ander naam kan doen. Die verifikasie van die broker se CA is die sterker opsie wanneer die hoop dit toelaat. Die grootte van die loonvrag maak ook saak: die MQTT-kliënt hou 'n buffer, en boodskappe groter as dit word stilweg afgekap tensy die buffer doelbewus vergroot word.
Keepalive en socket-timeouts is deel van dieselfde begroting, want 'n kliënt wat nooit 'n dooie verbinding opmerk nie, hou op om opdragte te ontvang sonder om 'n fout te rapporteer.
Die boodskapbetekenis wat byt
'n Behoue boodskap word deur die broker gestoor en aan latere ooreenstemmende intekenare gelewer, wat uitstekend is vir huidige toestand en gevaarlik vir eenmalige opdragte: 'n toestel wat weer verbind, kan gister se opdrag ontvang asof dit nuut is. QoS 1 waarborg lewering ten minste een keer, so duplikate is normaal en die toepassing moet herhaalveilig wees, ideaal met 'n identifiseerder of 'n tydstempel wat dit kan verwerp. Die last will and testament gee jou 'n statussein wanneer die toestel afval, maar net as die verbinding werklik misluk eerder as om te hang.
Skoon-sessie-gedrag bepaal of die broker jou intekeninge hou terwyl jy weg is, en om dit verkeerd te kry is waarom sommige toestelle die eerste boodskap na elke herverbinding mis.
TLS beskerm die skakel na die broker. Dit is nie end-tot-end loonvrag-enkripsie teen die broker-operateur nie, wat alles kan lees wat jy daardeur publiseer.
Beperk die lewensiklus en toets dit met onskadelike data
Beplan herverbinding met terugtrekking eerder as 'n stywe herprobeer-lus, teken eksplisiet weer in as die sessie nie aanhoudend is nie, en log die verbindingsresultaat sodat 'n stil, aflyn toestel bewyse laat. Toets die herverbindingspad met voorbeeld-loonvragte wat niks doen nie, want die eerste produksietoets van 'n opdragkanaal moet nie 'n regte opdrag wees nie. Bevestig dan wat 'n verouderde behoue boodskap by herverbinding doen, en besluit of daardie gedrag vir elke topic aanvaarbaar is.
So gedoen, verwyder die ontwerp een inkomende netwerkvereiste en laat die toestelprogrammatuur, die broker-beleid en die boodskapbetekenis as sigbare werk eerder as verborge aannames.