## Introduction

Apache Airflow repose sur plusieurs connexions réseau : le webserver et l'API, la base de données de métadonnées, les brokers de messages optionnels (pour CeleryExecutor) et parfois des récepteurs de métriques. Quand Airflow semble lent ou inaccessible, la cause racine est souvent le DNS, les ports, les adresses de liaison, le routage ou les pare-feux. Ce guide vous donne des commandes pratiques et sûres pour isoler rapidement les problèmes, explique les résultats attendus pour que vous puissiez raisonner sur les sorties, et fournit une procédure de retour arrière si un changement n'aide pas.

Le chemin le plus rapide vers la clarté est de tester d'abord une tranche étroite et mesurable, de vérifier les résultats localement, puis seulement d'élargir la portée. Des points de terminaison nommés et clairs pour les services Airflow minimisent les allers-retours et rendent les diagnostics reproductibles d'un environnement à l'autre.

## Inventaire des versions et de l'environnement

Avant de changer quoi que ce soit, capturez ce qui tourne réellement. Cela évite de poursuivre le mauvais problème et vous donne une cible de retour arrière connue comme bonne.

Prérequis :

- Accès shell aux hôtes Airflow où tournent le webserver, le scheduler, les workers, la base de données ou le broker.

- Capacité à lancer les outils réseau de base : ss ou netstat , lsof , curl , nc (netcat), dig ou nslookup , traceroute .

- Accès en lecture aux fichiers de configuration Airflow (typiquement $AIRFLOW_HOME/airflow.cfg ) et aux logs.

Enregistrez ce qui suit sur chaque hôte pertinent :

- Version Airflow et exécuteur

airflow version
airflow config get-value core executor 

- Python et OS

 python --version
uname -a 

- Inventaire des processus

 ps -ef | grep -E 'airflow|celery' | grep -v grep 

