On peut également bloquer toutes les connexions entrantes sauf les ports 80/443
en contournant Docker qu'y s'immisce dans iptables
https://github.com/chaifeng/ufw-docker

/etc/ufw/after.rules

# BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:ufw-docker-logging-deny - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward

-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16

-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN

-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12

-A DOCKER-USER -j RETURN

-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
-A ufw-docker-logging-deny -j DROP

COMMIT
# END UFW AND DOCKER

Cela permet au réseau public d'accéder à tous les ports publiés dont le port conteneur est 80 :
ufw route allow proto tcp from any to any port 80

2 mois plus tard

Bonjour et merci beaucoup pour se tuto très clair, je me pose tout de même une question peut être con mais j'essaie ^^. Vu que le port des containers et supprimer comment fait npm pour savoir sur quel port écouter pour diffuser le container ensuite ? Et nous même comment fait on pour savoir quel port noté dans npm ? Cette technique fonctionne avec n'importe quel container ? Je pense notamment à adguard home qui et plutôt chiant avec les port demandé.
Merci encore, Cordialement

Tu reportes dans NPM le port utilisé normalement par l'application, exemple 9000 pour Portainer :

proxy

Pour résumer le tuto :
Tu créée normalement le conteneur de l'application et tu testes via ip:port (ex : 127.0.0.1:9000 pour Portainer)
Tu configures le proxy via NPM (voir capture écran)
Tu recréé le conteneur de l'application en retirant le port et en ajoutant le network (npm-proxy dans l'exemple)

NB : les étapes liées au network sont facultatives lors de l'utilisation de docker-compose, car celui créé un network compose_default

Merci pour l'explication sa paraît logique maintenant ^^

Bonjour,
Je reviens avec une nouvelle question ^^. Comme dit plus haut je me posais des questions pour ce tuto sur adguardhome et pas manqué je sèche. J'ai donc mon container adguardhome sur mon dédié et chez moi mon routeur sous openwrt qui me demande donc comme dns une adresse IP avec ou sans port mais du coup si je ferme mes port + adresse IP cela ne fonctionne plus. Quelqu'un à eu le problème ? Ou pour cette exception il faut laisser les ports ouverts ?
Cordialement

Si tu accédais via IP:port, tu configures ce port dans NPM et tu accèdera à Adguard via adguard.ndd.tld par exemple
(ce sous-domaine doit être préalablement configuré au niveau de la zone DNS)

    spider1163 Merci beaucoup pour l'aide. Oui c'est se que j'avais en tête mais pour l'instant mes essais ne sont pas très concluant. Je regarderai plus en détail ce weekend. Merci encore

    9 mois plus tard

    Pourtant ça marche bien ici sur un rpi4 et une autre machine.
    Tu le lance de quelle manière ? cli ou compose ?

      je le lance comme cela MattProd

      docker run -dt --network npm-proxy --name=rutorrent --restart always -v /home/diesel/docker/rutorrent:/config -v /home/diesel/mnt/torrent:/data/downloads -v /home/diesel/mnt/sourcetorrents/PreSeries:/data/.watch -v /home/diesel/docker/rutorrentseries/session:/data/.session mondedie/rutorrent:latest

      dns cloudfare en dns only mai erreur 502

      edit : probleme resolu je le lancer en port 8081 au lieu de 8080

        Diesel tu devrais ajouter quand même : -p 45000:45000 pour le port torrent 😅

        2 mois plus tard

        Bonjour voulant mettre a jour l'image mondedie/rutorrent je n'arrive plus a acceder a celle ci avec npm

        je lance :

        docker run -dt --network npm-proxy --name=rutorrent \
         -p 45000:45000 -p 8081:8081 --restart always \
         -v /home/diesel/docker/rutorrent:/config \
         -v /home/diesel/mnt/torrent:/data/downloads \
         -v /home/diesel/mnt/sourcetorrents/PreSeries:/data/.watch \
         -v /home/diesel/docker/rutorrentseries/session:/data/.session \
        mondedie/rutorrent:latest

        dans mon npm j'ai :

        si je le lance via 8080:8080 il ne se lance pas car crowdsec utilise déjà ce port
        et quand je vais sur le seedbox.tld.com de NPM j'ai une erreur 502
        obligé de l'ip en entier mettre pour accéder j'avais eu le même soucis mai je ne sais plus comment on la résolu

        Hello @Diesel

        Alors :
        1) si tu met rutorrent derrière NPM tu peux éviter de publier le port de la WebUI, seulement le 45000/tcp.
        2) si tu met 8081:8081 on ira nulle part dans le container c'est 8080 donc au pire tu fais un -p8081:8080.
        3) si tu lances ton container avec pour nom rutorrent alors dans NPM tu dois appeler http://rutorrent:8080

        Donc pour rappel, à moins de vouloir y'a accéder par IP😛ORT si on met un container dans le network NPM / Traefik / Zoraxy etc on a pas besoin de publier le port pour l'accès à la webui. Seulement les ports qui ont besoin de communiquer depuis l'extérieur.
        Par exemple : rutorrent on a besoin d'un port 45000/tcp, wireguard 51820/udp etc

        Matt

          MattProd

          docker run -dt --network npm-proxy --name=seedbox -p 45000:45000 -p 8080:8081 --restart always -v /home/diesel/docker/rutorrent:/config -v /home/diesel/mnt/torrent:/data/downloads -v /home/diesel/mnt/sourcetorrents/PreSeries:/data/.watch -v /home/diesel/docker/rutorrentseries/session:/data/.session mondedie/rutorrent:latest
          4af2f6915e3fd762b18fa117a99a0f665ad3c2ab69de27b79a623b3b2a75919b
          docker: Error response from daemon: driver failed programming external connectivity on endpoint seedbox (c1385e2f6370410d612598f91db3bffd8f668637fd44797a0e8c1bdb5b5194e4): Error starting userland proxy: listen tcp4 0.0.0.0:8080: bind: address already in use.

          vue que crowdsec tourne aussi sur le serveur dedie en 8080....

            Diesel
            -p8080:8081 -> -p exterieur:intérieur -> donc oui ca va être bloquant... Cependant comme indiqué dans mon message précedant : -p8081:8080 devrait fonctionner.
            Je le redis aussi : pas besoin d'exposer le port de la webui si le container est dans le network de NPM:

            docker run -dt --name=seedbox \
             -p 45000:45000 \
             -v /home/diesel/docker/rutorrent:/config \
             -v /home/diesel/mnt/torrent:/data/downloads \
             -v /home/diesel/mnt/sourcetorrents/PreSeries:/data/.watch \
             -v /home/diesel/docker/rutorrentseries/session:/data/.session \
             --restart always \
            --network npm-proxy \
            mondedie/rutorrent:latest

            devrait être fonctionnel...

            Matt

              MattProd

              je l'ai lancer 8081:8080
              et c'est nikel
              merci MattProd
              et donc si je met seedbox et port 45000 dans npm ca fonctionnera meme si je le lance sans port ?

              MattProd

              je veux pas specialement l'exposer j'essaye de comprendre le principe
              car en le lancant juste sur 45000
              et en mettant

              erreur 502