Configurer un serveur DNS Bind sur Debian
Bind est un serveur de noms de domaine très répandu dans le monde Unix. Sa grande puissance s'accompagne malheureusement d'une certaine complexité de configuration. Cet article essaye de regrouper les options de configuration importantes de Bind 9.
Ce guide est testé sur:
- Debian 6.0 Squeeze
- Debian 7.0 Wheezy
Installation
Installez le serveur:
command apt-get install bind9
La configuration du serveur est gérée par ces deux fichiers:
- /etc/bind9/named.conf.options: les options du DNS : autorisations d'accès, redirection de DNS, recursion, etc.
- /etc/bind9/named.conf.local: les zones gérées par le serveur DNS.
Journaux
Créez le dossier destiné à contenir les journaux de Bind:
command mkdir --parent '/var/log/named/'
command chown -R bind:bind '/var/log/named/'
Activez la journalisation des événements concernant la sécurité du serveur:
if [ ! -e '/etc/bind/named.conf.logging' ]; then
echo '
logging {
// Logging security events for fail2ban
channel security_file {
file "/var/log/named/security.log" versions 3 size 30m;
severity dynamic;
print-time yes;
};
category security {
security_file;
};
// Logging queries for Munin
channel b_query {
file "/var/log/named/query.log" versions 2 size 1m;
print-time yes;
severity info;
};
category queries {
b_query;
};
};' > '/etc/bind/named.conf.logging'
echo '// Include logging configuration.
include "/etc/bind/named.conf.logging";
' >> '/etc/bind/named.conf.options'
fi
Configurez la rotation des journaux:
echo '/var/log/named/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 644 bind bind
postrotate
/usr/sbin/invoke-rc.d bind9 reload > /dev/null
endscript
}' > '/etc/logrotate.d/bind9'
Rechargez la configuration:
/etc/init.d/bind9 restart
Sécurité
Installez fail2ban:
command apt-get install fail2ban
Activez la sécurisation de Bind par fail2ban:
if [ ! -e '/etc/fail2ban/jail.local' ]; then
command touch '/etc/fail2ban/jail.local'
fi
if [ -z "$(command grep "[named-refused-tcp]" '/etc/fail2ban/jail.local')" ]; then
echo "
[named-refused-tcp]
enabled = true
" >> '/etc/fail2ban/jail.local'
fi
Rechargez la configuration:
/etc/init.d/fail2ban restart
Redirections
Le serveur DNS peut obtenir les informations sur les zones depuis les serveurs maîtres, ou depuis les serveurs DNS du fournisseur d'accès à Internet. Cette dernière méthode est préférable car normalement plus rapide.
Détectez les serveurs DNS du F.A.I.:
NAME_SERVERS=$(command grep 'nameserver' '/etc/resolv.conf' \
| command sed -e 's/^.*nameserver[\t ]*//' \
-e 's/^\(.*\)$/\t\t\1\\;\\/' \
| command egrep -v '127\.')
Une alternative est d'utiliser les serveurs du projet OpenDNS:
NAME_SERVERS="\t\t208.67.222.222\\;\\
\t\t208.67.220.220\\;\\"
Redirigez les requêtes DNS vers les serveurs sélectionnés:
if [ -n "${NAME_SERVERS}" ]; then
command sed -i \
-e '/^[ \t]*forwarders/,/^[ \t]*};/d' \
-e "/directory/a\\
\\
\t// Forwarding DNS queries to ISP DNS.\\
\tforwarders {\\
${NAME_SERVERS}
\t}\\;" '/etc/bind/named.conf.options'
fi
Rechargez la configuration:
/etc/init.d/bind9 reload
Configurez le système pour utiliser le serveur DNS local:
command sed -i -e 's/^\([ \t]*nameserver\)/#\1/' '/etc/resolv.conf'
command echo 'nameserver 127.0.0.1' >> '/etc/resolv.conf'
Utilisation par le réseau local
Par défaut, le serveur DNS n'est utilisable que par l'hôte local. Il est nécessaire d'autoriser spécifiquement les plages d'adresses IP autorisées à l'utiliser.
Détectez les plages d'adresses IP de vos interfaces réseau:
IP_RANGES="$(command ifconfig \
| command grep "inet adr" \
| command sed -e 's/.*adr:\([^ ]*\) .*/\1/' \
| command egrep -v '127.0.0.1' \
| sed -e "s|^\(.*\)[^\.]*$|\t\10/24;|")"
Créez la liste des plages d'adresses des réseaux locaux:
command echo -e "
// Local networks access control list.
acl local-networks {
\t127.0.0.0/8;
${IP_RANGES}
};" >> '/etc/bind/named.conf.options'
Autorisez les requêtes en provenance des réseaux locaux:
command sed -i -e '/directory/a\
\
\t// Allowing queries for local networks.\
\tallow-query {\
\t\tlocal-networks\;\
\t}\;\
\
\t// Allowing recursion for local networks.\
\tallow-recursion {\
\t\tlocal-networks\;\
\t}\;' '/etc/bind/named.conf.options'
Rechargez la configuration du serveur:
/etc/init.d/bind9 reload
Configuration
Initialisation d'un domaine
Pour ajouter la gestion d'un domaine au serveur, renseignez le nom du domaine:
DOMAIN="domaine-exemple.fr"
Renseignez l'adresse IPv4 du domaine:
DOMAIN_IP="XX.XX.XX.XX"
Renseignez le nom d'hôte de votre serveur DNS (par défault, la valeur de ${HOSTNAME}):
DNS_SERVER="${HOSTNAME}"
Créez le fichier de zone pour le domaine:
echo "\$ttl 86400
${DOMAIN}. IN SOA ${DNS_SERVER}. postmaster.${DOMAIN}. (
2010111504; Serial
3600; refresh after 3 hours.
3600; Retry after 1 hour.
1209600; expire after 1 week.
86400; Minimum TTL of 1 day.
);
;
; Name servers declaration.
;
${DOMAIN}. IN NS ${DNS_SERVER}.;
${DOMAIN}. IN NS sdns2.ovh.net.;
;
; Hostnames declaration.
;
${DOMAIN}. IN A ${DOMAIN_IP};
" > "/etc/bind/db.${DOMAIN}"
Ajoutez la zone au serveur:
if [ -z "$(command grep "${DOMAIN}" "/etc/bind/named.conf.local")" ]; then
echo "
zone \"${DOMAIN}\" in {
type master;
file \"/etc/bind/db.${DOMAIN}\";
allow-query { any; };
};
" >> "/etc/bind/named.conf.local"
fi
Rechargez la configuration:
/etc/init.d/bind9 reload
Vérifiez que la configuration a bien été prise en compte:
command tail -n 50 "/var/log/daemon.log"
Vérification d'un domaine
Il est très important de vérifier que votre zone DNS est configurée correctement. Voici 3 outils permettant de contrôler votre serveur:
Configurations spécifiques
Serveur SMTP
Les enregistrement MX sont utilisé pour déclarer la gestion des emails d'un domaine par un serveur SMTP. L'enregistrement du nom du serveur SMTP doit être de type "A" (IPv4) et/ou "AAAA" (IPv6). Par exemple:
smtp.mon-domaine.com. IN A XX.XX.XX.XX;
mon-domaine.com. IN MX 10 smtp.mon-domaine.com.;
La valeur "10" placée sur la ligne d'enregistrement MX permet de prioritiser les serveurs SMTP. Vous pouvez mettre en place plusieurs serveurs SMTP pour un même domaine.
Windows Live Mail utilise le Sender Policy Framework (SPF) pour vérifier si les emails reçus sont des spams. Pour implémenter cet outil, il faut créer un enregistrement TXT contenant la configuration SPF: la liste des serveurs pouvant envoyer des e-mails en provenance du domaine @mon-domaine.com.
Par exemple, si le même serveur est utilisé pour l'expédition et la réception des emails du domaine mon-domaine.com, utilisez l'enregistrement:
mon-domaine.com. IN TXT "v=spf1 mx ~all"
Si votre configuration est plus complexe, vous pouvez utiliser un générateur de configuration Sender ID.
Si vos domaines sont gérés par OVH, ce dernier propose un générateur de configuration SPF dans l'administration du domaine.
Vous pouvez (devez ?) ensuite signaler à Windows Live Mail que votre domaine possède un enregistrement SPF en remplissant le formulaire https://support.msn.com/eform.aspx?productKey=senderid&ct=eformts
Serveur XMPP (Jabber)
Le protocole XMPP utilise des enregistrements SRV pour obtenir l'adresse des serveurs d'un domaine donné. Voici les lignes à ajouter à une zone dont le serveur XMPP est "mail.example.com" écoutant sur les ports 5222 et 5269.
; XMPP
_xmpp-server._tcp 3600 IN SRV 10 0 5269 mail.example.com.
_xmpp-server._udp 3600 IN SRV 10 0 5269 mail.example.com.
_xmpp-client._tcp 3600 IN SRV 10 0 5222 mail.example.com.
_xmpp-client._udp 3600 IN SRV 10 0 5222 mail.example.com.
_jabber._tcp 3600 IN SRV 10 0 5269 mail.example.com.
_jabber._udp 3600 IN SRV 10 0 5269 mail.example.com.
_jabber-client._tcp 3600 IN SRV 10 0 5222 mail.example.com.
_jabber-client._udp 3600 IN SRV 10 0 5222 mail.example.com.
Références
Ces livres peuvent vous aider:
Remerciements
- Merci aux développeurs de Bind 9.
- Merci à l'auteur de l'article OpenDNS: Un DNS rapide et utile sur Comment Ça Marche.
- Merci à Thom pour son post DNS SRV records for SIP and XMPP.
- Merci à Samuel ROZE pour son article configurer Sender ID et DomainKeys.
- Merci à OpenSPF pour leurs nombreux outils pour SPF.
- Merci à System-Linux.eu pour l'article Tester la configuration de son serveur DNS Bind9.
- Merci à l'auteur de HOWTO Implement GeoDNS using BIND & MaxMind.