============================================================================== -----------[ BFi numero 10, anno 4 - 30/09/2001 - file 18 di 18 ]------------- ============================================================================== -[ MiSCELLANE0US ]------------------------------------------------------------ ---[ DNS JAM -----[ tHE rECIdjVO____ _ __ _____ | \ | \ | | / ____| ################################### | \ | \ | | | |___ ______ ___ ____ ____ | | | | | \____ \ |_ _| / _ \ | _ \/ _ | | | | |\ | /\____| | | | | |_| |_ | | | | | | |_______/ |__| \___| \_______/ | | \_____/\_| |__| |__| |__| / | ################################# |___/ ############################ | | | DNSjam - A little survey across the Domain Name System village | | | | by tHE rECIdjVO - recidjvo@pkcrew.org | | Member of the Packet Knights | | http://www.pkcrew.org/ | | | | - June, 2001 | | | ##################################################################### o 0. Introduzione o 1. Cenni storici o 2. Basi protocollo DNS 2.1. Gerarchia 2.2. Top Level Domains 2.3. Reverse Lookup o 3. RRs (Resource Records) o 4. Implementazioni del protocollo 4.1. gethostbyname() 4.2. getaddrinfo() o 5. Struttura di un pacchetto DNS (utilizzando il protocollo UDP) o 6. Software di analisi DNS (la pappa e` prontaaa) 6.1. host 6.2. dig o 7. DNS e Whois o 8. Future 8.1. Nuovi organismi e TLD 8.2. Futuro del protocollo o 9. Resources 9.1. RFCs 9.2. URLs 9.3. HOWTOs 9.4. Books 9.5. About the Author 0. Introduzione Eccoci qui. Ennesimo lunedi` mattina, ennesimo casino. Della serie *ma quasi quasi stavo bene prima di ieri sera*, per gli amanti delle feste della domenica notte, per quelli che credono che oramai tutto sia quasi sistemato e invece poi in poche ore cambia tutto, e non sai piu` cosa pensare ne` cosa fare, vorresti solo sprofondare nella calma del tuo CED, per quelli che si ritrovano ogni dieci secondi a pensare a certe cose che speravano di aver cancellato dalla mente e archiviato nella sezione *bei momenti passati insieme* del proprio Castello della Memoria, per quelli che sanno cosa vuol dire quando il vento sembra soffiare sempre contro di te, per coloro che capiscono che un messaggio sul cellulare dopo una serata del genere possa essere il colpo di grazia, beh, benvenuti. Dire come mi sento ora e` davvero difficile (e probabilmente non ve ne freghera` neanche nulla =), pero` cosi` e`, se vi pare; a tutte quelle persone che probabilmente mai leggeranno questo testo, ma che forse potranno capire cosa mi sta succedendo, beh, vi voglio bene, lo so che non e` molto ma e` cosi` e non ci posso fare nulla, oramai. E allora cosa si puo` fare quando ci si trova in una situazione del genere? SIIIIIIIII!!!!!!!!! =) Mettersi a leggere un inutilissimo documento sul protocollo DNS e su come possa distogliere la nostra mente, magari anche solo per pochi secondi, da questo triste scenario. Quindi da parte lo sconforto e la tristezza, sguardo fisso in alto, a scrutare le stelle, memori che nel mondo il dolore deve venire superato sempre... tenendo anche conto della nuova segretaria che e` arrivata oggi... uhm... alla fine forse il mondo non e` cosi` male come poteva sembrare =D Insomma in poche parole, su con la vita, noi siamo gli immortali, e prima o poi troveremo anche noi la felicita`... 1. Cenni storici Beh tanto per iniziare un po' di storia, anche perche` come spero abbiate immaginato non e` che di colpo sia stato Internet gia` bello e funzionante, ma il tutto si e` sviluppato piano piano fino a che fondendo le varie esperienze si e` giunti all'attuale standard, che a noi sembra normalissimo e immutabile, ma anche lui sara` destinato a scomparire ed essere sostituito da... uhm... ehm... boh, insomma da quello che inventeranno dopo :) Premetto che non tutto quello che dico l'ho sperimentato di persona, ma l'ho letto sulle quintalate di rfc e doc che mi sono scorso nei giorni scorsi (o che mi sono passato nei giorni passati, o che mi sono letto nei giorna-letti). Quindi se non vi va bene andate a rompere a Postel e compagnia bella che io c'ho gia` i miei problemi... Lo scopo principale del protocollo DNS e` quello di permettere di identificare un determinato computer attraverso un nome, e non un IP address; i vantaggi che questo comporta sono molteplici, in quanto e` molto piu` facile ricordarsi un hostname (ad esempio www.pornvalley.com - e chi se lo scorda =), piuttosto che 64.75.34.136, non credete? Ehi, dico a voi! Oh, chiudete subito quel browser branco di maniaci e continuate a leggere ^__^ All'inizio, quando la scimmia aveva appena iniziato a raggrupparsi in piccole comunita` e a darsi un'organizzazione, sorse il problema di dare un nome alle macchine in modo da poter rendere facile il loro riconoscimento all'interno di una rete e permettere operazioni di interscambio ad alto livello, come ad esempio l'invio della posta. Tra le varie proposte ce ne furono alcune che ancora sussistono, piu` o meno in disuso, come l'UUCP; fino a che le reti erano piccole e l'utenza non toccava utenti che non si possono certo definire *tecnici* (come capita ora, dopo il grande boom di internet), si poteva usare anche solo un nome associato alla macchina, senza preoccuparsi del dominio: il semplice HOST era piu` che sufficiente per permettere gli scambi in modo trasparente. Reti mitiche come ARPANET o DDN si trovarono pero` in crisi quando il numero di macchine collegate tra di loro crebbe in maniera spropositata, e Internet si trasformo` dalla rete militare che era in uno dei piu` affollati mondi internazionali di scambio. Per rendersi conto di come sia cambiato il mondo, basti pensare che nel 1987 i domini .com registrati ammontavano a poche centinaia, mentre ora sono in numero talmente elevato da avere difficolta` a registrarne uno =) Il protocollo fu introdotto nel 1984 dalla nascita di Nostro Signore, e le reti gia` esistenti iniziarono i cambiamenti necessari per l'adattamento al nuovo standard, ovviamente passando per una lunga fase di transizione. L'evoluzione sembro` soddisfare abbastanza la comunita`, e negli anni successivi si continuo` lo sviluppo lungo questa direzione, introducendo nuovi standard e implementando piano piano il sistema di risoluzione dei nomi che stiamo usando ancora oggi. Per capire quanto sia in evoluzione questo mondo, basti pensare che un'importante modifica fu fatta nel '95 per introdurre il supporto per le risorse su IPv6, protocollo che sara` fondamentale anche se solo ora la gente sta incominciando a rendersene conto: grazie alla risoluzione dei FQDNs (Full Qualified Domain Names) gli utenti un po' meno esperti (giusto per citarne qualcuno: la segretaria tettona che usa la posta, il pornografo impunito che guarda www.pornvalley.com - FERMI!!! -, la mamma della mia vicina che deve assolutamente andare sul sito dei LunaPop... :) non si accorgeranno minimamente di quale fantastica rivoluzione sia avvenuta nel mondo digitale, e valle pure a spiegare che il merito va dato al browser IPv6 e ai nuovi router della Cisco, tanto lei vede il sito dei LunaPop, e` contenta, la figlia esce la sera e siamo tutti felici - *ting* [(C) Pollon - pollon@olimpo.net] Dopo questa tortura vediamo un po' cosa ci ha portato da ARPANET e le reti militari al sito di Cesare (che sia la sua Vespa? =). 2. Basi protocollo DNS Il protocollo e` sostanzialmente mooolto semplice, ovviamente dopo che si e` perso il sonno per mesi interi cercando di capirlo ^__^ Pero` con questo documento spero di chiarire le idee a molta gente, anche perche` a essere sincero credo di conoscerne le basi discretamente, e in giro una delle domande piu` frequenti che mi fanno riguarda questo argomento (cosi` ora gli mando via DCC l'articolo e non rompono piu` le bolle =) Abbiamo detto che lo scopo del DNS e` quello di permettere la dualita` tra IP address e hostname. In realta` questo concetto, sebbene dia un'idea molto mirata della situazione, e` molto restrittivo e non si puo` certo esaurire cosi` l'argomento. Il sistema che e` stato messo in piedi e` un gigantesco database distribuito su migliaia di macchine tutte in giro per il mondo. Scopo principale e` la risoluzione dei nomi, ma nulla ci vieta di usare il protocollo DNS per scambiarci messaggi di amore attraverso una risorsa TXT (ho sentito di gente che mandava binari interi uuencodati con questo metodo): beh, visto che purtroppo una ragazza a cui mandare i messaggi di amore non la tengo (e se ce l'avessi credo che scapperebbe se provassi a fare una cosa cosi` malata :), vediamo come e` strutturato il mondo dei DNS. 2.1. Gerarchia Uno di concetti fondamentali che caratterizza la rete attuale a differenza di altre piu` antiche e` quella di avere una forte gerarchizzazione dei nomi. Tradotto in un linguaggio che anche |CyRaX| possa capire, il potere e` tenuto centralizzato per quanto riguarda la gestione, ma non per quanto riguarda le risorse. Tradotto in un linguaggio che anche |CyRaX| fumato e ubriaco possa capire, io comando e delego te per comandare una determinata zona che mi appartiene, e se ti va puoi delegare qualcun'altro per amministrare un'altra porzione di sottozona e cosi` via fino a che serve, se vi piace vedetela come il signore del castello con i suoi vassalli, valvassori e valvassini (Oh, a Cirooo, se non hai capito ancora, vaffanculo, te lo spiego con un disegno un'altra volta ^__^, e scusate la parolaccia). L'organizzazione delle risorse prevede un livello base, chiamato anche root, che andrebbe identificato con uno 0 pero` per esigenze grafiche la si indica comunemente (anche i programmi usano questa convenzione) con un dot (.): questa e` la root zone, ovvero chi ha il potere supremo, in quanto tutto il resto e` una *derivazione* della root. Appena sotto la root ci stanno i TLD, di cui parleremo meglio dopo, i quali non possono essere registrati a'mm'zzo ma sono stabiliti dalle autorita` competenti (che poi sarebbero la ICANN - Internet Corporation of Assigned Names and Numbers, IANA - Internet Assigned Numbers Authority e l'InterNIC). Questo livello e` il primo, e sotto questi TLD si possono registrare altri domini (che saranno quindi di secondo livello), e di solito e' a questo strato che viene permessa una registrazione agli utenti *comuni*. Prendiamo ad esempio l'host www.pornvalley.com (tanto per cambiare =), e vediamo come si scompone: innanzitutto mettiamo in forma esplicita il fatto che ci sia la root alla base di tutto, ottenendo il FQDN *www.pornvalley.com.* (e` stato aggiunto il . finale). Vediamo ora i livelli: root: . . (TLD) 1st level: com com. 2nd level: pornvalley pornvalley.com. 3rd level: www www.pornvalley.com. Intanto e` bene sfatare i luoghi comuni, quindi diciamo subito che il fatto di avere www davanti al dominio non vuol dire per forza che ci sia un server web in ascolto, e nemmeno che www.pornvalley.com. e pornvalley.com. siano la stessa cosa: e` semplicemente una convenzione di comodo adottata da molti il fatto che il livello piu` alto indichi il tipo di servizio che si sta offrendo (www, ftp, mail), ma nessuno ci costringe a settare i server in questa maniera. Lo schema sopraindicato significa questo: se voglio sapere qualcosa di www.pornvalley.com (chissa perche` poi :P) devo chiedere al capo del mondo (la root) di dirmi qualcosa riguardo al gradino immediatamente successivo (com), dopodiche` a questo chiedo in maniera analoga informazioni su pornvalley e infine a quest'ultimo chiedo di dirmi chi e` in realta` www. In questo modo sono sicuro di arrivare dove voglio senza possibilita` di malintesi. 2.2. Top Level Domains I TLD esistenti sono veramente molti, ma possiamo raggrupparli in 4 grandi categorie. La prima e` quella dei TLD generic, che possono essere registrati da tutti e non implicano una grande fatica a essere sistemati: qui troviamo i .COM .NET e .ORG (giusto per dire, tutto quello che riguarda i DNS non e` case sensitive, quindi www.pornvalley.com e WWW.PoRnVaLlEy.COM sono equivalenti). Inizialmente le tre tipologie avevano un significato preciso, ma poi con la grande corsa alla registrazione del dominio sono diventati quasi tutti equivalenti; nelle idee originarie i .COM erano destinati alle societa` commerciali, i .NET a quelle che si occupavano di topic relativi alla rete e .ORG per tutte le altre organizzazioni (ad esempio le non-profit). Una seconda categoria e` quella delle nazionali, identificate da un TLD di due lettere corrispondente al loro Country Code (li trovate tutti nell'ISO-3166). Spesso i NIC nazionali creano zone che specificano maggiormente il campo di interesse di un determinato dominio (co.uk -> Commercial/United Kingdom), ma ovviamente non hanno nessun potere al di fuori del loro TLD assegnato dall'autorita`. La terza categoria e` composta da domini che non sono registrabili da utenti normali, ma solo da particolari enti americani: .MIL (US military), .GOV (US governative), .EDU (US Educational - universita` e college di quattro anni di durata). L'ultima categoria riguarda due domini speciali, ovvero ARPA e INT, usati in modo temporaneo per i passaggi da reti come ARPANET o per scopi al di fuori della risoluzione dei nomi. I due domini di secondo livello IN-ADDR.ARPA. e IP6.INT. sono di notevole importanza in quanto servono per la risoluzione al contrario degli ip (rispettivamente IPv4 e IPv6). Vediamo ora uno schemino facile facile su come sia organizzato l'albero DNS con un paio di esempi: /--------------\ | root | \--------------/ | /-----------------------------------------------------------------------\ | | | | | | | | | | /-----\ /-----\ /-----\ /-----\ /-----\ /-----\ /------\ /-----\ /----\ /-----\ | com | | net | | org | | mil | | edu | | gov | | arpa | | int | | it | | ... | \-----/ \-----/ \-----/ \-----/ \-----/ \-----/ \------/ \-----/ \----/ \-----/ | | | \------------\ \-----------------\ | | | | /------------\ /--------\ /-----\ | pornvalley | | pkcrew | | ip6 | \------------/ \--------/ \-----/ | | /-----\ /-----------\ | www | | tiatunnel | \-----/ \-----------/ Compreso questo il modello dei DNS diventa veramente semplice: ogni volta che vi trovate davanti a un nome, non pensate al nome come ad un'entita` unica e indivisibile, ma piuttosto disegnatevi mentalmente l'albero che dalla root porta al vostro amato sito pieno di donnine nude =) (ooh, ho detto l'albero non le donnine :D) Quando io cerco di collegarmi a www.pornvalley.com, i passi che vengono compiuti sono i seguenti (non considero eventuali query ricorsive, ma giusto il percorso logico lungo l'albero); il programma, di solito attraverso una chiamata a gethostbyname(3), richiede un ip address per l'host www.pornvalley.com, e quindi, leggendo il file /etc/resolv.conf viene inoltrata al server dns una query del tipo: "dammi l'ip del sitozzo" class: "internet", e, se esistente, otteniamo una struct contenente i dati necessari per l'inizializzazione dei socket. Ma come fa il nameserver sulla mia macchina (che non e` stato delegato per gestire la risorsa www.pornvalley.com.) a sapere dove cercare l'ip? Ecco cosa avviene: 0x00: chiediamo a uno dei root-servers (che il nostro server dns ha scritti in un file), di dirci la lista dei root-servers stessi aggiornata. 0x01: al root server diciamo: voglio i dns del TLD com. 0x02: dopodiche` chiede a uno di questi di dirci un server DNS che e` autorizzato a dare informazioni sul dominio pornvalley.com. 0x03: infine interroghiamo quest'ultimo per sapere l'indirizzo IPv4 (type: A) del server. Ottenuta la risposta la utilizziamo per la connessione. Vediamo in pratica come fare usando il tool host, che viene distribuito nel package bind rilasciato dalla ISC (Internet Software Consortium) e reperibile all'url http://www.isc.org/products/BIND/. La sintassi che useremo per ora e` molto semplice: l'opzione -t specifica il tipo di risorsa richiesta, seguita dal nome e dal server DNS che vogliamo interrogare. (chiediamo al nostro server locale di darci i nameserver (NS) autoritativi per la root-zone) [recidjvo@pkcrew:~]$ host -t NS . 127.0.0.1 Using domain server 127.0.0.1: . name server F.ROOT-SERVERS.NET . name server B.ROOT-SERVERS.NET . name server J.ROOT-SERVERS.NET . name server K.ROOT-SERVERS.NET . name server L.ROOT-SERVERS.NET . name server M.ROOT-SERVERS.NET . name server I.ROOT-SERVERS.NET . name server E.ROOT-SERVERS.NET . name server D.ROOT-SERVERS.NET . name server A.ROOT-SERVERS.NET . name server H.ROOT-SERVERS.NET . name server C.ROOT-SERVERS.NET . name server G.ROOT-SERVERS.NET (ora chiediamo il primo livello a uno di questi) [recidjvo@pkcrew:~]$ host -t NS com. A.ROOT-SERVERS.NET. Using domain server: Name: A.ROOT-SERVERS.NET Address: 198.41.0.4 Aliases: com name server A.GTLD-SERVERS.NET com name server G.GTLD-SERVERS.NET com name server C.GTLD-SERVERS.NET com name server I.GTLD-SERVERS.NET com name server B.GTLD-SERVERS.NET com name server D.GTLD-SERVERS.NET com name server L.GTLD-SERVERS.NET com name server F.GTLD-SERVERS.NET com name server J.GTLD-SERVERS.NET com name server K.GTLD-SERVERS.NET com name server E.GTLD-SERVERS.NET com name server M.GTLD-SERVERS.NET (passiamo ora al secondo livello) [recidjvo@pkcrew:~]$ host -t NS pornvalley.com. A.GTLD-SERVERS.NET. Using domain server: Name: A.GTLD-SERVERS.NET Address: 192.5.6.30 Aliases: pornvalley.com name server NS1.MYDOMAIN.COM pornvalley.com name server NS2.MYDOMAIN.COM pornvalley.com name server NS3.MYDOMAIN.COM pornvalley.com name server NS4.MYDOMAIN.COM (ora abbiamo il nameserver autoritativo, chiediamogli l'IPv4 corrispondente a www) [recidjvo@pkcrew:~]$ host -t A www.pornvalley.com. NS1.MYDOMAIN.COM. Using domain server: Name: NS1.MYDOMAIN.COM Address: 216.34.13.236 Aliases: www.pornvalley.com has address 64.75.34.136 [recidjvo@pkcrew:~]$ Bene, ora sappiamo che l'ip corrispondente a www.pornvalley.com. e` 64.75.34.136. Il gioco da fare e` sempre lo stesso, scalare la gerarchia risalendo piano piano di livello e chiedendo chi e` il responsabile del livello dopo; in questa maniera i root-server non hanno *tutte* le risorse, ma solo le informazioni su chi se ne occupa e in via ricorsiva si arriva a chi le risorse le gestisce e ce le offre. 2.3. Reverse Lookup Bene, ora abbiamo capito come funziona un DNS server quando viene interrogato per restituire un ip dato un FQDN, ma cosa succede se voglio fare il contrario? Facciamo questo esempio: io ho un ip 64.75.34.136 (indovinate un po' che sara` mai? =) e vorrei proprio sapere quale e` il nome della macchina che lo ha configurato sulla sua scheda di rete. Ecco che entra in gioco il reverse lookup, ovvero assegnare un nome ad un ip (se ci avete fatto caso, fino ad ora e` successo esattamente il contrario). Per fare cio` dobbiamo istituire un nuovo tipo di RR (Resource Record) che contenga queste informazioni, e poi trovare un modo affinche` si possa procedere alla ricerca attraverso il modello di albero gerarchico che abbiamo visto caratterizzare questo protocollo. La soluzione a questo quesito e` data dall'unione di un campo PTR e di due domini speciali, IN-ADDR.ARPA (IPv4) e IP6.INT (IPv6). Vediamo come. Se non si pensasse bene a tutto quello che abbiamo detto fino ad ora, si potrebbe dire semplicemente: vabbe`, io chiedo un campo PTR per l'ip 64.75.34.136 e il nameserver me lo dice... ENNO`!!! Perche` in base a cosa il server puo` dircelo? L'unica possibilita` sarebbe che ci fosse un DNS server che contenga *tutti* i campi PTR del mondo, e direi che non e` il caso, anche perche` non vorrei essere nei panni dell'amministratore di questo fantasioso server che riceverebbe al giorno milioni di richieste di modifica =) E allora perche` non usare il concetto di database distribuito che gia` stiamo implementando per la risoluzione, chiamiamola *diretta*? Ci sorge un bel dubbio anche qui: come facciamo a sapere quale DNS server e` autoritativo per un determinato ip? Uhm, ehm, err... Non si puo` certo fare finta che l'ip (per ora parliamo di IPv4) sia come un dominio, perche` in questo modo si verrebbero a creare delle zone contenenti solo l'ultimo byte, che e` il meno significativo, mentre sarebbe l'ideale raggruppare i PTR su ip sequenziali, quindi probabilemnte gestiti dallo stesso mantainer. Detto questo sembra piu` che naturale la soluzione di *reversare* l'ip byte a byte, aggiungendoci in fondo l'appartenenza al dominio IN-ADDR.ARPA. Cosi`, l'ip 64.75.34.136 puo` essere facilmente raggiunto attraverso il PTR al FQDN 136.34.75.64.in-addr.arpa., e cosi` sembra che abbiamo davvero messo tutto a posto. Vorrei spendere ancora un paio di parole per spiegare a chi non fosse ancora convinto di quanto sia importante invertire l'ordine dei byte dell'ip, che altrimenti avremmo un dns che ha delegati tutti i PTR relativi agli ip che finiscono con .1, un altro con quelli che finiscono con .2, mentre ha molto piu` senso che un nameserver abbia delegato una classe A (64.in-addr.arpa), che poi a sua volta deleghi una classe B a un altro nameserver piu` localizzato (75.64.in-addr.arpa), che poi volendo puo` delegare ancora classi C (34.75.64.in-addr.arpa). In questo modo si possono raggruppare gli ip in base ai loro byte piu` significativi, e questa e` una buona cosa. Una volta che abbiamo questa zona, essa si comporta esattamente come un normale albero sotto IN-ADDR.ARPA., quindi possiamo definire i campi PTR e associarci un FQDN. Vediamo un attimo in pratica come funziona: se voglio trovare che host e` associato ad un ip, posso usare semplicemente host , pero` visto che stiamo cercando di imparare diamo un'occhiata a come viene trasformata la query che viene passata al server DNS. Prendiamo l'ip 64.75.34.136, invertiamo l'ordine dei byte e aggiungiamoci in fondo il dominio speciale: otteniamo quindi 136.34.75.64.in-addr.arpa., che viene processato come se fosse una normale query, quindi chiedendo prima un NS autoritativo per la zona di root, poi per la arpa, poi per la in-addr, poi per 64, poi per 75, poi per 34 e infine una query di tipo PTR per 136. Il risultato e` un FQDN (sempre che sia impostato il campo di reverse di quell'ip - e purtroppo specialmente nelle societa` nuove mi e` capitato di parlare di zona di reverse e sentirmi dire: "Ah, si`, il nostro provider vi fornisce la possibilita` di usare i nostri server DNS per la navigazione, ora le comunico gli ip" "No guardi, io vorrei la delegazione per la zona di reverse degli ip che ho acquistato..." "Ah, si`, il nostro provider vi fornisce la possibilita` di usare i nostri server DNS per la navigazione, ora le comunico gli ip" "..." e poi scoprire che neanche gli ip utilizzati dalla societa` per ospitarci i loro servizi avevano la zona di reverse impostata). "Ma e` cosi` importante questo reverse lookup?", chiederete voi. "Beh non certo importante come la risoluzione diretta, pero` si puo` rivelare molto utile in alcune occasioni." "Quali?" "Ecchepp..." =) Ad esempio e` molto utile per scoprire informazioni riguardo a chi posiede un ip o su cosa ci possa essere su una macchina, come ad esempio potrebbero fare i siti di statistiche degli accessi web a dire che si ha avuto visite da .gov e .mil se non potessero reversare gli ip dei client che si collegano? Tanti server oltre a quelli web lo fanno per inserire il risultato nei log e rendere piu` leggibile ai sysadmin quel gran burdel di cifre: il wu-ftpd lo fa, il server telnet, i pop3 e smtp piu` comuni, e, ciliegina sulla torta, I SERVER IRC =))) Perche` lo so brutti balordi che la meta` di voi stara` cercando in queste follie mentali il modo per poter avere finalmente un bel vhost da sfoggiare con gli amici, perche`, ammettiamolo, uscire con passo.le.giornate.a.guardare.tua.sorella.nella.nuova.sezione.di.pornvalley.com e` di certo meglio che un semplice numerico o un triste dialup :( E allora, bimbi miei, ecco qui la guida completa al tamarro della chat, l'uomo con il vhost d'oro... eheheh =) Punto primo: rassegnatevi. Per poter avere un vhost che venga accettato dai server irc bisogna avere non pochi requisiti, che passo ad illustrare: il vostro ip, interrogato secondo il metodo dei PTR, deve riportare un certo FQDN, il quale a sua volta interrogato per una risorsa tipo A deve rispondere con lo *stesso* ip che avete usato per il collegamento. In poche parole dovete avere la delegazione sia della zona diretta dei vhost che volete usare sia della zona di reverse relativa al vostro ip, cosa che con le dialup non capita mai. Punto secondo: poteva sembrare una cosa da lameri invece puo` essere istruttiva. Questo esempio l`ho messo apposta anche perche` possiamo trarne delle conclusioni molto importanti: non e` per nulla vero che un ip e un host siano associati alla stessa maniera per quanto riguarda diretto e reverse, volendo io potrei mettere come PTR al mio ip guarda.che.se.mi.inkazzo.vengo.li (non mi ricordo chi era che l'aveva fatto, pero` e` troppo bello =), anche se io non ho mai comperato il dominio vengo.li. Semplicemente la query per il PTR riporta il contenuto che IO ho messo nel database, e a nessuno importa se io non ho comprato il dominio, ma solo che il mio nameserver sia autoritativo per la mia zona di reverse lookup. Allo stesso modo posso far puntare un qualsiasi host del mio dominio a una macchina che non amministro io, quindi teoricamente the.usa.president.always.visits.pornvalley.com potrebbe puntare allo stesso ip del webserver che ospita www.whitehouse.gov (ATTENTI!!! www.whitehuose.gov e` il sito della Casa Bianca, mentre www.whitehouse.com e` un sito porno ^__^ Ma a che punto siamo arrivati... :) Il processo che compiono i server IRC serve quindi ad evitare che si possa mettere qualsiasi dominio solo avendo la zona di reverse e non quella diretta, infatti nel caso il doppio controllo fallisse verremmo ammessi solo con l'ip numerico. Per quanto riguarda la zona di reverse IPv6, il concetto piu` o meno e` lo stesso: al posto della IN-ADDR.ARPA. si usa la IP6.INT., la risorsa PTR e` la stessa, ma il modo di reversare l'ip non e` cosi` immediato: viene reversato anche lui byte a byte con un punto tra un campo e il successivo, ma bisogna stare attenti quando l'IPv6 e` scritto in forma contratta, perche` vanno riempiti tutti gli zeri necessari. Esempio: 3ffe:1001:280::1 == == 3ffe:1001:0280:0000:0000:0000:0000:0001 == == 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.2.0.1.0.0.1.e.f.f.3.ip6.int. Proviamo ora con il nostro amico host: [recidjvo@pkcrew:~]$ host -t NS arpa. A.ROOT-SERVERS.NET. Using domain server: Name: A.ROOT-SERVERS.NET Address: 198.41.0.4 Aliases: arpa name server A.ROOT-SERVERS.NET arpa name server H.ROOT-SERVERS.NET arpa name server C.ROOT-SERVERS.NET arpa name server G.ROOT-SERVERS.NET arpa name server F.ROOT-SERVERS.NET arpa name server B.ROOT-SERVERS.NET arpa name server I.ROOT-SERVERS.NET arpa name server E.ROOT-SERVERS.NET arpa name server D.ROOT-SERVERS.NET [recidjvo@pkcrew:~]$ host -t NS in-addr.arpa. A.ROOT-SERVERS.NET. Using domain server: Name: A.ROOT-SERVERS.NET Address: 198.41.0.4 Aliases: in-addr.arpa name server A.ROOT-SERVERS.NET in-addr.arpa name server H.ROOT-SERVERS.NET in-addr.arpa name server B.ROOT-SERVERS.NET in-addr.arpa name server C.ROOT-SERVERS.NET in-addr.arpa name server D.ROOT-SERVERS.NET in-addr.arpa name server E.ROOT-SERVERS.NET in-addr.arpa name server I.ROOT-SERVERS.NET in-addr.arpa name server F.ROOT-SERVERS.NET in-addr.arpa name server G.ROOT-SERVERS.NET [recidjvo@pkcrew:~]$ host -t NS 64.in-addr.arpa. A.ROOT-SERVERS.NET. Using domain server: Name: A.ROOT-SERVERS.NET Address: 198.41.0.4 Aliases: [recidjvo@pkcrew:~]$ host -t NS 75.64.in-addr.arpa. A.ROOT-SERVERS.NET. Using domain server: Name: A.ROOT-SERVERS.NET Address: 198.41.0.4 Aliases: [recidjvo@pkcrew:~]$ host -t NS 34.75.64.in-addr.arpa. A.ROOT-SERVERS.NET. Using domain server: Name: A.ROOT-SERVERS.NET Address: 198.41.0.4 Aliases: 34.75.64.in-addr.arpa name server NS.EXODUS.NET 34.75.64.in-addr.arpa name server NS2.EXODUS.NET [recidjvo@pkcrew:~]$ host -t PTR 136.34.75.64.in-addr.arpa. NS.EXODUS.NET. Using domain server: Name: NS.EXODUS.NET Address: 206.79.230.10 Aliases: 136.34.75.64.in-addr.arpa domain name pointer redirect.dnsix.com Perche` non abbiamo avuto risposta per alcune delle query fatte? Anche se a prima vista puo` sembrare un errore, e` giusto cosi`. Infatti la classe 64, pur essendo una classe A, ha la zona di reverse impostata direttamente sui primi tre byte, quindi evita passaggi successivi attraverso altri nameserver. E poi al contrario: [...] (salto la procedura per trovare il NS autoritativo) [recidjvo@pkcrew:~]$ host -t A redirect.dnsix.com. NS1.MYDOMAIN.COM. Using domain server: Name: NS1.MYDOMAIN.COM Address: 216.34.13.236 Aliases: redirect.dnsix.com has address 64.75.34.136 Ovviamente tutti questi esempi che abbiamo visto sono a scopo didattico, non vi sognate mai di fare tutte le query (a meno che non vi interessi sapere informazioni del tipo societa` incorporate o simili): basta fare la query al nameserver predefinito e poi ci pensa lui a fare il resto, portando direttamente a casa il risultato finale. Pero`, come dice sempre Ciro: "[biiip], lo so che c'e` un modo piu` facile automatico di farlo ma a me va di fare cosi`", quindi fanculo se vi sembra che abbiamo perso solo tempo, e scusate ancora la parolaccia =) 3. RRs (Resource Records) Vediamo ora i principali tipi di risorse che si possono ottenere da un server DNS. Come abbiamo visto, anche se apparentemente l'unico campo che potrebbe interessare sarebbe quello A (address), molti altri sono importantissimi (NS, PTR): vediamone un tot, indicando di fianco il relativo codice (i type delle query saranno ripresi nella sezione dell'implementazione di un pacchetto DNS): 0x01: A IPv4 Address Questa risorsa contiene l'ip corrispondente a un FQDN. 0x02: NS NameServer Nameserver autoritativo per la determinata zona. 0x05: CNAME Canonical Name Un nickname per un altro host. 0x06: SOA Start Of Authority Dati relativi alla gestione della zona. 0x0c: PTR Pointer FQDN per il reverse lookup. 0x0d: HINFO Host Info Informazioni sulla macchina. 0x0f: MX Mail Exchanger Nome del server gestore della posta. 0x10: TXT Text Info Descrizione della zona. 0x1c: AAAA IPv6 Address Risorsa duale a A per indirizzi IPv6. 0xfc: AXFR Zone Transfer Richiesta di trasferimeto zona. 0xff: ANY All records Richiesta per tutti i RR disponibili. Per capire come vanno impostate le risorse, potete rifarvi all'ottimo manuale del bind e all'HOWTO, comunque sono molto semplici: il SOA definisce cose come il responsabile (email) della zona, i tempi di caching delle risposte e il serial dell'ultima modifica. Il campo CNAME invece serve per poter deinire degli alias di un host; in questo modo, ci comportiamo similmente a una risorsa A, pero` al posto dell'IPv4 ci mettiamo un altro hostname, il quale a sua volta dovra` prima o poi risolversi in un campo A. Questo serve ad esempio nel caso il nostro webserver abbia 1984 virtualhost che puntano sul suo ip: nel momento in cui ci vediamo costretti a cambiare ip al webserver, dovremmo aggiornare 1984 campi A probabilmente in 1984 file di configurazione diversa... Non un bel lavoro! In questo modo invece se noi definiamo i vhost con un CNAME su webserver, ci bastera` modificare l'IPv4 di quest'ultimo e automaticamente anche tutti gli altri verranno aggiornati =) L'unica limitazione e` che alcuni campi (come quelli NS o MX), non possono essere associati a un host definito da un CNAME, ma da un campo A. Giusto per tenerci in allenamento, vediamo come funziona il nostro software di invio mail quando cerchiamo di spedire una mail a bfi@s0ftpj.org . Per prima cosa cerchiamo chi e` il server di posta per il dominio s0ftpj.org, dopodiche` tenteremo di collegarci alla sua porta SMTP (25/tcp) e inviare una mail all'utente. [...] (saltiamo ancora la ricerca del namserver autoritativo per s0ftpj.org) [recidjvo@pkcrew.org:~]$ host -t MX s0ftpj.org NS1.ANDREAMONTI.NET. Using domain server: Name: NS1.ANDREAMONTI.NET Address: 151.39.115.130 Aliases: s0ftpj.org mail is handled (pri=100) by mail.olografix.org Il numero 100 che otteniamo e` la priorita` del mail exchanger, nel caso esistessero piu` server viene provato per primo quello con priorita` piu` bassa e via crescendo. L'opzione -v del comando host visualizza anche le informazioni relative all'host ritornato come risultato della query MX, ovvero un RR di tipo A su mail.olografix.org. Come vedete quindi, il server di posta non deve essere per forza con il dominio associato alle caselle che contiene, basta che sia definito come MX nel file di configurazione del dominio. Ci sono molti altri RR possibili, anche se non sono quasi mai usati. Diciamo che, come spiegato all'inizio, il sistema DNS non e` altro che un immenso database gerarchico distribuito, quindi possiamo usarlo per scambiare tantissimi tipi di informazione. Ma la domanda che ci sorge e`: vogliamo davvero usare tipi di risorse come le YellowPages per indicare quali sono le wellknown-service ports su una macchina? Le possibilita` di utilizzo sono tantissime, potete rifarvi agli rfc per conoscerle, ma quelle che potete trovare in giro sono quelle illustrate fino ad ora, ma davvero troveremo mai in giro un RR del tipo TELNET.TCP-port.Number.YP.? Spero di no, altrimenti vuol dire che ci sono davvero sistemisti che hanno meno idee di me su come passare il tempo in ufficio, eheheh =) 4. Implementazioni del protocollo Il protocollo DNS puo` venire implementato in due livelli: il primo, che e` quello piu` classico e che normalmente dobbiamo usare quando progettiamo del software di rete, e` l'utilizzo delle API per risolvere i nomi e poter cosi` creare connessioni tramite socket conoscendo non l'ip address, ma il FQDN degli endpoint. Principalemente le query DNS viaggiano su UDP, ma c'e` anche la possibilita` di avere delle risposte tramite query che utilizzano TCP, anche se i datagrammi sono preferiti nelle occasioni comuni. Principalemente ci sono due interfacce alla risoluzione dei nomi offerte per gli sviluppatori c, vediamole brevemente: 4.1. gethostbyname() gethostbyname(3): contiene principalmente gethostbyname(), gethostbyname2(), gethostbyaddr(), sethostent(), endhostent(). La prima funzione serve per risolvere gli host verso i loro IPv4 address, la gethostbyname2() permette di specificare anche la famiglia del risultato (ad esempio AF_INET6 per gli indirizzi IPv6), la gethostbyaddr() viene utilizzata per fare il reverse lookup, mentre la sethostent() e endhostent() servono per gestire le connessioni nel momento in cui si decida di forzare il protocollo TCP per l'interrogazione dei nameserver. Vediamo ora un esempio classico di procedura che, dato un host, restituisce il suo ip address, ma prima diamo un'occhiata al tipo di struttura ritornata da quasi tutte le funzioni precedenti, ovvero la struct hostent (dal file ): /* Description of data base entry for a single host. */ struct hostent { char *h_name; /* Official name of host. */ char **h_aliases; /* Alias list. */ int h_addrtype; /* Host address type. */ int h_length; /* Length of address. */ char **h_addr_list; /* List of addresses from name server. */ #define h_addr h_addr_list[0] /* Address, for backward compatibility. */ }; I campi che piu` ci stanno a cuore sono gli ultimi due, che tanto come vedete sono molto simili, in quanto l'ultimo e` solamente un define sul primo elemento della lista precedente. Quindi il nostro IPv4, se esistente, lo troveremo li`, ovviamente gia` in forma utilizzabile da una struttura in_addr e non nella forma dotted decimal :) Ecco qui il codice di una semplice procedura di risoluzione dei nomi, con la relativa chiamata per riempire il campo s_addr (la funzione e` una versione leggermente modificata di quella che uso di solito nei mie stupidi programmi, si potrebbe modificare per ottenere molte piu` informazioni e gestire in modo trasparente alla chiamata la risoluzione IPv6 o il riconoscimento di ip numerici che non necessitano di nessuna risoluzione, ma credo che sia meglio dividere gli ambiti per evitare confusioni). int resolv4(char *hostname, struct sockaddr_in *saddr) { struct hostent *host_data; // Query nameserver for hostname if((host_data = gethostbyname(hostname)) == NULL) { herror("resolv4"); return(-1); } // Fill the s_addr field memcpy(&saddr->sin_addr.s_addr, host_data->h_addr_list[0], host_data->h_length); return(0); } In questo esempio abbiamo inserito anche la funzione herror(), che serve ad avere informazioni riguardo all'eventuale errore che si e` verificato; potremmo ad esempio ottenere: resolv4: Host name lookup failure nel caso non fosse possibile ricavare l'ip. Una lista completa di questi comandi si trova nella manpage del comando gethostbyname(3). Siccome questa non vuole essere in nessun modo una guida sull'utilizzo delle API per i socket BSD, tralascero` l'invocazione, dato che mi sembra del tutto ovvia, o l'utilizzo della inet_addr(3) nel caso si passasse un ip in dotted decimal. Ricordate giusto che l'unico include aggiuntivo per queste funzioni di libreria e` . 4.2. getaddrinfo() L'utilizzo della getaddrinfo(3) serve per richiedere delle risoluzioni indipendentemente dal protocollo utilizzato, ritornando molte piu` informazioni della tradizionale gethostbyname(3), e oscurando in parte l'utilizzo della gethostbyname2(3) per la risoluzione di protocolli alternativi alla famiglia AF_INET. Personalmente ho usato con successo la getaddrinfo(3) per la risoluzione degli hostname appartenenti alla famiglia AF_INET6 (IPv6), quindi proporro` un esempio di risoluzione su tale traccia, lasciando al lettore curioso e intraprendente il compito di leggersi manpage e sorgenti per capire meglio come funziona il tutto (seee, non so se trovero` mai qualcuno con cosi` tanta buona volonta`, e soprattutto tempo da perdere =). Prima di poter chiamare la funzione bisogna inizializzare delle variabili da passare come parametri per una buona riuscita della risoluzione: entra quindi in gioco la struct addrinfo: vediamola. /* Structure to contain information about address of a service provider. */ struct addrinfo { int ai_flags; /* Input flags. */ int ai_family; /* Protocol family for socket. */ int ai_socktype; /* Socket type. */ int ai_protocol; /* Protocol for socket. */ int ai_addrlen; /* Length of socket address. */ struct sockaddr *ai_addr; /* Socket address for socket. */ char *ai_canonname; /* Canonical name for service location. */ struct addrinfo *ai_next; /* Pointer to next in list. */ }; Questo e` invece e` il prototipo della funzione getaddrinfo(3): int getaddrinfo(const char *nodename, const char *servname, const struct addrinfo *hints, struct addrinfo **res); nodename e` il nostro host da risolvere (da notare che in questo caso puo` essere anche un dotted decimal ip, ci pensa la funzione stessa a rendersene conto), servname lo inizializziamo a NULL, e poi riempiamo le due strutture addrinfo: la prima (hints) contiene una *maschera* rispetto alla quale verranno richieste le RR corrispondenti (possiamo forzare che l'ip sia IPv6 e non IPv4 ad esempio), mentre res e` una lista di risorse che ci vengono restituite dalla funzione. Vediamo ora un esempio, cosi' si capisce meglio; la seguente funzione riempie una struttura in6_addr con il risultato della risoluzione di un host verso il suo IPv6. int resolv6(char *hostname, struct sockaddr_in6 *saddr6) { struct addrinfo *iaddr = NULL, imatch; char *paddr; int ret; // Specify IPv6 request bzero(&imatch, sizeof(imatch)); imatch.ai_family = AF_INET6; // Get info if((ret = getaddrinfo(hostname, NULL, &imatch, &iaddr)) == 0) { paddr = (char *)malloc(iaddr->ai_addrlen); memcpy(paddr, iaddr->ai_addr, iaddr->ai_addrlen); freeaddrinfo(iaddr); // Fill the sin6_addr field memcpy(&saddr6->sin6_addr, &((struct sockaddr_in6 *)paddr)->sin6_addr, (size_t)sizeof(struct in6_addr)); free(paddr); return(0); } fprintf(stderr, "resolv6: %s\n", gai_strerror(ret)); return(-1); } Le uniche funzioni che non ho spiegato sono la freeaddrinfo(3), che non fa altro che liberare le risorse delle strutture allocate dalla getaddrinfo(3), e la gai_strerror(3) che aiuta la comprensione degli eventuali errori che si verificano durante la procedura. 5. Struttura di un pacchetto DNS (utilizzando il protocollo UDP) Le interfacce API forniscono un buon livello di flessibilita` per quello che riguarda la programmazione comune, ma come e` strutturato un pacchetto DNS nel suo profondo? Visto che oramai ci siamo vediamo un po' in dettaglio i campi che compongono la sua struttura e come sia possibile attraverso l'utilizzo dei socket di tipo SOCK_RAW creare query e answer DNS compatibili con lo standard prescritto. A questo punto, nonostante abbia perso un paio di mesi a studiarlo e a cercare di scrivere un programma che funzionasse (e che se faccio a tempo e non esce proprio una pirlata, scusate tanto la parolaccia, troverete prima o poi in giro), mi armo dello Stevens (per chi non lo conoscesse, e` il famoso TCP/IP Illustrated che trovate in fondo nelle references) e iniziamo... uhm, ehm, err... si` asynchro lo so che e` tuo e sono mesi che dovrei restituirtelo, ma e` cosi` bello che non voglio separarmene =) Dai, pazienta ancora poco che non so come ma ho convinto il braccine corte del mio capo a finanziarmi l'acquisto di un po' di materiale cartaceo... speriamo che non cambi idea, eheheh... ^_^; a proposito, non e` che avresti anche il volume 2 da prestarmi? :D La struttura del pacchetto DNS e` ovviamente composta dai due header standard (quello IP e quello UDP, ma e` anche fornito di un suo header particolare, che possiamo trovare nel file di include e si chiama, tanto per essere originali e univoci, HEADER. Eccolo qui come si presenta nella sua struttura standard (BYTE_ORDER == BIG_ENDIAN): typedef struct { unsigned id :16; /* query identification number */ /* fields in third byte */ unsigned qr: 1; /* response flag */ unsigned opcode: 4; /* purpose of message */ unsigned aa: 1; /* authoritative answer */ unsigned tc: 1; /* truncated message */ unsigned rd: 1; /* recursion desired */ /* fields in fourth byte */ unsigned ra: 1; /* recursion available */ unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */ unsigned ad: 1; /* authentic data from named */ unsigned cd: 1; /* checking disabled by resolver */ unsigned rcode :4; /* response code */ /* remaining bytes */ unsigned qdcount :16; /* number of question entries */ unsigned ancount :16; /* number of answer entries */ unsigned nscount :16; /* number of authority entries */ unsigned arcount :16; /* number of resource entries */ } HEADER; (Per chi non fosse molto pratico di c, i membri della struct possono avere dimensioni predefinite con precisione di bit, specificate dopo i ':', quindi unsigned id :16 significa che il campo id e` un intero senza segno di dimensioni 16 bit -> 2 byte). Come si nota subito la struct si puo` dividere in sei sottozone di 16 bit ciascuna, per un totale di 12 byte; la prima e` l'id, ovvero un numero casuale che identifica il codice della transazione per impedire promiscuita` con altre richieste fatte contemporaneamente (e soprattutto per difendersi da un blind spoofing, che nel caso del protocollo UDP e` facilitato in mancanza del seq tipico del protocollo TCP). La seconda coppia di byte e` quella delle flags: la analizzeremo meglio in seguito. Le altre quattro sono destinate a contenere il numero di domande contenute in una query, le risposte ritornate nel caso il datagramma sia una risposta, quante di queste sono autoritative (ovvero il server e` perlomeno convinto di gestirle lui), e il numero di risorse aggiuntive presenti. Graficamente l'header del DNS risulta circa cosi`: 0 15 16 31 |------------------------------|------------------------------| | ID | flags | |------------------------------|------------------------------| | numero delle richieste | numero delle risposte | |------------------------------|------------------------------| | numero delle autoritative | numero delle addizzionali | |------------------------------|------------------------------| Vediamo ora i due byte delle flags come sono suddivisi: 0 15 |----|----------------|----|----|----|----|------------|----------------| | QR | opcode | AA | TC | RD | RA | zero | rcode | |----|----------------|----|----|----|----|------------|----------------| 1 4 1 1 1 1 3 4 QR: impostato a 0 per le query, a 1 per le risposte opcode: generalmente 0 (standard query) o 1 (inversa) AA: se impostato a 1 dichiara l'autoritativita` della risposta TC: risposta troncata (superiore ai 512 byte UDP) RD: richiesta di una query ricorsiva (se posto a 0 e` iterativa) RA: se a 1 il server supporta le query ricorsive zero: bit impostati a 0 (non sono utilizzati) rcode: return code (0 significa nessun errore) Appena dopo l'header del pacchetto DNS troviamo le risorse vere e proprie, che nel caso di una query conterranno i dati per i quali si richiede l'intervento del nameserver, o, nel caso di risposta, ci troveremo i valori ricercati dal client. Ecco come si presenta la richesta di una query. In testa alla RR troviamo il nome della risorsa richiesta, codificata nel seguente modo: ogni livello del dominio richiesto e` preceduto dal numero dei byte rappresentativi della sua lunghezza, e sono aboliti i punti; il tutto e` terminato da uno 0. Nel caso la query sia molto lunga, e` possibile ricorrere a uno schema di compressione, che pero` non verra` analizzato in questo documento. Vediamo un esempio che e` meglio, eh? =) Ecco come verrebbe trasformato bradipo.cds.lan.pkcrew.org: b r a d i p o . c d s . l a n . p k c r e w .o r g 7 b r a d i p o 3 c d s 3 l a n 6 p k c r e w 3 o r g 0 Ovviamente i numeri non sono intesi come carattere ASCII corrispondente, ma come valore effettivo. Appena dopo troviamo altri dati riguardanti la richiesta: 2 byte di query type (i valori riportati nel capitolo 3), e altri 2 byte di query class (IN, CHAOS, ecc...). Si complica invece un po' la storia quando si parla di risposte. Ecco come appaiono: all'inizio riportano la query a cui stanno rispondendo, dopo 2 byte di TTL (quanto tempo rimarra` in cache la risposta), 1 byte indicante la lunghezza della risposta, e infine la risposta vera e propria (ad esempio quattro byte per una richiesta di risoluzione IPv4). Questo e` quanto. 6. Software di analisi DNS (la pappa e` prontaaa) Per chi non avesse voglia di scriversi il suo client di interrogazione dei nameserver (eheheh vorrei ben vedere...), introduciamo ora veramente in modo superficiale (leggetevi le pagine man, fate prima =) due dei piu` comuni strumenti, utilissimi in molti casi: host(1) e dig(1). Ci sono anche altri tool, come ad esempio dnsquery(1) e nslookup(8) (il primo e` stato il mio *primo* tool di analisi DNS, bei ricordi :~~~ - il secondo a mio avviso e` brutto, ma brutto brutto!!! =) 6.1. host Questo e` un ottimo strumento, e l'ho preferito di gran lunga ad altri (come ad esempio nslookup, che si trova anche sotto WinNT4 e 5): attualmente lo uso per soddisfare tutti i miei bisogni (non pensate male, intendo i bisogni riguardanti il protocollo :P). Vediamo ora la sintassi con i principali parametri: host [-t ] [-c ] domain [nameserver] Il parametro -t, che abbiamo visto anche prima, serve per definire il tipo di RR che desideriamo (A, NS, ecc...), mentre il -c e` veramente poco usato (l'unica volta che l'ho usato e` stato giusto ora per provarlo :), perche` le classi di richiesta sono sempre di tipo IN, e l'unico vero bisogno di un utente comune al di fuori di questa classe e` sapere la versione del server, per la quale normalmente uso dig(1). Una feature carina di host(1) e` che se gli viene passato come indirizzo un ip esegue automaticamente il reverse lookup, senza perdere tempo a reversare i byte e aggiungerci in fondo il dominio, in-addr.arpa. o ip6.int. che sia. Il dominio e` quello che dobbiamo risolvere, eventualmente chiuso dal ., per evitare che si faccia path searching. Infatti se non viene specificato un nameserver al quale fare la richiesta, host analizza il file /etc/resolv.conf, leggendo li` i nomi dei DNS server, o servendosi del file /etc/hosts nel caso ci sia un'entry corrispondente; nel file /etc/resolv.conf puo` essere specificata anche una riga search, seguita da uno o piu` domini, che viene utilizzata per *combinare* il dominio passato come parametro a host, aggiungendoci in fondo i domini specificati dal file e provando a risolverli. Questo e` fatto perche`, ad esempio in una grossa lan dove le macchine si chiamano recidjvo.salalettura.lan.pkcrew.org., cyrax.saladroga.lan.pkcrew.org., specificando lan.pkcrew.org. sara` sufficiente usare recidjvo.salalettura o cyrax.saladroga (notare l'omissione del punto finale) per ricevere la risposta voluta. Un altro parametro molto comodo e` il -v, che permette un output molto piu` esauriente e fornisce gli ip degli indirizzi contenuti nelle risposte. Piu` tardi quando parleremo di zone transfer analizzeremo i parametri -a (equivalente a -t ANY, e -l). 6.2. dig dig(1), a essere sincero, lo uso solo in due occasioni, ovvero scoprire le versioni dei server DNS (ad esempio per controllare di aver modificato il reply), e per trovare gli indirizzi dei root-servers. Come strumento di interrogazione e` sicuramente un po' piu` approfondito di host(1), pero` a meno che non ci vogliamo proprio impuntare, non vale la pena di usarlo; il funzionamento e` molto simile, e di default visualizza ad esempio informazioni sugli header della risposta (ottenibile comunque anche con la flag -d di host(1)). Direi che visto il fatto che non sto a fare una manpage per questi comandi, scrivero` solo le due sintassi: dig (per la lista dei root-servers) dig version.bind chaos txt @nameserver (per ottenere la versione) Giusto per far capire, le righe sopra sono equivalenti a: host -t NS . -v -d host -t TXT -c CHAOS version.bind localhost -v -d Entrambi i pacchetti li trovate nel bind distribuito dalla ISC all'url http://www.isc.org/. 7. DNS e Whois Bene bene bene :) Questa in teoria dovrebbe essere la parte piu` divertente, anche perche` in fin dei conti chi se ne sbatte di saper forgiare un pacchetto DNS? (purtroppo devo rispondere "IO!", ma questo per colpa della mia insanita` mentale...), ovvero quella che riguarda la ricerca di informazioni su un determinato nodo della nostra mamma rete: ad esempio vogliamo sapere chi e` lo $*@`#?=* che ha osato farci un portscan, oppure vogliamo sapere chi c'e` dietro a un determinato sito che appreziamo tanto (ehhh, chissa` come mai, ma una mezza idea su quale sia ce l'ho :). Bene. Armiamoci di buona volonta` e iniziamo a fare le nostre belle ricerchine. Per fare cio` ci torna molto utile il protocollo DNS, anche perche` spesso questi *nodi* sono identificati da un ip, opure un hostname, da un dominio di posta... Insomma da qualcosa che sia riconducibile al nostro bel database distribuito. Un altro protocollo che in questi casi ci e` davvero molto utile e` quello Whois, che si avvicina molto al mondo del DNS: esso contiene tutte le informazioni riguardanti la registrazione dei domini e dei server DNS, quindi questi due strumenti uniti possono rivelarsi un buon inizio per avere le idee un po' piu` chiare su cosa stiamo cercando. Il server Whois, a differenza del server DNS, contiene anche informazioni su persone e luoghi, numeri di telefono e email, quindi permette un'analisi approfondita del nostro target. Facciamo un esempio pratico di Whois: cambiamo un po', anche perche` oramai l'admin di pornvalley.com ci odiera` a morte per tutto quello che abbiamo detto su di lui :) Uhm, pero` per mantenere viva l'attenzione spostiamoci su... whitehouse.com (.com mi raccomando, .gov e` quello della Casa Bianca e quelli sono cattiiivi =). Allora, primo passo: chiediamo al nostro server Whois di fiducia informazioni per il dominio whitehouse.com, che, essendo registrato, dovra` fornirci le informazioni che ci servono. [recidjvo@pkcrew:~]$ whois whitehouse.com -h rs.internic.net Whois Server Version 1.3 Domain names in the .com, .net, and .org domains can now be registered with many different competing registrars. Go to http://www.internic.net for detailed information. Domain Name: WHITEHOUSE.COM Registrar: REGISTER.COM, INC. Whois Server: whois.register.com Referral URL: www.register.com Name Server: NS.NJ.EXODUS.NET Name Server: NS2.EXODUS.NET Name Server: W101.WHITEHOUSE.COM Name Server: W102.WHITEHOUSE.COM Updated Date: 16-feb-2001 >>> Last update of whois database: Tue, 1 May 2001 11:46:32 EDT <<< The Registry database contains ONLY .COM, .NET, .ORG, .EDU domains and Registrars. Non molte informazioni, eh? :( Vabbe`, pero` in questo modo gia` conosciamo i nameserver, e per di piu` abbiamo il nome del server Whois presso il quale e` stato registrato il dominio. Proviamo a interrogare questo: [recidjvo@pkcrew:~]$ whois whitehouse.com -h whois.register.com [...] Organization: Dan Parisi Dan Parisi 295 Greenwich Street (Suite 184) New York, NY 10007 US Phone: (973) 503 1785 Email: dparisi@garden.net Registrar Name....: Register.com Registrar Whois...: whois.register.com Registrar Homepage: http://www.register.com Domain Name: WHITEHOUSE.COM Created on..............: Wed, May 21, 1997 Expires on..............: Sat, May 22, 2004 Record last updated on..: Fri, Feb 23, 2001 Administrative Contact: Dan Parisi Dan Parisi 295 Greenwich Street (Suite 184) New York, NY 10007 US Phone: (973) 503 1785 Email: dparisi@garden.net Technical Contact: Dan Parisi Dan Parisi 295 Greenwich Street (Suite 184) New York, NY 10007 US Phone: (973) 503 1785 Email: dparisi@garden.net Zone Contact: Dan Parisi Dan Parisi 295 Greenwich Street (Suite 184) New York, NY 10007 US Phone: (973) 503 1785 Email: dparisi@garden.net Domain servers in listed order: W101.WHITEHOUSE.COM 209.67.27.247 W102.WHITEHOUSE.COM 209.67.27.248 NS2.EXODUS.NET 207.82.198.150 NS.NJ.EXODUS.NET 206.79.7.50 Bene, gia` meglio =) Ora abbiamo i dati personali delle persone responsabili, un'inizio di idea di che locazione geografica dobbiamo dare al progetto e altri due domini da aggiungere alla lista: exodus.net e garden.net. Vediamo il server DNS che cosa ci dice... [recidjvo@pkcrew:~]$ host -a whitehouse.com. W101.whitehouse.com. Using domain server: Name: W101.whitehouse.com Address: 209.67.27.247 Aliases: rcode = 0 (Success), ancount=13 The following answer is not authoritative: The following answer is not verified as authentic by the server: whitehouse.com 71136 IN NS ns.nj.exodus.net whitehouse.com 71136 IN NS ns2.nj.exodus.net whitehouse.com 71136 IN NS w101.whitehouse.com whitehouse.com 71136 IN NS w102.whitehouse.com whitehouse.com 71136 IN NS web3.whitehouse.com whitehouse.com 71136 IN NS web4.whitehouse.com whitehouse.com 71136 IN NS prd4.wynn.com whitehouse.com 71136 IN NS wa3yre.wynn.com whitehouse.com 71136 IN NS ns.exodus.net whitehouse.com 77935 IN SOA w101.whitehouse.com root.w101.whitehouse.com( 1999012728 ;serial (version) 10800 ;refresh period 3600 ;retry refresh this often 604800 ;expiration period 86400 ;minimum TTL ) whitehouse.com 74737 IN MX 10 mail.whitehouse.com whitehouse.com 71136 IN NS ns2.exodus.net whitehouse.com 65204 IN A 209.67.27.247 For authoritative answers, see: whitehouse.com 71136 IN NS ns.nj.exodus.net whitehouse.com 71136 IN NS ns2.nj.exodus.net whitehouse.com 71136 IN NS w101.whitehouse.com whitehouse.com 71136 IN NS w102.whitehouse.com whitehouse.com 71136 IN NS web3.whitehouse.com whitehouse.com 71136 IN NS web4.whitehouse.com whitehouse.com 71136 IN NS prd4.wynn.com whitehouse.com 71136 IN NS wa3yre.wynn.com whitehouse.com 71136 IN NS ns.exodus.net whitehouse.com 71136 IN NS ns2.exodus.net Additional information: ns.nj.exodus.net 32642 IN A 206.79.7.50 ns2.nj.exodus.net 32642 IN A 209.1.10.234 Bene, direi che non c'e` molto di piu` di quello che gia` sapevamo... La prossima mossa e`, sempre usando il protocollo Whois, cercare di ottenere maggiori informazioni sul responsabile (Dan Parisi). [recidjvo@pkcrew.org:~]$ whois -h whois.networksolutions.com dparisi@garden.net [...] Parisi, Dan (DP996) dparisi@GARDEN.NET Dan Parisi Post Office Box 1009 Secaucus, NJ 07094 973-503-1785 Record last updated on 24-May-1999. Database last updated on 1-May-2001 21:20:00 EDT. [...] Ho usato whois.networksolutions.com come server Whois perche` per quanto riguarda la ricerca dei contatti non sempre sono ammesse query ricorsive, e qui si trova molta piu` roba che in altri server :) Ogni DNS server deve avere una registrazione (HOST Handle) per poter essere utilizzato: vediamola =) [recidjvo@pkcrew:~]$ whois W101.WHITEHOUSE.COM [...] Server Name: W101.WHITEHOUSE.COM IP Address: 209.67.27.247 Registrar: REGISTER.COM, INC. Whois Server: whois.register.com Referral URL: www.register.com [...] E cosi` per gli altri server. Ma se per caso ci fosse un PTR per questi server che non corrisponde con l'host segnato nella registrazione? Controlliamo!!! =) [recidjvo@pkcrew:~]$ host 209.67.27.247 247.27.67.209.IN-ADDR.ARPA domain name pointer www.whitehouse.com Wow, il server DNS corrisponde al server web! =) Ripetiamo tutto questo procedimento per tutti gli altri appunti che abbiamo nella nostra tabellina, e riempiamo fogli e fogli di informazioni =) Di certo ora abbiamo molte piu` informazioni, ma ci bastano? NOOO!!! (chi dice "SIII" e` solo che non vede l'ora di vedersi le donnine nude, eh, vecchio porcellone? =) Visto che il nostro traceroute oltre a tracciare, se non gli si specifica l'opzione -n cerca anche di risolvere gli ip in hostname, vediamo da che linee passa il nostro percorso. [recidjvo@pkcrew:~]$ traceroute whitehouse.com [... skip dei primi HOP, la mia rete =) ...] 6 * Serial3-1-0.GW3.MLN4.ALTER.NET (146.188.38.137) 150.516 ms 192.999 ms 7 323.at-2-0-0.XR1.MLN4.Alter.Net (146.188.4.226) 215.669 ms 170.289 ms 183.82 ms 8 95.at-3-0-0.TR1.PAR2.Alter.Net (146.188.5.17) 226.501 ms 217.036 ms 207.106 ms 9 SO-6-0-0.TR1.LND9.Alter.Net (146.188.8.166) 191.53 ms * 250.536 ms 10 so-6-0-0.IR1.NYC12.Alter.Net (146.188.15.50) 292.398 ms 281.089 ms 287.598 ms 11 so-0-0-0.IR1.NYC9.ALTER.NET (152.63.23.57) 255.314 ms 312.739 ms 322.168 ms 12 119.at-5-0-0.TR1.NYC9.ALTER.NET (152.63.1.114) 317.851 ms 313.32 ms 351.918 ms 13 * 187.ATM5-0.XR1.NYC4.ALTER.NET (152.63.21.121) 315.974 ms 372.969 ms 14 189.ATM6-0.GW3.NYC4.ALTER.NET (152.63.24.141) 333.965 ms 320.045 ms 337.12 ms 15 exodus-nyc4-oc12-gw.customer.alter.net (157.130.60.98) 334.771 ms 300.338 ms 303.457 ms 16 dcr03-g4-0.jrcy01.exodus.net (216.32.223.99) 291.824 ms * 332.755 ms 17 rsm01-vlan990.jrcy01.exodus.net (216.32.222.170) 344.35 ms 281.031 ms 301.97 ms 18 www.whitehouse.com (209.67.27.247) 302.995 ms 316.483 ms 326.041 ms Direi che questo tracciato si commenta da se =) Ancora qualcosina dai... prima della grande sorpresa finale =) Vediamo chi gestisce la zona di reverse: [recidjvo@pkcrew:~]$ host -t NS 27.67.209.in-addr.arpa. 27.67.209.in-addr.arpa name server ns.exodus.net 27.67.209.in-addr.arpa name server ns2.exodus.net [recidjvo@pkcrew:~]$ host -t NS 67.209.in-addr.arpa. 67.209.in-addr.arpa name server NS.EXODUS.NET 67.209.in-addr.arpa name server NS2.EXODUS.NET Ok, rimane solo un'ultima cosa da fare, che e` anche abbastanza divertente se ci riesce :) Quando prima parlavamo delle varie query che si possono fare, ho accennato brevemente alla AXFR, ovvero alla richiesta che di solito fa un nameserver posto in slave per scaricare *completamente* la zona dal nameserver principale. Il problema di questo trasferimento e` che se non specificato altrimenti, il namserver e` impostato per accettare a autorizzare trasferimenti di zona da *chiunque* glielo chieda =) Quindi rischiamo di avere la mappa completa del dominio che ci interessa (ripeto, anche se potrebbe essere un'incompetenza dell'admin - cosa che di solito e` ^__^ - non e` illegale - o almeno spero, bhuabuabbhuabhu :) Per fare cio` chiamiamo il comando host(1) con i parametri -a -l e vediamo se qualcuno dei nameserver autoritativi ci danno retta =) Se lo facciamo su pornvalley.com (siii, mitica ritorna =), otteniamo il seguente risultato: [recidjvo@pkcrew:~]$ host -a -l pornvalley.com rcode = 0 (Success), ancount=4 Found 1 addresses for NS2.MYDOMAIN.com Found 1 addresses for NS3.MYDOMAIN.com Found 1 addresses for NS4.MYDOMAIN.com Found 1 addresses for NS1.MYDOMAIN.com Trying 64.75.34.132 (Nada, qui l'admin si e` ricordato =) Vediamo invece su whitehouse.com... [recidjvo@pkcrew:~]$ host -v -a -l whitehouse.com rcode = 0 (Success), ancount=10 Found 1 addresses for web3.whitehouse.com Found 1 addresses for web4.whitehouse.com Found 1 addresses for prd4.wynn.com Found 1 addresses for wa3yre.wynn.com Found 1 addresses for ns.exodus.net Found 1 addresses for ns2.exodus.net Found 1 addresses for ns.nj.exodus.net Found 1 addresses for ns2.nj.exodus.net Trying 209.67.3.103 Connection failed, trying next server: No route to host Trying 209.67.3.104 whitehouse.com 86400 IN SOA w101.whitehouse.com root.w101.whitehouse.com( 1999012728 ;serial (version) 10800 ;refresh period 3600 ;retry refresh this often 604800 ;expiration period 86400 ;minimum TTL ) whitehouse.com 86400 IN NS ns.exodus.net whitehouse.com 86400 IN NS ns2.exodus.net whitehouse.com 86400 IN NS ns.nj.exodus.net whitehouse.com 86400 IN NS ns2.nj.exodus.net whitehouse.com 86400 IN NS w101.whitehouse.com whitehouse.com 86400 IN NS w102.whitehouse.com whitehouse.com 86400 IN NS web3.whitehouse.com whitehouse.com 86400 IN NS web4.whitehouse.com whitehouse.com 86400 IN NS prd4.wynn.com whitehouse.com 86400 IN NS wa3yre.wynn.com whitehouse.com 86400 IN MX 10 mail.whitehouse.com whitehouse.com 86400 IN A 209.67.27.247 chatzone.whitehouse.com 86400 IN CNAME chat.whitehouse.com sexchannel.whitehouse.com 86400 IN A 216.182.48.76 cash.whitehouse.com 86400 IN A 209.67.3.123 webmail.whitehouse.com 86400 IN A 209.67.27.245 webmail.whitehouse.com 86400 IN MX 10 webmail.whitehouse.com netmail.whitehouse.com 86400 IN CNAME mail.whitehouse.com members3.whitehouse.com 86400 IN A 209.67.3.116 realserv.whitehouse.com 86400 IN CNAME sexchannel.whitehouse.com mail.whitehouse.com 86400 IN MX 10 mail.whitehouse.com mail.whitehouse.com 86400 IN A 209.67.27.246 localhost.whitehouse.com 86400 IN A 127.0.0.1 signup.whitehouse.com 86400 IN MX 10 mail.whitehouse.com signup.whitehouse.com 86400 IN A 209.67.3.120 www.whitehouse.com 86400 IN A 209.67.27.247 w101.whitehouse.com 86400 IN A 209.67.3.101 web1.whitehouse.com 86400 IN A 209.67.3.101 store.whitehouse.com 86400 IN A 216.182.48.81 chat.whitehouse.com 86400 IN MX 10 mail.whitehouse.com chat.whitehouse.com 86400 IN A 209.67.27.249 w102.whitehouse.com 86400 IN MX 10 mail.whitehouse.com w102.whitehouse.com 86400 IN A 209.67.3.102 web3.whitehouse.com 86400 IN A 209.67.3.103 members.whitehouse.com 86400 IN MX 10 mail.whitehouse.com members.whitehouse.com 86400 IN A 209.67.3.122 members.whitehouse.com 86400 IN A 209.67.3.121 web4.whitehouse.com 86400 IN A 209.67.3.104 signup1.whitehouse.com 86400 IN MX 10 mail.whitehouse.com signup1.whitehouse.com 86400 IN A 209.67.3.123 ftp.whitehouse.com 86400 IN CNAME w101.whitehouse.com whitehouse.com 86400 IN SOA w101.whitehouse.com root.w101.whitehouse.com( 1999012728 ;serial (version) 10800 ;refresh period 3600 ;retry refresh this often 604800 ;expiration period 86400 ;minimum TTL ) BINGOOOOOOOOO!!!!!!!!! =) Stupidi stupidi STUPIDI admin :D E da qui la fantasia prende piede, se applicate ricorsivamente la procedura a tutte le info che avete diligentemente annotato nel vostro blocco, ottenete davvero tante di quelle informazioni sulla struttura della rete da conoscerla forse meglio dell'admin stesso, e tutto questo solo con host(1) e whois(1) =)) Ora capite come si possa trovare da passare il tempo quando la serata e` piovosa, quando il capo ti costringe a stare in ufficio anche se non ne hai punto voglia e fuori c'e` pure il sole, ma al parco dalla fanciulla che tanto lo sguardo fuggi in preda al rossore non ci puoi andare, ne` tantomeno girare in bicicletta spensierato ragionando sul senso della vita e sulla bellezza che ci circonda, tu, unico, raro essere incompreso da chi vorresti ti potesse amare, tu, pazzo sentimentalista che la gente addita come un tipo strano a dir poco, tu, che scrivi per poter trasmettere al mondo cio` che reputi importante e non vale la pena di tenerlo per te, tu che scrivi... oh, tu che scrivi! OHHH!!! Si`, tu che scrivi, MA CHE CACCHIO STAI SCRIVENDO?!?!?! =) Non sono impazzito, e` solo che voglio far vedere che in mezzo a tutte ste schifezze che scrivo si risolleva a volte il mio animo di poeta :P - MA VAFF...!!! :) (mannaggia se sto male =) 8. Future Come sicuramente non mi stanchero` mai di dire, il mondo di internet e` in continua evoluzione e quindi ogni giorno bisogna aspettarsi qualcosa di nuovo che fa capolino all'orizzonte. Tutta la comunita` spinge per migliorare sempre di piu` la situazione, introdurre sistemi piu` sicuri e dare piu` possibilita` alla gente. Vediamo ora brevemente aspetti che ancora non sono di uso comune, ma che presto lo diventeranno, integrandosi in questo modo di gestione della immense risorse della rete che sta prendendo sempre piu` piede a livello di utenza mondiale. 8.1. Nuovi organismi e TLD Di recente son stati proposti e approvati dei nuovi TLD che la ICANN ha accettato e che diventeranno standard tra poco. Personalemente l'introduzione di nuovi domini di primo livello non mi aggrada molto, perche` purtroppo ci sara` la corsa dei soliti sciacalli per registrare i nomi fino ad oggi considerati irraggiungibili. Tornando sul piano tecnico, ecco i sette nuovi TLD con relativa short: .aero - Compagnie di trasporto aereo .biz - Societa` di commercio .coop - Cooperative .info - Uso arbitrario .museum - Musei .name - Per usi personali .pro - Professionisti (ragionieri, avvocati, ...) Molti altri domini erano stati sottoposti per l'approvazione, ma sono stati bocciati. La speranza comune e` che la gente dimostri un po' di civilta` con la comparsa dei nuovi domini, ma non so perche` non sono molto fiducioso =) Per informazioni piu` dettagliate potete riferirvi alle pagine della ICANN all'url www.icann.org/tlds . 8.2. Futuro del protocollo Non mi stanchero` mai di ripeterlo, Internet non e` certo finito qui e ogni giorno qualcuno aggiunge qualcosa. Per quanto ci riguarda, il protocollo DNS, pur apparendo stabile e consolidato, e` in continua evoluzione, specialmente per quanto riguarda la sicurezza: ad esempio l'introduzione delle TSIG per autenticare una determinata risposta, utilizzando algoritmi di crittazione che stanno rivestendo la parte del leone in questo periodo :) Anche l'utilizzo che se ne puo` fare, come dimostrato dalle datate rfc sull'utilizzo dei campi TXT o sulle YellowPages ci fa capire che studiando a fondo la struttura di cio` che utiliziamo tutti i giorni e` possibile inventare sempre qualcosa di diverso, insomma, un po' di fantasia =) Le recenti modifiche introdotte dall'ICANN, le lamentele per la gestione dei domini .name da parte di societa` non consolidate, da una parte sembrano lecite, dall'altro ci permettono di vedere come non ci sia il monopolio chiuso, ma che si puo` sempre sperare in una collaborazione finalizzata al bene comune. Quindi, vada come vada, l'importante e` sviluppare qualcosa di utile e, voglia il Cielo, sperare che chi mantiene l'enorme potere dei domini sappia amministrarlo bene. 9. Resources Queste sono solo *alcune* delle cose che ci sono in giro riguardanti i DNS, sono tutte piu` o meno interessanti, mi raccomando leggetele, cosi` magari capite qualcosa di piu` =) 9.1. RFCs 0819 Domain naming convention for Internet user applications. Z. Su, J. Postel. Aug-01-1982. (Format: TXT=35314 bytes) (Status: UNKNOWN) 0881 Domain names plan and schedule. J. Postel. Nov-01-1983. (Format: TXT=23490 bytes) (Updated by RFC0897) (Status: UNKNOWN) 0897 Domain name system implementation schedule. J. Postel. Feb-01-1984. (Format: TXT=15683 bytes) (Updates RFC0881) (Updated by RFC0921) (Status: UNKNOWN) 0920 Domain requirements. J. Postel, J.K. Reynolds. Oct-01-1984. (Format: TXT=27823 bytes) (Status: UNKNOWN) 0921 Domain name system implementation schedule - revised. J. Postel. Oct-01-1984. (Format: TXT=23318 bytes) (Updates RFC0897) (Status: UNKNOWN) 0952 DoD Internet host table specification. K. Harrenstien, M.K. Stahl, E.J. Feinler. Oct-01-1985. (Format: TXT=12388 bytes) (Obsoletes RFC0810) (Status: UNKNOWN) 0974 Mail routing and the domain system. C. Partridge. Jan-01-1986. (Format: TXT=18581 bytes) (Also STD0014) (Status: STANDARD) 1032 Domain administrators guide. M.K. Stahl. Nov-01-1987. (Format: TXT=29454 bytes) (Status: UNKNOWN) 1033 Domain administrators operations guide. M. Lottor. Nov-01-1987. (Format: TXT=37263 bytes) (Status: UNKNOWN) 1034 Domain names - concepts and facilities. P.V. Mockapetris. Nov-01-1987. (Format: TXT=129180 bytes) (Obsoletes RFC0973, RFC0882, RFC0883) (Obsoleted by RFC1065, RFC2308) (Updated by RFC1101, RFC1183, RFC1348, RFC1876, RFC1982, RFC2065, RFC2181, RFC2308, RFC2535) (Also STD0013) (Status: STANDARD) 1035 Domain names - implementation and specification. P.V. Mockapetris. Nov-01-1987. (Format: TXT=125626 bytes) (Obsoletes RFC0973, RFC0882, RFC0883) (Updated by RFC1101, RFC1183, RFC1348, RFC1876, RFC1982, RFC1995, RFC1996, RFC2065, RFC2181, RFC2136, RFC2137, RFC2308, RFC2535) (Also STD0013) (Status: STANDARD) 1101 DNS encoding of network names and other types. P.V. Mockapetris. Apr-01-1989. (Format: TXT=28677 bytes) (Updates RFC1034, RFC1035) (Status: UNKNOWN) 1122 Requirements for Internet hosts - communication layers. R.T. Braden. Oct-01-1989. (Format: TXT=295992 bytes) (Also STD0003) (Status: STANDARD) 1123 Requirements for Internet hosts - application and support. R.T. Braden. Oct-01-1989. (Format: TXT=245503 bytes) (Updates RFC0822) (Updated by RFC2181) (Also STD0003) (Status: STANDARD) 1178 Choosing a name for your computer. D. Libes. Aug-01-1990. (Format: TXT=18472 bytes) (Also FYI0005) (Status: INFORMATIONAL) 1183 New DNS RR Definitions. C.F. Everhart, L.A. Mamakos, R. Ullmann, P.V. Mockapetris. Oct-01-1990. (Format: TXT=23788 bytes) (Updates RFC1034, RFC1035) (Status: EXPERIMENTAL) 1464 Using the Domain Name System To Store Arbitrary String Attributes. R. Rosenbaum. May 1993. (Format: TXT=7953 bytes) (Status: EXPERIMENTAL) 1480 The US Domain. A. Cooper, J. Postel. June 1993. (Format: TXT=100556 bytes) (Obsoletes RFC1386) (Status: INFORMATIONAL) 1535 A Security Problem and Proposed Correction With Widely Deployed DNS Software. E. Gavron. October 1993. (Format: TXT=9722 bytes) (Status: INFORMATIONAL) 1536 Common DNS Implementation Errors and Suggested Fixes. A. Kumar, J. Postel, C. Neuman, P. Danzig, S. Miller. October 1993. (Format: TXT=25476 bytes) (Status: INFORMATIONAL) 1591 Domain Name System Structure and Delegation. J. Postel. March 1994. (Format: TXT=16481 bytes) (Status: INFORMATIONAL) 1611 DNS Server MIB Extensions. R. Austein, J. Saperia. May 1994. (Format: TXT=58700 bytes) (Status: PROPOSED STANDARD) 1612 DNS Resolver MIB Extensions. R. Austein, J. Saperia. May 1994. (Format: TXT=61382 bytes) (Status: PROPOSED STANDARD) 1706 DNS NSAP Resource Records. B. Manning, R. Colella. October 1994. (Format: TXT=19721 bytes) (Obsoletes RFC1637) (Status: INFORMATIONAL) 1713 Tools for DNS debugging. A. Romao. November 1994. (Format: TXT=33500 bytes) (Also FYI0027) (Status: INFORMATIONAL) 1794 DNS Support for Load Balancing. T. Brisco. April 1995. (Format: TXT=15494 bytes) (Status: INFORMATIONAL) 1876 A Means for Expressing Location Information in the Domain Name System. C. Davis, P. Vixie, T. Goodwin, I. Dickinson. January 1996. (Format: TXT=29631 bytes) (Updates RFC1034, RFC1035) (Status: EXPERIMENTAL) 1886 DNS Extensions to support IP version 6. S. Thomson, C. Huitema. December 1995. (Format: TXT=6424 bytes) (Status: PROPOSED STANDARD) 1912 Common DNS Operational and Configuration Errors. D. Barr. February 1996. (Format: TXT=38252 bytes) (Obsoletes RFC1537) (Status: INFORMATIONAL) 1918 Address Allocation for Private Internets. Y. Rekhter, B. Moskowitz, D. Karrenberg, G. J. de Groot & E. Lear. February 1996. (Format: TXT=22270 bytes) (Obsoletes RFC1627, RFC1597) (Also BCP0005) (Status: BEST CURRENT PRACTICE) 1956 Registration in the MIL Domain. D. Engebretson & R. Plzak. June 1996. (Format: TXT=2923 bytes) (Status: INFORMATIONAL) 1982 Serial Number Arithmetic. R. Elz & R. Bush. August 1996. (Format: TXT=14440 bytes) (Updates RFC1034, RFC1035) (Status: PROPOSED STANDARD) 1995 Incremental Zone Transfer in DNS. M. Ohta. August 1996. (Format: TXT=16810 bytes) (Updates RFC1035) (Status: PROPOSED STANDARD) 1996 A Mechanism for Prompt Notification of Zone Changes (DNS NOTIFY). P. Vixie. August 1996. (Format: TXT=15247 bytes) (Updates RFC1035) (Status: PROPOSED STANDARD) 2010 Operational Criteria for Root Name Servers. B. Manning, P. Vixie. October 1996. (Format: TXT=14870 bytes) (Status: INFORMATIONAL) 2052 A DNS RR for specifying the location of services (DNS SRV). A. Gulbrandsen, P. Vixie. October 1996. (Format: TXT=19257 bytes) (Status: EXPERIMENTAL) 2104 HMAC: Keyed-Hashing for Message Authentication. H. Krawczyk, M. Bellare, R. Canetti. February 1997. (Format: TXT=22297 bytes) (Status: INFORMATIONAL) 2136 Dynamic Updates in the Domain Name System (DNS UPDATE). P. Vixie, Ed., S. Thomson, Y. Rekhter, J. Bound. April 1997. (Format: TXT=56354 bytes) (Updates RFC1035) (Status: PROPOSED STANDARD) 2137 Secure Domain Name System Dynamic Update. D. Eastlake. April 1997. (Format: TXT=24824 bytes) (Updates RFC1035) (Status: PROPOSED STANDARD) 2146 U.S. Government Internet Domain Names. Federal Networking Council. May 1997. (Format: TXT=26564 bytes) (Obsoletes RFC1816) (Status: INFORMATIONAL) 2163 Using the Internet DNS to Distribute MIXER Conformant Global Address Mapping (MCGAM). C. Allocchio. January 1998. (Format: TXT=58789 bytes) (Obsoletes RFC1664) (Status: PROPOSED STANDARD) 2168 Resolution of Uniform Resource Identifiers using the Domain Name System. R. Danie1, M. Mealling. June 1997. (Format: TXT=46528 bytes) (Status: EXPERIMENTAL) 2181 Clarifications to the DNS Specification. R. Elz, R. Bush. July 1997. (Format: TXT=36989 bytes) (Updates RFC1034, RFC1035, RFC1123) (Updated by RFC2535) (Status: PROPOSED STANDARD) 2182 Selection and Operation of Secondary DNS Servers. R. Elz, R. Bush, S. Bradner, M. Patton. July 1997. (Format: TXT=27456 bytes) (Also BCP0016) (Status: BEST CURRENT PRACTICE) 2219 Use of DNS Aliases for Network Services. M. Hamilton, R. Wright. October 1997. (Format: TXT=17858 bytes) (Also BCP0017) (Status: BEST CURRENT PRACTICE) 2230 Key Exchange Delegation Record for the DNS. R. Atkinson. October 1997. (Format: TXT=25563 bytes) (Status: INFORMATIONAL) 2247 Using Domains in LDAP/X.500 Distinguished Names. S. Kille, M. Wahl, A. Grimstad, R. Huber, S. Sataluri. January 1998. (Format: TXT=12411 bytes) (Status: PROPOSED STANDARD) 2308 Negative Caching of DNS Queries (DNS NCACHE). M. Andrews. March 1998. (Format: TXT=41428 bytes) (Obsoletes RFC1034) (Updates RFC1034, RFC1035) (Status: PROPOSED STANDARD) 2317 Classless IN-ADDR.ARPA delegation. H. Eidnes, G. de Groot, P. Vixie. March 1998. (Format: TXT=17744 bytes) (Also BCP0020) (Status: BEST CURRENT PRACTICE) 2345 Domain Names and Company Name Retrieval. J. Klensin, T. Wolf, G. Oglesby. May 1998. (Format: TXT=29707 bytes) (Status: EXPERIMENTAL) 2352 A Convention For Using Legal Names as Domain Names. O. Vaughan. May 1998. (Format: TXT=16354 bytes) (Obsoletes RFC2240) (Status: INFORMATIONAL) 2373 IP Version 6 Addressing Architecture. R. Hinden, S. Deering. July 1998. (Format: TXT=52526 bytes) (Obsoletes RFC1884) (Status: PROPOSED STANDARD) 2374 An IPv6 Aggregatable Global Unicast Address Format. R. Hinden, M. O'Dell, S. Deering. July 1998. (Format: TXT=25068 bytes) (Obsoletes RFC2073) (Status: PROPOSED STANDARD) 2375 IPv6 Multicast Address Assignments. R. Hinden, S. Deering. July 1998. (Format: TXT=14356 bytes) (Status: INFORMATIONAL) 2377 Naming Plan for Internet Directory-Enabled Applications. A. Grimstad, R. Huber, S. Sataluri, M. Wahl. September 1998. (Format: TXT=38274 bytes) (Status: INFORMATIONAL) 2517 Building Directories from DNS: Experiences from WWWSeeker. R. Moats, R. Huber. February 1999. (Format: TXT=14001 bytes) (Status: INFORMATIONAL) 2535 Domain Name System Security Extensions. D. Eastlake. March 1999. (Format: TXT=110958 bytes) (Updates RFC2181, RFC1035, RFC1034) (Status: PROPOSED STANDARD) 2536 DSA KEYs and SIGs in the Domain Name System (DNS). D. Eastlake. March 1999. (Format: TXT=11121 bytes) (Status: PROPOSED STANDARD) 2537 RSA/MD5 KEYs and SIGs in the Domain Name System (DNS). D. Eastlake. March 1999. (Format: TXT=10810 bytes) (Status: PROPOSED STANDARD) 2538 Storing Certificates in the Domain Name System (DNS). D. Eastlake, O. Gudmundsson. March 1999. (Format: TXT=19857 bytes) (Status: PROPOSED STANDARD) 2539 Storage of Diffie-Hellman Keys in the Domain Name System (DNS). D. Eastlake. March 1999. (Format: TXT=21049 bytes) (Status: PROPOSED STANDARD) 2540 Detached Domain Name System (DNS) Information. D. Eastlake. March 1999. (Format: TXT=12546 bytes) (Status: EXPERIMENTAL) 2541 DNS Security Operational Considerations. D. Eastlake. March 1999. (Format: TXT=14498 bytes) (Status: INFORMATIONAL) 2553 Basic Socket Interface Extensions for IPv6. R. Gilligan, S. Thomson, J. Bound, W. Stevens. March 1999. (Format: TXT=89215 bytes) (Obsoletes RFC2133) (Status: INFORMATIONAL) 2606 Reserved Top Level DNS Names. D. Eastlake, A. Panitz. June 1999. (Format: TXT=8008 bytes) (Also RFC2606) (Status: BEST CURRENT PRACTICE) 2671 Extension Mechanisms for DNS (EDNS0). P. Vixie. August 1999. (Format: TXT=15257 bytes) (Status: PROPOSED STANDARD) 2672 Non-Terminal DNS Name Redirection. M. Crawford. August 1999. (Format: TXT=18321 bytes) (Status: PROPOSED STANDARD) 2673 Binary Labels in the Domain Name System. M. Crawford. August 1999. (Format: TXT=12379 bytes) (Status: PROPOSED STANDARD) 9.2. URLs Documenti: - http://www.pkcrew.org/docs/DNSjam.txt - This doc :) - http://www.isc.org/products/BIND - ISC bind and docs - http://www.faqs.org/rfcs - Per trovare tutti gli rfc che volete =) Enti: - http://www.icann.org - Internet Corporation of Assigned Names and Numbers - http://www.iana.org - Internet Assigned Numbers Authority - http://www.internic.net - InterNIC website - http://www.networksolutions.com - NetSol archives - http://www.ripe.net - Mantainer europeo - http://www.nic.it - NIC italiano 9.3. HOWTOs && man - Linux-HOWTOs/DNS-HOWTO by Nicolai Langfeldt janl@math.uio.noa - named(8), named.conf(5), host(1), dig(1) - gethostbyname(3), getaddrinfo(3) 9.4. Books TCP/IP Illustrated, Chapter 1 - The protocols by W. Richard Stevens (tnx to asynchro :) 9.5. About the Author Beh, intanto grazie per aver letto tutto :) Spero di avervi chiarito un po' le idee per quanto riguarda i dns e affini, o almeno spero di avervi stuzzicato un po' la sete di conoscenza e la curiosita`. Per qualsiasi segnalazione, richiesta, commento, insulto o proposta di matrimonio, sono reperibile qua e la` su IRC, e all'indirizzo . bye bye =) t.R. ============================================================================== --------------------------------[ EOF 18/18 ]--------------------------------- ==============================================================================