Géolocalisation avec un serveur DNS : PowerDNS

La solution fut portée sur PowerDNS et le module GeoBackend pour la géolocalisation des internautes.

PowerDNS est actuellement utilisé parmi de nombreux registrars de domaine et également Wikimédia qui utilise GeoBackend.

De plus, PowerDNS fonctionne aussi bien sous Windows que Linux, par contre, il y a plus de documentations sous Linux que sous Windows pour le module GeoBackend. Il faut également penser que le module GeoBackend doit être compilé avec Visual C++ sous Windows alors que sous Linux tout cela est automatique.

La solution est entièrement gratuite, le système d’exploitation est Linux Debian version Etch 4.0, la base de données est MySQL version 5.0, le serveur Internet est basé sur Apache 2.0, le tout administré avec un logiciel gratuit Windows : Putty.

BIND propose également un module de géolocalisation mais il n’a pas été remis à jour depuis 2004 donc cette solution ne fut pas sélectionnée.
Il existe d’autres systèmes, par exemple des géo balancers matériels qui se chargent de rediriger les internautes, malheureusement ce type de matériel est très onéreux.

Ce tutorial est issu d’un de mes rapports de stage en 2007. Et à l’époque j’utilisais « nano » au lieu de « vi » 😉

Installation de PowerDNS

En ligne de commande, exécutez sur votre serveur :

apt-get install pdns-backend-geo pdns pdns-backend-mysql
cd /etc/powerdns/

Pour connaître la version utilisée, exécutez :

/usr/bin/pdns_control version

Pour démarrer PowerDNS :

/etc/init.d/pdns stop
/etc/init.d/pdns monitor

Configuration de PowerDNS

Comme tout programme sous Linux, il faut modifier les fichiers de configuration 😉

nano /etc/powerdns/pdns.conf
local-address=0.0.0.0				# répond à toutes les IP qui l’interroge
local-port=53					# écoute sur le port 53
recursor=127.0.0.1:5300			# les requêtes récursives sont renvoyés au localhost port 5300
allow-recursion=127.0.0.1 172.20.0.0/16	# autorise seulement le localhost et les adresses IP internes à utiliser les requêtes récursives

PowerDNS doit répondre à tous les IP donc le paramètre « local-address=0.0.0.0 », le port par défaut du DNS est 53 « local-port=53 ». Pour les requêtes récursives, le module recursor écoute sur le port 5300 et les requêtes seront traitées par lui-même.
Pour des raisons de sécurité, les requêtes récursives ne sont autorisées que pour les IP locales.

Configuration des requêtes récursives

nano /etc/powerdns/recursor.conf
local-address=127.0.0.1		# écoute sur l’IP local
local-port=5300		# écoute sur le port 5300
allow-from=127.0.0.0/8	# autorise seulement le localhost à utiliser le serveur recursor

Pour des raisons de sécurité, les requêtes récursives ne sont autorisées que pour les IP locales.

Une fois configuré, il faut démarrer le démon pour charger les fichiers de configuration.

Démarrage de recursor :

/etc/init.d/pdns-recursor start

Démarrage de pdns pour voir l’état de l’application en temps réel (pratique pour déboguer en temps réel dans la console Shell) :

/etc/init.d/pdns monitor

Ces informations sont essentielles pour vérifier le bon fonctionnement de l’application mais également pour la dépanner. Voici un exemple de logs :

