LocalAuthority / .doc / local-hosts.md
1 contributor
134 lines | 8.049kb

Adăugare hosturi locale — madagascar network

Rețeaua madagascar folosește un DNS intern dual: is-vpn-gw (192.168.2.100) ca resolver principal și as01 (192.168.2.2) ca fallback. Un hostname nou trebuie adăugat în ambele locuri.

Regula importantă: local nu se folosește wildcard pentru *.madagascar.xdev.ro. Doar hostname-urile cunoscute din config/local-hosts.tsv se rezolvă local; orice nume necunoscut, inclusiv typo-uri precum nohost.madagascar.xdev.ro, trebuie să întoarcă NXDOMAIN.

Domeniul vechi .vad.is.xdev.ro este deprecated. Nu se adaugă intrări noi pentru el și nu se păstrează aliasuri locale pentru acest namespace.

De ce dual?

is-vpn-gw este sus pe "lista de sacrificiu" la power outage — poate fi oprit deliberat. Fără intrările de pe as01, clienții nu pot rezolva hostname-urile interne când jumper e oprit.

Unde se adaugă

Loc Fișier Rol
is-vpn-gw /etc/hosts resolver principal, precedență maximă față de dnscrypt-proxy Funcționează și când dnscrypt-proxy e down
is-vpn-gw /etc/dnscrypt-proxy/cloaking-rules.txt servit clienților LAN prin dnscrypt-proxy Clienții care cer DNS la 192.168.2.100 primesc IP-ul intern
as01 /ip dns static (MikroTik) fallback când is-vpn-gw e oprit as01 servește direct din cache static propriu

Zona publică poate avea nume Madagascar care ajung la IP-ul public 89.32.222.226. Pentru LAN, fiecare nume real care există și local trebuie să aibă override exact în ambele resolvere, altfel va cădea în DNS public și va ajunge greșit la .226.

Implementarea versionată este:

Fișier Rol
config/hosts.yaml registrul versionat pentru hosturi și FQDN-uri canonice
config/local-hosts.tsv manifest DNS generat, cu aliasuri scurte derivate
scripts/sync_local_hosts.sh generează și sincronizează /etc/hosts, cloaking-rules.txt și /ip dns static

madagascar.xdev.ro este domeniul implicit. Pentru orice nume *.madagascar.xdev.ro, aliasul scurt este derivat automat. De exemplu, autonas01.madagascar.xdev.ro publică și autonas01, iar pmx.baobab.madagascar.xdev.ro publică și pmx.baobab. Aliasurile derivate nu se declară separat în config/hosts.yaml.

Ierarhia surselor

Când inventarele se contrazic, ordinea de încredere este:

  1. DHCP lease/reservation pe router (admin@192.168.2.1) — autoritatea pentru alocarea IP-urilor pe LAN. Configurațiile statice locale nu au voie să mute un IP peste DHCP; cel mult semnalează o rezervare lipsă sau o intrare veche.
  2. cluster/cluster-context/madagascar.json — autoritatea pentru roluri, topologie și IP-uri de serviciu. Pentru nodurile Proxmox, DNS-ul de serviciu poate folosi interfața thunderbridge (192.168.10.x) chiar dacă management/WAN este 192.168.2.x.
  3. config/local-hosts.tsv — manifestul DNS local publicat pe is-vpn-gw și as01. Acesta trebuie să fie derivat sau validat din DHCP plus topologia clusterului, nu folosit ca sursă primară de alocare IP.
  4. hosts-local.yaml — inventar SSH: aliasuri, utilizatori, entrypoint-uri și căi de acces. IP-urile de aici sunt utile pentru audit, dar pot fi stale dacă DHCP spune altceva.
  5. mDNS (*.local) — sursă observată de descoperire și validare. Confirmă prezența unui host sau propune aliasuri, dar nu creează automat intrări madagascar.xdev.ro.
  6. DNS public — folosit doar pentru acces extern. Local, numele interne trebuie shadow-uite exact sau lăsate nerezolvate; wildcard-ul public nu este autoritate pentru LAN.

Reguli de împăcare:

  • Pentru un IP de LAN, DHCP câștigă în fața oricărei valori hardcodate în inventare.
  • Pentru un IP de serviciu non-LAN, madagascar.json câștigă dacă explică explicit interfața sau rolul.
  • Pentru VM-uri, regula vmid -> 192.168.2.vmid este convenție de propunere și audit, nu autoritate. Rezervarea DHCP finală decide.
  • Prefixele istorice is-, vad- și b- se elimină la normalizarea numelor. .vad.is.xdev.ro rămâne deprecated și nu se reactivează prin aliasuri.
  • Dacă o sursă observată există doar în mDNS sau doar în lease-uri dinamice, se raportează ca propunere, nu se sincronizează automat în DNS.

