EDNS client subnet & BIND

Vincent Bernat

Afin de fournir des des réponses tenant compte de la localisation du client, un patch ajoutant le support GeoIP est couramment mis en œuvre pour BIND. Il permet de diriger un client vers le serveur 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";
    };
};

Toutefois, l’utilisateur final ne parle généralement pas directement aux serveurs faisant autorité. Il délègue cette tâche à un serveur récursif tiers. Ce dernier maintient également un cache des réponses afin de pouvoir les servir directement à d’autres clients.

Dans la plupart des cas, il est toujours possible de se baser sur la localisation géographique du serveur récursif car il se situe lui-même dans le réseau du FAI de l’utilisateur, 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 habite en Chine et désire connaître l’IP de www.example.com. Elle interroge le résolveur mis à disposition par son FAI.
  2. Le résolveur relaie la requête au serveur faisant autorité.
  3. Comme l’adresse IP du résolveur est également localisée en Chine, le serveur faisant autorité décide de répondre avec l’adresse IP du serveur web le plus proche, situé au Japon.
  4. Juan bénéficie alors d’une connexion rapide avec le serveur web.

Toutefois, ce n’est plus le cas en utilisant un serveur récursif public tel que ceux fournis par Google ou OpenDNS. L’adresse IP du client et l’adresse IP utilisée par le serveur récursif peuvent ne pas partager la même localisation. Ainsi, dans le schéma suivant, le serveur faisant autorité pense avoir affaire avec un client en Europe et redirige Juan sur un serveur 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 empire la situation.

Afin de résoudre ce problème, une extension EDNS pour exposer le sous-réseau du client a été proposée. Le serveur récursif va utiliser cette extension pour fournir le sous-réseau du client au serveur faisant autorité qui va en tenir compte pour donner une réponse optimisée. Le sous-réseau est suffisamment vague pour préserver la vie privée de l’utilisateur mais suffisamment précis pour pouvoir le localiser. Une version modifiée de dig permet 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-dessus, un client en France obtient en réponse deux adresses IP situées en France. Par contre, ci-dessous, un client aux États-Unis obtient 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 serveur récursif indique dans son cache les sous-réseaux contenus dans la réponse du serveur afin de n’utiliser le cache que pour les clients du même sous-réseau. Avec cette nouvelle extension, le serveur faisant autorité sait désormais que Juan est située en Chine et répond avec une IP approprié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 serveurs faisant autorité supportent cette extension (à ma connaissance, uniquement PowerDNS et gdnsd). À Dailymotion, nous avons mis au point un patch pour BIND1. Il ne fonctionne que lorsque BIND est utilisé en tant que serveur faisant autorité et n’expose aucune directive de configuration. Une fois installé, il convient de se faire connaître auprès de OpenDNS et Google pour recevoir des requêtes utilisant l’extension.


  1. La version exacte de BIND pour ce patch est 9.8.1-p1 avec le patch GeoIP correspondant. Il est également nécessaire d’appliquer le patch pour dig↩︎