C'est la première fois que je configure un serveur Ubuntu (14.04 LTS) et j'ai des difficultés à configurer le pare-feu (UFW).
Je n'ai besoin que de ssh
et http
, alors je fais ceci:
Sudo ufw disable
Sudo ufw reset
Sudo ufw default deny incoming
Sudo ufw default allow outgoing
Sudo ufw allow 22/tcp
Sudo ufw allow 80/tcp
Sudo ufw enable
Sudo reboot
Mais je peux toujours me connecter à des bases de données sur d'autres ports de cette machine. Une idée de ce que je fais mal?
EDIT: ces bases de données se trouvent sur des conteneurs Docker. Cela pourrait-il être lié? est-ce que cela remplace ma configuration ufw?
EDIT2: sortie de Sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
80/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp (v6) ALLOW IN Anywhere (v6)
Le problème utilisait l'indicateur -p
sur les conteneurs.
Il s'avère que Docker apporte des modifications directement sur votre iptables
, qui ne sont pas affichées avec ufw status
.
Les solutions possibles sont:
Arrêtez d'utiliser l'indicateur -p
. Utilisez la liaison Docker ou réseaux Docker à la place.
Liez les conteneurs localement pour qu'ils ne soient pas exposés en dehors de votre machine:
docker run -p 127.0.0.1:8080:8080 ...
Si vous insistez pour utiliser l'indicateur -p
, dites à docker de ne pas toucher votre iptables
en les désactivant dans /etc/docker/daemon.json
et en redémarrant:
{ "iptables" : false }
Je recommande les options 1 ou 2. Attention, l'option 3 a des effets secondaires , tout comme les conteneurs qui ne peuvent plus se connecter à Internet.
16.04 présente de nouveaux défis. J'ai fait toutes les étapes comme indiqué Lancer Docker derrière le pare-feu ufwMAIS Je ne pouvais PAS faire fonctionner docker plus UFW le 16.04. En d'autres termes, peu importe ce que j'ai fait, tous les ports de docker sont devenus globalement exposés à Internet. Jusqu’à ce que j’ai trouvé ceci: Comment configurer Docker 1.12+ de ne pas interférer avec IPTABLES/FirewallD
Je devais créer le fichier /etc/docker/daemon.json
et mettre le texte suivant dans:
{
"iptables": false
}
J'ai alors publié Sudo service docker stop
puis Sudo service docker start
FINALLY docker suit simplement les règles appropriées dans UFW.
Données supplémentaires: Docker annule UFW!
Si vous utilisez le système init de systemd (Ubuntu 15.10 et versions ultérieures), éditez le /etc/docker/daemon.json
(vous devrez peut-être le créer s'il n'existe pas), assurez-vous que la clé iptables
est configurée:
{ "iptables" : false }
EDIT: vous risquez de perdre la connexion à Internet à partir de conteneurs internes.
Si vous avez activé UFW, vérifiez que vous pouvez accéder à Internet à partir de conteneurs. sinon - vous devez définir DEFAULT_FORWARD_POLICY
comme ACCEPT
sur /etc/default/ufw
et appliquer l'astuce décrite ici: https://stackoverflow.com/a/17498195/507564
Une solution rapide consiste à exécuter Docker et à mapper les ports. Tu peux toujours faire
docker run ...-p 127.0.0.1:<ext pot>:<internal port> ...
pour empêcher l'accès à votre Docker de l'extérieur.
Utilisation de /etc/docker/daemon.json
avec du contenu
{
"iptables": false
}
cela peut sembler être une solution , mais cela ne fonctionne que jusqu'au prochain redémarrage . Après cela, vous remarquerez peut-être qu'aucun de vos conteneurs n'a accès à Internet. Par exemple, vous ne pouvez pas cingler de site Web. Ce peut être un comportement indésirable.
Même chose pour lier un conteneur à une adresse IP spécifique. Vous ne voudrez peut-être pas faire cela. L'option ultime consiste à créer un conteneur et à le placer derrière UFW, peu importe ce qui se passe et comment vous créez ce conteneur. Il existe donc une solution:
Après avoir créé le fichier /etc/docker/daemon.json
, appelez:
sed -i -e 's/DEFAULT_FORWARD_POLICY="DROP"/DEFAULT_FORWARD_POLICY="ACCEPT"/g' /etc/default/ufw
ufw reload
vous devez donc configurer la politique de transfert par défaut dans UFW pour accepter et utiliser:
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
Si vous êtes sur le point d'utiliser Docker-Compose, la commande IP de ci-dessus doit être remplacée par l'IP du réseau créé par Docker-Composition lors de son exécution avec docker-compose up
.
J'ai décrit le problème et la solution de manière plus complète dans cet article
J'espère que ça aide!
Dans mon cas, j'ai fini par modifier iptables pour permettre l'accès à Docker uniquement à partir d'adresses IP spécifiques.
Selon réponse de ESala :
Si vous utilisez l'indicateur
-p
sur les conteneurs, Docker apporte directement les modifications à iptables, en ignorant le paramètre ufw.
Exemple d'enregistrements ajoutés à iptables par Docker
Routage vers la chaîne 'DOCKER':
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
Envoi de paquets de la chaîne 'DOCKER' au conteneur:
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 6379 -j DNAT --to-destination 172.17.0.3:6379
Vous pouvez modifier iptables pour autoriser l'accès à la chaîne DOCKER uniquement à partir de l'adresse IP source spécifiée (par exemple, 1.1.1.1
):
-A PREROUTING -s 1.1.1.1 -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT -s 1.1.1.1 ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
Vous voudrez peut-être utiliser iptables-save > /tmp/iptables.conf
et iptables-restore < /tmp/iptables.conf
pour vider, éditer et restaurer les règles iptables.
Connectez-vous à votre console de docker:
Sudo docker exec -i -t nom_image_stockeur/bin/bash
Et ensuite dans votre console de docker:
Sudo apt-get update Sudo apt-get install ufw Sudo ufw allow 22
Ajoutez vos règles ufw et activez ufw
Sudo ufw permettre
Pour activer l'option "NET_ADMIN" de Docker:
1.Stop Container:
docker arrêter votre conteneur; Identifiant du conteneur 2.Get:
docker inspecter votre conteneur; 3. Modifiez hostconfig.json (chemin d'accès au menu fixe par défaut:/var/lib/docker, vous pouvez modifier le vôtre).
vim /var/lib/docker/containers/containerid/hostconfig.json
4.Rechercher "CapAdd" et modifier null en ["NET_ADMIN"];
...., "VolumesFrom": null, "CapAdd": ["NET_ADMIN"], "CapDrop": null, .... 5.Redémarrez le menu fixe dans la machine hôte;
redémarrage du docker de service; 6. Démarrez yourconatiner;
docker démarrer votre conteneur;
Utilisez --network = Host lorsque vous démarrez un conteneur afin que docker mappe le port sur un réseau isolé uniquement à la place d'un réseau de pont par défaut. Je ne vois aucun moyen légal de bloquer un réseau ponté. Vous pouvez également utiliser un réseau personnalisé défini par l'utilisateur avec isolation.
J'ai utilisé docker-compose
pour démarrer plusieurs conteneurs et le problème était qu'un port était exposé au monde en ignorant les règles ufw.
Le correctif destiné à rendre le port uniquement disponible pour mes conteneurs Docker était ce changement dans mon fichier docker-compose.yml
:
ports:
- "1234:1234"
pour ça:
ports:
- "1234"
Maintenant, les autres conteneurs Docker peuvent toujours utiliser le port, mais je ne peux pas y accéder de l'extérieur.