SwordArMor

knot : reverse automatique et DNSSEC

Reverse simple

Il peut arriver, pour une raison X ou Y, que vous ayez envie de servir des reverses DNS sur une grande plage d’adresses IP. Par exemple, admettons que votre FAI vous route tout un bloc, vous n’allez pas entrer chaque reverse pour chaque machine qui reçoit une IP.

knot a un module nommé mod-synth-record qui permet cela. Son utilisation est relativement simple. On commence par définir deux zones basiques. Une pour servir les PTR, et l’autre pour servir les A/AAAA associés. En effet, un reverse doit marcher dans les deux sens.
Zone de résolution directe :

@	864000	IN	SOA	tregon-grifon.swordarmor.fr. hostmaster.swordarmor.fr. (
		2 3600 900 1209600 43200 )

	864000	IN	NS	tregon-grifon.swordarmor.fr.

		IN	AAAA	2a00:5884:8316::1
			A	89.234.186.16
Zone de résolution inverse :
@	864000	IN	SOA	tregon-grifon.swordarmor.fr. hostmaster.swordarmor.fr. (
		2 3600 900 1209600 43200 )
	864000	IN	NS	tregon-grifon.swordarmor.fr.
Ensuite, nous expliquons à knot comment remplir ces deux zones automatiquement :
mod-synth-record:
  - id: tregon-grifon
    type: forward
    prefix: ip6-
    ttl: 400
    network: 2a00:5884:8316::/48

mod-synth-record:
  - id: tregon-grifon-reverse
    type: reverse
    prefix: ip6-
    origin: tregon-grifon.swordarmor.fr
    ttl: 400
    network: 2a00:5884:8316::/48
Puis nous précisons à knot qu’il faut utiliser ces modules pour les deux zones :
  - domain: tregon-grifon.swordarmor.fr
    file: tregon-grifon.swordarmor.fr.zone # Must exist
    module: mod-synth-record/tregon-grifon

  - domain: 6.1.3.8.4.8.8.5.0.0.a.2.ip6.arpa
    file: 6.1.3.8.4.8.8.5.0.0.a.2.ip6.arpa.zone # Must exist
    module: mod-synth-record/tregon-grifon-reverse
Notre serveur DNS est maintenant en capacité de répondre au A et au PTR :
alarig@pikachu ~ % dig +short -x 2a00:5884:8316::1234 @tregon-grifon.swordarmor.fr
ip6-2a00-5884-8316-0000-0000-0000-0000-1234.tregon-grifon.swordarmor.fr.
alarig@pikachu ~ % dig +short -t AAAA ip6-2a00-5884-8316-0000-0000-0000-0000-1234.tregon-grifon.swordarmor.fr. @tregon-grifon.swordarmor.fr
2a00:5884:8316::1234

Et nous pouvons même définir des reverses personnalisés en les mettant dans le fichier de zone.

1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0 IN PTR tregon-grifon.swordarmor.fr.
6.2.4.c.f.6.5.5.d.7.4.d.0.4.d.f.3.5.6.2 IN PTR pika-tregon.swordarmor.fr.
alarig@pikachu ~ % dig +short -x 2a00:5884:8316::1 @tregon-grifon.swordarmor.fr
tregon-grifon.swordarmor.fr.
alarig@pikachu ~ % dig +short -x 2a00:5884:8316:2653:fd40:d47d:556f:c426 @tregon-grifon.swordarmor.fr
pika-tregon.swordarmor.fr.

Mettons maintenant un peu de DNSSEC

(parce que c’est très important d’avoir du DNSSEC sur un reverse)

Arrivé ici, nous pouvons nous dire que knot va, comme à son habitude, gérer le DNSSEC comme un grand sans rien avoir besoin de toucher.
Alors oui et non. Il va générer les RRSIG pour les RRs que nous avons entré dans notre zone (c’est à dire ici un A, un NS, un SOA, un AAAA, plus le NSEC et le DNSKEY générés par knot), mais pas pour tout ce qui est généré à la volée, nous avons un SERVFAIL au lieu d’une réponse.

