Files
argocd/docs/REVERSE-PROXY-EXTERNES.md
2026-01-22 23:34:56 +01:00

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 !