Archives pour la catégorie ‘DNS’

Unbound : mise en place d’un fake DNS

La mise en place d’une cache DNS peut être nécessaire pour bypasser le résultat de requêtes DNS.

# apt-get install unbound
# vim /etc/resolv.conf
# cat /etc/unbound/unbound.conf
 
server:
    local-zone: "my.domain." static
    local-data: "fake.my.domain. IN A 10.20.2.22"
    local-data-ptr: "10.20.2.22 fake.my.domain"

Amazon Route 53 : alias sur le root domain

route53_root_alias

CloudFlare : redirection du root domain vers un CNAME

Dans le cas d’un hébergement web de type cloud, il est impossible de déclarer un CNAME au niveau du root domain (alias @).

Avec  CloudFlare, la solution est de déclarer l’alias @ avec une IP publique (quelle qu’elle soit) afin qu’il soit possible d’activer la mise en cache (qui sera donc obligatoire) et d’ajouter les pages rules suivantes :

  • Forward http://monsite.fr/* to http://www.monsite.fr/$1
  • Forward http://monsite.fr to http://www.monsite.fr/

Les reverse proxy Nginx de CloudFlare renverront ainsi une redirection 302 jusqu’au navigateur client.

Bind: cache forward & error (no valid RRSIG) resolving

Dec  2 11:21:22 vmb-ld7-proxydns named[3951]: error (no valid RRSIG) resolving 'google.fr/DS/IN': 192.168.0.153#53
root@proxydns:~# nano /etc/bind/named.conf.options
options {

        forward only;
        forwarders {
                192.168.0.153;
                192.168.0.154;
        };

        //dnssec-validation auto;
        dnssec-enable no;
        dnssec-validation no;
};

Remarque : la désactivation de DNSSEC ne devrait être faite que dans le cas d’un serveur de cache interne, limité à un groupe de travail.

Bind : configuration d’une zone de reverse IPv6

root@sd-42307:~# ipv6calc --out revnibbles.arpa  2001:0bc8:3248::/48
No input type specified, try autodetection...found type: ipv6addr
8.4.2.3.8.c.b.0.1.0.0.2.ip6.arpa.
root@sd-42307:~# cat /etc/bind/named.conf.local
zone "8.4.2.3.8.c.b.0.1.0.0.2.ip6.arpa"
{
        type master;
        file "/etc/bind/db.8.4.2.3.8.c.b.0.1.0.0.2.ip6.arpa";
};
root@sd-42307:~# cat /etc/bind/db.8.4.2.3.8.c.b.0.1.0.0.2.ip6.arpa
$TTL 1h	; Default TTL
@	IN	SOA	ns1.hbis.fr.	ns2.hbis.fr. (
	2013112101	; serial
	1h		; slave refresh interval
	15m		; slave retry interval
	1w		; slave copy expire time
	1h		; NXDOMAIN cache time
	)

@	IN	NS	ns1.hbis.fr.
@	IN	NS	ns2.hbis.fr.

1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.1.0.8.4.2.3.8.c.b.0.1.0.0.2.ip6.arpa. IN PTR blog.hbis.fr.

Nagios : sonde check DNS

Je vous joins ici la sonde Nagios que j’utilise pour vérifier des enregistrements DNS.

Plusieurs serveurs DNS peuvent être interrogés et leurs réponses vérifiées. Un seuil d’alerte critique/avertissement est configurable. La sonde renvoie également des performance data pour générer des graphes pour chaque serveur interrogé.

#!/usr/bin/perl -w

#
# This plugin checks DNS nameservers resolution.
#
# Boris HUISGEN <bhuisgen@hbis.fr>
#

use strict;
use warnings;

use NetAddr::IP::Util qw( inet_ntoa inet_n2dx );
use Nagios::Plugin;
use Net::DNS::Dig qw( :forceEmu ndd_gethostbyaddr ndd_gethostbyname ndd_gethostbyname2 AF_INET AF_INET6 );
use Switch;