alarig@pikachu ~ % dig -t RRSIG tregon-grifon.swordarmor.fr.

; <<>> DiG 9.10.4-P3 <<>> -t RRSIG tregon-grifon.swordarmor.fr.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53081
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;tregon-grifon.swordarmor.fr.	IN	RRSIG

;; ANSWER SECTION:
tregon-grifon.swordarmor.fr. 3600 IN	RRSIG	A 13 3 3600 20161208210625 20161124210625 28440 tregon-grifon.swordarmor.fr. YlT/vCMLDyGHwKLoMOdQqENwWTyhphrbBatKhhtvCteTubwBp9FCrf9b /jc0cRM07a321de7kw3cYPD3lfbPYA==
tregon-grifon.swordarmor.fr. 864000 IN	RRSIG	NS 13 3 864000 20161208210625 20161124210625 28440 tregon-grifon.swordarmor.fr. l6HiWFaqz3Hys7aknEHEG6woKJ9xdYqopxNUTOYmMk94733jMnDiH5bx fDKGPjgyVCkbQWfFsJCr/udwnelSaQ==
tregon-grifon.swordarmor.fr. 864000 IN	RRSIG	SOA 13 3 864000 20161208210625 20161124210625 28440 tregon-grifon.swordarmor.fr. OUWibAYe8oyRBWgGyPAxG0etUcGQe1ZEZ+1ywZIi1xQvhWMQy/0B+HNH RyQYYdJ9eXqXPP3uQRyXPTtsa+9KKQ==
tregon-grifon.swordarmor.fr. 3600 IN	RRSIG	AAAA 13 3 3600 20161208210625 20161124210625 28440 tregon-grifon.swordarmor.fr. NIEEeURn0/RH9IqWxGM9W74Gf8UqDh4Bqap0NlZ4XQ+95FpfylAQKxo0 KZUNCDCXCFQ4Rpg/dJH4EhpWw8Pxtw==
tregon-grifon.swordarmor.fr. 43200 IN	RRSIG	NSEC 13 3 43200 20161208210625 20161124210625 28440 tregon-grifon.swordarmor.fr. 6T2+GjrRU8qU/zGNmY8R9bmkNUFGPJuJQP2qkhakV0GeiyseEWA5yPDE /YIELH04KKAE3yrudo8S6xcaQ6DveQ==
tregon-grifon.swordarmor.fr. 864000 IN	RRSIG	DNSKEY 13 3 864000 20161208210625 20161124210625 57104 tregon-grifon.swordarmor.fr. F/jepDBqQriHFUSN8mnkiNZ6l3vP5K8ob44yuHkHBupimIo4S6hvuZXD F7AnbF5GtVsZPDdjA4qumkv1HaiTFQ==

;; Query time: 160 msec
;; SERVER: 2a00:5884:8218::1#53(2a00:5884:8218::1)
;; WHEN: Mon Nov 28 11:02:27 CET 2016
;; MSG SIZE  rcvd: 794

alarig@pikachu ~ % dig -t RRSIG ip6-2a00-5884-8316-2653-fd40-d47d-556f-c427.tregon-grifon.swordarmor.fr.

; <<>> DiG 9.10.4-P3 <<>> -t RRSIG ip6-2a00-5884-8316-2653-fd40-d47d-556f-c427.tregon-grifon.swordarmor.fr.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 27161
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ip6-2a00-5884-8316-2653-fd40-d47d-556f-c427.tregon-grifon.swordarmor.fr. IN RRSIG

;; Query time: 457 msec
;; SERVER: 2a00:5884:8218::1#53(2a00:5884:8218::1)
;; WHEN: Mon Nov 28 11:02:33 CET 2016
;; MSG SIZE  rcvd: 100

