IPTABES & Docker - Pourquoi ne puis-je pas me connecter à des services PostgreSQL conteneurisés?

1

J'apprends à implémenter les règles iptables. J'ai actuellement les règles suivantes:

#!/bin/sh

iptables -F

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp -m multiport --dports 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m multiport --sports 80,443 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -o eth0 -p udp -m multiport --dports 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p udp -m multiport --sports 53 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -j REJECT
iptables -A OUTPUT -j REJECT
iptables -A FORWARD -j REJECT

Les règles devraient être assez faciles à suivre:

- Start from scratch
- Allow local traffic
- Allow incoming ssh, www traffic
- Allow outgoing www traffic
- Allow outgoing dns traffic
- Disallow all other traffic

Maintenant, je crée un serveur PostgreSQL comme suit:

docker run -p 5432:5432 postgres

Je souhaite maintenant me connecter dans l'hôte à ce conteneur PostgreSQL:

psql -U postgres -h localhost

Je reçois:

psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.

Je ne reçois pas cette erreur lorsque je n'implémente pas les règles iptables décrites ci-dessus.

Je me serais attendu à ce que Docker ajoute / supprime des règles à la volée lorsque des conteneurs sont démarrés / supprimés, afin de permettre l'accès aux ports ouverts.

iptables -S: règles après le démarrage

-P INPUT DROP
-P FORWARD DROP
-P OUTPUT DROP
-N DOCKER
-N DOCKER-ISOLATION
-N DOCKER-USER
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m multiport --sports 80,443 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p udp -m multiport --sports 53 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m multiport --dports 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p udp -m multiport --dports 53 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -j REJECT --reject-with icmp-port-unreachable
-A DOCKER-ISOLATION -j RETURN
-A DOCKER-USER -j RETURN

iptables -S: règles après l'exécution de docker postgres

-P INPUT DROP
-P FORWARD DROP
-P OUTPUT DROP
-N DOCKER
-N DOCKER-ISOLATION
-N DOCKER-USER
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m multiport --sports 80,443 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p udp -m multiport --sports 53 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m multiport --dports 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p udp -m multiport --dports 53 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -j REJECT --reject-with icmp-port-unreachable
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 5432 -j ACCEPT
-A DOCKER-ISOLATION -j RETURN
-A DOCKER-USER -j RETURN

Comme vous le voyez à la troisième dernière ligne, une règle a été ajoutée pour autoriser les 5432 entrants.

Dave Teezo
la source

Réponses:

1

-i losignifie que le trafic sur l' interface de bouclage uniquement. Bien que les conteneurs Docker soient "locaux", ils n'utilisent pas l'interface de bouclage - ils se connectent à l'hôte via des interfaces Ethernet virtuelles.

Puisque vous n'avez pas de règle autorisant le trafic PostgreSQL entrant ou sortant, il est bloqué.

Grawity
la source
Je vous remercie! Je comprends que. Mais Docker n’est-il pas supposé ajouter / supprimer dynamiquement de telles règles lorsque je démarre / arrête le conteneur? Je suis assez perplexe de savoir comment résoudre ce problème, car je ne peux pas connaître les adresses IP du conteneur à l’avance.
Dave Teezo
Si Docker ajoute des règles de manière dynamique, avez-vous essayé de regarder le jeu de règles réel pour vous assurer qu'il est présent? Votre message n'en fait aucune mention et ne parle que du jeu de règles d'origine que vous avez défini.
Grawity
Vous avez raison, j'aurais dû ajouter cela à ma question. Je l'ai fait maintenant.
Dave Teezo
Donc , comme vous pouvez le voir, Docker n'ajoute avant les règles (lorsque votre hôte agit comme une passerelle), pas d' entrée / sortie. Donc, la réponse ci-dessus s'applique toujours. (Cela peut en fait être intentionnel, pour protéger l'hôte des conteneurs.)
grawity
Je vais devoir faire des études, il me manque un peu de compréhension dans ces concepts. Merci de me pointer dans cette direction.
Dave Teezo