Wonderfall Ok merci, je pensais qu'une fois ajouté au daemon.json par défaut ça désactivait le runtime de base. Mais c'est vrai qu'en y réflechissant tu dis qu'on peut déclarer plusieurs runtimes
Bonnes pratiques pour un hôte Docker en "prod"
- Modifié
Banip Je suis en train de tester l'UDP et j'ai quelques questions :
- Si tu es sur un dédié la question ne se pose pas normalement mais à la maison, tu es quand même obligé de mettre en place un NAT du ou des ports que tu veux utiliser en UDP ?
- Tu attaques sur l'adresse ts.domain.tld ou ts2.domain.tld mais tu ne déclares pas cette adresse dans ton teamspeak.yml ? Tu la déclares ailleurs ?
- Tu n'exposes pas les ports 9987 et 9988 dans le docker-compose de ton traefik ?
- Dans l'interface traefik, je n'ai rien dans UDP, alors que j'ai bien mes containers dans HTTP, c'est normal ?
- Tu aurais un exemple de docker-compose pour ton serveur TS ?
Merci !
- Modifié
Wonderfall Merci pour l'article et notamment l'explication VS Kata. Je faisais tourner certains Dockers dans des VM (Whonix ou Qubes notamment) mais effectivement c'était plus du bricolage qu'autre chose pour la plupart (ne nécessitant pas d'anonymat spécifique surtout).
- Modifié
NicCo Je suis en train de tester l'UDP et j'ai quelques questions :
Pas de problème je vais essayer de répondre à tout, bonne lecture
Si tu es sur un dédié la question ne se pose pas normalement mais à la maison, tu es quand même obligé de mettre en place un NAT du ou des ports que tu veux utiliser en UDP ?
Je suis sur un dédié effectivement, si mon traefik était @home je ferai quand même tout passer par traefik.
J'irais même plus loin et je mettrais tout ce qui est exposé au web en DMZ au cas ou quelqu'un réussisse à pirater ton serveur qu'il ne puisse pas redescendre dans le réseau domestique et soit arrêté dans la DMZ.
Tu attaques sur l'adresse ts.domain.tld ou ts2.domain.tld mais tu ne déclares pas cette adresse dans ton teamspeak.yml ? Tu la déclares ailleurs ?
Exacte, mon serveur fait aussi DNS j'ai donc deux entrées SRV dans ma déclaration DNS comme l'indique la documentation de teamspeak :
; A record
chronos IN A XXX.XXX.XXX.XXX
; SRV record
_ts3._udp.ts.domain.tld. 86400 IN SRV 0 5 9987 chronos
_ts3._udp.ts2.domain.tld. 86400 IN SRV 0 5 9988 chronos
Tu n'exposes pas les ports 9987 et 9988 dans le docker-compose de ton traefik ?
Si tu es obligé si tu veux que traefik gère ton entrypoints après :
version: "3.2"
networks:
traefik:
external:
name: traefik
services:
traefik:
image: traefik:v2.3.6
container_name: traefik
volumes:
- /path/file/static/traefik/:/etc/traefik/
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- 80:80
- 443:443
- 21:21
- 9900-9999:9900-9999/udp # j'ai pour projet de gérer 100 serveurs teamspeak
networks:
- traefik
restart: unless-stopped
Mais grâce aux entrées SRV quand la requête ts.domain.tld
arrive au serveur on sait qu'en réalité on demande le port 9987 comme si tu tapais IP:9987 dans la requête. De l'autre coté dans la configuration de traefik j'ai deux entrypoints udp :
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
ftp:
address: ":21"
ts9987:
address: ":9987/udp"
ts9988:
address: ":9988/udp"
Et ensuite dans mon dossier conf que traefik watch j'ai le fichier teamspeak.yml
:
udp:
services:
ts9987:
loadBalancer:
servers:
- address: "teamspeak:9987"
ts9988:
loadBalancer:
servers:
- address: "teamspeak:9988"
routers:
ts9987:
entryPoints:
- "ts9987"
service: "ts9987"
ts9988:
entryPoints:
- "ts9988"
service: "ts9988"
De cette manière les ports 9987 et 9988 ne sont pas en listening malgré qu'ils soient déclarés dans le docker-compose de traefik - 9900-9999:9900-9999/udp
:
root@chronos:~# netstat -ntpl |grep 9987
root@chronos:~# netstat -ntpl |grep 9988
Dans l'interface traefik, je n'ai rien dans UDP, alors que j'ai bien mes containers dans HTTP, c'est normal ?
Dès que j'ai mon fichier teamspeak.yml
dans mon dossier conf
je vois bien mes routers UDP :
Il faut fouiller dans les logs de traefik voir si tu n'as pas un problème dans ton fichier .yml, tu peux même prendre le mien et regarder si ça fonctionne.
Tu aurais un exemple de docker-compose pour ton serveur TS ?
Voici, j'ai mis quelques #annotations sur certains points :
version: '3'
services:
#############
# teamspeak #
#############
teamspeak:
image: teamspeak
container_name: teamspeak
ports:
- 9987 # Je laisse les ports que mes applications utilisent, cela n'expose en rien les ports du host vers le docker, c'est simplement pour pouvoir me souvenir si j'ai la tête dans les fichiers qui utilise quoi sans devoir me reconnecter au dashboard traefik.
- 30033
- 10011
environment:
- TS3SERVER_LICENSE=accept
volumes:
- /path/to/static/files/ts3:/var/ts3server
restart: always
networks:
- traefik # Bien penser à déclarer qu'on utilise le network traefik (et bien le créer avant) sinon le traefik ne verra pas le teamspeak.
networks: # Obligé de redéclarer le netork traefik car ce fichier docker-compose est séparé du docker-compose de traefik
traefik:
external:
name: traefik
Merci !
Content si j'ai pu t'aider
J'attire ton attention sur la doc des routeurs UDP de traefik, tu ne pourra pas faire fonctionner une application derrière sub.domain.tld si cette application ne fournit pas d'entrée SRV car traefik sur les routeur UDP ne gère pas de règle host SNI.
@Banip Bon avec tes explications et en cherchant un peu j'ai réussi à le faire fonctionner mais sans utiliser une entrée SRV mais avec une entrée A classique. Je me connecte en UDP à travers Traefik, le client Wireguard demande une URL et un port. Quelle est la différence entre l'utilisation d'un enregistrement SRV et un A ? J'avoue que j'ai une utilisation basique du DNS, j'ai toujours plus ou moins utilisé seulement du A, CNAME et MX.
J'ai bien vérifié, le port 51820 utilisé par Wireguard n'est pas en listening. J'ai également mis en place un OpenVPN en UDP aussi, les 2 semblent tourner sans problème en parallèle. Voici mes fichiers pour le moment (avec les 2 VPN en parallèle) :
ports: - 80:80 - 443:443 - 1194:1194/udp - 51820:51820/udp
entryPoints: web: address: ":80" http: redirections: entryPoint: to: websecure scheme: https permanent: true websecure: address: ":443" openvpn: address: ":1194/udp" wireguard: address: ":51820/udp"
udp:
services:
wireguard:
loadBalancer:
servers:
- address: "wireguard:51820"
routers:
wireguard:
entryPoints:
- "wireguard"
services: "wireguard@file"
tcp: services: openvpn_tcp: loadBalancer: servers: - address: "openvpn_tcp:1194" routers: openvpn_tcp: rule: "HostSNI(`*`)" entryPoints: - "websecure" service: "openvpn_tcp@file" udp: services: openvpn_udp: loadBalancer: servers: - address: "openvpn_tcp:1194" routers: openvpn_udp: entryPoints: - "openvpn" service: "openvpn_udp@file"
@Wonderfall ou quelu'un d'autre toujours, j'ai une autre question sur la sécurité si tu as la réponse pour les VPN, il est demandé d'ajouter dans le docker-compose ceci :
cap_add: - NET_ADMIN - SYS_MODULE
Apparemment c'est utilisé pour que l'app puisse accéder à certaines fonctions de la machine hôte. Tu as déjà utilisé ceci ? Niveau sécurité je suppose que ça doit pas être génial ? Il y a une solution alternative plus sécurisée ? Merci !
NicCo C'est des capabilities, en gros des "morceaux de privilèges", c'est déjà bien plus propre que de tourner avec l'option privileged
.
Parfois c'est nécessaire, et dans ce cas, NET_ADMIN
permet au conteneur d'administrer des règles iptables par exemple ce qui semble nécessaire pour un VPN. Pour SYS_MODULE
c'est à voir selon le besoin. Tu veux monter un serveur ou un client VPN (pour une seedbox par exemple) ? Si c'est pour un client et que tu veux passer par un conteneur, je te conseille cette image qui est bien documentée et à jour.
Il n'y a pas de solution plus sécurisée, parfois il faut les privilèges. Mais il faut appliquer le concept du moindre privilège et adopter une façon granulaire quand tu dois en donner à un conteneur. RedHat en parle en détails.
Merci @Wonderfall je vais regarder ça, pour le NET_ADMIN apparemment c'est obligatoire, pour le SYS_MODULE sur Wireguard c'est apparemment obligatoire aussi car il utilise le module Wireguard du kernel Linux. Après peut-être qu'il peut l'utiliser sans devoir faire un SYS_MODULE, à tester.
Et je cherche à monter un serveur VPN pour connecter un ou plusieurs PC distants ensemble, mais merci je garde au cas où le lien
Et tant que j'y suis, si vous avez des containers recommandés à mettre en place je suis preneur
A priori Watchtower est un quasi indispensable pour rester à jour (sauf à surveiller tous les jours les mises à jour), s'il y en a d'autres dans les "indispensables" (il me faudrait sûrement un monitoring aussi, au moins pour surveiller les disques, CPU et mémoire de mon hôte Docker)
Et encore merci à tout le monde et plus particulièrement à @Wonderfall !
- Modifié
Je conseille pas tant que ça Watchtower, ça peut mener à des emmerdes. Enfin, pourquoi pas, mais ça dépend vraiment au cas par cas et il faut absolument prendre la bonne habitude de préciser les tags de ses images (exemple : nginx:1.19-alpine et pas juste nginx). Watchtower ou pas, tu auras moins de soucis comme ça.
Pour le monitoring tu peux jeter un coup d'oeil à Netdata : c'est surtout pour du monitoring en temps réel même s'il peut être personnalisé pour remonter un peu plus loin dans le temps. Si tu veux un truc plus complet (mais plus lourd), pourquoi pas s'intéresser à une stack Grafana/Prometheus/Node-exporter/Cadvisor. Attention c'est un peu lourd par contre, et y a trop de configurations pour que je te dise quoi faire (faut que je mette à jour la mienne d'ailleurs...), mais doit y avoir des tuto sur Internet.
@Wonderfall Merci pour les infos, j'ai regardé Diun aussi qui permet seulement d'avertir quand de nouvelles images sont dispo, c'est peut-être mieux d'être juste notifié plutôt que de recevoir automatiquement les images. A voir je vais regarder les 2.
Pour le monitoring c'est vraiment pour voir si mon serveur est up, si les disques ne sont pas pleins et si les ressources (CPU, RAM, réseau) ne sont pas au taquet. Je vais regarder NetData mais je pense que ça peut me suffire, pas besoin d'une usine à gaz pour rien.
Ou Watchtower sans mise à jour sur un serveur de prod :
https://containrrr.dev/watchtower/arguments/#without_updating_containers
Ah intéressant aussi @spider1163 merci, ça permet peut-être de mettre en place Watchtower en version notification et basculer par la suite en version mise à jour si le besoin apparaît sans reprendre toutes les configs des apps
Par contre @spider1163 tu as déjà testé cette config ? J'ai du mal à saisir le sens de cette phrase "Due to Docker API limitations the latest image will still be pulled from the registry.". Si on utilise le tag latest, l'image sera quand même téléchargée même en monit ?
- Modifié
Perso ce que je fais j'ai des flux RSS pour chaque soft que j'utilise, et comme j'utlilise au maximum les versions officielles, je sais que c'est vite à jour. Après même sur un tag fixe tu dois idéalement refaire le conteneur avec une image fraîche de temps en temps histoire d'avoir des paquets à jour (là encore il faut que la maintenance de l'image soit présente, à moins de la construire toi-même) ; faut avoir ça à l'esprit (et on touche au gros point noir de Docker avec l'enfer des dépendances : si t'as une faille OpenSSL tu dois la corriger sur X conteneurs au lieu d'un simple apt update).
@Wonderfall Du coup tu récupères les flux RSS chez chaque éditeur pour suivre les sorties des mises à jour ? Tu n'utilises rien comme Watchtower ou Diun ?
Effectivement c'est vrai que Docker a pas mal de point positif mais j'en oublie les images, et je ne suis pas prêt pour les construire moi-même, je regarderai quand mon infra Docker sera en place et opérationnelle
- Modifié
NicCo Non je n'utilise ni Watchtower ni Diun. Peut-être je devrai mais pour l'instant je suis satisfait avec les RSS pour les mises à jour proprement dites et la "bonne pratique" de mettre à jour les images régulièrement (tout comme généralement on fait apt update/upgrade soi-même plutôt qu'automatique). Après c'est à chacun de voir ce qui lui va...
Pour les RSS sache que la page "releases" de chaque Github t'as un flux atom pour ça. Chez moi j'utilise Miniflux et Miniflux le récupère tout seul après un C/C. Pour les images, tu peux ajouter les flux RSS d'Alpine Linux (souvent utilisé) pour être au courant si y a un gros truc à mettre à jour et donc penser à mettre à jour toutes tes images. Et évidemment Debian, etc.
De façon générale faut se tenir au courant, il n'y a pas d'install & forget même avec Docker. Les flux RSS sont un outil souvent trop sous-estimé pour ça.
@Wonderfall Ok merci, et un autre sujet est-ce que tu as testé Podman ?