LocalAuthority / .doc / local-hosts.md
Newer Older
193 lines | 10.684kb
Xdev Host Manager authored a week ago
1
# Adăugare hosturi locale — madagascar network
2

            
Xdev Host Manager authored a week ago
3
Rețeaua madagascar folosește un **DNS intern dual**: jumper (192.168.2.100) ca resolver principal și as01 (192.168.2.2) ca fallback. Un hostname nou trebuie adăugat în **ambele locuri**.
4

            
5
Numele vechi `is-vpn-gw` este deprecated. Folosește `jumper` sau `jumper.madagascar.xdev.ro` în scripturi și documentație.
Xdev Host Manager authored a week ago
6

            
7
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`.
8

            
9
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.
10

            
11
## De ce dual?
12

            
Xdev Host Manager authored a week ago
13
Jumper 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.
Xdev Host Manager authored a week ago
14

            
15
## Unde se adaugă
16

            
17
| Loc | Fișier | Rol |
18
|-----|--------|-----|
Xdev Host Manager authored a week ago
19
| jumper `/etc/hosts` | resolver principal, precedență maximă față de dnscrypt-proxy | Funcționează și când dnscrypt-proxy e down |
20
| jumper `/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 |
21
| as01 `/ip dns static` (MikroTik) | fallback când jumper e oprit | as01 servește direct din cache static propriu |
Xdev Host Manager authored a week ago
22

            
23
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`.
24

            
25
Implementarea versionată este:
26

            
27
| Fișier | Rol |
28
|--------|-----|
Bogdan Timofte authored 4 days ago
29
| `var/host-manager.sqlite` | sursa de adevăr runtime pentru registry și Work Orders |
30
| `config/hosts.yaml` | seed/snapshot export pentru hosturi și FQDN-uri canonice |
Bogdan Timofte authored 4 days ago
31
| `config/local-hosts.tsv` | export DNS generat din registry-ul SQLite, cu A records pentru hosturi/aliasuri de host și CNAME records pentru vhosturi |
32
| `scripts/sync_local_hosts.sh` | citește manifestul DNS din SQLite-ul runtime de pe jumper și sincronizează `/etc/hosts`, `cloaking-rules.txt` și `/ip dns static` |
Xdev Host Manager authored a week ago
33

            
Bogdan Timofte authored 4 days ago
34
`madagascar.xdev.ro` este domeniul implicit. Pentru orice host real `*.madagascar.xdev.ro`, aliasul scurt este derivat automat. De exemplu, `autonas01.madagascar.xdev.ro` publică și `autonas01`. Vhosturile, de exemplu `pmx.baobab.madagascar.xdev.ro`, se publică drept CNAME către hostul care le servește; aliasul scurt derivat, de exemplu `pmx.baobab`, este tot CNAME. Aliasurile derivate nu se declară separat în registry.
Xdev Host Manager authored a week ago
35

            
Xdev Host Manager authored a week ago
36
## Ierarhia surselor
37

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

            
40
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.
41
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`.
Bogdan Timofte authored 4 days ago
42
3. `var/host-manager.sqlite` — registry-ul operațional aprobat, editat prin Madagascar Local Authority.
Bogdan Timofte authored 4 days ago
43
4. `config/local-hosts.tsv` — manifestul DNS local publicat pe jumper și as01. Acesta este un export al registry-ului SQLite și nu sursa primară pentru sync; sincronizarea citește manifestul runtime de pe jumper.
Bogdan Timofte authored 4 days ago
44
5. `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.
45
6. 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`.
46
7. 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.
Xdev Host Manager authored a week ago
47

            
48
Reguli de împăcare:
49

            
50
- Pentru un IP de LAN, DHCP câștigă în fața oricărei valori hardcodate în inventare.
51
- Pentru un IP de serviciu non-LAN, `madagascar.json` câștigă dacă explică explicit interfața sau rolul.
52
- Pentru VM-uri, regula `vmid -> 192.168.2.vmid` este convenție de propunere și audit, nu autoritate. Rezervarea DHCP finală decide.
53
- 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.
54
- Dacă o sursă observată există doar în mDNS sau doar în lease-uri dinamice, se raportează ca propunere, nu se sincronizează automat în DNS.
55

            
Bogdan Timofte authored 5 days ago
56
## Listener mDNS
57

            
Bogdan Timofte authored 4 days ago
58
`scripts/mdns_host_seed.pl` ascultă multicast mDNS pe `224.0.0.251:5353`, colectează recorduri `A` pentru nume `*.local` din intervale private/link-local și seeduiește baza runtime SQLite.
Bogdan Timofte authored 5 days ago
59

            
60
Locația implicită:
61

            
62
```text
Bogdan Timofte authored 4 days ago
63
var/host-manager.sqlite#mdns_observations
Bogdan Timofte authored 5 days ago
64
```
65

            
Bogdan Timofte authored 4 days ago
66
Regulă importantă: listenerul mDNS scrie doar în tabelul `mdns_observations`; nu modifică registry-ul de hosturi, `config/hosts.yaml` sau `config/local-hosts.tsv`. Seed-ul mDNS rămâne observație separată până la review.
Bogdan Timofte authored 5 days ago
67

            
68
Rulare manuală pentru test:
69

            
70
```bash
71
perl scripts/mdns_host_seed.pl --verbose --once --timeout 120
72
```
73

            
74
Dry-run:
75

            
76
```bash
77
perl scripts/mdns_host_seed.pl --dry-run --verbose --timeout 30
78
```
79

            
80
Pe jumper, listenerul poate rula ca serviciu separat:
81

            
82
```bash
83
sudo install -m 0644 deploy/jumper/host-manager-mdns.service /etc/systemd/system/host-manager-mdns.service
84
sudo systemctl daemon-reload
85
sudo systemctl enable --now host-manager-mdns
86
```
87

            
Xdev Host Manager authored a week ago
88
Pe jumper, 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.
Xdev Host Manager authored a week ago
89

            
90
`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`.
91

            
Bogdan Timofte authored 3 days ago
92
## Colector DHCP
93

            
94
Routerul DHCP `192.168.2.1` împinge evenimente de lease către Madagascar Local Authority prin:
95

            
96
```text
Bogdan Timofte authored 3 days ago
97
POST https://192.168.2.100/api/collect/dhcp-leases
Bogdan Timofte authored 3 days ago
98
X-DHCP-Push-Token: <HOST_MANAGER_DHCP_PUSH_TOKEN>
99
```
100

            
101
Endpoint-ul scrie doar în `dhcp_leases` și actualizează `data_workers.last_run_at`; nu modifică automat registry-ul de hosturi, `config/hosts.yaml` sau `config/local-hosts.tsv`.
102

            
103
Scriptul RouterOS versionat este:
104

            
105
```text
106
deploy/mikrotik/dhcp-lease-push.rsc
107
```
108

            
109
Înainte de import, setează tokenul real în `/etc/xdev/host-manager.env` pe jumper și în variabila `hostManagerDhcpPushToken` din scriptul RouterOS. Scriptul setează `lease-script` pe serverele DHCP existente; dacă routerul are deja un `lease-script`, codul trebuie îmbinat manual ca să nu se piardă logica existentă.
110

            
Xdev Host Manager authored a week ago
111
Rulează întâi dry-run:
112

            
113
```bash
114
./scripts/sync_local_hosts.sh
115
```
116

            
117
Aplică și verifică:
118

            
119
```bash
120
./scripts/sync_local_hosts.sh --apply --verify
121
```
122

            
123
## Pași pentru un hostname nou
124

            
125
```bash
Bogdan Timofte authored 4 days ago
126
# 1. Adaugă hostul în Madagascar Local Authority.
127
# Aplicația păstrează registry-ul în var/host-manager.sqlite.
Xdev Host Manager authored a week ago
128

            
Bogdan Timofte authored 3 days ago
129
# 2. Publicarea către resolvere este declanșată automat pe jumper.
130
# Pentru intervenție manuală sau re-verificare:
Xdev Host Manager authored a week ago
131
./scripts/sync_local_hosts.sh --apply --verify
132

            
133
# 3. Verificare manuală, dacă e nevoie
Xdev Host Manager authored a week ago
134
dig @192.168.2.100 host.madagascar.xdev.ro +short   # via jumper
Xdev Host Manager authored a week ago
135
dig @192.168.2.2   host.madagascar.xdev.ro +short   # via as01
136

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

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

            
Bogdan Timofte authored 4 days ago
144
## Politica de adresare
145

            
146
Registry-ul de cluster publică un singur IP rutabil pentru fiecare host. Micromanagement-ul local, inclusiv orice intrări `127.0.0.1 localhost localhost.localdomain` sau override-uri locale pe host, nu se administrează din Madagascar Local Authority.
147

            
Xdev Host Manager authored a week ago
148
## Hosturi speciale — excepții
149

            
Xdev Host Manager authored a week ago
150
| Hostname | /etc/hosts pe jumper | cloaking-rules | Motiv |
Xdev Host Manager authored a week ago
151
|----------|------------------------|----------------|-------|
Xdev Host Manager authored a week ago
152
| `mazeri.madagascar.xdev.ro` | 192.168.2.102 | 192.168.2.102 | Mașina Debian la .102, separată de jumper chiar dacă Exim folosește acest hostname |
Bogdan Timofte authored 4 days ago
153
| `jumper.madagascar.xdev.ro` | 192.168.2.100 | 192.168.2.100 | Registry-ul publică doar adresa rutabilă; orice comportament local special rămâne responsabilitatea hostului |
Xdev Host Manager authored a week ago
154

            
155
## Hosturi existente
156

            
157
| Hostname | IP |
158
|----------|----|
159
| `baobab.madagascar.xdev.ro` | 192.168.10.91 |
160
| `mazeri.madagascar.xdev.ro` | 192.168.2.102 |
Bogdan Timofte authored 4 days ago
161
| `jumper.madagascar.xdev.ro` | 192.168.2.100 |
Xdev Host Manager authored a week ago
162
| `hosts.madagascar.xdev.ro` | 192.168.2.100 (vhost nginx pe jumper) |
163
| `zabbix.madagascar.xdev.ro` | 192.168.2.107 |
164
| `toltec.madagascar.xdev.ro` | 192.168.2.103 |
165
| `ebony.madagascar.xdev.ro` | 192.168.10.92 |
166
| `tapia.madagascar.xdev.ro` | 192.168.10.93 |
167
| `autonas01.madagascar.xdev.ro` | 192.168.10.21 |
168
| `autonas02.madagascar.xdev.ro` | 192.168.10.22 |
169
| `anjothibe.madagascar.xdev.ro` | 192.168.2.95 |
170
| `andrafiabe.madagascar.xdev.ro` | 192.168.2.96 |
171
| `pmx.baobab.madagascar.xdev.ro` | 192.168.10.91 |
172
| `pmx.ebony.madagascar.xdev.ro` | 192.168.10.92 |
173
| `pmx.tapia.madagascar.xdev.ro` | 192.168.10.93 |
174
| `pbs.anjothibe.madagascar.xdev.ro` | 192.168.2.95 |
175
| `pbs.andrafiabe.madagascar.xdev.ro` | 192.168.2.96 |
176

            
177
## Verificări obligatorii după modificări
178

            
179
```bash
180
# Host real: trebuie să întoarcă IP intern pe ambele resolvere
181
dig @192.168.2.100 baobab.madagascar.xdev.ro +short
182
dig @192.168.2.2   baobab.madagascar.xdev.ro +short
183

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

            
189
## DNS public (zones/xdev.ro.zone)
190

            
191
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.
192

            
193
> 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`.