Mais l’équipe de nic.cz a déjà pensé à tout en développant un autre module qui permet de signer toute une zone à la volée. Il s’agît de mod-online-sign.
Par contre, ce module n’a pas encore été mis à jour pour supporter la nouvelle mouture de gestion DNSSEC, il faut toujours utiliser keymgr en mode de compatibilité (option -l). Il est important de noter que le fichier de zone référencé dans la configuration ne doit pas comporter de signatures DNSSEC et que le système de signature classique doit être désactivé.
Nous avons donc une configuration comme ceci :

template:
  - id: default
    storage: "/var/lib/knot"
    kasp-db: kasp

mod-online-sign:
   - id: default
  - domain: tregon-grifon.swordarmor.fr
    file: tregon-grifon.swordarmor.fr.zone.nodnssec # Must exist
    module: [mod-synth-record/tregon-grifon, mod-online-sign/default]
    dnssec-signing: false
Et nous générons les clés comme à la bonne époque :
eddy ~ # mkdir /var/lib/knot/kasp
eddy ~ # chown knot: /var/lib/knot/kasp/
eddy ~ # su - knot -s /bin/sh 
No directory, logging in with HOME=/
$ cd /var/lib/knot/kasp/
$ keymgr -l init
$ keymgr -l zone add tregon-grifon.swordarmor.fr
$ keymgr -l zone key generate tregon-grifon.swordarmor.fr algorithm ecdsap256sha256 size 256
# je n’ai pas généré de clé pour 6.1.3.8.4.8.8.5.0.0.a.2.ip6.arpa. car
# 4.8.8.5.0.0.a.2.ip6.arpa. n’est pas encore signé
Pour finir, nous devons publier le DS dans la zone parente, ainsi que le NS pour la délégation et le glue record, comme toujours en DNS.
tregon-grifon.swordarmor.fr.	10800	A	89.234.186.16
tregon-grifon.swordarmor.fr.	10800	AAAA	2a00:5884:8316::1
tregon-grifon.swordarmor.fr.	10800	NS	tregon-grifon.swordarmor.fr.
tregon-grifon.swordarmor.fr.	10800	DS	(22942 13 2 E4E1B6EFF9D473905D0DA9C5C6CF43D9BC38E73D44E9579723748D8CD8AE3C1C)

Et maintenant, si nous demandons un AAAA autogénéré pour cette zone, nous avons bien le flag ad pour Autentic Data, c’est à dire que la vérification DNSSEC a fonctionné.

alarig@pikachu ~ % dig -t AAAA ip6-2a00-5884-8316-2653-fd40-d47d-556f-c427.tregon-grifon.swordarmor.fr.
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35285
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; ANSWER SECTION:
ip6-2a00-5884-8316-2653-fd40-d47d-556f-c427.tregon-grifon.swordarmor.fr. 400 IN	AAAA 2a00:5884:8316:2653:fd40:d47d:556f:c427

Redondance

Si vous gérez les reverses d’un range IP un temps soit peu conséquent (on va dire, un /24 d’un FAI par exemple), il est plus que probable que vous vouliez un peu de redondance.

Sachez alors qu’il faudra soit utiliser un autre knot, soit utiliser un autre système de reverse automatique si vous ne voulez pas avoir deux knot pour cette zone. En effet, les enregistrements étant générés à la volée, il n’est pas possible de faire un transfert de la zone complète comme nous en avons l’habitude.

Cependant, il faudra tout de même commencer par avoir une réplication des zones originales.
Sur le master :


remote:
  - id: freebsd
    address: 2a01:cb08:898c:fc00:5054:ff:fe0e:b8e

