33800 Docs

← Retour

Tache : Investigation Docker Bridge Network sans Internet

Date : 12/01/2026 00:20 Statut : TERMINE Machine : prod-portainer (192.168.1.12)


1. Probleme observe

Les containers Docker sur les reseaux bridge n'ont pas acces internet.

2. Symptomes

# Depuis un container sur bridge
docker run --rm --network=bridge alpine wget -q https://google.com
# Resultat: FAIL - Host is unreachable

# Depuis un container sur host
docker run --rm --network=host alpine wget -q https://google.com
# Resultat: OK

3. Diagnostics effectues

3.1 IP Forwarding

cat /proc/sys/net/ipv4/ip_forward
# Resultat: 1 (active)

3.2 Routes par defaut (2 routes!)

ip route show default
# default via 192.168.1.1 dev eth0 proto static
# default via 192.168.1.254 dev eth0 proto static

Note : Deux passerelles par defaut - potentiel conflit de routage.

3.3 iptables NAT

iptables -t nat -L POSTROUTING -n -v
# MASQUERADE pour 172.20.0.0/16 (notifications) - present
# MASQUERADE pour 172.17.0.0/16 (docker0) - present

3.4 iptables FORWARD

iptables -L FORWARD -n -v
# Chain FORWARD (policy DROP)
# -> DOCKER-USER
# -> DOCKER-FORWARD

3.5 Test connectivite host

# Depuis l'host (prod-portainer)
curl -4 https://ntfy.sh  # OK (HTTP 200)
ping ntfy.sh             # FAIL (ICMP bloque, normal)

4. Hypotheses

Hypothese 1 : Conflit de routes par defaut

Deux passerelles (192.168.1.1 et 192.168.1.254) peuvent causer des problemes de routage asymetrique.

Hypothese 2 : iptables DOCKER-USER vide

La chaine DOCKER-USER est vide, ce qui devrait etre OK mais pourrait manquer des regles.

Hypothese 3 : Probleme de conntrack

Le NAT/masquerading pourrait avoir des soucis avec le tracking de connexions.

Hypothese 4 : Interface ens19 DOWN

3: ens19: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN

Une interface reseau est DOWN - peut-etre liee au routage.


5. Solution de contournement actuelle

Tous les services notifications sont en --network=host :


6. Cause racine identifiee

Le probleme

Deux fichiers netplan en conflit :

Resultat : deux routes par defaut, dont une vers une passerelle morte.

Diagnostic cle

ip neigh show | grep 192.168.1.1
# 192.168.1.1 dev eth0 FAILED

La passerelle 192.168.1.1 ne repond pas a l'ARP - elle n'existe pas sur le reseau.

Trace du probleme

  1. Paquet container → docker0 (OK)
  2. FORWARD → DOCKER-FORWARD → ACCEPT (OK)
  3. NAT POSTROUTING → MASQUERADE (jamais atteint)
  4. Host repond "ICMP host unreachable" car route vers 192.168.1.1 echoue

7. Solution appliquee

1. Desactiver cloud-init network

echo 'network: {config: disabled}' | sudo tee /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg

2. Supprimer le fichier cloud-init

sudo rm /etc/netplan/50-cloud-init.yaml

3. Configuration finale (90-custom.yaml)

network:
  version: 2
  ethernets:
    eth0:
      addresses:
        - 192.168.1.12/24
      routes:
        - to: default
          via: 192.168.1.254
      nameservers:
        addresses:
          - 192.168.1.254
          - 8.8.8.8
    ens19:
      optional: true
      addresses:
        - 10.10.10.12/24

4. Appliquer

sudo chmod 600 /etc/netplan/90-custom.yaml
sudo netplan apply

8. Verification

# Route unique fonctionnelle
ip route show default
# default via 192.168.1.254 dev eth0 proto static

# Test Docker bridge
docker run --rm --network=bridge alpine ping -c 2 8.8.8.8
# 2 packets transmitted, 2 packets received, 0% packet loss

9. Retour sur Bridge Network (12/01/2026 00:30)

Services remis sur bridge network apres correction du probleme de passerelle.

Configuration finale

docker-compose.yml

cd /mnt/stock_8to/33800-stack/docker/stacks/notifications
docker compose up -d

Nginx

proxy_pass http://192.168.1.12:8080  # ntfy via bridge

Test valide

curl -s -X POST "http://192.168.1.12:5300/api/notify/push" \
    -H "Content-Type: application/json" \
    -d '{"title": "TEST", "body": "OK"}'
# {"success":true,"log_id":1,"storage":"memory"}

Statut : RESOLU ET OPTIMISE