luni, 19 decembrie 2016

Retea privata Dynamic DNS cu ESP8266 ( partea 1 )

            Intotdeauna cind vei dori sa accesezi de la distanta prin internet un dispozitiv, o camera IP, un mic server sau un simplu senzor, te vei lovi mereu de aceeasi problema: unde si la ce adresa din internet se gaseste dispozitivul tau? Asa am patit si eu, la inceput, cind m-am hotarat sa accesez informatia de pe un mic server cu NodeMCU dispus la mine acasa. Dar problema expusa nu este noua, ea fiind rezolvata de multi altii inaintea mea. Solutia adoptata de catre acestia consta in apelarea la serviciile de redirectionare IP ale unor site-uri precum DynDNS, No-IP, FreeDNS, etc. La inceput am fost tentat si eu, sa folosesc un astfel de serviciu dar studiind bine oferta providerului meu de internet, RCS RDS, am constatat ca nu mai era necesar. Acesta ofera serviciul gratuit de redirectionare IP pentru clientii sai. Astfel, setand un domeniu pe site-ul lor si un port forward pe routerul meu am facut posibila aparitia mea pe internet la adresa ywar2.go.ro:9876. Dar lucrurile nu stau intotdeauna asa bine. Cind m-am hotarat sa fac aceeasi setare intr-o alta locatie a familiei mele, aceasta nu mai era posibila. Providerul local nu ofera servicii de redirectionare. Astfel, cautand solutii pe internet, mi-a venit ideea: de ce nu mi-as face propria mea retea privata de redirectionare IP? Oare ar fi posibil? De ce as avea nevoie?
            Fara sa intru in amanunte si descriind aspecte la care nu ma pricep, am constatat ca majoritatea retelelor sint constituite dintr-un server dispus la un IP fix, unul sau mai multi clienti care au IP-urile dinamice si un protocol de comunicatie intre acestia. Protocolul este simplu si consta dintr-un mesaj prin care clientul isi face cunoscuta identitatea si apartenenta la retea, iar serverul memoreaza identitatea si IP-ul la care se afla acesta. La aparitia unui vizitator care doreste sa ia legatura cu clientul, serverul trimite adresa IP unde se afla acesta, astfel stabilindu-se legatura intre vizitator si client. Daca asa stau lucrurile, atunci de ce as avea nevoie? In primul rand de un IP fix sau relativ fix, de un server, un client si un protocol de comunicatie intre acestia. IP fix sau relativ fix am de la providerul meu de internet. El este relativ fix deoarece in realitate este dinamic, dar adresa la care acesta este gasit, respectiv ywar2.go.ro, este fixa. Pentru server si client m-am hotarit sa folosesc modulele cu ESP8266, respectiv NodeMCU. Sint simplu de folosit, mici si ieftine, si se conecteaza usor la internet. In privinta protocolului de comunicatie m-am inspirat din mesajele pe care le trimit furnizorii de astfel de servicii pe care datorita simplitatii retelei le-am adaptat cerintelor minime de functionare. Iata cum arata in realitate reteaua mea privata !



Protocolul de comunicatie


           Pentru functionarea corecta a retelei periodic, la un anumit interval de timp, clientul trebuie sa comunice cu serverul. Acesta trebuie sa anunte de existenta si apartenenta sa la retea. Personal, datorita simplitatii retelei, dar si datorita faptului ca este privata, am renuntat la partea de mesaj cu apartenenta acestuia. Aceasta consta intr-o parola prin care isi confirma autenticitatea. Nu am si nu intentionez sa am asa multi clienti incat sa apara conflicte la nivelul serverului. Serverul confirma receptia mesajului, detecteaza IP-ul clientului si il memoreaza alaturi de identitatea acestuia. Cind un vizitator interogheaza serverul despre un client, serverul trimite vizitatorului o pagina HTML de redirectionare a acestuia catre adresa IP la care se gaseste clientul cautat. In continutul paginii HTML se gaseste un script care se executa automat si care directioneaza browserul clientului la adresa IP solicitata. Continutul paginii HTML este inspirat exact de aici. Iata mai exact schimbul de mesaje intre client, server si vizitator.


