Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 31/12/2018, à 00:19

blueduck

Docker modifie iptables et bloque OpenVPN

Bonsoir,

Je rencontre une difficulté avec Docker qui, lorsqu'il démarre, modifie les règles d'iptables.

Or je me suis aperçu que ces modifications "parasitent" la communication entre mon LAN et celui du bureau, qui sont reliés par OpenVPN.

Si je désactive Docker au démarrage, les deux LAN communiquent parfaitement, et les chaînes iptables sont les suivantes :

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             192.168.10.40        tcp dpt:58051
ACCEPT     tcp  --  anywhere             192.168.10.40        tcp dpt:58050

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Puis j'active Docker et je le démarre ; je liste à nouveau les chaînes d'iptables, ce qui donne alors ce résultat :

$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             192.168.10.40        tcp dpt:58051
ACCEPT     tcp  --  anywhere             192.168.10.40        tcp dpt:58050

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             172.17.0.2           tcp dpt:http

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere

Avec ces modifications, seul le serveur OpenVPN peut encore communiquer avec le LAN du bureau : aucun des postes de la maison n'y arrive plus, et inversement les postes du bureau ne "voient" plus ceux de la maison (en-dehors du serveur OpenVPN lui-même).

Comme je suis très ignorant du fonctionnement d'iptables, je n'arrive pas à identifier laquelle des règles mises en place par Docker bloque le VPN. Je comprends vaguement que la politique par défaut de la chaîne FORWARD passe de ACCEPT à DROP, mais je ne sais pas dire si c'est de là que vient le problème, ni comment et dans quel ordre les chaînes interagissent entre elles.
Si j'y arrivais, je me dis que peut-être il serait possible d'ajouter une ou deux règles pour rétablir les communications à travers le VPN, sans pour autant gêner le fonctionnement de Docker.

Quelqu'un peut-il m'expliquer ce qui se passe et comment y remédier ?

Cordialement,

Blue Duck

Dernière modification par blueduck (Le 24/01/2019, à 21:22)


Poste de travail : Kubuntu (KDE Plasma 5.14.4, Frameworks 5.52.0) « Cosmic Cuttlefish » 18.10 64 bits - Intel Core i7 860 @ 2.8 GHz - SLI 2 x Asus GTX660-DC2T-2GD5
Serveur domestique : Ubuntu Server « Bionic Beaver » 18.04.1 LTS 64 bits - Intel Core i5 2400S @ 2.5 GHz

Hors ligne

#2 Le 13/01/2019, à 00:29

Junkaria

Re : Docker modifie iptables et bloque OpenVPN

Salut,
Je te conseille vivement de suivre un petit cours sur IPTables, franchement ce n'est pas si compliqué qu'il n'y parait, et ça te permettra de comprendre ce que tu fais plutôt que de suivre des conseils qui peuvent t'induire en erreur et qui peuvent foutre un peu la merde, et tu finiras par tout virer parce que tu en aura marre d’enchaîner les galères tongue

Pour commencer, tes règles pour le VPN ne sont pas complètes, ce qui brouille déjà le trajet de tes packets.
Comment les modifies-tu ? Script bash ?

Hors ligne

#3 Le 24/01/2019, à 21:21

blueduck

Re : Docker modifie iptables et bloque OpenVPN

Bonsoir, et merci pour ta réponse.

J'ai en effet pris le temps de me documenter un peu plus sur iptables (essentiellement là : http://olivieraj.free.fr/fr/linux/infor … 03-01.html) et, si j'ai bien compris, cela confirme l'origine de ma difficulté.

Au point de départ (c'est-à-dire avant d'installer Docker), je n'utilise pas iptables : les chaînes par défaut sont toutes vides et laissent tout passer (policy ACCEPT), en particulier FORWARD qui est la seule à m'intéresser en ce qui concerne mon problème. Comme le serveur est derrière un routeur, je n'en fais pas une histoire, et cela permet à OpenVPN de fonctionner.

Quand Docker démarre, comme il est (un peu) moins permissif, il isole ses conteneurs (qui communiquent par son interface virtuelle docker0) en les faisant passer à travers des chaînes utilisateurs qu'il crée, et il modifie le réglage par défaut de la chaîne FORWARD à DROP, sans se poser la question de savoir si d'autres services n'auraient pas besoin de FORWARDer des paquets (je trouve d'ailleurs ça un peu moyen comme fonctionnement, mais bon).

