uPnpc est un client qui permet d’ouvrir des ports dynamiquement dans le firewall.
Ca évite de se connecter dans sa box internet et de configurer (et oublier) des trous dans la sécurité.
Je l’utilise pour ouvrir temporairement le port 80 utilisé par certbot afin de générer un certificat Letsencrypt.
L’image docker générée pèse 8Mo.
Le code que je vous ai écrit ci-dessous fait plusieurs choses :
- Aller chercher le dernier code source disponible pour uPnpc
- Créer un docker alpine spécifique à la compilation du package (ce docker sera détruit en fin de génération)
- Compiler et extraire les fichiers compilés hors du docker.
- Créer un nouveau docker le plus petit possible (alpine) avec injection des binaires fraichement compilés.
- Exporter l’image docker dans un fichier tar afin de l’utiliser ailleurs.
### Docker pour upnpc --> µ PNP Client --> ouvrir des ports dans le firewall dynamiquement.
## Installation de docker et de ses prérequis.
sudo apt -y update
sudo apt -y install apt-transport-https ca-certificates curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [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
sudo apt -y install docker-ce docker-ce-cli containerd.io
sudo systemctl enable docker
## Détecter la derniere version : http://miniupnp.free.fr/files/rest.php/tags?count=1
sudo apt install jq curl
upnpcLatest=`curl http://miniupnp.free.fr/files/rest.php/tags?count=1 | jq -r ".tags.miniupnpc | .[] | .file"`
## Créer le conteneur docker qui servira à compiler
cat <<ENDOFFILE >Dockerfile
FROM alpine:latest
RUN apk add alpine-sdk
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
ENTRYPOINT ["/deploy/usr/bin/upnpc"]
ENDOFFILE
## Compiler le docker
sudo docker build -t miniupnpc .
## Tester
sudo docker rm miniupnpc 2>/dev/null
sudo docker run --interactive --tty --network host --name miniupnpc miniupnpc --help
## Extraire les fichiers compilés
mkdir AlpineBinaries
sudo docker cp miniupnpc:/deploy ./AlpineBinaries
## Supprimer le docker 'miniupnpc' temporaire
sudo docker rm miniupnpc 2>/dev/null
## Créer le fichier de build docker
cat <<ENDOFFILE >Dockerfile
FROM alpine:latest
COPY AlpineBinaries/deploy /
ENTRYPOINT ["/usr/bin/upnpc"]
ENDOFFILE
## Créer un nouveau docker avec uniquement l'applicatif upnpc
sudo docker build -t miniupnpc .
## Test de l'image
sudo docker rm miniupnpc 2>/dev/null
sudo docker run --rm --interactive --tty --network host --name miniupnpc miniupnpc --help
## Nettoyer les dernières traces
sudo rm -rf AlpineBinaries
sudo docker rm miniupnpc 2>/dev/null
rm Dockerfile
## Sauver l'image dans un fichier tar
sudo docker save --output miniupnpc.tar miniupnpc
Ensuite, comment l’utiliser?
Exemple, je voudrais ouvrir le port 80 sur ma box et le rediriger sur le port 80 de mon serveur (192.168.0.2):
sudo docker run --rm --interactive --tty --network host miniupnpc -a 192.168.0.2 80 80 tcp
Et pour supprimer l’ouverture du port 80, dans la même logique :
sudo docker run --rm --interactive --tty --network host miniupnpc -d 80 tcp