EDNS client subnet & BIND

Vincent Bernat

Afin de four­nir des ré­ponses te­nant compte de la lo­ca­li­sa­tion du client, un patch ajou­tant le sup­port GeoIP est cou­ram­ment mis en œuvre pour BIND. Il per­met de di­ri­ger un client vers le ser­veur le plus proche :

view "FRANCE" {
     match-clients { geoip_cityDB_country_FR; };
     zone "example.com" in {
         type master;
         file "france.example.com.dns";
     };
};
view "GERMANY" {
     match-clients { geoip_cityDB_country_DE; };
     zone "example.com" in {
         type master;
         file "germany.example.com.dns";
     };
};
/* […] */
view "DEFAULT" {
    zone "example.com" in {
        type master;
        file "example.com.dns";
    };
};

Tou­te­fois, l’uti­li­sa­teur fi­nal ne parle gé­né­ra­le­ment pas di­rec­te­ment aux ser­veurs fai­sant au­to­rité. Il dé­lègue cette tâche à un ser­veur ré­cur­sif tiers. Ce der­nier main­tient éga­le­ment un cache des ré­ponses afin de pou­voir les ser­vir di­rec­te­ment à d’autres clients.

Dans la plu­part des cas, il est tou­jours pos­sible de se ba­ser sur la lo­ca­li­sa­tion géo­gra­phique du ser­veur ré­cur­sif car il se si­tue lui-même dans le ré­seau du FAI de l’uti­li­sa­teur, comme le montre le schéma suivant :

Requête pour www.example.com à travers le serveur récursif d'un FAI
Cas idéal : le serveur récursif utilisé est à proximité de l’utilisateur final.
  1. Juan ha­bite en Chine et dé­sire connaître l’IP de www.​example.​com. Elle in­ter­roge le ré­sol­veur mis à dis­po­si­tion par son FAI.
  2. Le ré­sol­veur re­laie la re­quête au ser­veur fai­sant autorité.
  3. Comme l’adresse IP du ré­sol­veur est éga­le­ment lo­ca­li­sée en Chine, le ser­veur fai­sant au­to­rité dé­cide de ré­pondre avec l’adresse IP du ser­veur web le plus proche, si­tué au Japon.
  4. Juan bé­né­fi­cie alors d’une connexion ra­pide avec le ser­veur web.

Tou­te­fois, ce n’est plus le cas en uti­li­sant un ser­veur ré­cur­sif pu­blic tel que ceux four­nis par Google ou OpenDNS. L’adresse IP du client et l’adresse IP uti­li­sée par le ser­veur ré­cur­sif peuvent ne pas par­ta­ger la même lo­ca­li­sa­tion. Ainsi, dans le schéma sui­vant, le ser­veur fai­sant au­to­rité pense avoir af­faire avec un client en Eu­rope et re­di­rige Juan sur un ser­veur Européen :

Requête pour www.example.com à travers un serveur récursif public
Pire des cas : le serveur récursif interroge le serveur faisant autorité depuis une autre localisation.

De plus, la mise en cache em­pire la si­tuation.

Afin de ré­soudre ce pro­blème, une ex­ten­sion EDNS pour ex­po­ser le sous-ré­seau du client a été pro­po­sée. Le ser­veur ré­cur­sif va uti­li­ser cette ex­ten­sion pour four­nir le sous-ré­seau du client au ser­veur fai­sant au­to­rité qui va en te­nir compte pour don­ner une ré­ponse op­ti­mi­sée. Le sous-ré­seau est suf­fi­sam­ment vague pour pré­ser­ver la vie pri­vée de l’uti­li­sa­teur mais suf­fi­sam­ment pré­cis pour pou­voir le lo­ca­li­ser. Une ver­sion mo­di­fiée de dig per­met de construire de telles requêtes :

$ geoiplookup 138.231.136.0
GeoIP Country Edition: FR, France
$ ./bin/dig/dig @dns-02.dailymotion.com www.dailymotion.com \
>     +client=138.231.136.0/24

; <<>> DiG 9.8.1-P1-geoip-1.3 <<>> @dns-02.dailymotion.com www.dailymotion.com +client=138.231.136.0/24
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23312
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; CLIENT-SUBNET: 138.231.136.0/24/24
;; QUESTION SECTION:
;www.dailymotion.com.           IN      A

;; ANSWER SECTION:
www.dailymotion.com.    600     IN      A       195.8.215.136
www.dailymotion.com.    600     IN      A       195.8.215.137

;; Query time: 20 msec
;; SERVER: 188.65.127.2#53(188.65.127.2)
;; WHEN: Sun Oct 20 15:44:47 2013
;; MSG SIZE  rcvd: 91

$ geoiplookup 195.8.215.136
GeoIP Country Edition: FR, France

Dans l’exemple ci-des­sus, un client en France ob­tient en ré­ponse deux adresses IP si­tuées en France. Par contre, ci-des­sous, un client aux États-Unis ob­tient des IP amé­ricaines.

$ geoiplookup 170.149.100.0
GeoIP Country Edition: US, United States
$ ./bin/dig/dig @dns-02.dailymotion.com www.dailymotion.com \
>     +client=170.149.100.0/24

; <<>> DiG 9.8.1-P1-geoip-1.3 <<>> @dns-02.dailymotion.com www.dailymotion.com +client=170.149.100.0/24
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23187
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; CLIENT-SUBNET: 170.149.100.0/24/24
;; QUESTION SECTION:
;www.dailymotion.com.           IN      A

;; ANSWER SECTION:
www.dailymotion.com.    600     IN      A       188.65.120.135
www.dailymotion.com.    600     IN      A       188.65.120.136

;; Query time: 18 msec
;; SERVER: 188.65.127.2#53(188.65.127.2)
;; WHEN: Sun Oct 20 15:47:22 2013
;; MSG SIZE  rcvd: 91

$ geoiplookup 188.65.120.135
GeoIP Country Edition: US, United States

Le ser­veur ré­cur­sif in­dique dans son cache les sous-ré­seaux conte­nus dans la ré­ponse du ser­veur afin de n’uti­li­ser le cache que pour les clients du même sous-ré­seau. Avec cette nou­velle ex­ten­sion, le ser­veur fai­sant au­to­rité sait dé­sor­mais que Juan est si­tuée en Chine et ré­pond avec une IP ap­propriée :

Requête pour www.example.com à travers un serveur récursif public utilisant l'extension
Le serveur récursif fournit le sous-réseau du client et obtient une réponse adaptée à celui-ci.

Peu de ser­veurs fai­sant au­to­rité sup­portent cette ex­ten­sion (à ma connais­sance, uni­que­ment PowerDNS et gdnsd). À Dai­ly­mo­tion, nous avons mis au point un patch pour BIND1. Il ne fonc­tionne que lorsque BIND est uti­lisé en tant que ser­veur fai­sant au­to­rité et n’ex­pose au­cune di­rec­tive de confi­gu­ra­tion. Une fois ins­tallé, il convient de se faire connaître au­près de OpenDNS et Google pour re­ce­voir des re­quêtes uti­li­sant l’ex­tension.