Serverul


            Gestionarea retelei, mai precis evidenta clientilor, detectarea IP-urilor si redirectionarea vizitatorilor catre destinatari este deservita de catre server. Desi, la prima vedere, pare ca acesta are destul de mult de lucru, in realitate nu este asa. Cea mai mare parte din timpul functionarii sale este ocupata cu traficul si evidenta clientilor, iar cea mai mica parte din timp, cu raspunsul la interogarea vizitatorilor. Ce face concret acesta ? Ori de cate ori un client trimite un mesaj de improspatare a datelor, continutul acestora este analizat, este extras numele clientului, detectat IP-ul acestuia si apoi memorate impreuna. Daca toate acestea sint realizate, serverul confirma clientului receptia corecta a mesajului. Desi nu am prevazut explicit acest caz, cind continutul mesajului este alterat, severul raspunde clientului cu pagina de redirectionare catre o pagina WEB care avertizeaza eroarea. La aparitia unui vizitator serverul poate raspunde in mai multe moduri. Daca vizitatorul interogheaza doar adresa serverului, fara numele unui client, acesta raspunde cu o pagina WEB prin care se identifica. Atunci cind interogarea contine si numele unui client, serverul verifica clientii din memoria sa si daca acesta exista, trimite pagina de redirectionare cu IP-ul clientului cautat. Daca clientul nu exista sau continutul este alterat, este redirectionat catre o pagina WEB care avertizeaza eroarea. Acestea sint pe scurt toate procesele pe care le desfasoara serverul. 

Clientul


            Rolul clientilor in aceasta retea este acela de a comunica serverului numele clientilor care beneficiaza de serviciul de redirectionare. Numele clientilor alaturi de IP-urile lor vor fi memorate de catre server pentru a fi furnizate ulterior vizitatorilor. Pentru a nu aglomera inutil serverul si pentru prevenirea aparitiei de coliziuni, este indicat ca rata de reimprospatare a datelor din server sa se faca o data la 10..15 minute. Astfel serverul poate gestiona un numar mare de clienti si utilizatori. Orice conectare corecta la server, dar si deconectarea, sint indicate de aprinderea sau stingerea LED-ului de pe placa. Desi nu este indicat, temporar, pana la resetarea IP-ului sau chiar a serverului, update-ul se poate face si manual, respectand regulile din imaginea de mai sus, dintr-o pagina WEB, fara a fi necesara existenta unui modul client. Acesta este un caz particular, posibil ca o  facilitate a acestui sistem.

Realizarea practica


            Pentru crearea serverului si clientului, m-am orientat catre modulele NodeMCU. Acestea beneficiaza de o gramada de facilitati care le fac perfecte realizarii proiectului. Pentru scrierea programelor care gestioneaza serviciile acestora am folosit limbajul eLua. Nu voi intra in amanunte legat de ceea ce am scris, dar voi da lamuriri daca mi se vor cere. Programele sint open source si pot fi modificate dupa bunul plac. Ambele variante, server si client sint versiuni Lite care asigura minimul de functii necesare functionarii corecte a retelei. Toate imbunatarile de care vor beneficia acestea, vor fi publicate pe viitor. Experimentele continua !

Online Dynamic DNS Server: ywar2.go.ro:9876.
Descarca codul sursa.

Pentru realizarea proiectului m-am inspirat din:


---  73's   YO7FWS  ---