Jul 11 10:22:08 This is a standalone pdns
Jul 11 10:22:08 It is advised to bind to explicit addresses with the --local-address option
Jul 11 10:22:08 UDP server bound to 0.0.0.0:53
Jul 11 10:22:08 TCP server bound to 0.0.0.0:53
Jul 11 10:22:08 PowerDNS 2.9.20 (C) 2001-2006 PowerDNS.COM BV (Mar 10 2007, 00:36:58, gcc 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)) starting up
Jul 11 10:22:08 PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.
Jul 11 10:22:08 Set effective group id to 109
Jul 11 10:22:08 Set effective user id to 108
Jul 11 10:22:08 DNS Proxy launched, local port 48069, remote 127.0.0.1:5300
Jul 11 10:22:09 Creating backend connection for TCP
Jul 11 10:22:09 About to create 3 backend threads for UDP
% Jul 11 10:22:09 Done launching threads, ready to distribute questions
Jul 11 10:22:15 Distributor misses a thread (4

Comme PowerDNS fonctionne sous forme de démon (similaire au « service » sous Windows), il est possible de l’exécuter sans afficher les logs en temps réel :

/etc/init.d/pdns start

Test du bon fonctionnement du serveur PowerDNS

Une fois installé, il faut tester le bon fonctionnement du serveur DNS. Nous allons taper les commandes recommandées dans la documentation (http://doc.powerdns.com/testing.html) :

host www.example.com 127.0.0.1

PowerDNS résout l’URL www.example .com pour nous retourner l’IP du domaine.

dig www.example.com A @127.0.0.1

Le serveur DNS nous retourne l’enregistrement de type A pour le domaine www.example.com qui a pour IP : 208.77.188.166 ce qui est correct.

Activation des logs

Les logs sont très importants et permettent de résoudre pas mal de problèmes de configuration mais également de bien vérifier que tout fonctionne correctement.

Il faut décommenter les lignes « logfile » et « loglevel » :

nano /etc/powerdns/pdns.conf

Attention, le « loglevel=7 » retourne un très grand nombre de ligne et ne doit servir que pour les tests ! Une fois les tests réussis, il faut remettre « loglevel=3 ».

Ensuite, il faut modifier le fichier « recursor.conf » avec « nano /etc/powerdns/recursor.conf » et rajouter la partie LOG :

L’argument « logging-facility=0 » permet de spécifier le format de sortie pour SYSLOG du système d’exploitation.

Pour récupérer les logs et remplir le fichier dédié à PowerDNS, il faut configurer syslog :

nano /etc/syslog.conf

On rajoute cela dans le fichier :

Puis on redémarre le démon syslog :

/etc/init.d/sysklogd restart

ainsi que les démons de PowerDNS

/etc/init.d/pdns-recursor restart

et

/etc/init.d/pdns restart

Pour visualiser les logs, il faudra faire :

tail -f /var/log/pdns.log

Installation de la Base de données

La base de données MySQL va contenir les domaines, les IP, c’est-à-dire toutes les informations nécessaires qui servent à définir un nom de domaine.
Il est possible d’utiliser une autre base de données tel qu’Oracle ou SQL Server mais le choix de MySQL fut adopté : éprouvé et gratuit.

Installation de MySQL

On commence donc par installer le module mysql de PowerDNS :

apt-get install pdns-backend-mysql

Il faut créer un utilisateur, spécifier un mot de passe (pdnstest dans notre exemple) et lui donner les droits pour qu’il puisse se connecter à la base.

mysql -u root –p
CREATE USER ‘u_pdnstest’@’localhost’ IDENTIFIED BY 'pdnstest'
#CREATE USER ‘u_pdnstest’@’localhost’;
CREATE DATABASE pdnstest;
GRANT ALL PRIVILEGES ON pdnstest.* TO 'u_pdnstest'@'localhost';
exit

On vérifie la bonne connexion de l’utilisateur :

mysql –u u_pdnstest -p

On rentre le mot de passe « pdnstest ». Il faut obtenir cela :

On quitte toujours en tapant « exit ; ».

Pour que PowerDNS puisse utiliser la base MySQL, il faut rajouter cela dans le fichier « pdns.conf » :

launch=gmysql
gmysql-host=127.0.0.1
gmysql-user=u_pdnstest
gmysql-dbname=pdnstest
gmysql-password=pdnstest

On commente la partie de tests d’avant : « launch=bind » et « bind-example-zones » pour que PowerDNS charge le module MySQL.

Création des tables MySQL

PowerDNS utilise une base de données (MySQL dans notre cas mais cela peut être Oracle, DB2, etc.) pour stocker les noms de domaines, les zones, etc.
Pour cela, il faut tout d’abord créer la structure de la base de données, car lors de l’installation, les tables ne sont pas installées ce qui nous permet de choisir notre SGBDR.

Voici ce qu’il faut exécuter sur le serveur MySQL pour créer les tables :

create table domains (
id INT auto_increment,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(6) NOT NULL,
notified_serial INT DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
primary key (id)
)type=InnoDB;

CREATE UNIQUE INDEX name_index ON domains(name);

CREATE TABLE records (
id INT auto_increment,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(6) DEFAULT NULL,
content VARCHAR(255) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
change_date INT DEFAULT NULL,
primary key(id)
)type=InnoDB;

CREATE INDEX rec_name_index ON records(name);
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);

create table supermasters (
ip VARCHAR(25) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) DEFAULT NULL
);

