web-dev-qa-db-fra.com

Comment configurer mon pare-feu pour qu'il fonctionne avec Docker?

Mon ordinateur héberge une application sur le port 1234 qui ne devrait jamais être accessible que par ma machine. Cependant, mon conteneur Docker (qui exécute Apache) devrait pouvoir y accéder. De même, mon conteneur Docker héberge un certain nombre de ressources sur différents ports qui devraient également être accessibles uniquement à partir de mon ordinateur. Maintenant, cela est encore compliqué par le fait que mon système utilise un pont pour ce réseau spécifique:

NETWORK ID          NAME                DRIVER              SCOPE
4d4b5e752963        bridge              bridge              local               
c387eb42698a        project_default     bridge              local               
6818c0eb94bf        Host                Host                local               
f7e4ed6c05a2        none                null                local  

Ce pont (ennuyeux) a toujours un identifiant généré aléatoirement qui change à chaque redémarrage de la configuration de Docker Compose:

br-c387eb42698a Link encap:Ethernet  HWaddr 02:42:29:95:fd:2c  
          inet addr:172.18.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:29ff:fe95:fd2c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:405753 errors:0 dropped:0 overruns:0 frame:0
          TX packets:530699 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:85147217 (85.1 MB)  TX bytes:75260996 (75.2 MB)

En bref, j'ai besoin de ce qui suit:

  • Tout hôte sur br-c387eb42698a (ou quel que soit le nom du réseau) pour accéder au port 1234 sur mon ordinateur local (idéalement 172.18.0.1)
  • Ma machine doit pouvoir accéder à tout port sur à tout hôte situé sur ce sous-réseau. (défaut)
  • Le monde ne pourra jamais accéder à aucun port du sous-réseau ou port 1234.

Idéalement, une solution ici fonctionnerait de manière agnostique IP, de sorte qu'elle ne dépende pas de la passerelle se trouvant sur le sous-réseau 172.18.0.0/24, ni ne casserait ou n'autoriserait des fuites de données si je suis connecté à un réseau qui se produit contenir le 172.18.0.0/24 sous-réseau.

La chose la plus simple à laquelle je puisse penser serait d'utiliser le nom de l'interface et de configurer les règles UFW autour de cela, mais je ne peux pas vraiment le faire car mon interface change constamment.

Comment puis-je faire ceci? Bien que je préfère faire ceci en pure ufw (ou iptables, si nécessaire), je suis ouvert aux solutions qui impliquent de configurer Docker pour toujours affecter un ID persistant (ou même un nom personnalisé?) À l'interface du pont.

3
Kaz Wolfe

Cela n’est pas possible dans Vanilla UFW en raison du fait que le nom de l’interface est dans un état d’impossibilité de deviner. Afin de définir quelque chose comme ceci, un réseau défini manuellement doit être créé. En bref, on peut utiliser le options du pilote de bridge de Docker dans la configuration de composition pour créer un réseau personnalisé . Cela ressemblera à quelque chose comme:

networks:
    my_bridge:
        driver: bridge
        driver_opts:
            com.docker.network.bridge.name: my-bridge

À partir de là, la configuration du pont peut être ajoutée à chaque service dans le fichier de composition:

myimage:
    image: myimage:1.0
    ports:
        - "2580:2580"
    networks:
        - my_bridge

Ensuite, lors du prochain démarrage du système Compose, le nouveau réseau sera créé avec le nom approprié:

my-bridge Link encap:Ethernet  HWaddr 11:22:33:44:55:66  
      inet addr:172.18.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
      inet6 addr: fe80::42:1122:3344:5566/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:11 errors:0 dropped:0 overruns:0 frame:0
      TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0 
      RX bytes:788 (788.0 B)  TX bytes:695 (695.0 B)

À partir de là, l’ajout de règles UFW permettant la connexion au port 1234 est simple:

ufw allow in on my-bridge from any to any port 1234

Et du coup, tout fonctionne parfaitement!

5
Kaz Wolfe

Pour intégrer la réponse acceptée, vous pouvez également utiliser une commande docker pour créer le réseau en dehors de docker-compose:

Sudo docker network create -d bridge -o com.docker.network.bridge.name=my-bridge my_bridge

Après cela, vous pouvez inspecter les réseaux qui émettent

ip link show

Maintenant, dans vos fichiers de composition, vous pouvez simplement ré-acheminer le réseau par défaut ou définir tout réseau que vous souhaitez remapper sur le réseau existant.

version: "3"
services:
  test:
    image: nginx:Alpine
    ports:
      - "80:80"
networks:
  default:
    external:
      name: my_bridge
1