Dupa ce ani de zile Plug and Play a fost un buzzword supra-uzitat in orice tinea de IT (si bineinteles generand si glume de genul Plug and Pray) in ultimii ani a aparut si este folosit destul de des (desi de multe ori nu stim de el) un protocol mult mai putin celebru ce imprumuta acest nume: Universal Plug-and-Play.
UPnP este de fapt un set de protocoale ce au ca target device-urile dintr-o retea (SOHO de exemplu) permitandu-le acestora sa se identifice intre ele si sa-si anunte/foloseasca diverse servicii. Spre exemplu, exista o extensie a standardului, numita UPnP AV (audio/video) care permite unor device-uri sa joace rolul de Media Gateways – pot contine de exemplu o colectie de muzica sau filme pe care sa o puna la dispozitie prin UPnP altor echipamente din retea, cum ar fi un Media Player conectat la un TV sau PC-ului utilizatorului.
Exista insa o functie ce este trecuta des cu vederea dar care este extrem de importanta cu atat mai mult cu cat routerele “de apartament” au devenit atat de comune: NAT Traversal.
NAT Traversal prin UPnP este facilitatea prin care o aplicatie poate anunta un router ca este disponibila si ca are nevoie de acces din exteriorul retelei, acesta urmand sa-i ofere accesul cerut. NAT (Network Address Translation) este o metoda de a permite accesul in afara retelei unui numar f. mare de echipamente desi avem la dispozitie o singura adresa IP publica. Astfel, in reteaua locala putem folosi asa numitele adrese private (din clasa 192.168.0.0 – 192.168.255.255 de exemplu) ale caror pachete vor fi modificate la iesirea din retea inlocuindu-se adresa sursa IP din pachet cu adresa publica pe care o avem configurata pe router, adresa primita de la providerul Internet. Procesul NAT este (mult) mai complicat de atat dar pentru discutia noastra explicatia este suficienta.
Din pacate desi NAT are avantaje deosebite (si a ajutat de exemplu enorm la intarzierea “consumarii” adreselor IPv4) are si cateva dezavantaje printre care faptul ca nu pot fi accesate in mod normal din exterior, hosturile din interior. E clar ca de undeva din exterior nu ar avea sens sa incercam sa dam de un PC folosind ca destinatie o adresa privata, fiind probabil milioane de calculatoare in lume care au o adresa 192.168.x.x. Pe de alta parte, daca incercam sa apelam din exterior un PC din reteaua interna folosind adresa IP publica, routerul pe care aceasta este setata (si pe care facem NAT) nu va sti carui computer din reteaua locala trebuie sa-i fie forwardat traficul. Astfel apare in discutie si extensia NAT-ului numita PAT (Port Address Translation) care in general este subinteleasa cand vorbim de NAT si care permite si folosirea porturilor TCP ca un identificator suplimentar.
Ok, sa spunem ca folosim un router cu NAT+PAT care implicit translateaza toate pachetele din reteaua locala cand acestea doresc sa iasa. Cum putem face totusi sa putem accesa un server (sa zicem) Telnet aflat in reteaua locala din extern? Simplu, pe router trebuie sa configuram o facilitate numita Port Forwarding: ne alegem un numar de port TCP si pe acesta il vom forwarda spre un host din reteaua interna. Presupunem urmatoarea structura:
(PC) IP 192.168.1.100 (server Telnet / port 23) —— (IP 192.168.1.1 <- Router -> IP 100.100.100.100) —–(Internet)
Configurarea Port Forwarding-ului pe Router poate insemna inserarea unei linii de configuratie prin care putem specifica ceva ce in cuvinte ar suna asa: “Ia toate pachetele care vin din Internet catre IP-ul tau- 100.100.100.100 – si care au port destinatie 2300, modifica-le si trimite-le spre PC-ul 192.168.1.100 pe portul sau 23). Dupa ce facem aceasta configurare, oricine din Internet se poate conecta la adresa 100.100.100.100 pe portul 2300 si in mod transparent va discuta de fapt cu PC-ul din reteaua locala pe portul 23. Astfel Port Forwardingul este realizat cu succes si putem oferi, in ciuda folosirii NAT-ului, acces din exterior catre resurse din interior.
Dupa acest mini-tutorial NAT ramane intrebarea: atunci UPnP la ce ne mai ajuta? Simplu: ne face viata mai usoara. De ce?
- foarte multe protocoale au inceput sa foloseasca numere de port dinamice sau aleatoare (BitTorrent?) si ar fi incomod spre imposibil sa configuram port forwarding manual in acest caz
- multi utilizatori nu stiu ce este un port TCP si nu ar sti sa configureze aceasta facilitate, avand apoi probleme cu diverse aplicatii de retea
- daca putem automatiza ceva, de ce sa nu o facem?
UPnP NAT Traversal preia taskul de creare automata a regulilor de Port Forwarding pe routere permitand aplicatiilor sa comunice cu routerul ce face NAT in vederea stabilirii automate a forwardingurilor necesare. UPnP deja este folosit de aproape toti clientii de Torrent existenti, de Skype, YMessenger sau orice alta aplicatie care doreste sa poata fi accesata din exterior printr-un router NAT. Astfel, nu ne ramane decat sa lansam o aplicatie si automat aceasta informeaza routerul de accesul pe care il doreste.
Un caz recent in care m-a ajutat UPnP-ul a fost intr-o retea in care nu aveam acces pe gateway (routerul care facea NAT) dar am aflat prin teste ca acesta are serviciul UPnP pornit. Nu puteam sa il configurez pentru a-mi deschide portul de SSH (22) din exterior si nici serverul de SSH nu avea suport UPnP pentru a comunica cu routerul si a crea forwardingul necesar, drept pentru care am apelat la un utilitar extrem de simplu si util pe care il puteti gasi aici: http://sourceforge.net/projects/upnp-portmapper/. Acesta permite realizarea prin UPnP a regulilor de forwarding pentru orice port sau IP necesar. Astfel, am introdus adresa PC-ului local (server SSH in cazul meu), portul extern 2200 si portul intern de pe PC 22/ssh. Programul a generat secventa de pachete necesara pentru dialogul cu Routerul si din acel moment am avut acces din extern conform necesitatilor mele.
Desi este un lucru util pentru orice utilizator si simplifica mult lucrurile in ceea ce priveste NAT-ul UPnP poate fi si o problema de securitate.. un virus sau backdoor poate deschide prin UPnP “porti” prin NAT-ul unui router/gateway permitand unui atacator sa acceseze din exterior resurse din interior in mod normal “ascunse” de NAT prin insasi natura sa. Recomand in consecinta, daca lasati UPnP pornit, sa va accesati routerul din cand in cand si sa verificati regulile curente de forwarding si aplicatiile ce le-au generat.
ca sa fie si mai clar, te rog sa-mi confirmi/infirmi urmatoarea afirmatie:
daca in LAN-ul meu de acasa am un server FTP pe un linux cu 500G de filme si un laptop cu windows, pot instala aplicatia respectiva pe laptop dar specificand IP-ul din LAN al linux-ului, se va crea pe router-ul meu, folosind UPnP, o regula de port forwarding care imi va permite sa accesez din internet FTP-ul meu cu filme de pe linux.
Eeeexact. Nu este nevoie sa rulezi neaparat aplicatia de pe calculatorul caruia doresti sa-i oferi acces, aplicatia te lasa sa introduci orice IP si port si va face respectiva mapare, fara sa conteze de pe ce PC/laptop etc faci requestul UPnP.
O mica problema e ca in general aceste intrari daca nu sunt refreshed se pierd asa ca daca ai nevoie de ceva permanent cred ca poti modifica timerii din sectiunea UPnP de pe router sau sa faci pur si simplu un port-forwarding “the good-old-fashioned-way”, static. Momentan caut o solutie pe linux pentru asa ceva pentru ca am testat ceva care nu a functionat din pacate … astfel, pot scripta lucruri daca as avea aceasta aplicatie pe linux.
UPDATE: am gasit si metoda de a face acest lucru direct de pe un linux. Scriptul folosit este acesta: http://linux-igd.sourceforge.net/
Este facut in perl si foloseste o librarie PERL care trebuie instalata (pe Debian/Ubuntu cu “apt-get install -y libnet-upnp-perl”).
Exemple folosire:
—————–
Afisare informatii router (eu nu m-as increde in ele):
./igdctl.pl -p
WAN access type : Ethernet
Maximum upstream rate : 100000000 bps
Maximum downstream rate : 100000000 bps
Physical link state : Up
Total bytes sent : 244.91 MB
Total packets sent : 0
Total bytes received : 244.29 MB
Total packets received : 345171
Vizualizare forwarding-uri
./igdctl.pl -l
ACTIVE REMOTE HOST EXTERNAL PORT CLIENT HOST INTERNAL PORT LEASE TIME
1 * 44250 192.168.1.4 44250 0
1 * 44250 192.168.1.4 44250 0
1 * 2200 192.168.1.100 2200 0
Adaugare port-forwarding (pt ultime inregistrare din tabelul de mai sus):
./igdctl.pl -a -e 2200 -i 2200 -I 192.168.1.100 -P TCP
Command successful.