On relance PowerDNS pour vérifier la bonne connexion du serveur DNS à la base de données MySQL :

/etc/init.d/pdns monitor

Voici le résultat de la commande :

debian:~# /etc/init.d/pdns monitor
Jul 12 17:46:32 This is module gmysqlbackend.so reporting
Jul 12 17:46:32 This is a standalone pdns
Jul 12 17:46:32 It is advised to bind to explicit addresses with the --local-address option
Jul 12 17:46:32 UDP server bound to 0.0.0.0:53
Jul 12 17:46:32 TCP server bound to 0.0.0.0:53
Jul 12 17:46:32 PowerDNS 2.9.20 (C) 2001-2006 PowerDNS.COM BV (Mar 10 2007, 00:36:58, gcc 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)) starting up
Jul 12 17:46:32 PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.
Jul 12 17:46:32 Set effective group id to 109
Jul 12 17:46:32 Set effective user id to 108
Jul 12 17:46:32 DNS Proxy launched, local port 42771, remote 127.0.0.1:5300
Jul 12 17:46:32 Creating backend connection for TCP
% Jul 12 17:46:32 gmysql Connection succesful
Jul 12 17:46:32 About to create 3 backend threads for UDP
Jul 12 17:46:32 Launched webserver on 0.0.0.0:8081
Jul 12 17:46:32 gmysql Connection succesful
Jul 12 17:46:32 gmysql Connection succesful
Jul 12 17:46:32 gmysql Connection succesful
Jul 12 17:46:32 Done launching threads, ready to distribute questions
Jul 12 17:46:48 Distributor misses a thread (4

La partie « gmysql Connection succesful » nous confirme la bonne connexion entre les deux.

Résolution de quelques noms de domaines

Pour tester le bon fonctionnement du serveur DNS, il suffit de rajouter l’IP du serveur et d’exécuter quelques pings vers example.com, perdu.com, etc. pour générer du trafic et des résolutions de requêtes.

Voici une vue des logs, après les pings :

tail -f /var/log/pdns.log

Jul 16 11:49:31 Query: select content,ttl,prio,type,domain_id,name from records where name='perdu.com'
Jul 16 11:49:31 Query: select content,ttl,prio,type,domain_id,name from records where name='*.com'
Jul 16 11:49:31 gmysql Connection succesful
Jul 16 11:50:04 Distributor misses a thread (4

Activation du serveur WEB de PowerDNS

PowerDNS contient un serveur Internet intégré pour afficher les requêtes que le serveur a traitées et permet de faire des statistiques.

Tout d’abord, il faut modifier le fichier de configuration pdns.conf pour l’activer. Voici mes paramètres :

Quelques explications sur les paramètres :

  • « webserver=yes » -> activation du serveur Internet
  • « webserver-address=0.0.0.0 » -> permet d’accéder au serveur à partir de toutes les IP. Attention ! Il vaut mieux mettre l’IP de la machine qui doit accéder aux statistiques pour la sécurité
  • « webserver-port=8081 » -> sélection du port pour accéder au serveur Internet

Ainsi, pour accéder au serveur Internet, il faut taper : http://IP_serveur_DNS:8081

Une fois les pings effectués, il est possible de se connecter au serveur Web activé pour visualiser les diverses requêtes :

On remarque les résolutions inversées « .in-addr.arpa » des divers noms de domaine. Ainsi, lors d’un ping sur le domaine example.com : « PING example.com (208.77.188.166) 56(84) bytes of data » possède comme IP 208.77.188.166, le serveur DNS retourne l’adresse inversée « 166.188.77.208.in-addr.arpa ».

La liste des IP qui ont demandé des résolutions d’adresses sont loguées et des pourcentages sont visibles ce qui permet de connaître les IP qui sollicitent le plus le serveur DNS.

Test de divers serveurs DNS :

apt-get install zonecheck

Configuration des domaines dans la base de données MySQL

Quelques commandes sont à réaliser d’après la documentation :

« host www.test.com 127.0.0.1 » retourne « www.test.com has address 208.48.34.132 »

Il faut ajouter des enregistrements dans la base de données Mysql en exécutant en ligne de commande les lignes ci-dessous :

mysql -u u_pdnstest -p

	  INSERT INTO domains (name, type) values ('test.com', 'NATIVE');
	  INSERT INTO records (domain_id, name, content, type,ttl,prio)
	  VALUES (1,'test.com','localhost ahu@ds9a.nl 1','SOA',86400,NULL);
	  INSERT INTO records (domain_id, name, content, type,ttl,prio)
	  VALUES (1,'test.com','dns-us1.powerdns.net','NS',86400,NULL);
	  INSERT INTO records (domain_id, name, content, type,ttl,prio)
	  VALUES (1,'test.com','dns-eu1.powerdns.net','NS',86400,NULL);
	  INSERT INTO records (domain_id, name, content, type,ttl,prio)
	  VALUES (1,'www.test.com','199.198.197.196','A',120,NULL);
	  INSERT INTO records (domain_id, name, content, type,ttl,prio)
	  VALUES (1,'mail.test.com','195.194.193.192','A',120,NULL);
	  INSERT INTO records (domain_id, name, content, type,ttl,prio)
	  VALUES (1,'localhost.test.com','127.0.0.1','A',120,NULL);
	  INSERT INTO records (domain_id, name, content, type,ttl,prio)
	  VALUES (1,'test.com','mail.test.com','MX',120,25);
exit;

Maintenant, la requête « host www.test.com 127.0.0.1 » retourne « www.test.com has address 199.198.197.196 » ce qui correspond à l’IP renseigné dans la base de données pour le nom de domaine www.test.com.

Et la requête « host mail.test.com 127.0.0.1 » retourne « mail.test.com has address 195.194.193.192 » ce qui est correct puisqu’issue de la base de données.

Installation et configuration de la Géolocalisation

Sous Debian, l’installation du GeoBackend ne comporte pas de souci particulier :

apt-get install pdns-backend-geo

Le module geobackend permet de connaître le continent de l’internaute suivant son adresse IP. Il sera possible de rediriger cette internaute sur les serveurs choisis.

Il existe plusieurs modules disponibles en tapant : « apt-cache search pdns »

Il faut modifier le fichier de configuration pour intégrer le nouveau backend : « nano /etc/powerdns/pdns.conf »

Pour tester la géolocalisation, le domaine utilisé est « testrepartition.com ».

# The geobackend
launch=geo

# The zone that your geo-balanced RR is inside of.  The whole zone has to #be delegated to the PowerDNS backend, so you will generally want to make #up some subzone of your main zone.
geo-zone=geo.testrepartition.com

# The only parts of the SOA for "geo.telepulse.net" that apply here are the
# master server name and the contact address.
geo-soa-values=dns.testrepartition.com, webmaster@testrepartition.com

# List of NS records of the PowerDNS servers that are authoritative for #your GLB zone.
geo-ns-records=dns.testrepartition.com

# The TTL of the CNAME records that geobackend will return.  Since the same
# resolver will always get the same CNAME (apart from if the director-map
# changes) it is safe to return a reasonable TTL, so if you leave this
# commented then a sane default will be chosen.
#geo-ttl=3600

# The TTL of the NS records that will be returned.  Leave this commented if #you don't understand.
#geo-ns-ttl=86400

# This is the real guts of the data that drives this backend.  This is a #DNS zone file for RBLDNSD, a nameserver specialised for running large DNS #zones typical of DNSBLs and such.  We choose it for our data because it is #easier to parse than the BIND-format one.
# Anyway, it comes from http://countries.nerd.dk/more.html - there are #details there for how to rsync your own copy.  You'll want to do that #regularly, every couple of days maybe.  We believe the nerd.dk guys take #the netblock info from Regional Internet Registries (RIRs) like RIPE, #ARIN, APNIC.  From that they build a big zonefile of IP/prefixlen -> ISO-#country-pre mappings.
geo-ip-map-zonefile=/etc/powerdns/zz.countries.nerd.dk.rbldnsd

# And finally this last directive tells the geobackend where to find the #map files that say a) which RR to answer for, and b) what actual resource #record to return for each ISO country pre.  The setting here is a comma-#separated list of paths, each of which may either be a single map file or #a directory that will contain map files.  If you are only ever going to #serve one RR then a single file is probably better, but if you're going to #serve many then a directory would probably be better.  The rest of this #documentation will assume you chose a directory.
geo-maps=/etc/powerdns/geo-maps

« geo-ip-map-zonefile » retourne le pre du pays à partir d’une IP et « geo-maps » retourne un nom de pays à partir du pre du pays.

Récupération de la liste :

rsync -va rsync://countries-ns.mdc.dk/zone/zz.countries.nerd.dk.rbldnsd .

Ne pas oublier le « . » à la fin de la commande pour télécharger les données.

Attention à ne pas mettre de fichier tel que « zz.countries.nerd.dk.rbldnsd » dans le dossier geo-maps car le parseur recherche les variables « $RECORD » et « $ORIGIN » dans l’entête du fichier.
L’erreur obtenu est : « [geobackend] Error occured while reading director file /etc/powerdns/geo-maps/zz.countries.nerd.dk.rbldnsd: $RECORD line empty or missing, georecord qname unknown ».

Tous les fichiers sont placés dans le dossier « /etc/powerdns ».

Une fois le dossier choisi : « /etc/powerdns/geo-maps » dans notre exemple, il faut respecter un format de fichier.
Le début doit contenir « $RECORD », puis « $ORIGIN domaine.com. » puis un domaine par défaut.

$RECORD www 			# pour www.geo.testrepartition.com.
$ORIGIN iso.testrepartition.com.
#par défaut
0 geomain.testrepartition.com.

La suite comporte le nom du pays et le pre ISO. Par exemple, dans ce fichier se trouve :

# Belgium
56 eu

Le n°56 est le pre ISO de la Belgique. Le « eu » est nécessaire au module GeoBackend et lui indique la localisation de la Belgique qui se trouve dans l’Europe. Il répond par un enregistrement DNS de type CNAME « eu.iso.testrepartition.com ».
Lorsque le module GeoBackend est correctement lancé, le message « 0 failures » apparait.

La suite est disponible à cette adresse : http://www.micro-gravity.com/data/300605/vip

Voici un screenshot :

Configuration des domaines dans la base de données MySQL

La base de données MySQL contient les renseignements sur le domaine tel que l’IP, les noms DNS, etc.
Dans notre exemple, le domaine « testrepartition.com » est utilisé. Ainsi, il faut définir les noms DNS tel que « www.testrepartition.com » qui dépendra de « eu.iso.testrepartition.com », « us.iso.testrepartition.com » etc.
Puis il faut définir les IP suivant le nom de domaine. Pour effectuer un bon load balancing DNS, il est nécessaire de fournir plusieurs IP pour chaque nom de domaine. Dès lors, la charge des serveurs sera répartie.

Configuration DNS – schema de type BIND

$TTL 38400
@    IN    SOA    dns.testrepartition.com.  webmaster.testrepartition.com. (
1607200701	   ; N° série (yyyymmddnn)
10800		   ; Rafraichissement (3 heures)
3600			; Retry (1 heure)
604800		; Expiration (1000 heures)
86400			; Minimum (24 heures)
)

; IN    NS    dns.testrepartition.com.

www 		IN	CNAME	www.geo
dns		IN	A	172.20.1.1
geo		IN	NS	dns

;geo		IN	CNAME	us.iso ;pas besoin PowerDNS utilise le module Geo
;geo		IN	CNAME	eu.iso ;pas besoin PowerDNS utilise le module Geo

us.iso	IN	A	172.20.100.10
us.iso	IN	A	172.20.100.11

eu.iso	IN	A	172.20.100.20
eu.iso	IN	A	172.20.100.21

; accès par défaut
geomain	IN	A	172.20.100.10
geomain	IN	A	172.20.100.20

Installation dans la base de données (script MySQL)

Voici un exemple de script que j’ai réalisé :

INSERT INTO domains (name, type) values ('testrepartition.com', 'NATIVE');

INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, 'testrepartition.com','dns.testrepartition.com web@testrepartition.com 1607200701 10800 3600 604800 86400','SOA',38400,NULL);

INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, 'www.testrepartition.com','www.geo.testrepartition.com','CNAME',86400,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, 'dns.testrepartition.com','172.20.1.1','A',86400,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, 'geo.testrepartition.com','dns.testrepartition.com','NS',86400,NULL);

INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, 'us.iso.testrepartition.com','172.20.100.10','A',86400,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, 'us.iso.testrepartition.com','172.20.100.11','A',86400,NULL);

INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, 'eu.iso.testrepartition.com','172.20.100.20','A',86400,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, 'eu.iso.testrepartition.com','172.20.100.21','A',86400,NULL);

INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, 'geomain.testrepartition.com','172.20.100.10','A',86400,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, 'geomain.testrepartition.com','172.20.100.20','A',86400,NULL);
exit;

Test de la résolution

Sur la machine où est installé PowerDNS, il est possible d’utiliser l’utilitaire « dig » qui va nous permettre de résoudre « www.testrepartition.com » avec l’IP local :

Si l’on utilise l’outil Windows « nslookup » à partir d’une autre IP, dans les logs de PowerDNS, une ligne apparait :

Jul 17 17:08:21 [geobackend] Serving www.geo.testrepartition.com CNAME geomain.testrepartition.com to 172.20.200.1 (0)

Puisqu’il s’agit d’une IP privée, le serveur DNS retourne l’internaute vers la zone par défaut : « geomain.testreparition.com », car le serveur ne trouve pas cette IP dans la liste d’IP par continent.

Il ne reste plus qu’à tester avec une IP publique.

Modification de la base des IP pour tester une IP privée