my $np = Nagios::Plugin->new(
   shortname => 'DNS',
   version   => '0.1',
   blurb     => "This plugin checks DNS nameservers resolution.",
   usage     => "Usage: %s -Q  -T  -S <SERVER1[,SERVER2 ...]> [-R [RDATA1[,RDATA2 ...]] [-w warn] [-c crit] [--debug]",
   timeout   => 15
);

$np->add_arg(
   spec     => 'query|Q=s',
   help     => '-Q ',
   required => 1
);

$np->add_arg(
   spec     => 'type|T=s',
   help     => '-T ',
   required => 1
);

$np->add_arg(
   spec     => 'servers|S=s',
   help     => '-S ',
   required => 1
);

$np->add_arg(
   spec     => 'rdatas|R=s',
   help     => '-R ',
   required => 0,
   default => ""
);

$np->add_arg(
   spec     => 'warn|w=i',
   help     => '-warn <time>',
   required => 0,
   default => 1000
);

$np->add_arg(
   spec     => 'crit|c=i',
   help     => '-crit <time>',
   required => 0,
   default => 1500
);

$np->add_arg(
   spec     => 'debug|d',
   help     => '--debug',
   required => 0,
   default => 0
);

$np->getopts;
alarm $np->opts->timeout;

my @servers = ("host");
my @rdatas = "";

@servers = split(",", $np->opts->servers) if (defined $np->opts->servers && $np->opts->servers ne "");

@rdatas = split(",", $np->opts->rdatas) if (defined $np->opts->rdatas && $np->opts->rdatas ne "");

my $max_time = 0;
my $index = 0;