- Points de terminaison et ports des composants (noms d'exemple construits)

- Webserver : http://airflow-web.example.internal:8080

- Scheduler : processus local ; pas de port entrant

- Base de données de métadonnées (ex. Postgres) : airflow-db.example.internal:5432

- Broker (ex. Redis ou RabbitMQ pour Celery) : redis.example.internal:6379 ou rabbitmq.example.internal:5672

- Métriques (StatsD optionnel) : statsd.example.internal:8125/udp

- Valeurs de configuration clés

 airflow config get-value webserver web_server_host
airflow config get-value webserver web_server_port
airflow config get-value webserver base_url
airflow config get-value core sql_alchemy_conn
airflow config get-value celery broker_url
airflow config get-value celery result_backend 
 Tableau : points de terminaison et ports réseau Airflow courants (défauts affichés ; ajustez à votre environnement).

<div class="my-stack-md overflow-x-auto">
<table class="w-full min-w-[42rem] border-collapse text-left">
<thead><tr><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Composant</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Port par défaut</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Protocole</th></tr></thead>
<tbody><tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Webserver (UI/API)</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">8080</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">TCP</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Flower (optionnel)</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">5555</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">TCP</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Postgres métadonnées</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">5432</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">TCP</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">MySQL métadonnées</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">3306</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">TCP</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Broker Redis</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">6379</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">TCP</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Broker RabbitMQ (AMQP)</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">5672</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">TCP</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">RabbitMQ mgmt (optionnel)</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">15672</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">TCP</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">StatsD (optionnel)</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">8125</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">UDP</td></tr></tbody>
</table>
</div>
Résultat attendu : vous avez une note d'une page avec versions, noms d'hôtes et ports. C'est votre source de vérité pendant le diagnostic.

## Chemin de configuration sécurisé

Les changements réseau peuvent casser l'accès. Utilisez une approche réversible :

- Sauvegardez les fichiers de config : cp $AIRFLOW_HOME/airflow.cfg $AIRFLOW_HOME/airflow.cfg.bak.$(date +%Y%m%d%H%M%S)

- Changez une chose à la fois ; testez ; puis continuez.

- Préférez les tests temporaires ( curl , nc ) aux changements de config permanents jusqu'à ce que vous ayez validé l'hypothèse.

- Utilisez une fenêtre de maintenance si vous devez redémarrer des services.

Changements ciblés, à faible risque, à envisager :

- Adresse de liaison et port du webserver

- Si l'UI n'est accessible que depuis localhost : mettez l'hôte à 0.0.0.0 pour un accès distant dans un réseau de confiance, ou à une IP d'interface spécifique (ex. 10.10.20.15 ).

- Exemple : dans airflow.cfg sous [webserver] :

[webserver]
web_server_host = 0.0.0.0
web_server_port = 8080
base_url = http://airflow-web.example.internal:8080 

- DNS base de données et broker

- Remplacez temporairement un nom d'hôte qui échoue par une IP directe pour confirmer DNS vs accessibilité.

- Si l'IP fonctionne, corrigez le DNS plutôt que de laisser l'IP en dur.

- Ouvertures pare-feu

- Ouvrez seulement les ports nécessaires, vers les sources qui en ont besoin. Testez avec une règle temporaire avant de la rendre permanente.

 Plan de retour arrière :

- Restaurez airflow.cfg depuis la sauvegarde et redémarrez seulement le(s) service(s) affecté(s).

- Annulez les changements de pare-feu en utilisant la liste de règles sauvegardée et rechargez.

## Vérification et diagnostics

Lancez des tests simples, progressivement plus profonds. Arrêtez-vous quand vous trouvez un saut qui échoue.

- Le webserver tourne-t-il et écoute-t-il ?

# Affiche les sockets d'écoute pour les ports Airflow courants
sudo ss -tulpn | grep -E ':(8080|5432|5672|6379)'

# Ou
sudo lsof -i -P -n | grep -E ':(8080|5432|5672|6379)' 
 Attendu : une ligne montrant python (airflow webserver) lié à 0.0.0.0:8080 ou une IP spécifique:8080. S'il est lié à 127.0.0.1:8080 , les clients distants ne l'atteindront pas. C'est la mauvaise configuration par défaut la plus fréquente dans les installations fraîches.

- Vérification HTTP santé depuis l'hôte lui-même

curl -sS -I http://127.0.0.1:8080/ | head -n 1
curl -sS http://127.0.0.1:8080/health || true 
 Attendu :

- La première commande retourne HTTP/1.1 200 OK ou 302 Found (redirection login). Cela prouve que le socket et le HTTP sont OK.

- /health peut retourner du JSON si activé. S'il 404 mais que la page racine retourne 200/302, le webserver est quand même assez sain pour servir l'UI.

- Vérification HTTP distante depuis un hôte client

curl -sS -I http://airflow-web.example.internal:8080/ | head -n 1 
 Si cela échoue mais que le test local réussit, investiguez DNS, routage ou pare-feux.

- Vérifications de résolution DNS

getent hosts airflow-web.example.internal
dig +short airflow-web.example.internal
nslookup airflow-web.example.internal 
 Attendu : IPs cohérentes sur tous les hôtes. Si la résolution diffère selon l'hôte ou est absente, corrigez le DNS d'abord.

- Vérification du chemin de routage

# Traceroute basé TCP vers le port web
sudo traceroute -T -p 8080 airflow-web.example.internal 
 Attendu : une liste de sauts stable se terminant à l'IP du webserver. Des timeouts vers la fin indiquent souvent des pare-feux d'hôte.

- Accessibilité du port sans HTTP

# Depuis un hôte client
nc -vz airflow-web.example.internal 8080

# Pour DB et broker (exemple)
nc -vz airflow-db.example.internal 5432
nc -vz redis.example.internal 6379
nc -vz rabbitmq.example.internal 5672 
 Attendu : messages succeeded pour les ports accessibles. Connection refused signifie que l'hôte est joignable mais aucun processus n'écoute. Timeout signifie un pare-feu ou un trou noir de routage.

- Connectivité base de données depuis l'hôte Airflow

# Exemple Postgres
psql "$(airflow config get-value core sql_alchemy_conn)" -c 'select 1;'

# Exemple MySQL
mysql --execute='select 1;' "$(airflow config get-value core sql_alchemy_conn)" 
 Attendu : retourne une seule ligne avec 1 . Si l'authentification échoue ici mais que les tests réseau passent, corrigez les identifiants ou les réglages SSL.

- Connectivité broker depuis l'hôte worker (CeleryExecutor)

# Exemple Redis
redis-cli -h redis.example.internal -p 6379 PING

# Exemple RabbitMQ (poignée de main TCP simple ; utilisez le port AMQPS 5671 pour TLS)
openssl s_client -connect rabbitmq.example.internal:5672 -quiet < /dev/null || true 
 Attendu : Redis PONG ; pour RabbitMQ vous confirmez seulement la poignée de main TCP sauf si TLS/AMQPS est configuré.

- Vérifications pare-feu d'hôte (lancez seulement ce qui s'applique)

# UFW
sudo ufw status verbose

# firewalld
sudo firewall-cmd --list-all

# iptables (hérité)
sudo iptables -S | sed -n '1,200p' 
 Attendu : voyez si 8080, 5432, 5672, 6379 sont autorisés depuis les bonnes sources.

- Logs Airflow pour corroboration

# Remplacez par votre AIRFLOW_HOME si nécessaire
ls -1 $AIRFLOW_HOME/logs/

