GoTeleport - Behind Nginx
🔧 Pré-requis
Dans ce scénario, Teleport est déployé sur un cluster Kubernetes exposant ses services via un Ingress Controller, un peu comme décrit ici .
Cela devrait toutefois fonctionner même si déployer Teleport sur un serveur Linux en standalone.
Peu importe la configuration, ce scénario implique que vous ayez activer le mode multiplex comme décrit dans cet article.

Pour résumé :
- Vous avez déployé Teleport dans un réseau non exposé, avec ou sans certificat valide.
- Vous disposez d'un reverse proxy Nginx routant le traffic de l'extérieur vers Teleport.
- Les services Teleport ne sont jamais exposé directement.

⛴️ Kubernetes
Un exemple de déploiement sur Kubernetes avec un Helm Chart.
acme: false
chartMode: standalone
clusterName: teleport.example.com
enterprise: true
# enterpriseImage: public.ecr.aws/gravitational/teleport-ent-distroless
annotations:
ingress:
# cert-manager.io/cluster-issuer: letsencrypt-prod
# Le backend est en HTTPS, exemple ici avec Traefik, si vous utilisez Nginx c'est plutôt :
# nginx.ingress.kubernetes.io/backend-protocol: HTTPS
traefik.ingress.kubernetes.io/service.serversscheme: https
traefik.ingress.kubernetes.io/service.serverstransport: "teleport-transport"
traefik.ingress.kubernetes.io/service.passhostheader: "true"
ingress:
enabled: true
spec:
ingressClassName: traefik
suppressAutomaticWildcards: false
useExisting: false
operator:
enabled: true
persistence:
enabled: true
volumeSize: 20Gi
storageClassName: nfs-csi
proxyListenerMode: multiplex
service:
type: ClusterIP
# On désactive TLS ici, pas besoin, c'est Nginx qui gère
# tls:
# existingCASecretName: ''
# existingSecretName: 'teleport-tls'
validateConfigOnDeploy: true⚙️ Nginx
Vous devrez ensuite créer un vhost sur votre nginx. Voici un exemple de configuration :
map $http_upgrade $connection_upgrade {
default Upgrade;
'' close;
}
server {
listen 0.0.0.0:443 ssl;
server_name teleport.example.com;
ssl_certificate /etc/letsencrypt/live/teleport.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/teleport.example.com/privkey.pem;
location ~ /\.well-known{
root /srv/www/htdocs;
allow all;
}
location ~ /\. { deny all; access_log off; log_not_found off; }
location / {
# WebSocket Support
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# Host and X headers
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Connectivity Options
proxy_http_version 1.1;
proxy_read_timeout 1800s;
proxy_send_timeout 1800s;
proxy_connect_timeout 1800s;
proxy_buffering off;
# # Allow large requests to support file uploads to sessions
client_max_body_size 10M;
#proxy_set_header Host $http_host;
proxy_pass https://your.ingress.controller.vip;
## Can also be your Teleport standalone server IP address, with the right port
}
}
Et voilà. Notez bien que dans cette configuration, tout le traffic devra passer par votre reverse proxy. Un service tentant d'accéder à Teleport en direct aura un problème de certificat.
De la même façon, je donne à clusterName la même adresse que celle diffusée par Nginx, si ce n'est pas votre cas, veillez à définir la variable publicAddr disponible dans le Helm Chart.
Plus d'informations ici :
