Cuprins
• Domain Name System (DNS)
• Caracterizare
• Organizare
• Configurare
• Comenzi, Primitive
• IDN
2
DNS
• Adresele IP (de ex. 85.122.23.145,
2001:0db8:0001:0000:0000:0ab9:C0A8:0102) sunt dificil de memorat
• Se utilizeaza un sistem al numelor de domenii pentru a translata adresele IP in nume de
domenii si invers
• Numele de domenii se organizeaza in ierarhii
DNS| organizare
• Initial: /etc/hosts – perechi (nume, IP) – Probleme de scalabilitate
• Actual: DNS consta dintr-o schema ierarhica de nume de domenii si dintr-un sistem de baze de date distribuite ce implementeaza aceasta
schema de nume
4
Figura. O portiune a spatiului numelor de
DNS| Tipuri de domenii
• Primare (Top Level Domains – TLD)
– pentru Infrastructura Internet – un singur domeniu .arpa ARPA (Address and Routing Parameter Area)
• “Changes to the .arpa zone must be coordinated manually with IANA”
– State (ccTLD) – coduri de state: .ro, .fr, .jp, …
– IDN ccTLD (Internationalized Country Code Top-Level Domains)
– Generice: .biz, .com, .info, .name, .net, .org, .pro – Sponsorizate: .aero, .edu, .gov, .int, .jobs, .mil, .tel – Rezervate: .example, .invalid, .localhost, .test
– Pseudo-domenii: .bitnet, .local, .root, .uucp etc.
https://www.iana.org/domains/root/db/
6http://例子.测试 http://example.test
DNS| Tipuri de domenii
DNS| Tipuri de domenii
• Domeniu de nume
– Subarbore al arborelui de domenii
– Nu trebuie sa respecte topologia retelei fizice
• Sub-domenii:
– intreaga cale de nume nu depaseste 255 de caractere
• Nume de calculatoare (gazde)
8
DNS
• Exemplu:
DNS| organizare
• Reguli de alocare a numelor de domenii:
– Fiecare domeniu controleaza cum sunt alocate subdomeniile sale
– Pentru a crea un nou subdomeniu, se cere permisiunea domeniului in care va fi inclus (un domeniu de la un anumit nivel va avea o autoritate) – Atribuirea de nume de domenii respecta granitele
organizationale, nu pe cele ale retelelor
– Un anumit nivel din ierarhia de niveluri poate fi controlat de mai multe servere
10
DNS| organizare
• Servere de nume (name servers)
– Teoretic, un singur server de nume poate contine intreaga baza de date DNS si poate raspunde
tuturor cererilor
• Probleme: incarcarea si “single point of failure”
–
DNS| organizare
• Servere de nume (name servers)
Exemplu: O posibila impartire a spatiului de nume DNS in zone
12
[Computer Networks, 2003 Andrew S. Tanenbaum]
DNS| organizare
• Servere de nume (name servers)
– Exista un server primar (primary/authoritative name server) care deserveste un anumit domeniu si, eventual, mai multe servere secundare continand baze de date replicate
– TCP se utilizeaza pentru replicarea DNS
– UDP pentru interogari (lookups)
DNS| organizare
• Client DNS
– Denumit resolver, trimite un pachet UDP serverului DNS, care cauta numele si returneaza adresa IP
14
[Retele de calculatoare – curs 2007-2008, Sabin Buraga]
DNS| organizare
• Exemplu de implementari ale serverului de nume: BIND (Berkeley Internet Name Domain), MSDNS, PowerDNS etc.
• Ca resolver (client) interactiv, se poate folosi de
exemplu una dintre comenzile: nslookup, host
sau dig.
DNS| interogari
• Interogari:
– Recursiva – daca un server DNS nu cunoaste adresa pentru numele solicitat, atunci va interoga alt server DNS
– Incrementala – daca serverul DNS nu stie sa raspunda, returneaza eroare si adresa altui server DNS (numit si referral) care ar putea cunoaste raspunsul la interogare
16
[http://technet.microsoft.com/en-us/library/cc775637%28v=ws.10%29.aspx]
DNS| interogari
• Fiecarui domeniu ii este asociata o multime de inregistrari de resurse (resource record – RR)
• Mecanismul:
– Cererea: resolver-ul trimite un nume de domeniu – Raspunsul: inregistrarile de resurse asociate acelui
nume (stocate in bazele de date DNS)
DNS| interogari
• Forma generala RR este:
Nume_domeniu Timp_de_viata Tip Clasa Valoare Nume_domeniu (domain name) – precizeaza
domeniul caruia i se aplica aceasta inregistrare
Timp_de_viata (time-to-live) – da o indicatie despre cat de stabila este inregistrarea
18
DNS| interogari
Tip - precizeaza tipul inregistrarii
– SOA (Start Of Authority) : domeniul curent, adresa e-mail a administratorului, etc.
– A – adresa IP a gazdei
– MX (mail exchangers) – precizeaza numele domeniului pregatit sa accepte posta electronica pentru domeniul specificat
– CNAME (Canonical Name) – permite crearea pseudonimelor
– PTR (Pointer) – Pseudonim pentru adresa IP
DNS| interogari
Clasa: pentru Internet valoarea acestuia este IN
Valoare: acest camp poate fi un numar, un nume de domeniu sau un sir ASCII; semantica depinde de tipul de inregistrare
20
Exemple de inregistrari de
resurse DNS
DNS| configurare
• Exemplu de fisier pentru specificarea unei zone
DNS
DNS| clienti, resolveri, servere
22
Ca fisier de configurare al
resolver-ului: /etc/resolv.conf
[Unix Network Programming, R. Stevens B. Fenner, A. Rudoff - 2003
DNS| configurare
• Exemplu de fisier /etc/resolv.conf
DNS| interogari inverse
• Problema:
– Data o adresa, care va fi numele ei simbolic?
(reverse DNS resolution sau reverse DNS lookup) Exemple:
1)
2) 2001:db8::567:89ab
b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa
24
DNS| optimizari
Proximitatea spatiala: serverele locale vor fi interogate mai des decat cele la distanta
Proximitatea temporala: daca un set de domenii sunt referentiate repetat atunci se apeleaza la caching DNS
Fiecare intrare DNS va avea stabilita o valoare TTL (time to live)
Se va utiliza si replicarea (servere multiple, servere
DNS| comenzi
Ca resolver interactiv se pot folosi comenzile:
– nslookup – dig
– host – whois – …
26
DNS| nslookup
nslookup www.info.uaic.ro
- Returneaza RR de tip A folosind serverul DNS local
Exemple de utilizari:
nslookup 85.122.23.1
- Returneaza RR de tip PTR pentru 85.122.23.1 in ierarhia de domenii in-addr.arpa
Host Lookup
DNS| nslookup
nslookup www.axiologic.ro
- Returneaza RR de tip A folosind serverul DNS specificat
28
Exemple de utilizari:
man nslookup
Host Lookup
DNS| dig
dig – un instrument mai puternic decat nslookup
Exemplu de utilizare:
dig www.info.uaic.ro A
DNS| comenzi
host
30
Exemplu de utilizare:
DNS| whois
whois ibm.com
DNS| primitive
• Nu trebuie scris un resolver pentru a afla adresa IP a unei gazde
• Functii principale:
• gethostbyname(); getaddrinfo();
• gethostbyaddr() ; getnameinfo();
• La unele sisteme de operare (e.g., Solaris) va trebui la compilare sa folosim biblioteca nsl (Name Server
Library): gcc … -lnsl
32
DNS| primitive
Una din structurile folosite: hostent struct hostent {
char *h_name; /* nume oficial (canonical) */
char **h_aliases; /* alias-uri */
int h_addrtype; /* AF_INET */
int h_length; /* lungimea adresei: 4 sau 6 */
DNS| primitive
Structura hostent:
34
h_name h_aliases h_addrtype
h_length h_addr_list
Numele oficial al hostului (canonical name)
… NULL
… NULL
alias 1 alias 2
Adresa IP 1 Adresa IP 2
AF_INET
DNS| gethostbyname()
#include <netdb.h>
struct hostent *gethostbyname
(const char *hostname);
• In termenii DNS, gethostbyname() realizeaza o
cerere pentru o inregistrare A
DNS| gethostbyname()
• Returneaza:
– In caz de succes returneaza un pointer la hostent, ce contine adresa IP a host-ului
– In caz de eroare NULL, iar variabila h_errno indica eroarea aparuta:
• HOST_NOT_FOUND
• …
• NO_RECOVERY
• …
36
Constante definite in
netdb.h
DNS| gethostbyname()
• Exemplu de utilizare: completarea structurii sockaddr_in avand in loc de adresa IP un nume simbolic:
struct sockaddr_in server;
struct hostent *hos;
if(!( hos = gethostbyname(“fenrir.info.uaic.ro”) ) {/*Eroare la rezolvarea adresei*/}
server.sin_family=AF_INET
/* adresa IP o luam din structura hos */
memcpy(&server.sin_addr.s_addr , hos->h_addr_list[0],
DNS| gethostbyaddr()
#include <netdb.h>
struct hostent *gethostbyaddr ( const char *addr, socklen_t len, int family);
• In termenii DNS, gethostbyaddr() realizeaza o cerere la serverul de nume pentru o inregistrare PTR in domeniul in-addr.arpa
• Returneaza: In caz de succes returneaza un pointer la hostent, ce contine numele oficial al host-ului ; In caz de eroare NULL, iar
variabila h_errno indica eroarea aparuta
Obs. gethostbyaddr() se foloseste in special pentru IPv4
38
DNS| getservbyname()
#include <netdb.h>
struct servent *getservbyname (const char *servname, const char
*protoname);
• Returneaza: un pointer la struct servent in caz de sucess, NULL in caz de eroare
struct servent {
char *s_name; /* numele oficial al serviciului*/
char **s_aliases; /* alias-uri */
int s-port; /* portul (network-byte order) */
DNS| getservbyport()
#include <netdb.h>
struct servent *getservbyport (int port, const char *protoname);
• Cauta un serviciu dupa un numar de port si dupa protocol (optional)
• Returneaza: un pointer la struct servent in caz de sucess, NULL in caz de eroare
Obs. port este in network byte order
Exemplu:
struct servent *pserv;
pserv=getservbyport( htons(53), ”udp”); /*DNS folosind UDP */
pserv=getservbyport( htons(21),”tcp”); /*FTP folosind TCP */
40DNS| getaddrinfo()
#include <netdb.h>
int getaddrinfo (
const char *hostname, const char *service,
const struct addrinfo *hints, struct addrinfo **result ) ;
• Obs. hostname, service, hints – parametri de intrare
• Returneaza: 0 in caz de sucess, !=0 in caz de eroare
Numele host-lui sau o adresa IPv4 sau IPv6 ca string
Portul serviciului sau numele serviciului (“http”,”pop”,..) (vezi /etc/services )
Contine informatii despre tipul
de informatii pe care trebuie sa
le intoarca primitiva
DNS| getaddrinfo()
struct addrinfo {
int ai_flags; /* AI_PASSIVE, AI_CANONNAME */
int ai_family; /* AF_INET, AF_INET6, AF_UNSPEC */
int ai_socktype; /* SOCK_STREAM sau SOCK_DGRAM */
int ai_protocol; /* 0 (auto) sau IPPROTO_TCP, IPPROTO_UDP */
socklen_t ai_addrlen; /* lungimea lui ai_addr */
char *ai_canonname; /* numele canonic al host-ului */
struct sockaddr *ai_addr; /* adresa binara a socket-ului */
struct addrinfo *ai_next; /* pointer la urmatoarea structura din lista */
};
42
DNS| getaddrinfo()
Discutii:
• Daca functia returneaza cu succes result va pointa la lista de struct addrinfo.
Cazuri cind se pot obtine structuri multiple:
– Exista mai multe adrese asociate cu numele hostului si cate o structura este returnata pentru fiecare adresa
– Daca serviciul este furnizat pentru tipuri diferite de socket-uri, atunci cate o structura este returnata pentru fiecare tip de socket
• Informatia returnata de getaddrinfo() in structura struct addrinfo
**result poate fi utilizata astfel:
– Pentru socket() : ai_family, ai_socktype, ai_protocol
DNS| getnameinfo()
#include <netdb.h>
int getnameinfo (
const struct sockaddr *sockaddr, socklen_t addrlen,
char *host,
socklen_t hostlen, char *serv,
socklen_t servlen, int flags) ;
• Inlocuieste gethostbyaddr() si getservbyport()
• Returneaza: 0 in caz de sucess, !=0 in caz de eroare
44
numele host-ului intors
Numele serviciului
Adresa socket-ului trimisa ca argument
NI_NOFQDN -> host va contine doar
numele host-ului si nu intreg numele
al domeniului
DNS| IDN
• International Domain Names (IDN)
– Extensie care permite folosirea caracterelor Unicode in numele de domenii, nu doar a celor ASCII
https://www.icann.org/en/topics/idn/
16 Noiembrie 2009 - Inregistrarea de domenii ccIDN
sau IDN ccTLD
DNS| administrare
• Radacina DNS este oficial administrata de Internet Corporation for Assigned Names and Numbers (ICANN)
• Exista si alte organizatii care ofera radacini alternative (alt DNS roots),
precum OpenNIC (Network Information Center) sau New.Net
46
Rezumat
• Domain Name System (DNS)
• Caracterizare
• Organizare
• Configurare
• Comenzi, Primitive
•
Intrebari?
48