Pour l’instant, seul les IP publiques peuvent être testées, mais il est intéressant de modifier la base de données des IP pour faire passer une IP privée, pour une IP venant de l’Europe.

Ajout du masque d’IP privée « 172.20.0.0 » dans le fichier de référence :

nano /etc/powerdns/zz.countries.nerd.dk.rbldnsd

Ajout : 172.20.0.0/16 :127.0.0.250:fr

Dès qu’un test est effectué, par exemple d’une machine virtuelle qui possède l’IP 172.20.200.1 et qui a pour serveur DNS l’IP du serveur où est installé PowerDNS, on effectue un « nslookup » de www.testrepartition.com et dans les logs, la résolution est visible :

[geobackend] Serving www.geo.testrepartition.com CNAME eu.iso.testrepartition.com to 172.20.200.1 (250)

Le chiffre « 250 » signifie qu’il s’agit d’une IP provenant du continent 250 qui a pour nom « eu » :

Dès lors, la demande « www.testrepartition.com » est redirigé sur les serveurs « eu.iso » qui sont les serveurs européens.

Une fois les fichiers modifié, il n’est pas nécessaire de redémarrer le démon PowerDNS, il suffit de taper : « pdns_control rediscover ».
Par contre, si vous avez exécuté PowerDNS avec « /etc/init.d/pdns monitor » et que l’on tente « pdns_control rediscover », alors une erreur apparait : « Fatal error: Unable to connect to remote ‘/var/run/pdns.controlsocket’: Connection refused ».