acl:
  - id: acl_freebsd
    address: 2a01:cb08:898c:fc00:5054:ff:fe0e:b8e
    action: transfer

  - domain: tregon-grifon.swordarmor.fr
    file: tregon-grifon.swordarmor.fr.zone.nodnssec # Must exist
    module: [mod-synth-record/tregon-grifon, mod-online-sign/default]
    dnssec-signing: false
    notify: freebsd
    acl: acl_freebsd

  - domain: 6.1.3.8.4.8.8.5.0.0.a.2.ip6.arpa
    file: 6.1.3.8.4.8.8.5.0.0.a.2.ip6.arpa.zone.nodnssec # Must exist
    module: [mod-synth-record/tregon-grifon-reverse, mod-online-sign/default]
    dnssec-signing: false
    notify: freebsd
    acl: acl_freebsd
Par rapport à la configuration précédente, nous n’avons fait que ajouter une machine, donner le droit la notifier de la mise à jour de la zone, puis de l’assigner à nos deux zones. Sur cette machine (le slave), nous allons donc configurer le knot :

remote:
  - id: tregon
    address: 2a00:5884:8316::1

acl:
  - id: acl_tregon
    address: 2a00:5884:8316::1
    action: notify

template:
  - id: default
    storage: "/var/db/knot"
    kasp-db: kasp

mod-synth-record:
  - id: tregon-grifon
    type: forward
    prefix: ip6-
    ttl: 400
    network: 2a00:5884:8316::/48

mod-synth-record:
  - id: tregon-grifon-reverse
    type: reverse
    prefix: ip6-
    origin: tregon-grifon.swordarmor.fr
    ttl: 400
    network: 2a00:5884:8316::/48

mod-online-sign:
   - id: default

  - domain: tregon-grifon.swordarmor.fr
    file: tregon-grifon.swordarmor.fr.zone
    master: tregon
    acl: acl_tregon
    module: [mod-synth-record/tregon-grifon, mod-online-sign/default]

  - domain: 6.1.3.8.4.8.8.5.0.0.a.2.ip6.arpa
    file: 6.1.3.8.4.8.8.5.0.0.a.2.ip6.arpa.zone
    master: tregon
    acl: acl_tregon
    module: [mod-synth-record/tregon-grifon-reverse, mod-online-sign/default]
Nous voyons ici qu’il faut également répéter la configuration de mod-synth-record et de mod-online-sign. En effet, tous les enregistrements issus de ces modules sont générés à la volée, ils ne sont donc pas à proprement parler dans la zone. Le daemon knot va les recalculer à chaque requête, alors que pour une zone classique, il se contente d’aller lire le fichier.

Aussi, pour que le DNSSEC soit disponible sur les deux serveurs, il faut avoir une copie de la KSK sur chaque serveur : scp -r /var/lib/knot/kasp/ root@freebsd.swordarmor.fr:/var/db/knot/.
Ici j’ai copié tout le dossier car je n’ai pas d’autre clé, mais il est plus sage de ne copier que les fichiers nécessaires.

Si nous testons, nous voyons que notre nouveau serveur répond bien les résultats attendus, accompagnés de leur RRSIG :

alarig@pikachu ~ % dig +dnssec -x 2a00:5884:8316:2653:fd40:d47d:556f:c426 @freebsd.swordarmor.fr                  

; <<>> DiG 9.10.4-P4 <<>> +dnssec -x 2a00:5884:8316:2653:fd40:d47d:556f:c426 @freebsd.swordarmor.fr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59166
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;6.2.4.c.f.6.5.5.d.7.4.d.0.4.d.f.3.5.6.2.6.1.3.8.4.8.8.5.0.0.a.2.ip6.arpa. IN PTR

;; ANSWER SECTION:
6.2.4.c.f.6.5.5.d.7.4.d.0.4.d.f.3.5.6.2.6.1.3.8.4.8.8.5.0.0.a.2.ip6.arpa. 3600 IN PTR pika-tregon.swordarmor.fr.
6.2.4.c.f.6.5.5.d.7.4.d.0.4.d.f.3.5.6.2.6.1.3.8.4.8.8.5.0.0.a.2.ip6.arpa. 3600 IN RRSIG	PTR 13 34 3600 20170114212255 20170113202255 3655 6.1.3.8.4.8.8.5.0.0.a.2.ip6.arpa. 0YE68evOCjovGMoY8X/32mvWjAdEkEod/SjXPMTS5YGUvmH+gvo3R/hP H6yxOtMYygb+ZtXKakIVrIH65kV0GA==