12 comentarii:

  1. Salut, vreau sa incerc varianta ta de ddns, dar nu inteleg ceva.
    La server init.lua variabile, in ce format introduc numele clientilor ?
    Multumesc.

    RăspundețiȘtergere
  2. Pare interesant, cred ca are un fisier separat cu datele clientilor din cate vad eu, dar pot gresi, nu stiu prea multe despre esp si lua.
    Personal mi s-ar parea si mai util cu un sistem de autentificare clienti, user/pass ar fi destul, pare prea expus asa cum e acum.
    Felicitari oricum YO7FWS, frumoasa idee si multa munca in spate.

    RăspundețiȘtergere
  3. Salut,
    Multumesc interesului acordat acestui proiect. Referitor la intrebarea ta doresc sa-ti precizez ca nu este nicaeri nevoie in modulul server sa introduci numele clientilor. El gestioneaza orice client care se conecteaza la server si care respecta protocolul de updatare. Nu exista niciun client binedefinit, el doar memoreaza cine s-a conectat la el si adresa acestuia. In concluzie, seteaza in Setari personale intre ghilimele, SSID si passwordul retelei WiFi si foarte important portul pe care l-ai dat forward. Daca nu reusesti, da-mi de veste. La client faci aceleasi setari pentru reteaua Wifi din punctul destinatie, fara port. Trebuie doar sa introduci numele simbolic alocat locatiei respective.
    Ambele versiuni sint Lite, varianta minima pentru functionare, dar care pot fi imbunatite pe viitor. Personal nu cred ca este nevoie de parola, desii in cazul a doi clienti cu acelasi nume 100% vor aparea erori, dar numai in cadrul unei retele extinse.
    Serverul meu este online, poti testa oricind clientul tau pe adresa de mai sus, fara nicio problema. Deasemenea poti updata manual dintr-o pagina WEB o locatie pentru teste. Succes !
    Constantin

    RăspundețiȘtergere
  4. Salut.
    Nu inteleg cum vizitatorul "x" este directionat la senzorul "y" (senzorul "y" fiind o automatizare cu esp8266 ce deschida usa garajului, ce asculta pe portul 22 ssh {cu user si pass ca sa nu intre hotul} sa zicem) si nu la "w" (care apartine clientului "q", ce are o camera ip pe portul 8000).
    Mai simplu, vizitatorul introduce in link-ul de request numele lui ?
    Am facut un client de test, cu numele "test", ce se conecteaza perfect pe serverul tau, rezistent la caderi de internet si/sau curent,(nu am decat 1 modul esp la indemana acum ca sa pot testa "in the house"), superba realizare YO7FWS !

    RăspundețiȘtergere
  5. Cind locatia senzorului y de la IP-ul yy.yy.yy.yy face update ywar2.go.ro:9876/update/y/ serverul memoreaza utilizatorul y cu adresa IP, yy.yy.yy.yy. Cind locatia altui sernzor w, face update ywar2.go.ro:9876/update/w/ se memoreaza un alt utilizator cu numele w si IP-ul, ww.ww.ww.ww. Daca un vizitator cauta senzorul w pe portul 22 la adresa ywar2.go.ro:9876/w:22, serverul raspunde cu o pagina de redirectionare avind adresa ww.ww.ww.ww:22. Lafel se intimpla si pentru senzorul y care are portul 8000, respectiv yy.yy.yy.yy:8000.
    Asa cum este serverul acum, simplu fara nicio imbunatatire, nu are sursa separata pentru caderi de tensiune si nici nu memoreaza clientii si adresele lor pentru o eventuala intrerupere a tensiunii. La un interval de update de cca 10 minute, este deajuns sa-si rememoreze clientii sai. La un interval mai mare, sa zicem o ora, intr-adevar este o problema. Asta nu inseamna ca nu poate fi imbunatatit. Succes si da-mi de veste indiferent de rezultatele tale.
    Constantin

    RăspundețiȘtergere
  6. Multumesc pentru raspunsul rapid.
    Partea cu caderea de tensiune e simpla, o celula liion, 1-2 diode, o rezistenta eventual.
    Modulul meu esp (model 01) singur are un consum de 92mA spike-uri de 5ms, 32mA/min average, deci o celula de 500mAh tine 10 ore.
    Spectaculos de rapid acest cip, si codul este bine facut bineinteles, timp de confirmare la client (led aprins) din momentul alimentarii 2sec maxim 3, cu conectare la wifi-ul meu cu tot, am fibra cu 300mb/s deci latenta minima in capatul meu, nu stiu ce tine serverul tau ca latenta, dar totusi soc-ul asta duduie ^^.
    Sa inteleg ca sintaxa exacta a linkului dinspre vizitator catre server este "ywar2.go.ro:9876/w:22", w fiind userul ?
    Adica pot pune intr-o aplicatie acest link (nu in browser) acest link, sa zicem intr-un client de DVR ?
    Browserele au probleme de interpretare cand simbolul ":" apare de mai multe ori..

    RăspundețiȘtergere
  7. Bravo, buna intrebare partea cu DVR-ul. Sa stii ca nu merge. La interogarea vizitatorului, dintr-o pagina WEB, i se raspunde cu o pagina in al carui continut se gaseste adresa destinatarului. Atunci cind un vizitator interogheaza serverul dintr-o aplicatie, nu merge. Nu functioneaza deoarece aplicatia nu stie sa interpreteze pagina WEB de redirectionare receptionata de la server. Azi am discutat problema aceasta cu un coleg si recunosc ca m-a pus pe ginduri. Daca marile site-uri reusesc aceasta redirectionare, atunci ar trebuii sa mearga, dar trebuie sa gasesc solutia. O alta problema care mi-a fost expusa tot de colegul meu, ar fi, cum se acceseaza atunci cind adresa este ftp? Mai am de studiat si sper sa gasesc solutiile. Multumesc interesului acordat. Numai bine !

    RăspundețiȘtergere
  8. Din unghiul meu de vedere (neofit in sw, fie lua,html,etc) problema mea si cea cu ftp-ul sant una si aceeasi, serverul trebuie sa redirectioneze la modul "s-a mutat in Sibiu, str.Horia,nr.3, intreaba acolo" cand este intrebat pe portul 9876 si nu cu un plic inchis cu adresa fiindca din punctul de vedere al aplicatiilor o pagina html cu o noua adresa este un plic inchis, aplicatiile gen dvr sau ftp sau etc nu se asteapta sa se raspunda cu o pagina html ci cu o interogare de login ori etc.
    Cred ca exista instructiuni html pentru asta, vorba ta noip cum o face ?
    Din pacate nu pot face nimic aici, ma pricep doar la hw.
    Apropo cand intru pe pagina ta cu portul 9876 din cand in cand ajung pe pagina de login a routerului tl841nd, nu cred ca e in regula, asta nu are legatura cu subiectul dar zic eu ca merita sa stii.

    RăspundețiȘtergere
  9. http://insider.zone/tools/client-side-url-redirect-generator/ ajuta ?
    Success.

    RăspundețiȘtergere
  10. Interesanta ultima parte. Sigur ai intrat cu 9876 si nu cumva fara el? Daca raspunsul este pozitiv, desii eu am testat asta de nenumarate ori, este posibil sa fie o scapare, o secventa neanticipata de mine in program, si atunci uita sau ignora portul. Am sa revizuiesc aceasta, e bine de stiut. Merci !

    RăspundețiȘtergere
  11. Am gresit, cand intru pe pagina serverului fara sa specific port 9876 (probabil browserul meu deduce ca portul este 80 fiind adresa http)si nu a blogului, stii tu care este, nu o scriu aici din motive evidente.
    Probabil este exact redirectarea de care nu santem multumiti, in cazul protocolului http merge de minune hehe.

    RăspundețiȘtergere
    Răspunsuri
    1. Mi se face rau cind vad bilele alea din 26.09 si 28.12... urita senzatie... nu-i de glumit... am tras si eu putin cu ochiul...

      Ștergere