Il faut donc démarrer le démon avec « /etc/init.d/pdns start » puis « pdns_control rediscover » affichera « Ok ».

Configuration de la zone inverse in-addr.arpa

La résolution d’une IP en nom de domaine est possible en configurant la zone inverse in-addr.arpa.

Pour la mettre en place, il faut insérer de nouveaux enregistrements dans la base de données :

INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, '99.1.20.172.in-addr.arpa','dns.testrepartition.com web@testrepartition.com 1607200701 10800 3600 604800 86400','SOA',38400,NULL);

INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, '99.1.20.172.in-addr.arpa','us.iso.testrepartition.com','PTR',86400,NULL);

INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, '20.100.20.172.in-addr.arpa','eu.iso.testrepartition.com','PTR',86400,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, '21.100.20.172.in-addr.arpa','eu.iso.testrepartition.com','NS',86400,NULL);

INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, '10.100.20.172.in-addr.arpa','geomain.testrepartition.com','PTR',86400,NULL);
INSERT INTO records (domain_id, name, content, type,ttl,prio) 	VALUES (2, ' 11.100.20.172.in-addr.arpa','geomain.testrepartition.com','PTR',86400,NULL);

exit;

Maintenant, il est possible de résoudre l’IP pour afficher le nom de domaine :