foreach (@servers)
	{
   		my $server = $_;

   		my $config = {
      				Timeout   => 10,
      				PeerAddr  => $server,
      				PeerPort  => 53,
      				Proto     => 'UDP',
      				Recursion => 1
   			     };

		my $response = Net::DNS::Dig->new($config)->for($np->opts->query, $np->opts->type)
			or $np->nagios_exit(CRITICAL, $np->opts->query . "," . $np->opts->type . " - failed to resolve on server $server");

   		$max_time = $response->{ELAPSED} if ($response->{ELAPSED} > $max_time);

   		my (@results) = $response->rdata();
   		my $found = 0;

		switch ($np->opts->type)
		{
      			case "A"
			{
         			foreach (@results)
				{
            				my ($result) = inet_ntoa($_);
            				$found++;

        				if ((scalar @rdatas > 0) && ($rdatas[0] ne "") && (grep(/^$result$/, @rdatas) eq 0))
					{
               					$found = -1;
               					last;
            				}
         			}
      			}

	      		case "AAAA"
			{
         			foreach (@results)
				{
            				my ($result) = inet_n2dx($_);
            				$found++;

            				if ((scalar @rdatas > 0) && ($rdatas[0] ne "") && (grep(/^$result$/, @rdatas) eq 0))
					{
               					$found = -1;
               					last;
            				}
         			}
      			}

      			else
			{
         			foreach (@results)
				{
            				my ($result) = $_;
            				$found++;

            				if ((scalar @rdatas > 0) && ($rdatas[0] ne "") && (grep(/^$result$/, @rdatas) eq 0))
					{               					$found = -1;               					last;
            				}
         			}
      			}
		}

		$np->nagios_exit(CRITICAL, $np->opts->query . "," . $np->opts->type . " - unexpected rdata found on server $server") if ($found eq -1);
   		$np->nagios_exit(CRITICAL, $np->opts->query . "," . $np->opts->type . " - none rdata found") if ($found eq 0);
   		$np->nagios_exit(CRITICAL, $np->opts->query . "," . $np->opts->type . " - some rdatas not found") if ($found < $#rdatas);
    		$np->add_perfdata(label => "server_$index", value => $response->{ELAPSED}, uom => "ms");
   		$index++;

   		$np->nagios_exit(CRITICAL, $np->opts->query . "," . $np->opts->type . " - slow resolution time from server $server") if ($response->{ELAPSED} >= $np->opts->crit);
   		$np->nagios_exit(WARNING, $np->opts->query . "," . $np->opts->type . " - slow resolution time from server $server") if ($response->{ELAPSED} >= $np->opts->warn);
	}

$np->nagios_exit(OK, $max_time . " ms maximum response time");

# END
$np->nagios_exit(UNKNOWN,"unexpected end of script");

Exemple d’utilisation :

root@muse:~# /usr/lib/nagios/plugins/check_dns -Q blog.hbis.fr -T A -S 173.246.97.2,217.70.184.40,217.70.182.20 -R 37.59.126.51 -d
DNS OK - 22 ms maximum response time | server_0=20ms;; server_1=20ms;; server_2=22ms;;

Bind : serveur DNS en forward uniquement (cache DNS)

root@srv-beta:~# nano /etc/bind/named.conf.options
options {
        [...]

        forward only;
        forwarders { 10.0.2.221; 10.0.2.222; };

        [...]
};

cli53 : client de gestion du service DNS Amazon Route 53

A command line script to administer the Amazon Route 53 DNS service :

https://github.com/barnybug/cli53

Unbound : optimisation de la configuration

root@srv01:~# nano /etc/unbound/unbound.conf
server:
# use all CPUs
num-threads: <number of cores>

msg-cache-slabs: <2^num-threads>
rrset-cache-slabs: <2^num-threads>
infra-cache-slabs: <2^num-threads>
key-cache-slabs: <2^num-threads>

# more cache memory, rrset=msg*2
rrset-cache-size: 100m
msg-cache-size: 50m

# more outgoing connections
# depends on number of cores: 1024/cores - 50
outgoing-range: 950

# larger socket buffer
so-rcvbuf: 4m
so-sndbuf: 4m

Bind : sécuriser les communications serveurs

TSIG – Transaction Signatures Configuration – est un mécanisme simple de sécurisation du dialogue entre un serveur DNS master et ses slaves. Sachant qu’un client peut usurper son adresse IP source, la protection du transfert de zones par ACL n’est pas suffisante. TSIG s’appuie sur une clé asymétrique pour chiffrer le dialogue DNS et garantir l’authenticité d’un serveur (par partage de la clé publique). Si vous souhaitez sécuriser les données DNS de bout en bout (des serveurs aux clients/résolveurs DNS), il faudra voir du côté de DNSSEC qui pousse le chiffrement jusqu’à chaque enregistrement des zones.

Voici les points nécessaires à la mise en place de TSIG entre un master et un slave.

Serveur master

Les clé privée/publique TSIG sont à générer en premier lieu  :

master# cd /etc/namedb
master# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST tsig-key
master# cat Ktsig-key.+157+27548.key
tsig-key. IN KEY 512 3 157 kvd6eDiceCdADTj+dp99kA==

La clé publique est à copier dans le fichier de configuration tsig.key :

master# nano tsig.key
key "TRANSFER" {
   algorithm hmac-md5;
   secret "kvd6eDiceCdADTj+dp99kA==";
};

server 88.8.8.8 {
   keys {
      TRANSFER;
   };
};

Ce fichier declare l’ensemble des serveurs slaves autorisés pour le transfert des zones (ici 88.8.8.8).

Reste à inclure le support TSIG et limiter le transfert de chaque zone DNS dans le fichier de configuration principal :

master# nano /etc/bind/named.conf
include "/etc/bind/tsig.key";

options {
   allow-transfer {
      88.8.8.8;
      key TRANSFER;
   };
}

Le transfert de zones est ici autorisé globalement, mais il peut être limité à une zone.

Serveur slave

Sur le slave, seul le fichier de configuration tsig.key est nécessaire :

slave# cd /etc/namedb
slave# nano tsig.key
key "TRANSFER" {
   algorithm hmac-md5;
   secret "kvd6eDiceCdADTj+dp99kA==";
};

server 66.6.6.6 {
   keys {
      TRANSFER;
   };
};

Le serveur master y est indiqué (ici 66.6.6.6).

Reste à reloader les serveurs DNS et tester le transfert de zones en mettant à jour une zone sur le master.

Haut de page