grep -iE 'connection|error|timeout|refused|dns' -R $AIRFLOW_HOME/logs/ | sed -n '1,100p' 
 Attendu : les erreurs réseau mentionneront timeout, refused, name or address not known, ou échecs SSL. Utilisez les horodatages des logs pour les aligner avec vos tests.

Tableau : référence diagnostics rapides.

<div class="my-stack-md overflow-x-auto">
<table class="w-full min-w-[42rem] border-collapse text-left">
<thead><tr><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Objectif</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Commande exemple</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Signal attendu</th></tr></thead>
<tbody><tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Voir les écouteurs</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">ss -tulpn</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Processus et adresses de liaison</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">HTTP local</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">curl -I http://127.0.0.1:8080/</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">En-têtes 200/302</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">HTTP distant</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">curl -I http://airflow-web.example.internal:8080/</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">En-têtes 200/302</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Résolution DNS</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">getent hosts airflow-web.example.internal</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Adresse IP</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Test port</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">nc -vz airflow-db.example.internal 5432</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">succeeded/refused/timeout</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Routage</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">traceroute -T -p 8080 airflow-web.example.internal</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">chemin de sauts vers cible</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Pare-feu</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">ufw status verbose</code></td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">règles autorisées/refusées</td></tr></tbody>
</table>
</div>

## Modes de défaillance et récupération

Utilisez cette carte pour passer du symptôme à la cause probable et au correctif.

Tableau : échecs réseau Airflow courants et premières étapes de correctif (exemples construits).

<div class="my-stack-md overflow-x-auto">
<table class="w-full min-w-[42rem] border-collapse text-left">
<thead><tr><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Symptôme</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Cause probable</th><th scope="col" class="border border-outline-variant bg-surface-container-low px-4 py-3 text-left font-label-md font-semibold text-on-surface">Première étape de correctif</th></tr></thead>
<tbody><tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">UI fonctionne localement, pas à distance</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Webserver lié à 127.0.0.1</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Mettez <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">web_server_host</code> à <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">0.0.0.0</code> ou IP d&#39;interface ; redémarrez webserver</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">curl timeout depuis client</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Pare-feu hôte ou ACL réseau</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Autorisez temporairement le port depuis l&#39;IP client ; vérifiez avec <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">nc -vz</code> ; puis pérennisez la règle proprement</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Connexion refusée sur 8080</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Pas de processus ou mauvais port</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Confirmez <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">ss -tulpn</code> ; corrigez port ou démarrez webserver</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">DNS résout différemment par hôte</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Split-horizon ou cache obsolète</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Corrigez enregistrements DNS ; videz cache <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">nscd</code>/<code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">systemd-resolved</code> ; évitez IPs en dur long terme</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Scheduler n&#39;atteint pas DB</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Mauvais hôte/port <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">sql_alchemy_conn</code> ou pare-feu</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Testez avec <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">psql</code>/<code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">mysql</code> depuis hôte scheduler ; corrigez config et autorisez port</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Workers bloqués, tâches non réclamées</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Broker inaccessible</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant"><code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">nc -vz</code> vers broker ; corrigez <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">broker_url</code> DNS/port ou ouvrez pare-feu</td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">UI lente ou 504 intermittents</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Proxy ou load balancer timeouts inactifs</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Augmentez timeouts amont ou activez keepalive ; vérifiez avec <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">curl -v</code></td></tr>
<tr><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Erreurs handshake SSL</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Mauvais certificats ou désaccord TLS</td><td class="border border-outline-variant px-4 py-3 align-top text-body-md text-on-surface-variant">Testez avec <code class="font-mono text-[0.9em] bg-surface-container px-1 py-0.5 rounded">openssl s_client</code> ; mettez à jour bundle CA ou alignez versions TLS</td></tr></tbody>
</table>
</div>
Patterns de récupération :

- Correction adresse de liaison

- Changez [webserver] web_server_host à 0.0.0.0 (ou l'IP d'interface spécifique sur un réseau de confiance, ex. 10.10.20.15 ).

- Redémarrez seulement le webserver.

- Revérifiez curl local et distant.

- Retour arrière : restaurez le airflow.cfg précédent si la nouvelle liaison élargit l'exposition inattendue.

- Correction conflit de port

- Identifiez le processus en conflit :

sudo ss -tulpn | grep :8080
sudo lsof -iTCP:8080 -sTCP:LISTEN -n -P 

- Option A : arrêtez l'autre processus si non nécessaire. Option B : changez Airflow vers un port libre (ex. 8081) et mettez à jour base_url .

- Vérifiez avec curl ; mettez à jour les règles pare-feu pour correspondre au nouveau port.

- Retour arrière : revenez au port et redémarrez si les clients sont codés en dur sur l'ancien port.

