{"id":731,"date":"2023-08-08T21:18:56","date_gmt":"2023-08-08T20:18:56","guid":{"rendered":"https:\/\/snakenet.eu\/blog\/?p=731"},"modified":"2023-08-08T21:26:14","modified_gmt":"2023-08-08T20:26:14","slug":"creer-un-docker-pour-upnpc","status":"publish","type":"post","link":"https:\/\/snakenet.eu\/blog\/creer-un-docker-pour-upnpc\/731\/","title":{"rendered":"Cr\u00e9er un docker pour uPnpc"},"content":{"rendered":"\n<p>uPnpc est un client qui permet d&rsquo;ouvrir des ports dynamiquement dans le firewall.<br>Ca \u00e9vite de se connecter dans sa box internet et de configurer (et oublier) des trous dans la s\u00e9curit\u00e9.<br>Je l&rsquo;utilise pour ouvrir temporairement le port 80 utilis\u00e9 par certbot afin de g\u00e9n\u00e9rer un certificat Letsencrypt.<br>L&rsquo;image docker g\u00e9n\u00e9r\u00e9e p\u00e8se 8Mo.<\/p>\n\n\n\n<p>Le code que je vous ai \u00e9crit ci-dessous fait plusieurs choses : <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Aller chercher le dernier code source disponible pour uPnpc<\/li>\n\n\n\n<li>Cr\u00e9er un docker alpine sp\u00e9cifique \u00e0 la compilation du package (ce docker sera d\u00e9truit en fin de g\u00e9n\u00e9ration)<\/li>\n\n\n\n<li>Compiler et extraire les fichiers compil\u00e9s hors du docker.<\/li>\n\n\n\n<li>Cr\u00e9er un nouveau docker le plus petit possible (alpine) avec injection des binaires fraichement compil\u00e9s.<\/li>\n\n\n\n<li>Exporter l&rsquo;image docker dans un fichier tar afin de l&rsquo;utiliser ailleurs.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>### Docker pour upnpc --> \u00b5 PNP Client --> ouvrir des ports dans le firewall dynamiquement.\n\n\n## Installation de docker et de ses pr\u00e9requis.\nsudo apt -y update\nsudo apt -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common\ncurl -fsSL https:\/\/download.docker.com\/linux\/debian\/gpg | sudo gpg --dearmor -o \/usr\/share\/keyrings\/docker-archive-keyring.gpg\necho \"deb &#91;arch=amd64 signed-by=\/usr\/share\/keyrings\/docker-archive-keyring.gpg] https:\/\/download.docker.com\/linux\/debian $(lsb_release -cs) stable\" | sudo tee -a  \/etc\/apt\/sources.list.d\/docker.list\nsudo apt -y install docker-ce docker-ce-cli containerd.io\nsudo systemctl enable docker\n\n## D\u00e9tecter la derniere version : http:\/\/miniupnp.free.fr\/files\/rest.php\/tags?count=1\nsudo apt install jq curl\nupnpcLatest=`curl http:\/\/miniupnp.free.fr\/files\/rest.php\/tags?count=1 | jq -r \".tags.miniupnpc | .&#91;] | .file\"`\n\n## Cr\u00e9er le conteneur docker qui servira \u00e0 compiler\ncat &lt;&lt;ENDOFFILE >Dockerfile\n  FROM alpine:latest\n  RUN apk add alpine-sdk\n  RUN wget http:\/\/miniupnp.free.fr\/files\/download.php?file=$upnpcLatest -O latest.tar.gz ; tar -zxf latest.tar.gz ;cd miniupnpc-* ; make; mkdir \/deploy ; make DESTDIR=\/deploy install; make install\n  ENTRYPOINT &#91;\"\/deploy\/usr\/bin\/upnpc\"]\nENDOFFILE\n\n## Compiler le docker\nsudo docker build -t miniupnpc .\n\n## Tester\nsudo docker rm miniupnpc 2>\/dev\/null\nsudo docker run --interactive --tty --network host --name miniupnpc miniupnpc --help\n\n## Extraire les fichiers compil\u00e9s\nmkdir AlpineBinaries\nsudo docker cp miniupnpc:\/deploy .\/AlpineBinaries\n\n## Supprimer le docker 'miniupnpc' temporaire\nsudo docker rm miniupnpc 2>\/dev\/null\n\n## Cr\u00e9er le fichier de build docker\ncat &lt;&lt;ENDOFFILE >Dockerfile\n  FROM alpine:latest\n  COPY AlpineBinaries\/deploy \/\n  ENTRYPOINT &#91;\"\/usr\/bin\/upnpc\"]\nENDOFFILE\n\n## Cr\u00e9er un nouveau docker avec uniquement l'applicatif upnpc\nsudo docker build -t miniupnpc .\n\n## Test de l'image\nsudo docker rm miniupnpc 2>\/dev\/null\nsudo docker run --rm --interactive --tty --network host --name miniupnpc miniupnpc --help\n\n## Nettoyer les derni\u00e8res traces\nsudo rm -rf AlpineBinaries\nsudo docker rm miniupnpc 2>\/dev\/null\nrm Dockerfile\n\n## Sauver l'image dans un fichier tar\nsudo docker save --output miniupnpc.tar miniupnpc\n<\/code><\/pre>\n\n\n\n<p>Ensuite, comment l&rsquo;utiliser?<br>Exemple, je voudrais ouvrir le port 80 sur ma box et le rediriger sur le port 80 de mon serveur (192.168.0.2):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo docker run --rm --interactive --tty --network host miniupnpc -a 192.168.0.2 80 80 tcp<\/code><\/pre>\n\n\n\n<p>Et pour supprimer l&rsquo;ouverture du port 80, dans la m\u00eame logique : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo docker run --rm --interactive --tty --network host miniupnpc -d 80 tcp<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>uPnpc est un client qui permet d&rsquo;ouvrir des ports dynamiquement dans le firewall.Ca \u00e9vite de se connecter dans sa box internet et de configurer (et oublier) des trous dans la s\u00e9curit\u00e9.Je l&rsquo;utilise pour ouvrir temporairement le port 80 utilis\u00e9 par certbot afin de g\u00e9n\u00e9rer un certificat Letsencrypt.L&rsquo;image docker g\u00e9n\u00e9r\u00e9e p\u00e8se 8Mo. Le code que je [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-731","post","type-post","status-publish","format-standard","hentry","category-non-classe"],"_links":{"self":[{"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/posts\/731","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/comments?post=731"}],"version-history":[{"count":6,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/posts\/731\/revisions"}],"predecessor-version":[{"id":738,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/posts\/731\/revisions\/738"}],"wp:attachment":[{"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/media?parent=731"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/categories?post=731"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/snakenet.eu\/blog\/wp-json\/wp\/v2\/tags?post=731"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}