Dans cet exemple, le masque d’IP « 172.20.0.0 » est indiqué comme adresse américaine, dès lors, la résolution de l’adresse « 172.20.1.99 » retourne le nom DNS de la zone américaine, en l’occurrence « us.iso.testrepartition.com »

Test charge DNS

Pour tester la rapidité de résolution du serveur DNS, la création d’un petit script réalisant un nslookup est nécessaire. Deux versions ont été réalisées : l’une sous Linux et l’autre sous Windows.

Script Windows (.bat) :

@echo off
:replay
nslookup www.testrepartition.com
Goto replay
:FIN

Sous Debian (.sh) :

#!/bin/sh
while true
do
nslookup www.testrepartition.com
done

Bilan : 60 requêtes/sec -> 3% CPU

En extrapolant, il est possible de dire que le serveur DNS supporte 2000 requêtes par seconde sur ce type de test assez théorique.

Il faudra donc effectuer quelques tests réels et surveiller l’utilisation des ressources des divers serveurs.

Conclusion

La géolocalisation avec PowerDNS fonctionne très bien et se configure de manière assez simple sous Linux.

La priorité d’une telle solution est la base de données qui contient les IP et leur provenance classées par continent.
En effet, si cette base est erronée ou incomplète, les internautes seront redirigés vers le lieu par défaut rendant la géo localisation inefficace. Ainsi, il faut que cette base soit le plus juste possible.

Il existe des bases effectuant la relation « IP vers continent » en vente sur Internet réalisées par des sociétés spécialisées ce qui permet de garantir un minimum la fiabilité des données.

Il est possible de faire évoluer cette solution en développant un petit module pour configurer simplement les données (nom de domaine, IP, etc.) qui se trouvent dans la base de données MySQL. Actuellement, la configuration est réalisée avec PHPMyAdmin qui permet de modifier la base de données de PowerDNS.

Avec mots-clefs , , , , .Lien pour marque-pages : permalien.

Laisser un commentaire