En mikrokontroller med et UART Wi-Fi-modul behøver ikke at implementere en VPN for at nå en tjeneste bagved en. Modulet kører allerede en TCP/IP-stak og eksponerer sockets over serielporten, og en gateway på samme LAN kan føre den trafik gennem tunnelen. Designet virker kun, hvis du kan svare på fire spørgsmål i rækkefølge, så behandl det som en tjekliste: adresse, socket, rute, grænse. Stop ved den første port, der fejler, for de senere kan ikke kompensere for den.

Giv hvert lag én opgave

UART-forbindelsen bærer AT-kommandoer og nyttelast mellem mikrokontrolleren og modulet. Modulet tilslutter sig Wi-Fi-netværket og ejer IP-forbindelsen, inklusive sin kildeadresse. Gatewayen ejer tunnelen, legitimationsoplysningerne og videresendelsespolitikken. Det er adskillelsen af disse opgaver, der gør designet fejlfindeligt på hvert trin.

Adskillelsen ændrer også måden, du skriver gatewaypolitikken på. En kilderegel skal navngive modulets LAN-adresse, ikke en imaginær adresse til mikrokontrolleren bag serielforbindelsen. Mikrokontrolleren har ingen egen IP-identitet i dette design, og at lade som om den har, giver en regel, der aldrig matcher.

Giv modulet en stabil adresse via den reservationsmekanisme, netværket understøtter, eller sæt enhederne på deres eget segment og lad gatewayen matche efter interface. En puljeadresse, der ændrer sig efter en genstart, vil før eller siden bryde en politik, der var korrekt, da du skrev den.

Kan gatewayen navngive modulets adresse?

Før nogen socket åbnes, skal du bekræfte, at modulet er tilsluttet, har en adresse, og at gatewayen ser det på det forventede interface. Det er den port, der oftest fejler lydløst, fordi modulet gerne rapporterer et forbindelsesforsøg, der aldrig forlod LAN'et.

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

Tilstanden med én forbindelse holder kommandosekvensen enkel, og det er det rigtige udgangspunkt for én sensor, der taler med én tjeneste. Tilstanden med flere forbindelser ændrer syntaksen for hver senere kommando, så afgør, hvilken du er i, før du kopierer et eksempel fra en anden firmwareversion.

Åbn socketten fra modulet

Når adresse og tilstand er fastlagt, kan modulet åbne en TCP-forbindelse til den private tjeneste. Adressen nedenfor er et eksempel fra et dokumentationsområde; erstat den med din egen, og behold samme form.

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

Den AT-kommando åbner en almindelig TCP-socket, og en socket er ikke en tunnel: intet i den opretter en VPN, og intet i den krypterer nyttelasten. Firmwarens TLS-tilstand er en separat funktion med sin egen kommando og sin egen certifikathåndtering, og et vilkårligt UART-modul understøtter måske ingen af dem. Slå op i TCP/IP AT-kommandoreferencen for din firmware i stedet for at antage, at syntaksen ovenfor gælder for den.

Nyttelastlængden i AT+CIPSEND skal passe til det, du faktisk sender, ellers venter modulet på bytes, der aldrig kommer, og forbindelsen vil se ud til at hænge. Den fejl ligner et netværksproblem og er næsten altid en off-by-one i længden.

Rut forbindelsen gennem gatewayen

Gatewayen skal have en rute til den private destination, tilladelse til at videresende fra enhedsnetværket ind i tunnelen og en returvej, der når modulet. Hvis fjernsiden ikke router tilbage til enhedssubnettet, har designet brug for en bevidst oversættelsesregel, og den regel ændrer den kildeidentitet, tjenesten ser.

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

Hold øje med returvejen først. En videresendt pakke, der når tjenesten og aldrig kommer tilbage, giver en timeout ved modulet uden nogen fejl på gatewayen, hvilket sender folk til at stirre på Wi-Fi-linket i timer. Conntrack-posten fortæller dig, om gatewayen overhovedet så svaret.

Afgør, hvor tunnelen faktisk slutter

Tunnelen starter ved gatewayen. Den krypterer ikke UART-forbindelsen, og den gør ikke LAN-segmentet mellem modul og gateway til en del af tunnelen. Alt, der skal beskyttes på det segment, har brug for sin egen mekanisme, og almindelig TCP i dette eksempel er ikke TLS.

Afgør også, hvad der sker, når tunnelen falder. Hvis levering skal være VPN-only, må videresendelsespolitikken ikke tillade samme destination gennem en alternativ vej, fordi en reservrute stille underminerer kravet. Begræns genopkoblingsadfærden, så et afbrudt modul ikke oversvømmer serielforbindelsen eller fjerntjenesten med genforsøg.

Notér de fire svar sammen: modulets adresse, socketmålet, gatewayens rute og hvor krypteringen begynder. Den næste person, der fejlfinder denne enhed, får brug for alle fire, og ingen af dem kan udledes alene af firmwaren.

Relaterede artikler