OpenWRT DNS et DHCP

 

Après avoir installé mon routeur avec OpenWRT (voir article précédent). Je voulais pouvoir gérer des zones dns interne pour mes différentes machines. Cependant le serveur dns de base installé sur OpenWRT - dnsmasq - ne permet pas de créer des zones DNS. Il faut donc installer un serveur DNS Bind.

IMPORTANT cette manpulation désactive le dhcp et le dns de base d'openwrt et ces fonctions dans l'interface Web Luci. Il faut donc avoir quelques connaissances en ligne de commande et sur bind et dhcp.

IMPORTANT 2 faites un backup de votre configuration dans l'interface : System / Backup Flash Firmware

Désactiver dnsmasq

Pour commencer on supprimer dnsmasq en se connectant en ssh sur le routeur :

# ssh monrouteur
# /etc/init.d/dnsmasq stop
# opkg remove dnsmasq
# rm /etc/config/dhcp /var/etc/dnsmasql.conf /var/dhcp.leases

A ce moment là vous n'avez plus de dhcp et plus de dns.

 

Serveur dhcp

On installe un serveur dhcp commun sur les installations Unix :

# opkg install isc-dhcp-server-ipv4

La configuration se trouve dans le fichier /etc/dhcpd.conf. Un petit exemple à adapter à votre conf, je fixe ma plage d'ips dans le dhcp, l'ip du routeur et quelques machines en ip fixe, rien d'inhabituel :

# dhcpd.conf
authoritative;
default-lease-time 3600;
max-lease-time 86400;

option domain-name-servers 192.168.10.250;
subnet 192.168.10.0 netmask 255.255.255.0 {
range 192.168.10.10 192.168.10.50;
option routers 192.168.10.250;
host hp  { hardware ethernet **:**:**:51:58:90; fixed-address 192.168.10.233; }
}

On peut redémarrer le serveur dhcp :

# /etc/init.d/dhcpd restart

 

Serveur dns

On passe maintenant à l'installation de bind :

# opkg install bind-server bind-tools

La configuration principale se fait dans le fichier /etc/bind/named.conf. Les infos principales à modifier :

Le forwarder est le serveur dns que va intéroger bind si il ne connais pas la réponse à requête. En général c'est le serveur dns de la box ou du fai. Mais on pourrait aussi mettre des dns de prestaires qui ne bloquent/filtrent pas les requêtes, voir cet article.

forwarders {
IP;
};

Créer une clé rndc

Cette clé va nous servir pour lancer certaines opérations comme par exemple vider un cache avec rndc flushname.

Pour cela :

# rndc-confgen
# Start of rndc.conf
key "rndc-key" {
algorithm hmac-md5;
secret "z8Z8HZghztDsJ0RN8OljaA==";
};

options {
default-key "rndc-key";
default-server 127.0.0.1;
default-port 953;
};
# End of rndc.conf

# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
#     algorithm hmac-md5;
#     secret "z8Z8HZghztDsJ0RN8OljaA==";
# };
#
# controls {
#     inet 127.0.0.1 port 953
#         allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf

Il suffit de recopier les infos comme indiqué.

Il faut de plus créer un lien :

ln -s /etc/bind/rndc.conf /etc/rndc.conf

Rajouter une zone

Pour gérer une zone en local, rajouter une partie comme celle-ci dans /etc/bind/named.conf :

zone "guidtz.local" {
type master;
file "/etc/bind/zone.guidtz.local";
};

Puis on crée le fichier de zone :

$TTL    1200
@       IN      SOA     guidtz.local. root.guidtz.local. (
                        2       ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL

                        NS              ns.guidtz.local.

                        A               192.168.10.250

ns                      A               192.168.10.250

Ne pas oublier de modifier le serial à chaque changement.

On peut maintenant redémarrer bind :

# /etc/init.d/named restart

Logs

Si bind ne redémarre pas il faut activer les logs en rajoutant ceci dans /etc/bind/named.conf :

logging {                                                                                            
        channel default_file { file "/var/log/bind.log" versions 3 size 5m; severity dynamic; print-t
        category default { default_file; };                                                          
        category general { default_file; };                                                          
        category database { default_file; };                                                         
        category security { default_file; };                                                         
        category config { default_file; };                                                           
        category resolver { default_file; };                                                         
        category xfer-in { default_file; };                                                          
        category xfer-out { default_file; };                                                         
        category notify { default_file; };                                                           
        category client { default_file; };                                                           
        category unmatched { default_file; };                                                        
        category queries { default_file; };                                                          
        category network { default_file; };                                                          
        category update { default_file; };                                                           
        category dispatch { default_file; };                                                         
        category dnssec { default_file; };                                                           
        category lame-servers { default_file; };                                                     
};   

Vérifier les logs et adapter puis une fois que ça marche désactiver les logs et supprimer les fichiers on dispose de peu d'espace disque sur ces petits routeur.

Tests

Tester la réponse du dns

# dig ns.guidtz.local

; <<>> DiG 9.9.4 <<>> ns.guidtz.local
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9297
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ns.guidtz.local.        IN    A

;; ANSWER SECTION:
ns.guidtz.local.    1200    IN    A    192.168.10.250

;; AUTHORITY SECTION:
guidtz.local.        1200    IN    NS    ns.guidtz.local.

;; Query time: 5 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Apr 02 14:33:18 CEST 2015
;; MSG SIZE  rcvd: 74

Effacer une info du cache :

# rndc flushname google.com

Voilà un petit serveur dns local qui fonctionne très bien.