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
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.