@@ -70,7 +70,7 @@ http://hosts.madagascar.xdev.ro/ |
||
| 70 | 70 |
Secretul TOTP nu este în repo. Pentru bootstrap, citește URI-ul root-only de pe jumper: |
| 71 | 71 |
|
| 72 | 72 |
```bash |
| 73 |
-ssh is-vpn-gw 'cat /etc/xdev/host-manager.totp-uri' |
|
| 73 |
+ssh jumper.madagascar.xdev.ro 'cat /etc/xdev/host-manager.totp-uri' |
|
| 74 | 74 |
``` |
| 75 | 75 |
|
| 76 | 76 |
## OTP |
@@ -84,7 +84,7 @@ Secretul nu se comite în repo. Dacă avem nevoie de integrare cu un manager de |
||
| 84 | 84 |
1. Hosturile se editează în aplicație sau direct în `config/hosts.yaml`. |
| 85 | 85 |
2. Operatorii autentificați pot descărca `/download/hosts.yaml`, `/download/local-hosts.tsv` sau `/download/monitoring.json`. |
| 86 | 86 |
3. Pentru DNS local, butonul `Write local-hosts.tsv` regenerează `config/local-hosts.tsv`. |
| 87 |
-4. Sincronizarea efectivă către is-vpn-gw și as01 rămâne: |
|
| 87 |
+4. Sincronizarea efectivă către jumper și as01 rămâne: |
|
| 88 | 88 |
|
| 89 | 89 |
```bash |
| 90 | 90 |
./scripts/sync_local_hosts.sh --apply --verify |
@@ -1,6 +1,8 @@ |
||
| 1 | 1 |
# Adăugare hosturi locale — madagascar network |
| 2 | 2 |
|
| 3 |
-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**. |
|
| 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. |
|
| 4 | 6 |
|
| 5 | 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`. |
| 6 | 8 |
|
@@ -8,15 +10,15 @@ Domeniul vechi `.vad.is.xdev.ro` este deprecated. Nu se adaugă intrări noi pen |
||
| 8 | 10 |
|
| 9 | 11 |
## De ce dual? |
| 10 | 12 |
|
| 11 |
-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. |
|
| 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. |
|
| 12 | 14 |
|
| 13 | 15 |
## Unde se adaugă |
| 14 | 16 |
|
| 15 | 17 |
| Loc | Fișier | Rol | |
| 16 | 18 |
|-----|--------|-----| |
| 17 |
-| is-vpn-gw `/etc/hosts` | resolver principal, precedență maximă față de dnscrypt-proxy | Funcționează și când dnscrypt-proxy e down | |
|
| 18 |
-| 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 | |
|
| 19 |
-| as01 `/ip dns static` (MikroTik) | fallback când is-vpn-gw e oprit | as01 servește direct din cache static propriu | |
|
| 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 | |
|
| 20 | 22 |
|
| 21 | 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`. |
| 22 | 24 |
|
@@ -36,7 +38,7 @@ Când inventarele se contrazic, ordinea de încredere este: |
||
| 36 | 38 |
|
| 37 | 39 |
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. |
| 38 | 40 |
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`. |
| 39 |
-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. |
|
| 41 |
+3. `config/local-hosts.tsv` — manifestul DNS local publicat pe jumper și as01. Acesta trebuie să fie derivat sau validat din DHCP plus topologia clusterului, nu folosit ca sursă primară de alocare IP. |
|
| 40 | 42 |
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. |
| 41 | 43 |
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`. |
| 42 | 44 |
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. |
@@ -49,7 +51,7 @@ Reguli de împăcare: |
||
| 49 | 51 |
- 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. |
| 50 | 52 |
- Dacă o sursă observată există doar în mDNS sau doar în lease-uri dinamice, se raportează ca propunere, nu se sincronizează automat în DNS. |
| 51 | 53 |
|
| 52 |
-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. |
|
| 54 |
+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. |
|
| 53 | 55 |
|
| 54 | 56 |
`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`. |
| 55 | 57 |
|
@@ -76,7 +78,7 @@ Aplică și verifică: |
||
| 76 | 78 |
./scripts/sync_local_hosts.sh --apply --verify |
| 77 | 79 |
|
| 78 | 80 |
# 3. Verificare manuală, dacă e nevoie |
| 79 |
-dig @192.168.2.100 host.madagascar.xdev.ro +short # via is-vpn-gw |
|
| 81 |
+dig @192.168.2.100 host.madagascar.xdev.ro +short # via jumper |
|
| 80 | 82 |
dig @192.168.2.2 host.madagascar.xdev.ro +short # via as01 |
| 81 | 83 |
|
| 82 | 84 |
# 4. Verificare negativă: numele inexistente nu trebuie să se rezolve |
@@ -88,10 +90,10 @@ Comenzile negative de mai sus trebuie să întoarcă output gol, iar cu `+commen |
||
| 88 | 90 |
|
| 89 | 91 |
## Hosturi speciale — excepții |
| 90 | 92 |
|
| 91 |
-| Hostname | /etc/hosts pe is-vpn-gw | cloaking-rules | Motiv | |
|
| 93 |
+| Hostname | /etc/hosts pe jumper | cloaking-rules | Motiv | |
|
| 92 | 94 |
|----------|------------------------|----------------|-------| |
| 93 |
-| `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 | |
|
| 94 |
-| `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 | |
|
| 95 |
+| `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 | |
|
| 96 |
+| `jumper.madagascar.xdev.ro` | 127.0.0.1 | 192.168.2.100 | Jumper se referă la sine prin loopback (necesar pentru Exim local delivery); clienții LAN primesc IP-ul real | |
|
| 95 | 97 |
|
| 96 | 98 |
## Hosturi existente |
| 97 | 99 |
|
@@ -7,7 +7,7 @@ This project lives on jumper and is the local source for: |
||
| 7 | 7 |
- `config/hosts.yaml` - git-versioned host registry |
| 8 | 8 |
- `config/local-hosts.tsv` - DNS manifest exported for local resolvers |
| 9 | 9 |
- `scripts/host_manager.pl` - Perl-only web app |
| 10 |
-- `scripts/sync_local_hosts.sh` - local DNS sync to is-vpn-gw and as01 |
|
| 10 |
+- `scripts/sync_local_hosts.sh` - local DNS sync to jumper and as01 |
|
| 11 | 11 |
- `scripts/ca_manager.sh` - local OpenSSL CA helper for host certificates |
| 12 | 12 |
|
| 13 | 13 |
The public `xdev.ro` zone is maintained in the separate DNS public-zone repository. |
@@ -159,4 +159,4 @@ hosts: |
||
| 159 | 159 |
- "local-hosts.tsv" |
| 160 | 160 |
- "hosts-local.yaml" |
| 161 | 161 |
monitoring: "enabled" |
| 162 |
- notes: "Loopback only for local delivery on is-vpn-gw; LAN DNS gets 192.168.2.100." |
|
| 162 |
+ notes: "Loopback only for local delivery on jumper; LAN DNS gets 192.168.2.100." |
|
@@ -1,6 +1,6 @@ |
||
| 1 | 1 |
#!/usr/bin/env bash |
| 2 | 2 |
# |
| 3 |
-# sync_local_hosts.sh - Sync local madagascar DNS records to is-vpn-gw and as01. |
|
| 3 |
+# sync_local_hosts.sh - Sync local madagascar DNS records to jumper and as01. |
|
| 4 | 4 |
# |
| 5 | 5 |
|
| 6 | 6 |
set -euo pipefail |
@@ -8,7 +8,7 @@ set -euo pipefail |
||
| 8 | 8 |
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
| 9 | 9 |
PROJECT_DIR="$(dirname "$SCRIPT_DIR")" |
| 10 | 10 |
CONFIG_FILE="$PROJECT_DIR/config/local-hosts.tsv" |
| 11 |
-IS_VPN_GW="is-vpn-gw" |
|
| 11 |
+JUMPER_HOST="jumper.madagascar.xdev.ro" |
|
| 12 | 12 |
AS01="admin@192.168.2.2" |
| 13 | 13 |
APPLY=false |
| 14 | 14 |
VERIFY=false |
@@ -17,7 +17,7 @@ NEGATIVE_NAME="nohost.madagascar.xdev.ro" |
||
| 17 | 17 |
|
| 18 | 18 |
usage() {
|
| 19 | 19 |
cat << EOF |
| 20 |
-Usage: $0 [--apply] [--verify] [--target all|is-vpn-gw|as01] [-c file] |
|
| 20 |
+Usage: $0 [--apply] [--verify] [--target all|jumper|as01] [-c file] |
|
| 21 | 21 |
|
| 22 | 22 |
Default mode is dry-run. Use --apply to change remote resolvers. |
| 23 | 23 |
|
@@ -49,10 +49,15 @@ while [[ $# -gt 0 ]]; do |
||
| 49 | 49 |
done |
| 50 | 50 |
|
| 51 | 51 |
case "$TARGET" in |
| 52 |
- all|is-vpn-gw|as01) ;; |
|
| 52 |
+ all|jumper|is-vpn-gw|as01) ;; |
|
| 53 | 53 |
*) die "Invalid target: $TARGET" ;; |
| 54 | 54 |
esac |
| 55 | 55 |
|
| 56 |
+if [[ "$TARGET" == "is-vpn-gw" ]]; then |
|
| 57 |
+ log "Target is-vpn-gw is deprecated; use jumper" |
|
| 58 |
+ TARGET="jumper" |
|
| 59 |
+fi |
|
| 60 |
+ |
|
| 56 | 61 |
[[ -f "$CONFIG_FILE" ]] || die "Missing config file: $CONFIG_FILE" |
| 57 | 62 |
|
| 58 | 63 |
WORK_DIR="$(mktemp -d)" |
@@ -70,7 +75,7 @@ quote_ros() {
|
||
| 70 | 75 |
printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g' |
| 71 | 76 |
} |
| 72 | 77 |
|
| 73 |
-is_local_is_vpn_gw() {
|
|
| 78 |
+is_local_jumper() {
|
|
| 74 | 79 |
local host_name |
| 75 | 80 |
host_name="$(hostname -f 2>/dev/null || hostname 2>/dev/null || true)" |
| 76 | 81 |
[[ "$host_name" == "jumper.madagascar.xdev.ro" ]] && return 0 |
@@ -78,12 +83,12 @@ is_local_is_vpn_gw() {
|
||
| 78 | 83 |
return 1 |
| 79 | 84 |
} |
| 80 | 85 |
|
| 81 |
-run_is_vpn_gw_payload() {
|
|
| 86 |
+run_jumper_payload() {
|
|
| 82 | 87 |
local remote_dir="$1" |
| 83 |
- if is_local_is_vpn_gw; then |
|
| 88 |
+ if is_local_jumper; then |
|
| 84 | 89 |
REMOTE_DIR="$remote_dir" bash -s |
| 85 | 90 |
else |
| 86 |
- ssh "$IS_VPN_GW" "REMOTE_DIR='$remote_dir' bash -s" |
|
| 91 |
+ ssh "$JUMPER_HOST" "REMOTE_DIR='$remote_dir' bash -s" |
|
| 87 | 92 |
fi |
| 88 | 93 |
} |
| 89 | 94 |
|
@@ -116,25 +121,25 @@ sort -u "$NAMES_FILE" -o "$NAMES_FILE" |
||
| 116 | 121 |
printf '/ip dns cache flush\n' >> "$MIKROTIK_RSC" |
| 117 | 122 |
printf ':put "xdev local dns sync complete"\n' >> "$MIKROTIK_RSC" |
| 118 | 123 |
|
| 119 |
-sync_is_vpn_gw() {
|
|
| 124 |
+sync_jumper() {
|
|
| 120 | 125 |
if ! $APPLY; then |
| 121 |
- log "Dry-run for $IS_VPN_GW: generated /etc/hosts block" |
|
| 126 |
+ log "Dry-run for $JUMPER_HOST: generated /etc/hosts block" |
|
| 122 | 127 |
sed -n '1,80p' "$HOSTS_ROWS" |
| 123 |
- log "Dry-run for $IS_VPN_GW: generated cloaking-rules block" |
|
| 128 |
+ log "Dry-run for $JUMPER_HOST: generated cloaking-rules block" |
|
| 124 | 129 |
sed -n '1,120p' "$CLOAK_ROWS" |
| 125 | 130 |
return |
| 126 | 131 |
fi |
| 127 | 132 |
|
| 128 |
- log "Syncing $IS_VPN_GW" |
|
| 133 |
+ log "Syncing $JUMPER_HOST" |
|
| 129 | 134 |
remote_dir="/tmp/xdev-local-dns.$$" |
| 130 |
- if is_local_is_vpn_gw; then |
|
| 135 |
+ if is_local_jumper; then |
|
| 131 | 136 |
mkdir -p "$remote_dir" |
| 132 | 137 |
cp "$HOSTS_ROWS" "$CLOAK_ROWS" "$NAMES_FILE" "$remote_dir/" |
| 133 | 138 |
else |
| 134 |
- ssh "$IS_VPN_GW" "mkdir -p '$remote_dir'" |
|
| 135 |
- scp "$HOSTS_ROWS" "$CLOAK_ROWS" "$NAMES_FILE" "$IS_VPN_GW:$remote_dir/" >/dev/null |
|
| 139 |
+ ssh "$JUMPER_HOST" "mkdir -p '$remote_dir'" |
|
| 140 |
+ scp "$HOSTS_ROWS" "$CLOAK_ROWS" "$NAMES_FILE" "$JUMPER_HOST:$remote_dir/" >/dev/null |
|
| 136 | 141 |
fi |
| 137 |
- run_is_vpn_gw_payload "$remote_dir" <<'REMOTE' |
|
| 142 |
+ run_jumper_payload "$remote_dir" <<'REMOTE' |
|
| 138 | 143 |
set -euo pipefail |
| 139 | 144 |
stamp="$(date +%Y%m%d_%H%M%S)" |
| 140 | 145 |
cp /etc/hosts "/etc/hosts.bak.$stamp" |
@@ -284,10 +289,10 @@ verify_resolver() {
|
||
| 284 | 289 |
if $APPLY || ! $VERIFY; then |
| 285 | 290 |
case "$TARGET" in |
| 286 | 291 |
all) |
| 287 |
- sync_is_vpn_gw |
|
| 292 |
+ sync_jumper |
|
| 288 | 293 |
sync_as01 |
| 289 | 294 |
;; |
| 290 |
- is-vpn-gw) sync_is_vpn_gw ;; |
|
| 295 |
+ jumper) sync_jumper ;; |
|
| 291 | 296 |
as01) sync_as01 ;; |
| 292 | 297 |
esac |
| 293 | 298 |
fi |
@@ -298,7 +303,7 @@ if $VERIFY; then |
||
| 298 | 303 |
verify_resolver 192.168.2.100 |
| 299 | 304 |
verify_resolver 192.168.2.2 |
| 300 | 305 |
;; |
| 301 |
- is-vpn-gw) verify_resolver 192.168.2.100 ;; |
|
| 306 |
+ jumper) verify_resolver 192.168.2.100 ;; |
|
| 302 | 307 |
as01) verify_resolver 192.168.2.2 ;; |
| 303 | 308 |
esac |
| 304 | 309 |
fi |