Pe is-vpn-gw, LAN-ul trebuie servit direct de dnscrypt-proxy pe 192.168.2.100:53. systemd-resolved rămâne doar stub local și trebuie să aibă ReadEtcHosts=no plus upstream unic DNS=127.0.0.1:5300. Altfel fie publică intrările din /etc/hosts către clienții LAN, fie ocolește cloaking-rules și întreabă DNS public direct. Scriptul de sync verifică și aplică aceste setări.

dnscrypt-proxy folosește blocklist; google.com și www.google.com sunt allowlist-uite explicit ca să nu fie întoarse ca 0.0.0.0.

Rulează întâi dry-run:

./scripts/sync_local_hosts.sh

Aplică și verifică:

./scripts/sync_local_hosts.sh --apply --verify

Pași pentru un hostname nou

# 1. Adaugă hostul în config/local-hosts.tsv
# Format: hosts_ip<TAB>dns_ip<TAB>name alias...
192.168.2.XXX   192.168.2.XXX   host.madagascar.xdev.ro host

# 2. Aplică pe ambele resolvere
./scripts/sync_local_hosts.sh --apply --verify

# 3. Verificare manuală, dacă e nevoie
dig @192.168.2.100 host.madagascar.xdev.ro +short   # via is-vpn-gw
dig @192.168.2.2   host.madagascar.xdev.ro +short   # via as01

# 4. Verificare negativă: numele inexistente nu trebuie să se rezolve
dig @192.168.2.100 nohost.madagascar.xdev.ro +short
dig @192.168.2.2   nohost.madagascar.xdev.ro +short

Comenzile negative de mai sus trebuie să întoarcă output gol, iar cu +comments statusul trebuie să fie NXDOMAIN.

Hosturi speciale — excepții

Hostname /etc/hosts pe is-vpn-gw cloaking-rules Motiv
mazeri.madagascar.xdev.ro 192.168.2.102 192.168.2.102 Mașina Debian la .102, separată de is-vpn-gw chiar dacă Exim folosește acest hostname
jumper.madagascar.xdev.ro 127.0.0.1 192.168.2.100 is-vpn-gw se referă la sine prin loopback (necesar pentru Exim local delivery); clienții LAN primesc IP-ul real

Hosturi existente

Hostname IP
baobab.madagascar.xdev.ro 192.168.10.91
mazeri.madagascar.xdev.ro 192.168.2.102
jumper.madagascar.xdev.ro 192.168.2.100 (127.0.0.1 local)
hosts.madagascar.xdev.ro 192.168.2.100 (vhost nginx pe jumper)
zabbix.madagascar.xdev.ro 192.168.2.107
toltec.madagascar.xdev.ro 192.168.2.103
ebony.madagascar.xdev.ro 192.168.10.92
tapia.madagascar.xdev.ro 192.168.10.93
autonas01.madagascar.xdev.ro 192.168.10.21
autonas02.madagascar.xdev.ro 192.168.10.22
anjothibe.madagascar.xdev.ro 192.168.2.95
andrafiabe.madagascar.xdev.ro 192.168.2.96
pmx.baobab.madagascar.xdev.ro 192.168.10.91
pmx.ebony.madagascar.xdev.ro 192.168.10.92
pmx.tapia.madagascar.xdev.ro 192.168.10.93
pbs.anjothibe.madagascar.xdev.ro 192.168.2.95
pbs.andrafiabe.madagascar.xdev.ro 192.168.2.96

Verificări obligatorii după modificări

# Host real: trebuie să întoarcă IP intern pe ambele resolvere
dig @192.168.2.100 baobab.madagascar.xdev.ro +short
dig @192.168.2.2   baobab.madagascar.xdev.ro +short

# Host inexistent: trebuie să rămână nerezolvat local
dig @192.168.2.100 nohost.madagascar.xdev.ro +noall +comments
dig @192.168.2.2   nohost.madagascar.xdev.ro +noall +comments

DNS public (zones/xdev.ro.zone)

Hostname-urile interne nu se adaugă în zona publică. Excepție: dacă un hostname intern are și un port forward public, se adaugă în zona publică numai pentru acces extern și trebuie shadow-uit local prin override exact.

RFC 2181: un MX record nu poate pointa la un CNAME. Dacă adaugi un hostname care va primi MX, trebuie să fie A record în zona publică — vezi cazul mazeri.