Pour régler (provisoirement) mon problème, j'ai utilisé deux scripts que j'avais et qui étaient déjà appelés par OpenVPN lors de son lancement et de son arrêt (leur rôle premier est d'ajouter ou de supprimer l'interface virtuelle d'OpenVPN à mon bridge ethernet). Lors du lancement d'OpenVPN, j'ai ajouté :

iptables -P FORWARD ACCEPT

et lors de son arrêt (plus par acquit de conscience, compte-tenu qu'OpenVPN est lancé 99,99 % du temps...) :

iptables -P FORWARD DROP

Le résultat dans iptables donne ceci :

$ sudo iptables -L -n -v
Chain INPUT (policy ACCEPT 7570K packets, 30G bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.10.40        tcp dpt:58051
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.10.40        tcp dpt:58050
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.10.40        tcp dpt:58051
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.10.40        tcp dpt:58050
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.10.40        tcp dpt:58051
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.10.40        tcp dpt:58050

Chain FORWARD (policy ACCEPT 514K packets, 156M bytes)
 pkts bytes target     prot opt in     out     source               destination
 519K  160M DOCKER-USER  all  --  *      *       0.0.0.0/0            0.0.0.0/0
 519K  160M DOCKER-ISOLATION-STAGE-1  all  --  *      *       0.0.0.0/0            0.0.0.0/0
 2628 3895K ACCEPT     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
    0     0 DOCKER     all  --  *      docker0  0.0.0.0/0            0.0.0.0/0
 1793  113K ACCEPT     all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     all  --  docker0 docker0  0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT 7359K packets, 3303M bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain DOCKER (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.2           tcp dpt:443
    0     0 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.3           tcp dpt:9980

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
 pkts bytes target     prot opt in     out     source               destination
 1793  113K DOCKER-ISOLATION-STAGE-2  all  --  docker0 !docker0  0.0.0.0/0            0.0.0.0/0
 519K  160M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       all  --  *      docker0  0.0.0.0/0            0.0.0.0/0
 1793  113K RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain DOCKER-USER (1 references)
 pkts bytes target     prot opt in     out     source               destination
 519K  160M RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0

Cela fonctionne, mais il subsiste deux problèmes.

Premièrement, c'est moche : quitte à mettre des règles dans iptables, autant en créer une spécifique pour OpenVPN et laisser le réglage par défaut de la chaîne FORWARD à DROP.

Deuxièmement, et même si je crée une telle règle dans un script, il ne faut pas qu'il soit appelé par OpenVPN. D'abord, parce que pendant la phase de boot, j'ai l'impression que Docker est lancé après OpenVPN : donc, les règles qui seraient mises en place par un script appelé par OpenVPN seraient ensuite écrasées par le démarrage de Docker (c'est d’ailleurs déjà le cas : il faut que je relance OpenVPN après le boot pour qu'il rebascule FORWARD à ACCEPT) ; ensuite, parce que même si j'arrivais à configurer systemd pour qu'OpenVPN se lance après Docker au moment du boot (et franchement, gérer l'ordre des lancements des services par systemd n'a pas l'air d'être une mince affaire...), il est quand même assez fréquent que je doive faire un restart sur Docker pour une raison ou pour une autre, et dans ce cas, à nouveau, Docker écrase les réglages iptables et remet FORWARD sur DROP.

Donc, la solution que je vois, c'est que ce script, qui ajouterait une règle à la chaîne FORWARD pour laisser transiter les paquets de mon bridge ethernet, soit appelé par le lancement de Docker. Il semble d'ailleurs que la chaîne utilisateur DOCKER-USER soit faite pour cela, mais je n'ai pas encore tout bien lu la documentation.

Maintenant, s'il y a une autre solution plus simple, plus sure, ou plus élégante, je suis preneur...

Blue Duck

Dernière modification par blueduck (Le 25/01/2019, à 08:57)


Poste de travail : Kubuntu (KDE Plasma 5.14.4, Frameworks 5.52.0) « Cosmic Cuttlefish » 18.10 64 bits - Intel Core i7 860 @ 2.8 GHz - SLI 2 x Asus GTX660-DC2T-2GD5
Serveur domestique : Ubuntu Server « Bionic Beaver » 18.04.1 LTS 64 bits - Intel Core i5 2400S @ 2.5 GHz

Hors ligne