DNS nicht DNA

Die Notiz habe ich im November 2020 geschrieben


Diese Woche habe ich ja viel gelernt über hidden-primary Setups, über Nameserver wie PowerDNS und CoreDNS, über DNS bei Plusserver, über AXFR und IXFR, über Openstack Designate, über Triton CNS, über DNS-Anbieter wie INWXCloudflare und deSEC. Dabei bin ich - wie so oft - über eine kleine Gemme in der Triton-Dokumentation gestolpert, die ich hier festhalten möchte, da ich sie sonst vermutlich bald wieder vergessen haben werde. Wenn man sich auf Triton eine Instanz erzeugt, werden per CNS über ein hidden-primary Setup automatisch DNS-Einträge für die neue Instanz erzeugt:

toens@wintermute:~$  triton inst create -w -n thunderdome-db e75c9d82 496922ac
Creating instance thunderdome-db (df5b8c73-2244-cff9-e4f7-ea65a49ce5f8, base-64-lts@19.4.0)
Created instance thunderdome-db (df5b8c73-2244-cff9-e4f7-ea65a49ce5f8) in 1m5s
toens@wintermute:~$ triton inst get thunderdome-db | jq .dns_names
[
  "df5b8c73-2244-cff9-e4f7-ea65a49ce5f8.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.tgos.de",
  "thunderdome-db.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.tgos.de",
  "df5b8c73-2244-cff9-e4f7-ea65a49ce5f8.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.get-cloud.xyz",
  "thunderdome-db.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.get-cloud.xyz",
  "df5b8c73-2244-cff9-e4f7-ea65a49ce5f8.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.tgos.xyz",
  "thunderdome-db.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.tgos.xyz",
  "df5b8c73-2244-cff9-e4f7-ea65a49ce5f8.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.get-cloud.io",
  "thunderdome-db.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.get-cloud.io",
  "df5b8c73-2244-cff9-e4f7-ea65a49ce5f8.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.snc.tgos.de",
  "my-fabric-network.df5b8c73-2244-cff9-e4f7-ea65a49ce5f8.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.snc.tgos.de",
  "thunderdome-db.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.snc.tgos.de",
  "my-fabric-network.thunderdome-db.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.snc.tgos.de",
  "df5b8c73-2244-cff9-e4f7-ea65a49ce5f8.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.snc.get-cloud.io",
  "my-fabric-network.df5b8c73-2244-cff9-e4f7-ea65a49ce5f8.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.snc.get-cloud.io",
  "thunderdome-db.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.snc.get-cloud.io",
  "my-fabric-network.thunderdome-db.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.snc.get-cloud.io"
]

Die verschiedenen Domains sind das Ergebnis verschiedener Umstände und der Experimente in der letzten Woche. Der entsprechende CNS-Status sieht so aus:

[root@c598e340-4715-4335-be8e-ca17174d6911 (de-gt-2:cns0) ~]# cnsadm status
ZONE                      LATEST SERIAL  CHANGED
de-gt-2.snc.tgos.de       388460948      2 days ago
de-gt-2.cns.tgos.de       388460948      2 days ago
get-cloud.xyz             388460948      2 days ago
de-gt-2.cns.tgos.xyz      388460948      2 days ago
de-gt-2.cns.get-cloud.io  388460948      2 days ago
de-gt-2.snc.get-cloud.io  388475190      6 hrs ago
128.168.192.in-addr.arpa  388460948      2 days ago
69.65.10.in-addr.arpa     388460948      2 days ago
15.168.192.in-addr.arpa   388410191      1 wk ago
5.168.192.in-addr.arpa    388410024      1 wk ago

PEER            ZONE                      LATEST SERIAL  DRIFT  VERSION
10.64.64.125    de-gt-2.snc.tgos.de       388460948             none
                de-gt-2.cns.tgos.de       388460948
185.181.104.96  de-gt-2.cns.tgos.xyz      388460948             INWX AXFR Server
62.138.233.183  get-cloud.xyz             388460948             
                de-gt-2.cns.get-cloud.io  388460948
                de-gt-2.snc.get-cloud.io  388475190
10.64.64.252    de-gt-2.snc.tgos.de       388460948             none
                de-gt-2.cns.tgos.de       388460948
62.138.201.123  get-cloud.xyz             388460948             
                de-gt-2.snc.get-cloud.io  388475190

Man kann damit ganz gut die Reaktionszeit der verschiedenen DNS-Anbieter testen:

