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:
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)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.
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!
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