;; Query time: 52 msec
;; SERVER: 2a01:cb08:898c:fc00:5054:ff:fe0e:b8e#53(2a01:cb08:898c:fc00:5054:ff:fe0e:b8e)
;; WHEN: Fri Jan 13 21:22:56 CET 2017
;; MSG SIZE  rcvd: 268

alarig@pikachu ~ % dig +dnssec -x 2a00:5884:8316::1234 @freebsd.swordarmor.fr      

; <<>> DiG 9.10.4-P4 <<>> +dnssec -x 2a00:5884:8316::1234 @freebsd.swordarmor.fr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13829
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;4.3.2.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.6.1.3.8.4.8.8.5.0.0.a.2.ip6.arpa. IN PTR

;; ANSWER SECTION:
4.3.2.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.6.1.3.8.4.8.8.5.0.0.a.2.ip6.arpa. 400 IN PTR ip6-2a00-5884-8316-0000-0000-0000-0000-1234.tregon-grifon.swordarmor.fr.
4.3.2.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.6.1.3.8.4.8.8.5.0.0.a.2.ip6.arpa. 400 IN RRSIG PTR 13 34 400 20170114210829 20170113200829 3655 6.1.3.8.4.8.8.5.0.0.a.2.ip6.arpa. QxPtzxT62oilXha9Ns4EyfOtj8fCBqhCCxI0SfKb4Yol61c2Pjum/DcZ fBIiMWdN+7VT6/Q2vs6S8uKjd1THOA==

;; Query time: 55 msec
;; SERVER: 2a01:cb08:898c:fc00:5054:ff:fe0e:b8e#53(2a01:cb08:898c:fc00:5054:ff:fe0e:b8e)
;; WHEN: Fri Jan 13 21:08:29 CET 2017
;; MSG SIZE  rcvd: 314

alarig@pikachu ~ % dig +dnssec -t AAAA ip6-2a00-5884-8316-0000-0000-0000-0000-1234.tregon-grifon.swordarmor.fr. @freebsd.swordarmor.fr

; <<>> DiG 9.10.4-P4 <<>> +dnssec -t AAAA ip6-2a00-5884-8316-0000-0000-0000-0000-1234.tregon-grifon.swordarmor.fr. @freebsd.swordarmor.fr
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58686
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
;; QUESTION SECTION:
;ip6-2a00-5884-8316-0000-0000-0000-0000-1234.tregon-grifon.swordarmor.fr. IN AAAA

;; ANSWER SECTION:
ip6-2a00-5884-8316-0000-0000-0000-0000-1234.tregon-grifon.swordarmor.fr. 400 IN	AAAA 2a00:5884:8316::1234
ip6-2a00-5884-8316-0000-0000-0000-0000-1234.tregon-grifon.swordarmor.fr. 400 IN	RRSIG AAAA 13 4 400 20170114212107 20170113202107 22942 tregon-grifon.swordarmor.fr. NpU/Q+vC3BzR1iLeqIWEWNlo0MMe+aUxDeVIkCd3Z5wUnwgmAsz9oXaS DjkGEfFvR3Wpbgp/RbjDlPNu7qhxqA==

;; Query time: 43 msec
;; SERVER: 2a01:cb08:898c:fc00:5054:ff:fe0e:b8e#53(2a01:cb08:898c:fc00:5054:ff:fe0e:b8e)
;; WHEN: Fri Jan 13 21:21:08 CET 2017
;; MSG SIZE  rcvd: 251

Documentation officielle de knot

Automatic reverse records
online-sign