472 lines
11 KiB
Markdown
472 lines
11 KiB
Markdown
# Reverse Proxy Traefik pour Équipements Externes
|
|
|
|
Ce guide explique comment utiliser Traefik comme reverse proxy pour exposer vos équipements externes (pfSense, OpenMediaVault, NAS, etc.) via les certificats TLS générés par cert-manager, **sans exporter les certificats**.
|
|
|
|
## Avantages de cette approche
|
|
|
|
✅ **Certificats gérés automatiquement** : Les certificats restent dans Kubernetes et sont renouvelés automatiquement par cert-manager
|
|
✅ **Configuration centralisée** : Tous les certificats sont gérés au même endroit
|
|
✅ **Pas d'export/import** : Plus besoin d'exporter et importer les certificats sur chaque équipement
|
|
✅ **Sécurité** : Les certificats ne quittent jamais le cluster Kubernetes
|
|
✅ **HTTPS automatique** : Traefik gère le TLS de bout en bout
|
|
|
|
## Architecture
|
|
|
|
```
|
|
Internet/Intranet
|
|
↓
|
|
Traefik (Kubernetes) ← Certificat wildcard (*.dev.gkdomaine.fr)
|
|
↓ HTTPS
|
|
Équipement externe (pfSense, OMV, NAS, etc.) ← HTTP (interne)
|
|
```
|
|
|
|
## Prérequis
|
|
|
|
1. **Traefik déployé** dans le cluster avec accès aux certificats wildcard
|
|
2. **Certificats wildcard** générés (ex: `wildcard-prd-tls` pour la production)
|
|
3. **Accès réseau** depuis Traefik vers les équipements externes
|
|
4. **Service externe** accessible en HTTP (ou HTTPS avec certificat auto-signé)
|
|
|
|
⚠️ **Note** : Pour le moment, seuls les services externes en **production** sont configurés. Les environnements dev et rct peuvent être ajoutés ultérieurement si nécessaire.
|
|
|
|
## Configuration de base
|
|
|
|
### 1. Créer un IngressRoute pour un équipement externe
|
|
|
|
Créez un fichier `helm/traefik/dev/templates/external-pfsense.yaml` :
|
|
|
|
```yaml
|
|
---
|
|
apiVersion: traefik.io/v1alpha1
|
|
kind: IngressRoute
|
|
metadata:
|
|
name: pfsense-external
|
|
namespace: traefik-dev
|
|
spec:
|
|
entryPoints:
|
|
- websecure
|
|
routes:
|
|
- match: Host(`pfsense.dev.gkdomaine.fr`)
|
|
kind: Rule
|
|
services:
|
|
- name: pfsense-backend
|
|
port: 80
|
|
scheme: http
|
|
# Optionnel : si pfSense utilise HTTPS avec certificat auto-signé
|
|
# scheme: https
|
|
# serversTransport: pfsense-insecure
|
|
tls:
|
|
secretName: wildcard-dev-tls
|
|
```
|
|
|
|
### 2. Créer un Service Kubernetes pointant vers l'équipement externe
|
|
|
|
Créez un fichier `helm/traefik/dev/templates/external-services.yaml` :
|
|
|
|
```yaml
|
|
---
|
|
# Service pour pfSense
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: pfsense-backend
|
|
namespace: traefik-dev
|
|
spec:
|
|
type: ExternalName
|
|
externalName: 192.168.1.1 # IP interne de pfSense
|
|
ports:
|
|
- port: 80
|
|
targetPort: 80
|
|
protocol: TCP
|
|
---
|
|
# Service pour OpenMediaVault
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: omv-backend
|
|
namespace: traefik-dev
|
|
spec:
|
|
type: ExternalName
|
|
externalName: 192.168.1.10 # IP interne d'OpenMediaVault
|
|
ports:
|
|
- port: 80
|
|
targetPort: 80
|
|
protocol: TCP
|
|
---
|
|
# Service pour Synology NAS
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: synology-backend
|
|
namespace: traefik-dev
|
|
spec:
|
|
type: ExternalName
|
|
externalName: 192.168.1.20 # IP interne du NAS
|
|
ports:
|
|
- port: 5000 # Port DSM
|
|
targetPort: 5000
|
|
protocol: TCP
|
|
```
|
|
|
|
### 3. Configuration pour HTTPS backend (certificat auto-signé)
|
|
|
|
Si votre équipement utilise HTTPS avec un certificat auto-signé, créez un `ServersTransport` :
|
|
|
|
```yaml
|
|
---
|
|
apiVersion: traefik.io/v1alpha1
|
|
kind: ServersTransport
|
|
metadata:
|
|
name: pfsense-insecure
|
|
namespace: traefik-dev
|
|
spec:
|
|
insecureSkipVerify: true # Ignorer la vérification du certificat
|
|
```
|
|
|
|
## Exemples complets par équipement
|
|
|
|
### pfSense
|
|
|
|
```yaml
|
|
---
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: pfsense-backend
|
|
namespace: traefik-dev
|
|
spec:
|
|
type: ExternalName
|
|
externalName: 192.168.1.1 # IP de pfSense
|
|
ports:
|
|
- port: 80
|
|
targetPort: 80
|
|
---
|
|
apiVersion: traefik.io/v1alpha1
|
|
kind: IngressRoute
|
|
metadata:
|
|
name: pfsense
|
|
namespace: traefik-dev
|
|
spec:
|
|
entryPoints:
|
|
- websecure
|
|
routes:
|
|
- match: Host(`pfsense.dev.gkdomaine.fr`)
|
|
kind: Rule
|
|
services:
|
|
- name: pfsense-backend
|
|
port: 80
|
|
tls:
|
|
secretName: wildcard-dev-tls
|
|
```
|
|
|
|
**Configuration pfSense** :
|
|
1. Allez dans **System > Advanced > Admin Access**
|
|
2. Désactivez **HTTPS Redirect** (Traefik gère le HTTPS)
|
|
3. Optionnel : Configurez **Trusted Proxies** avec l'IP de Traefik pour les headers X-Forwarded-*
|
|
|
|
### OpenMediaVault
|
|
|
|
```yaml
|
|
---
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: omv-backend
|
|
namespace: traefik-dev
|
|
spec:
|
|
type: ExternalName
|
|
externalName: 192.168.1.10 # IP d'OpenMediaVault
|
|
ports:
|
|
- port: 80
|
|
targetPort: 80
|
|
---
|
|
apiVersion: traefik.io/v1alpha1
|
|
kind: IngressRoute
|
|
metadata:
|
|
name: omv
|
|
namespace: traefik-dev
|
|
spec:
|
|
entryPoints:
|
|
- websecure
|
|
routes:
|
|
- match: Host(`omv.dev.gkdomaine.fr`)
|
|
kind: Rule
|
|
services:
|
|
- name: omv-backend
|
|
port: 80
|
|
tls:
|
|
secretName: wildcard-dev-tls
|
|
```
|
|
|
|
**Configuration OpenMediaVault** :
|
|
1. Allez dans **System > Certificates > SSL**
|
|
2. Désactivez le certificat SSL (Traefik gère le HTTPS)
|
|
3. Configurez les **Trusted Proxies** dans **System > Network > General**
|
|
|
|
### Synology NAS
|
|
|
|
```yaml
|
|
---
|
|
apiVersion: v1
|
|
kind: Service
|
|
metadata:
|
|
name: synology-backend
|
|
namespace: traefik-dev
|
|
spec:
|
|
type: ExternalName
|
|
externalName: 192.168.1.20 # IP du NAS
|
|
ports:
|
|
- port: 5000 # Port DSM
|
|
targetPort: 5000
|
|
---
|
|
apiVersion: traefik.io/v1alpha1
|
|
kind: IngressRoute
|
|
metadata:
|
|
name: synology
|
|
namespace: traefik-dev
|
|
spec:
|
|
entryPoints:
|
|
- websecure
|
|
routes:
|
|
- match: Host(`nas.dev.gkdomaine.fr`)
|
|
kind: Rule
|
|
services:
|
|
- name: synology-backend
|
|
port: 5000
|
|
tls:
|
|
secretName: wildcard-dev-tls
|
|
```
|
|
|
|
**Configuration Synology** :
|
|
1. Allez dans **Control Panel > Network > DSM Settings**
|
|
2. Désactivez **HTTPS** (Traefik gère le HTTPS)
|
|
3. Configurez **Reverse Proxy** si nécessaire
|
|
|
|
### Autres équipements
|
|
|
|
Le principe est le même pour tous les équipements :
|
|
|
|
1. **Créer un Service** de type `ExternalName` pointant vers l'IP de l'équipement
|
|
2. **Créer un IngressRoute** avec :
|
|
- Le domaine souhaité (ex: `equipement.dev.gkdomaine.fr`)
|
|
- Le service backend créé
|
|
- Le certificat wildcard (`wildcard-dev-tls`)
|
|
|
|
## Configuration avancée
|
|
|
|
### Headers personnalisés
|
|
|
|
Pour passer des headers spécifiques à l'équipement backend :
|
|
|
|
```yaml
|
|
apiVersion: traefik.io/v1alpha1
|
|
kind: Middleware
|
|
metadata:
|
|
name: pfsense-headers
|
|
namespace: traefik-dev
|
|
spec:
|
|
headers:
|
|
customRequestHeaders:
|
|
X-Forwarded-Proto: "https"
|
|
X-Real-IP: ""
|
|
---
|
|
apiVersion: traefik.io/v1alpha1
|
|
kind: IngressRoute
|
|
metadata:
|
|
name: pfsense
|
|
namespace: traefik-dev
|
|
spec:
|
|
entryPoints:
|
|
- websecure
|
|
routes:
|
|
- match: Host(`pfsense.dev.gkdomaine.fr`)
|
|
kind: Rule
|
|
services:
|
|
- name: pfsense-backend
|
|
port: 80
|
|
middlewares:
|
|
- name: pfsense-headers
|
|
tls:
|
|
secretName: wildcard-dev-tls
|
|
```
|
|
|
|
### Authentification basique
|
|
|
|
Pour ajouter une authentification HTTP Basic :
|
|
|
|
```yaml
|
|
apiVersion: traefik.io/v1alpha1
|
|
kind: Middleware
|
|
metadata:
|
|
name: pfsense-auth
|
|
namespace: traefik-dev
|
|
spec:
|
|
basicAuth:
|
|
secret: pfsense-basic-auth # Secret contenant user:password hashé
|
|
---
|
|
apiVersion: v1
|
|
kind: Secret
|
|
metadata:
|
|
name: pfsense-basic-auth
|
|
namespace: traefik-dev
|
|
type: Opaque
|
|
data:
|
|
users: | # Format: user:password_hash (généré avec htpasswd)
|
|
admin:$apr1$...
|
|
```
|
|
|
|
### Redirection HTTP vers HTTPS
|
|
|
|
Pour rediriger automatiquement HTTP vers HTTPS :
|
|
|
|
```yaml
|
|
apiVersion: traefik.io/v1alpha1
|
|
kind: Middleware
|
|
metadata:
|
|
name: redirect-https
|
|
namespace: traefik-dev
|
|
spec:
|
|
redirectScheme:
|
|
scheme: https
|
|
permanent: true
|
|
---
|
|
apiVersion: traefik.io/v1alpha1
|
|
kind: IngressRoute
|
|
metadata:
|
|
name: pfsense-http-redirect
|
|
namespace: traefik-dev
|
|
spec:
|
|
entryPoints:
|
|
- web
|
|
routes:
|
|
- match: Host(`pfsense.dev.gkdomaine.fr`)
|
|
kind: Rule
|
|
middlewares:
|
|
- name: redirect-https
|
|
services:
|
|
- name: pfsense-backend
|
|
port: 80
|
|
```
|
|
|
|
## Structure recommandée
|
|
|
|
Créez un chart Helm dédié pour les équipements externes :
|
|
|
|
```
|
|
helm/
|
|
└── external-devices/
|
|
└── dev/
|
|
├── Chart.yaml
|
|
├── values.yaml
|
|
└── templates/
|
|
├── services.yaml
|
|
├── ingressroutes.yaml
|
|
└── middlewares.yaml
|
|
```
|
|
|
|
**values.yaml** (production) :
|
|
|
|
```yaml
|
|
externalDevices:
|
|
pfsense:
|
|
enabled: true
|
|
domain: "pfsense.prd.gkdomaine.fr"
|
|
ip: "192.168.1.1"
|
|
port: 80
|
|
tlsSecret: "wildcard-prd-tls"
|
|
|
|
omv:
|
|
enabled: true
|
|
domain: "omv.prd.gkdomaine.fr"
|
|
ip: "192.168.1.10"
|
|
port: 80
|
|
tlsSecret: "wildcard-prd-tls"
|
|
|
|
synology:
|
|
enabled: true
|
|
domain: "nas.prd.gkdomaine.fr"
|
|
ip: "192.168.1.20"
|
|
port: 5000
|
|
tlsSecret: "wildcard-prd-tls"
|
|
```
|
|
|
|
## Vérification
|
|
|
|
### Vérifier que les services sont créés
|
|
|
|
```bash
|
|
kubectl get services -n traefik-dev | grep -E "pfsense|omv|synology"
|
|
```
|
|
|
|
### Vérifier que les IngressRoute sont créés
|
|
|
|
```bash
|
|
kubectl get ingressroute -n traefik-dev
|
|
```
|
|
|
|
### Tester l'accès
|
|
|
|
```bash
|
|
# Test depuis l'intérieur du cluster
|
|
curl -k https://pfsense.dev.gkdomaine.fr
|
|
|
|
# Vérifier les logs Traefik
|
|
kubectl logs -n traefik-dev -l app.kubernetes.io/name=traefik --tail=50
|
|
```
|
|
|
|
## Dépannage
|
|
|
|
### Erreur "no endpoints available"
|
|
|
|
Vérifiez que l'IP de l'équipement est correcte et accessible depuis les pods Traefik :
|
|
|
|
```bash
|
|
# Depuis un pod Traefik
|
|
kubectl exec -n traefik-dev -it <traefik-pod> -- curl http://192.168.1.1
|
|
```
|
|
|
|
### Erreur "certificate not found"
|
|
|
|
Vérifiez que le secret TLS existe :
|
|
|
|
```bash
|
|
kubectl get secret wildcard-prd-tls -n traefik-prd
|
|
```
|
|
|
|
### Équipement non accessible
|
|
|
|
Vérifiez :
|
|
1. **Réseau** : L'IP est-elle accessible depuis les pods Traefik ?
|
|
2. **Firewall** : Le port est-il ouvert sur l'équipement ?
|
|
3. **Service** : Le service Kubernetes pointe-t-il vers la bonne IP/port ?
|
|
|
|
## Sécurité
|
|
|
|
⚠️ **Important** :
|
|
|
|
1. **Restreindre l'accès** : Utilisez des NetworkPolicies pour limiter l'accès aux équipements
|
|
2. **Authentification** : Ajoutez une authentification (Basic Auth, OAuth, etc.) pour les équipements sensibles
|
|
3. **Whitelist IP** : Limitez l'accès aux IPs autorisées si possible
|
|
4. **Monitoring** : Surveillez les accès aux équipements via les logs Traefik
|
|
|
|
## Avantages vs Export de certificats
|
|
|
|
| Critère | Reverse Proxy | Export de certificats |
|
|
|---------|---------------|----------------------|
|
|
| Gestion des certificats | ✅ Automatique | ❌ Manuel |
|
|
| Renouvellement | ✅ Automatique | ❌ Manuel |
|
|
| Configuration | ✅ Centralisée | ❌ Par équipement |
|
|
| Sécurité | ✅ Certificats dans K8s | ⚠️ Certificats exportés |
|
|
| Complexité | ✅ Simple | ❌ Plus complexe |
|
|
|
|
## Conclusion
|
|
|
|
La solution reverse proxy avec Traefik est **recommandée** car elle :
|
|
- Simplifie la gestion des certificats
|
|
- Centralise la configuration
|
|
- Améliore la sécurité
|
|
- Réduit la maintenance
|
|
|
|
Les équipements externes n'ont plus besoin de gérer les certificats TLS - Traefik s'en charge complètement !
|
|
|