toens@wintermute:~$ dig +short df5b8c73-2244-cff9-e4f7-ea65a49ce5f8.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.get-cloud.xyz
toens@wintermute:~$ dig +short thunderdome-db.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.get-cloud.xyz
toens@wintermute:~$ dig +short thunderdome-db.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.tgos.de
10.65.69.249
toens@wintermute:~$ dig +short df5b8c73-2244-cff9-e4f7-ea65a49ce5f8.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.tgos.xyz
10.65.69.249
toens@wintermute:~$ dig +short thunderdome-db.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.get-cloud.io
toens@wintermute:~$ dig +short df5b8c73-2244-cff9-e4f7-ea65a49ce5f8.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.snc.tgos.de
192.168.128.178
toens@wintermute:~$ dig +short my-fabric-network.df5b8c73-2244-cff9-e4f7-ea65a49ce5f8.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.snc.get-cloud.io
toens@wintermute:~$ dig +short thunderdome-db.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.snc.get-cloud.io
toens@wintermute:~$ dig +short df5b8c73-2244-cff9-e4f7-ea65a49ce5f8.inst.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.get-cloud.xyz

Wie man sieht funktionieren manche Zonentransfers fast sofort und bei manchen tut sich minutenlang gar kein Tranfer. Bei der Auswahl eines DNS-Anbieters für ein hidden-primary Setup sollte man genau auf solche Merkmale achten.

Nun zu der kleinen Funktion, die ich in der Dokumentation entdeckt hatte. Wie oben gezeigt, hat die Instanz bei zuverlässigen DNS-Anbietern in sehr kurzer Zeit einen DNS-Eintrag bekommen, den man jetzt z. B. für die Ausstellung eines Letsencrypt-Zertifikats verwenden könnte (vielleicht mit triton-dehydrated). Ich kann bei der Erzeugung (oder auch nachträglich) aber auch einen DNS-Eintrag für einen Service erzeugen lassen:

toens@wintermute:~$ triton instance tag set -w thunderdome-db triton.cns.services=thunder
{
    "triton.cns.services": "thunder"
}

Schon erzeugt CNS weitere DNS-Namen für die gewünschte Instanz:

toens@wintermute:~$ triton inst get thunderdome-db | jq .dns_names |grep svc
  "thunder.svc.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.tgos.de",
  "thunder.svc.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.get-cloud.xyz",
  "thunder.svc.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.tgos.xyz",
  "thunder.svc.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.get-cloud.io",
  "thunder.svc.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.snc.tgos.de",
  "my-fabric-network.thunder.svc.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.snc.tgos.de",
  "thunder.svc.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.snc.get-cloud.io",
  "my-fabric-network.thunder.svc.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.snc.get-cloud.io"

Wenn ich jetzt einer weiteren Instanz den obigen Service Tag vergebe, wird diese automatisch im DNS dem Service hinzugefügt:

toens@wintermute:~$ dig +short thunder.svc.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.tgos.de
10.65.69.249
10.65.69.46

Wenn ich jetzt die Instanz wieder aus der Verteilung nehmen will, kann ich das z. B. aus der Instanz heraus tun:

toens@wintermute:~$ triton ssh thunderdome-db
   __        .                   .
 _|  |_      | .-. .  . .-. :--. |-
|_    _|     ;|   ||  |(.-' |  | |
  |__|   `--'  `-' `;-| `-' '  ' `-'
                   /  ; Instance (base-64-lts 19.4.0)
                   `-'  https://docs.joyent.com/images/smartos/base

[root@thunderdome-db ~]# mdata-list
root_authorized_keys
[root@thunderdome-db ~]# mdata-put triton.cns.status down

Im DNS sollte die Instanz dann zügig ausgetragen sein:

toens@wintermute:~$ dig +short thunder.svc.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.tgos.de
10.65.69.46

Andere DNS-Systeme haben noch nicht einmal den ersten Eintrag hinbekommen:

toens@wintermute:~$ dig +short thunder.svc.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.get-cloud.io
toens@wintermute:~$

Manche sind eben benutzbarer als andere:

toens@wintermute:~$ triton ssh thunderdome-db
   __        .                   .
 _|  |_      | .-. .  . .-. :--. |-
|_    _|     ;|   ||  |(.-' |  | |
  |__|   `--'  `-' `;-| `-' '  ' `-'
                   /  ; Instance (base-64-lts 19.4.0)
                   `-'  https://docs.joyent.com/images/smartos/base

[root@thunderdome-db ~]# mdata-put triton.cns.status up
[root@thunderdome-db ~]# exit
logout
Connection to 10.65.69.249 closed.
toens@wintermute:~$ dig +short thunder.svc.a5ba23f5-8237-6879-e7e1-ea6f574fbde9.de-gt-2.cns.tgos.de
10.65.69.249
10.65.69.46