feat(looking_glass) : le frontal descend en conteneur, et le blocage annoncé n'existait pas #40

Open
thystips wants to merge 2 commits from feat/lg-frontend-container into main
Owner

Dernier élément de la file conteneurs. Le dépôt annonçait que ce déménagement demandait une patte privée au conteneur, donc une décision sur ens3 à Bordeaux — l'unique carte de ce nœud, qui porte son IPv6 publique et ses deux routes par défaut.

C'était faux, et faux sur la direction du problème.

Le sortant ne demandait rien

Hors bande veut dire « pas par l'overlay », pas « sur ce L2 précis ». Le conteneur atteint déjà le plan de management par le pont NATé, SNATé vers l'adresse privée de son propre nœud, sans jamais toucher DN42.

Mesuré depuis lg-fr-rbx1 avant d'écrire une ligne :

Destination Résultat
ca1:8200 connecte
les quatre agents :8000 timeout — jetés par « containers do not reach the private planes »

Il manquait quatre lignes dans la liste qui portait déjà ca1, pas une interface. Et l'adresse source après SNAT étant celle du nœud porteur, l'--allowed des agents et la ligne 16 du pare-feu n'ont bougé ni l'un ni l'autre.

L'entrant, si — d'où le premier DNAT du dépôt

liberty, le reverse proxy clearnet qui publie lg.thystips.net, arrive de l'extérieur ; un conteneur ne fait que sortir. Le DNAT est borné à une source, une destination et un port, et sa jumelle de forward refait le même triplet.

Bilan : une soustraction

