# Dnsmasq : dans un conteneur {{INLINETOC}} Installer Dnsmasq, qui est le logiciel de serveur de transfert DHCP et de serveur DNS léger. ## Installer Dnsmasq depuis les dépôts ``` sudo apt-get -y install dnsmasq ``` ## Construire Dnsmasq depuis les sources ### Prérequis Installer les packages suivants ``` sudo apt-get update sudo apt-get -y install wget sudo apt-get -y install build-essential sudo apt-get -y install apt-utils sudo apt-get -y install pkg-config sudo apt-get -y install idn sudo apt-get -y install libidn11-dev sudo apt-get -y install gettext sudo apt-get -y -t wheezy-backports install nettle-dev sudo apt-get -y -t wheezy-backports install dnsutils ``` ### Récupérer les sources et construire les biniaires ``` wget http://www.thekelleys.org.uk/dnsmasq/dnsmasq-2.73.tar.gz tar xvzf dnsmasq-2.73.tar.gz cd dnsmasq-2.73 make all-i18n COPTS="-DHAVE_DNSSEC -DHAVE_DNSSEC_STATIC" ``` ### Réduire la taille ``` strip ./src/dnsmasq ``` ### Tester les binaires et déployer les binaires Le binaire dnsmasq doit se trouver à la base du dossier src ``` sudo cp ./src/dnsmasq /usr/sbin/dnsmasq ``` ## Configuration ### Configurer Dnsmasq. ``` vi /etc/dnsmasq.conf ``` le fichier dnsmasq.conf ressemble à ceci: ``` interface=eth0 user=root domain-needed bogus-priv no-resolv local=/mydomain.io/ no-poll server=/server.education/10.0.0.10 no-hosts addn-hosts=/etc/dnsmasq_static_hosts.conf expand-hosts domain=mydomain.io dhcp-range=192.168.2.10,192.168.2.250,255.255.255.0,192.168.2.255,5m # Have windows machine release on shutdown dhcp-option=vendor:MSFT,2,1i # No default route dhcp-option=3 ``` * **domain-needed**: ne jamais transmettre les noms simples (décommenter) * **bogus-priv**: ne jamais transférer les adresses dans les espaces adresse non routés (décommenter) * **strict-order**: interroger chaque serveur strictement dans l'ordre indiqué dans resolv.conf (décommenter) * **server=/server.education/10.0.0.10**: interroge le nom de domaine spécifique sur le serveur DNS spécifique l'exemple signifie que le domaine de la requête [server.education] est dirigé vers le serveur [10.0.0.10] (ajouter si besoin) * **expand-hosts**: ajouter le nom de domaine automatiquement (décommenter) * **domain=mydomain.io**: définir le nom de domaine (ajouter) * **`dhcp-range`**: La machine hôte a une adresse statique de 192.168.2.2. Démarrer dnsmasq ``` systemctl start dnsmasq systemctl enable dnsmasq ``` ### Ajouter les enregistrements DNS, à /etc/hosts. Ensuite, Dnsmasq souhaite répondre aux requêtes des clients. ``` vi /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 # add records 10.0.0.30 dlp.srv.world dlp ``` Redémarrer le serveur ``` systemctl restart dnsmasq ``` ### Autoriser le service DNS dans firewalld ``` firewall-cmd --add-service=dns --permanent success firewall-cmd --reload success ``` ## Vérifier la résolution du nom Vérifier la résolution du nom ou de l'adresse IP d'un client du réseau interne. Installer bind-utils ``` yum -y install bind-utils ``` Modifier les paramètres de l'environnement pour pointer vers le serveur Dnsmasq (remplacer "ens3" par l'interface réseau actif ``` nmcli c modify ens3 ipv4.dns 10.0.0.30 nmcli c down ens3; nmcli c up ens3 ``` Tester la résolution de noms ``` dig dlp.srv.world. ; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> dlp.srv.world ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11613 ;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;dlp.srv.world. IN A ;; ANSWER SECTION: dlp.srv.world. 0 IN A 10.0.0.30 ;; Query time: 2 msec ;; SERVER: 10.0.0.30#53(10.0.0.30) ;; WHEN: Wed Aug 31 17:22:51 JST 2016 ;; MSG SIZE rcvd: 47 ``` et la résolution inverse ``` dig -x 10.0.0.30 ; <<>> DiG 9.9.4-RedHat-9.9.4-29.el7_2.3 <<>> -x 10.0.0.30 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61937 ;; flags: qr aa rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;30.0.0.10.in-addr.arpa. IN PTR ;; ANSWER SECTION: 30.0.0.10.in-addr.arpa. 0 IN PTR dlp.srv.world. ;; Query time: 3 msec ;; SERVER: 10.0.0.30#53(10.0.0.30) ;; WHEN: Wed Aug 31 17:24:00 JST 2016 ;; MSG SIZE rcvd: 67 ``` ## Exécution du conteneur Le conteneur veut avoir ses propres interfaces sur un sous-réseau virtuel (le réseau de ponts docker0). Donc, il veut essayer d'offrir des adresses sur ce sous-réseau. Utiliser --net host dans la commande `docker run` afin de garantir que le conteneur utilise la pile de réseau de l'hôte plutôt que la sienne ``` docker run --name dnsmasq2 -t -v /vagrant/dnsmasq.conf:/opt/dnsmasq.conf -p 67:67/udp --net host centos ```