- Remédiation DNS

- Prouvez le chemin avec une IP directe une fois :

 curl -I http://10.10.20.30:8080/ 

- Si l'IP fonctionne, corrigez le DNS : mettez à jour enregistrements A/CNAME ou domaines de recherche. Évitez de laisser des IPs brutes dans airflow.cfg .

- Videz les caches si nécessaire :

 sudo resolvectl flush-caches || sudo systemd-resolve --flush-caches || true 

- Retour arrière : aucun nécessaire ; retirez les surcharges IP temporaires.

- Ouverture pare-feu (exemple UFW)

 # Autorisation temporaire depuis un client spécifique
sudo ufw allow from 192.0.2.10 to any port 8080 proto tcp
sudo ufw status numbered 

- Testez avec nc et curl . Si bon, rendez la règle persistante dans votre système de gestion de changements.

- Retour arrière :

 sudo ufw delete <numéro-règle> 

- Accessibilité base de données

- Depuis l'hôte Airflow, testez le port DB et la connexion ; corrigez réseau et identifiants.

- Exemple Postgres d'un test de connexion minimal :

 PGURI="$(airflow config get-value core sql_alchemy_conn)"
psql "$PGURI" -c 'select 1;' 

- Si SSL est requis, confirmez le chemin CA et sslmode dans la chaîne de connexion.

- Récupération broker (CeleryExecutor)

- Redis :

 redis-cli -h redis.example.internal -p 6379 PING 

- RabbitMQ :

 nc -vz rabbitmq.example.internal 5672 

- Corrigez broker_url DNS, identifiants, ou ouvrez le port. Redémarrez les workers après avoir confirmé l'accessibilité.

- Réglage proxy ou load balancer

- Reproduisez un timeout avec curl -v pour voir le délai et si un en-tête proxy est présent.

- Augmentez le timeout inactif et le keepalive entre le proxy et le webserver Airflow.

- Vérifiez en lançant plusieurs curl rapides ; la latence doit se stabiliser.

- Désaccords SSL/TLS

- Inspectez avec openssl :

 openssl s_client -connect airflow-web.example.internal:8443 -servername airflow-web.example.internal -showcerts < /dev/null 

- Mettez à jour les certificats et alignez les versions de protocole selon votre politique de sécurité.

## Liste de contrôle opérationnelle

 Utilisez cette liste courte, reproductible, pour les installations et les incidents.

Pré-vol

- Capturez version Airflow, exécuteur, et points de terminaison des composants.

- Documentez noms d'hôtes et ports attendus pour web, DB, broker, métriques.

- Sauvegardez airflow.cfg et toute règle de pare-feu que vous prévoyez de toucher.

Vérification rapide quotidienne ou hebdomadaire

- ss -tulpn montre le webserver en écoute sur l'hôte:port prévu.

- curl -I vers l'UI depuis localhost et un client distant retourne 200/302.

- getent hosts pour tous les noms d'hôtes Airflow retourne les IPs attendues.

- Pour CeleryExecutor : nc -vz vers broker et DB réussissent depuis les workers.

Gestion des changements

- Changez une variable à la fois (liaison, port, DNS, pare-feu).

- Testez localement, puis à distance ; enregistrez sorties de commandes et horodatages.

- Si sans succès, retour arrière immédiat avec configs et règles sauvées.

Réponse aux incidents

- Confirmez processus et écouteur ( ss , lsof ).

- Distinguez refus vs timeout ( nc ) : refus => pas d'écouteur ; timeout => filtre/routage.

- Validez cohérence DNS entre hôtes ( getent , dig ).

- Tracez la route seulement si DNS et curl local sont bons.

- Vérifiez les logs pour erreurs de connexion alignées avec vos tests.

Revue post-incident

- Remplacez tout hack IP temporaire par du DNS propre.

- Serrez les règles pare-feu au moindre privilège tout en gardant les chemins qui marchent ouverts.

- Mettez à jour cette liste avec commandes concrètes et sorties observées.

## Conclusion

Les problèmes réseau Airflow se réduisent généralement à quelques questions : un processus écoute-t-il où vous l'attendez, les clients peuvent-ils le résoudre et l'atteindre, et les équipements intermédiaires permettent-ils le flux ? En commençant par un petit test vérifiable, en confirmant DNS et adresses de liaison, et en utilisant des vérifications d'accessibilité ciblées, vous pouvez isoler les échecs rapidement. Gardez des sauvegardes pour airflow.cfg et les règles de pare-feu, changez une variable à la fois, et faites un retour arrière rapide si une étape n'aide pas. Adoptez le tableau de diagnostics et la liste de contrôle comme base de votre équipe pour que la validation routine et la récupération deviennent de la mémoire musculaire.