Retiré — le relais whois entièrement (son unique client l'a rejoint), la ligne 17 de la matrice, l'unique entrée « frontal LG » de nftables_container_mgmt_services, et avec elle le dernier client du conteneur d'ingress sur le plan de management.

Ajouté — les quatre agents dans cette même liste, le DNAT et sa jumelle.

Comparaison des rendus avant/après : fr-rbx2 et fr-bod2 ne font que perdre deux règles.

Le défaut trouvé en déroulant

Trois agents sur quatre répondaient ; le quatrième — celui du nœud hébergeant le conteneur — rendait « Invalid Request » en 500, et seul son journal disait pourquoi : source 10.42.0.43, non SNATée. Un paquet livré localement ne traverse jamais postrouting.

C'est la même asymétrie qui vaut aux règles de pare-feu d'exister en deux exemplaires. La matrice le dit déjà mot pour mot : « le cas local et le cas distant ne sont pas le même test ». Corrigé dans le second commit.

Au passage

  • services.yml gagne une troisième forme de backendscontainer: — et son commentaire périmé sur « the proxy runs in the global routing table » est corrigé : le proxy est un conteneur dans DN42 depuis la PR #25.
  • Les gabarits qui recopiaient la chaîne de .get() du plan de management lisent dn42_mgmt_address, que le plugin calcule et dont le commentaire disait déjà qu'il avait été extrait pour ça.

Vérifié

  • changed=0 au second passage sur les 18 machines
  • lg.thystips.net200 par le DNAT, les quatre colonnes pleines (8 sessions Babel, 24 iBGP)
  • la page whois rend l'aut-num, sans relais
  • lg.thystips.dn42 → 302 par le tier, qui joint le frontal en DN42
  • ./.ci/lint.sh vert, NetBox à 0 to create, 0 to update
Dernier élément de la file conteneurs. Le dépôt annonçait que ce déménagement demandait une patte privée au conteneur, donc une décision sur `ens3` à Bordeaux — l'unique carte de ce nœud, qui porte son IPv6 publique et ses deux routes par défaut. **C'était faux, et faux sur la direction du problème.** ## Le sortant ne demandait rien Hors bande veut dire « pas par l'overlay », pas « sur ce L2 précis ». Le conteneur atteint déjà le plan de management par le pont NATé, SNATé vers l'adresse privée de son propre nœud, sans jamais toucher DN42. Mesuré depuis `lg-fr-rbx1` avant d'écrire une ligne : | Destination | Résultat | |---|---| | `ca1:8200` | **connecte** | | les quatre agents `:8000` | **timeout** — jetés par « containers do not reach the private planes » | Il manquait **quatre lignes** dans la liste qui portait déjà `ca1`, pas une interface. Et l'adresse source après SNAT étant celle du nœud porteur, l'`--allowed` des agents et la ligne 16 du pare-feu n'ont bougé ni l'un ni l'autre. ## L'entrant, si — d'où le premier DNAT du dépôt `liberty`, le reverse proxy clearnet qui publie `lg.thystips.net`, arrive de l'extérieur ; un conteneur ne fait que sortir. Le DNAT est borné à une source, une destination et un port, et sa jumelle de `forward` refait le même triplet. ## Bilan : une soustraction **Retiré** — le relais whois entièrement (son unique client l'a rejoint), la ligne 17 de la matrice, l'unique entrée « frontal LG » de `nftables_container_mgmt_services`, et avec elle le dernier client du conteneur d'ingress sur le plan de management. **Ajouté** — les quatre agents dans cette même liste, le DNAT et sa jumelle. Comparaison des rendus avant/après : `fr-rbx2` et `fr-bod2` ne font que **perdre** deux règles. ## Le défaut trouvé en déroulant Trois agents sur quatre répondaient ; le quatrième — celui du nœud hébergeant le conteneur — rendait « Invalid Request » en 500, et seul son journal disait pourquoi : source `10.42.0.43`, **non SNATée**. Un paquet livré localement ne traverse jamais `postrouting`. C'est la même asymétrie qui vaut aux règles de pare-feu d'exister en deux exemplaires. La matrice le dit déjà mot pour mot : « le cas local et le cas distant ne sont pas le même test ». Corrigé dans le second commit. ## Au passage - `services.yml` gagne une troisième forme de `backends` — `container:` — et son commentaire périmé sur « the proxy runs in the global routing table » est corrigé : le proxy est un conteneur dans DN42 depuis la PR #25. - Les gabarits qui recopiaient la chaîne de `.get()` du plan de management lisent `dn42_mgmt_address`, que le plugin calcule et dont le commentaire disait déjà qu'il avait été extrait pour ça. ## Vérifié - `changed=0` au second passage sur les **18 machines** - `lg.thystips.net` → **200** par le DNAT, les quatre colonnes pleines (8 sessions Babel, 24 iBGP) - la page whois rend l'`aut-num`, sans relais - `lg.thystips.dn42` → 302 par le tier, qui joint le frontal en DN42 - `./.ci/lint.sh` vert, NetBox à `0 to create, 0 to update`
Le dépôt annonçait que ce déménagement demandait une patte privée au conteneur,
donc une décision sur `ens3` à Bordeaux — l'unique carte de ce nœud, qui porte son
IPv6 publique et ses deux routes par défaut. C'était faux, et faux sur la direction
du problème.

Hors bande veut dire « pas par l'overlay », pas « sur ce L2 précis ». Le conteneur
atteint déjà le plan de management par le pont NATé, SNATé vers l'adresse privée de
son propre nœud, sans jamais toucher DN42. Mesuré depuis `lg-fr-rbx1` avant d'écrire
une ligne : `ca1:8200` connecte, les quatre agents expirent — non par absence de
chemin, mais faute d'être énumérés dans `nftables_container_mgmt_services`, la liste
qui portait déjà `ca1`.

Deux conséquences qui rendent le chantier bien moins cher qu'annoncé : l'adresse
source après SNAT étant celle du nœud porteur, l'`--allowed` des agents et la
ligne 16 du pare-feu n'ont bougé ni l'un ni l'autre.

Le sens qui bloquait réellement est l'ENTRANT — `liberty`, le reverse proxy clearnet
qui publie lg.thystips.net, arrive de l'extérieur et un conteneur ne fait que sortir.
D'où le premier DNAT du dépôt, borné à une source, une destination et un port.

Ce que ça retire :
- le relais whois entièrement, son unique client l'ayant rejoint — le frontal
  interroge whois.dn42 par `eth0` ;
- la ligne 17 de la matrice, plus rien n'écoutant 5000 sur un nœud ;
- l'unique entrée « frontal LG » de `nftables_container_mgmt_services`, le proxy
  joignant maintenant le frontal par DN42 sans une règle ;
- le dernier client du conteneur d'ingress sur le plan de management.

Ce que ça ajoute : les quatre agents dans cette même liste, le DNAT et sa jumelle
de `forward`.

Vérifié par comparaison des rendus avant/après sur les quatre nœuds : fr-rbx2 et
fr-bod2 ne font que PERDRE deux règles.

Au passage, `services.yml` gagne une troisième forme de `backends` — `container:` —
et son commentaire périmé sur « the proxy runs in the global routing table » est
corrigé : le proxy est un conteneur dans DN42 depuis la PR #25. Les gabarits qui
recopiaient la chaîne de `.get()` du plan de management lisent désormais
`dn42_mgmt_address`, que le plugin calcule et dont le commentaire disait déjà qu'il
avait été extrait pour ça.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FGwvXLVXJ2PrRFwJTB3Xp9
Trouvé en déroulant : trois agents sur quatre répondaient au frontal, le quatrième
rendait « Invalid Request » en 500. Le quatrième était celui du nœud QUI HÉBERGE le
conteneur, et seul son journal disait pourquoi — source `10.42.0.43`, l'adresse brute
du conteneur.

Un paquet destiné à la machine elle-même passe `prerouting` puis `input` et ne
traverse JAMAIS `postrouting`. Il n'est donc pas masqué, là où celui qui part vers un
nœud distant l'est. Le raisonnement du commit précédent — « après SNAT la source est
l'adresse privée du nœud porteur » — était juste pour trois cas sur quatre.

C'est la même asymétrie qui vaut aux règles de pare-feu d'exister en deux
exemplaires, une dans `input` et sa jumelle dans `forward`. La matrice des flux le dit
déjà mot pour mot : « le cas local et le cas distant ne sont pas le même test ».

L'agent d'un nœud qui héberge le conteneur accepte donc aussi son `egress_address`.
C'est borné : le pare-feu n'accepte 8000 que depuis les adresses privées des nœuds
porteurs, donc une adresse de pont ne peut se présenter que par le pont local — et
`10.42.0.43` n'apparaît que sur fr-rbx1 et fr-bod1, vérifié au rendu.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FGwvXLVXJ2PrRFwJTB3Xp9
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/lg-frontend-container:feat/lg-frontend-container
git switch feat/lg-frontend-container

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch main
git merge --no-ff feat/lg-frontend-container
git switch feat/lg-frontend-container
git rebase main
git switch main
git merge --ff-only feat/lg-frontend-container
git switch feat/lg-frontend-container
git rebase main
git switch main
git merge --no-ff feat/lg-frontend-container
git switch main
git merge --squash feat/lg-frontend-container
git switch main
git merge --ff-only feat/lg-frontend-container
git switch main
git merge feat/lg-frontend-container
git push origin main
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ThysTips_dn42/infra-dn42!40
No description provided.