Guide de Configuration d'OmniPGW
Référence Complète pour la Configuration de runtime.exs
par Omnitouch Network Services
Table des Matières
- Aperçu
- Structure du Fichier de Configuration
- Configuration des Métriques
- Configuration Diameter/Gx
- Configuration S5/S8
- Configuration Gn/Gp (GGSN)
- Configuration Sxb/PFCP
- Configuration du Pool IP UE
- Configuration PCO
- Configuration de l'Interface Web
- Exemple Complet
- Validation de la Configuration
Aperçu
OmniPGW utilise la configuration runtime définie dans config/runtime.exs. Ce fichier est évalué au démarrage de l'application et permet une configuration dynamique basée sur des variables d'environnement ou des sources externes.
Philosophie de Configuration
Principes Clés :
- Source Unique de Vérité - Toute la configuration dans un seul fichier
- Sécurité de Type - Configuration validée au démarrage
- Flexibilité Environnementale - Support pour dev, test, production
- Defaults Clairs - Defaults sensés avec des remplacements explicites
Structure du Fichier de Configuration
Emplacement du Fichier
pgw_c/
├── config/
│ ├── config.exs # Configuration de base (importe runtime.exs)
│ ├── dev.exs # Configuration spécifique au développement
│ ├── prod.exs # Configuration spécifique à la production
│ └── runtime.exs # ← Fichier de configuration principal
Structure de Haut Niveau
# config/runtime.exs
import Config
config :logger, level: :info
config :pgw_c,
metrics: %{...},
diameter: %{...},
s5s8: %{...},
sxb: %{...},
ue: %{...},
pco: %{...}
Sections de Configuration
Configuration des Métriques
Objectif
Configurer l'exportateur de métriques Prometheus pour surveiller OmniPGW.
Bloc de Configuration
config :pgw_c,
metrics: %{
# Activer/désactiver l'exportateur de métriques
enabled: true,
# Adresse IP pour lier le serveur HTTP
ip_address: "0.0.0.0",
# Port pour le point de terminaison des métriques
port: 9090,
# Fréquence de sondage des registres (millisecondes)
registry_poll_period_ms: 10_000
}
Paramètres
| Paramètre | Type | Par Défaut | Description |
|---|---|---|---|
enabled | Boolean | true | Activer l'exportateur de métriques |
ip_address | String (IP) | "0.0.0.0" | Adresse de liaison (0.0.0.0 = toutes les interfaces) |
port | Integer | 9090 | Port HTTP pour le point de terminaison /metrics |
registry_poll_period_ms | Integer | 10_000 | Intervalle de sondage pour les comptes de registre |
Exemples
Production - Lier à une IP spécifique :
metrics: %{
enabled: true,
ip_address: "10.0.0.20", # Réseau de gestion
port: 9090,
registry_poll_period_ms: 5_000 # Sondage toutes les 5 secondes
}
Développement - Localhost uniquement :
metrics: %{
enabled: true,
ip_address: "127.0.0.1",
port: 42069, # Port non standard
registry_poll_period_ms: 10_000
}
Désactiver les métriques :
metrics: %{
enabled: false
}
Accéder aux Métriques
# Point de terminaison par défaut
curl http://<ip_address>:<port>/metrics
# Exemple
curl http://10.0.0.20:9090/metrics
Voir : Guide de Surveillance & Métriques pour la documentation détaillée des métriques.
Configuration Diameter/Gx
Objectif
Configurer le protocole Diameter pour l'interface Gx (communication PCRF).
Bloc de Configuration
config :pgw_c,
diameter: %{
# Adresse IP pour écouter les connexions Diameter
listen_ip: "0.0.0.0",
# Identité Diameter d'OmniPGW (Origin-Host)
host: "omnipgw.epc.mnc001.mcc001.3gppnetwork.org",
# Domaine Diameter d'OmniPGW (Origin-Realm)
realm: "epc.mnc001.mcc001.3gppnetwork.org",
# Liste des pairs PCRF
peer_list: [
%{
# Identité Diameter PCRF
host: "pcrf.epc.mnc001.mcc001.3gppnetwork.org",
# Domaine PCRF
realm: "epc.mnc001.mcc001.3gppnetwork.org",
# Adresse IP PCRF
ip: "10.0.0.30",
# Initier la connexion au PCRF
initiate_connection: true
}
]
}
Paramètres
| Paramètre | Type | Requis | Description |
|---|---|---|---|
listen_ip | String (IP) | Oui | Adresse d'écoute Diameter |
host | String (FQDN) | Oui | Origin-Host d'OmniPGW (doit être FQDN) |
realm | String (Domaine) | Oui | Origin-Realm d'OmniPGW |
peer_list | Liste | Oui | Configurations des pairs PCRF |
Configuration des Pairs :
| Paramètre | Type | Requis | Description |
|---|---|---|---|
host | String (FQDN) | Oui | Identité Diameter PCRF |
realm | String (Domaine) | Oui | Domaine PCRF |
ip | String (IP) | Oui | Adresse IP PCRF |
initiate_connection | Boolean | Oui | Si OmniPGW se connecte au PCRF |
Format FQDN
Les identités Diameter DOIVENT être des FQDN :
# CORRECT
host: "omnipgw.epc.mnc001.mcc001.3gppnetwork.org"
# INCORRECT
host: "omnipgw" # Pas un FQDN
host: "10.0.0.20" # IP non autorisée
Format 3GPP :
<hostname>.epc.mnc<MNC>.mcc<MCC>.3gppnetwork.org
Exemples :
- omnipgw.epc.mnc001.mcc001.3gppnetwork.org (MCC=001, MNC=001)
- pgw-c.epc.mnc260.mcc310.3gppnetwork.org (MCC=310, MNC=260 - US T-Mobile)
Exemples
Un seul PCRF :
diameter: %{
listen_ip: "0.0.0.0",
host: "omnipgw.epc.mnc001.mcc001.3gppnetwork.org",
realm: "epc.mnc001.mcc001.3gppnetwork.org",
peer_list: [
%{
host: "pcrf.epc.mnc001.mcc001.3gppnetwork.org",
realm: "epc.mnc001.mcc001.3gppnetwork.org",
ip: "10.0.0.30",
initiate_connection: true
}
]
}
Plusieurs PCRFs (Redondance) :
diameter: %{
listen_ip: "0.0.0.0",
host: "omnipgw.epc.mnc001.mcc001.3gppnetwork.org",
realm: "epc.mnc001.mcc001.3gppnetwork.org",
peer_list: [
%{
host: "pcrf-primary.epc.mnc001.mcc001.3gppnetwork.org",
realm: "epc.mnc001.mcc001.3gppnetwork.org",
ip: "10.0.1.30",
initiate_connection: true
},
%{
host: "pcrf-backup.epc.mnc001.mcc001.3gppnetwork.org",
realm: "epc.mnc001.mcc001.3gppnetwork.org",
ip: "10.0.2.30",
initiate_connection: true
}
]
}
Connexion Initiée par le PCRF :
diameter: %{
listen_ip: "0.0.0.0",
host: "omnipgw.epc.mnc001.mcc001.3gppnetwork.org",
realm: "epc.mnc001.mcc001.3gppnetwork.org",
peer_list: [
%{
host: "pcrf.epc.mnc001.mcc001.3gppnetwork.org",
realm: "epc.mnc001.mcc001.3gppnetwork.org",
ip: "10.0.0.30",
initiate_connection: false # Attendre que le PCRF se connecte
}
]
}
Voir : Documentation de l'Interface Diameter Gx
Configuration S5/S8
Objectif
Configurer l'interface GTP-C pour la communication avec SGW-C.
Bloc de Configuration
config :pgw_c,
s5s8: %{
# Adresse IPv4 locale pour l'interface S5/S8
local_ipv4_address: "10.0.0.20",
# Optionnel : Adresse IPv6 locale
local_ipv6_address: nil,
# Optionnel : Remplacer le port GTP-C par défaut (2123)
local_port: 2123,
# Délai d'attente des requêtes GTP-C en millisecondes (par défaut : 500ms)
# Délai d'attente par tentative lors de l'attente des réponses GTP-C
request_timeout_ms: 500,
# Nombre de tentatives de réessai pour les requêtes GTP-C (par défaut : 3)
# Temps d'attente total maximum = request_timeout_ms * request_attempts
request_attempts: 3
}
Paramètres
| Paramètre | Type | Par Défaut | Description |
|---|---|---|---|
local_ipv4_address | String (IPv4) | Requis | Adresse IPv4 de l'interface S5/S8 |
local_ipv6_address | String (IPv6) | nil | Adresse IPv6 de l'interface S5/S8 (optionnel) |
local_port | Integer | 2123 | Port UDP pour GTP-C (port standard 2123) |
request_timeout_ms | Integer | 500 | Délai d'attente par tentative de réessai en millisecondes |
request_attempts | Integer | 3 | Nombre de tentatives de réessai avant d'abandonner |
Détails du Protocole
- Protocole : GTP-C Version 2
- Transport : UDP
- Port Standard : 2123
- Direction : Reçoit de SGW-C
Exemples
IPv4 Seulement (Commun) :
s5s8: %{
local_ipv4_address: "10.0.0.20"
}
IPv4 + IPv6 Dual-Stack :
s5s8: %{
local_ipv4_address: "10.0.0.20",
local_ipv6_address: "2001:db8::20"
}
Port Personnalisé (Non-Standard) :
s5s8: %{
local_ipv4_address: "10.0.0.20",
local_port: 2124 # Port personnalisé
}
Réseau à Latence Élevée :
s5s8: %{
local_ipv4_address: "10.0.0.20",
request_timeout_ms: 1500, # 1.5 secondes par tentative
request_attempts: 3 # Total : 4.5 secondes max
}
Configuration des Délais d'Attente
L'interface S5/S8 utilise des délais d'attente configurables pour les transactions de requêtes/réponses GTP-C (Create Bearer Request, Delete Bearer Request).
Calcul du Temps d'Attente Total :
Temps d'Attente Maximum Total = request_timeout_ms × request_attempts
Par Défaut : 500ms × 3 = 1.5 secondes
Directives de Réglage :
| Latence Réseau | Délai d'Attente Recommandé | Temps d'Attente Total |
|---|---|---|
| Faible latence (<50ms) | 200-300ms | 600-900ms |
| Normal (50-150ms) | 500ms (par défaut) | 1.5s |
| Haute latence (>150ms) | 1000-2000ms | 3-6s |
| Satellite/instable | 2000-3000ms | 6-9s |
Quand Ajuster :
- Augmenter le délai si vous constatez des erreurs fréquentes "Create Bearer Request timed out" mais que Wireshark montre des réponses arrivant
- Diminuer le délai pour une détection d'échec plus rapide dans des environnements à faible latence
- Augmenter les tentatives de réessai pour des réseaux peu fiables avec perte de paquets
Comportement du Délai d'Attente :
- En cas de délai d'attente, une erreur est enregistrée :
"Create Bearer Request timed out" - Une erreur Diameter est renvoyée au PCRF : Result-Code 5012 (UNABLE_TO_COMPLY)
- Le porteur reste en stockage précoce pour nettoyage lorsque Charging-Rule-Remove arrive
Planification Réseau
Sélection d'Adresse IP :
- Utilisez un réseau de gestion/signalisation dédié
- Assurez-vous de la connectivité depuis tous les nœuds SGW-C
- Envisagez la redondance (VRRP/HSRP) pour la HA
Règles de Pare-feu :
# Autoriser GTP-C depuis SGW-C
iptables -A INPUT -p udp --dport 2123 -s <sgw_c_network> -j ACCEPT
Configuration Gn/Gp (GGSN)
Objectif
Configurer l'interface GTP-C v1 pour la communication avec les SGSNs, permettant la fonctionnalité GGSN pour les réseaux 2G/3G.
Bloc de Configuration
config :pgw_c,
gn: %{
# Adresse IPv4 locale pour l'interface Gn
local_ipv4_address: "10.0.0.20",
# Optionnel : Adresse IPv6 locale (la plupart des réseaux 2G/3G sont uniquement IPv4)
local_ipv6_address: nil,
# Port GTP-C (partagé avec S5/S8)
local_port: 2123
},
# Serveurs DNS renvoyés dans PCO (partagés avec S5/S8)
dns: %{
primary_ipv4: {8, 8, 8, 8},
secondary_ipv4: {8, 8, 4, 4}
}
Paramètres
| Paramètre | Type | Par Défaut | Description |
|---|---|---|---|
local_ipv4_address | String (IPv4) | Requis | Adresse IPv4 de l'interface Gn (adresse GGSN) |
local_ipv6_address | String (IPv6) | nil | Adresse IPv6 de l'interface Gn (optionnel, rarement utilisé) |
local_port | Integer | 2123 | Port UDP pour GTP-C v1 (partagé avec S5/S8) |
Paramètres DNS
| Paramètre | Type | Par Défaut | Description |
|---|---|---|---|
primary_ipv4 | Tuple | {8, 8, 8, 8} | Serveur DNS principal pour la réponse PCO |
secondary_ipv4 | Tuple | {8, 8, 4, 4} | Serveur DNS secondaire pour la réponse PCO |
Détails du Protocole
- Protocole : GTP-C Version 1 (3GPP TS 29.060)
- Transport : UDP
- Port Standard : 2123 (partagé avec GTP-C v2)
- Direction : Reçoit des SGSNs
Coexistence avec S5/S8
OmniPGW peut fonctionner à la fois comme PGW (4G) et GGSN (2G/3G) simultanément :
- Les deux interfaces partagent le port UDP 2123
- La version GTP est détectée automatiquement à partir des en-têtes de message
- La même adresse IP peut servir à la fois le trafic 4G et 2G/3G
- Infrastructure partagée : pools IP, UPF/PFCP, facturation en ligne
Voir : Documentation de l'Interface Gn/Gp
Configuration Sxb/PFCP
Objectif
Configurer l'interface PFCP pour la communication avec PGW-U (Plan Utilisateur).
Bloc de Configuration
config :pgw_c,
sxb: %{
# Adresse IP locale pour la communication PFCP
local_ip_address: "10.0.0.20",
# Optionnel : Remplacer le port PFCP par défaut (8805)
local_port: 8805
}
Paramètres
| Paramètre | Type | Par Défaut | Description |
|---|---|---|---|
local_ip_address | String (IP) | Requis | Adresse d'écoute PFCP |
local_port | Integer | 8805 | Port UDP PFCP |
Important :
- Tous les pairs UPF sont automatiquement enregistrés à partir de la configuration
upf_selection(règles + pool de secours) au démarrage- Les UPF auto-enregistrés utilisent des valeurs par défaut sensées :
- Nom auto-généré :
"UPF-<ip>:<port>"- Association PFCP passive (attendre que l'UPF initie)
- Intervalle de cœur de 5 secondes
- Les règles de sélection UPF et les pools sont configurés dans la section séparée
upf_selection. Voir Stratégies de Sélection UPF ci-dessous.- L'enregistrement dynamique des UPF est pris en charge pour les UPF découverts par DNS qui ne sont pas dans la configuration
Exemples
Configuration Minimale :
sxb: %{
local_ip_address: "10.0.0.20"
}
# Tous les UPFs dans upf_selection seront automatiquement enregistrés avec :
# - Nom auto-généré : "UPF-10.0.0.21:8805"
# - Association PFCP passive (attendre que l'UPF se connecte)
# - Intervalle de cœur de 5 secondes
Port PFCP Personnalisé :
sxb: %{
local_ip_address: "10.0.0.20",
local_port: 8806 # Port PFCP non standard
}
Exemple Complet avec Sélection UPF :
sxb: %{
local_ip_address: "10.0.0.20"
},
upf_selection: %{
rules: [
%{
name: "Pool IMS",
priority: 10,
match_field: :apn,
match_regex: ~r/^ims$/,
upf_pool: [
%{remote_ip_address: "10.0.1.21", remote_port: 8805, weight: 100},
%{remote_ip_address: "10.0.1.22", remote_port: 8805, weight: 100}
]
}
],
fallback_pool: [
%{remote_ip_address: "10.0.2.21", remote_port: 8805, weight: 100}
]
}
# Tous les 3 UPFs (10.0.1.21, 10.0.1.22, 10.0.2.21) sont automatiquement enregistrés
Sélection Basée sur DNS (Enregistrement Dynamique) :
sxb: %{
local_ip_address: "10.0.0.20"
},
upf_selection: %{
dns_enabled: true,
dns_query_priority: [:ecgi, :tai],
dns_suffix: "epc.3gppnetwork.org",
fallback_pool: [
%{remote_ip_address: "10.0.2.21", remote_port: 8805, weight: 100}
]
}
# Les UPFs découverts par DNS seront enregistrés dynamiquement lors de la première utilisation
Stratégies de Sélection UPF
Important : La configuration de sélection UPF a été simplifiée. Tous les pairs UPF sont automatiquement enregistrés à partir de la configuration upf_selection.
Structure de Configuration
La sélection UPF est configurée dans la section upf_selection qui définit :
- Règles Statique - Routage basé sur des motifs avec des pools d'équilibrage de charge
- Paramètres DNS - Découverte dynamique UPF basée sur la localisation
- Pool de Secours - Pool par défaut lorsque aucune règle ne correspond et que DNS échoue
Ordre de Priorité de Sélection
- Règles Statique (Priorité la Plus Élevée) - Routage basé sur des motifs avec des pools d'équilibrage de charge
- Sélection Basée sur DNS (Priorité Inférieure) - Découverte dynamique UPF basée sur la localisation
- Pool de Secours (Priorité la Plus Basse) - Pool par défaut lorsque aucune règle ne correspond et que DNS échoue
Flux de Décision de Sélection UPF
Champs de Correspondance Disponibles
Les règles statiques peuvent correspondre à n'importe lequel de ces attributs de session :
| Champ de Correspondance | Description | Exemple de Motif |
|---|---|---|
:imsi | Identité Internationale de l'Abonné Mobile | ^313380.* (opérateur américain) |
:apn | Nom du Point d'Accès / DNN | ^internet\. ou ^ims\. |
:serving_network_plmn_id | Identifiant du réseau de service | ^313380$ |
:sgw_ip_address | Adresse IP SGW | ^10\.100\..* |
:uli_tai_plmn_id | Identifiant PLMN de la Zone de Suivi | ^313.* |
:uli_ecgi_plmn_id | Identifiant PLMN de la Cellule E-UTRAN | ^313.* |
Comparaison des Méthodes de Sélection
| Méthode | Quand Utiliser | Avantages | Inconvénients |
|---|---|---|---|
| Pools UPF | Déploiements en production | Équilibrage de charge, HA, poids flexibles | Nécessite plusieurs UPFs |
| Basé sur APN | Différenciation de service | Routage IMS/Internet séparément | Configuration statique |
| Basé sur IMSI | Scénarios de Roaming | Routage géographique | Complexité des regex |
| Basé sur DNS | MEC/Edge computing | Dynamique, conscient de la localisation | Nécessite une infrastructure DNS |
| Pool de Secours | Filet de sécurité | Toujours avoir un UPF | Peut ne pas être optimal |
| Mode Dry-Run | Tester les configs | Test sécurisé | Pas de trafic réel |
Flux Complet d'Établissement de Session
Ce diagramme montre le flux complet d'établissement de session, y compris la sélection UPF et la population PCO :
Points de Décision Clés :
-
Priorité de Sélection UPF :
- Règles Statique (Correspondance de Motif) → Découverte DNS → Pool de Secours
- Filtrage de santé appliqué à tous les stades
- Logique Actif/Standby pour haute disponibilité
- Voir : Interface PFCP pour les détails de communication UPF
-
Priorité de Population PCO :
- Remplacement PCO de Règle → Découverte DNS P-CSCF → Configuration PCO Globale
- Fusion par champ (les remplacements de règle remplacent des champs spécifiques, le global fournit des défauts)
- Voir : Configuration PCO pour les paramètres PCO détaillés
-
Priorité de Découverte P-CSCF :
- FQDN par Règle → Découverte DNS Globale → PCO Statique par Règle → PCO Statique Global
- Voir : Surveillance P-CSCF pour les métriques de découverte et le suivi de la santé
-
Intégration de la Facturation :
- PCRF détermine si la facturation en ligne est requise (Groupe de Notation + Online=1)
- OCS accorde le quota avant l'établissement de session
- PGW-C suit le quota et demande plus via CCR-Update
- Voir : Interface Diameter Gx et Interface Diameter Gy pour les détails de facturation
Exemple Complet de Configuration
Voici un exemple complet montrant la sélection UPF multi-pool avec enregistrement automatique des pairs :
config :pgw_c,
# Interface PFCP - Tous les UPFs sont auto-enregistrés à partir de upf_selection
sxb: %{
local_ip_address: "127.0.0.20"
},
# Logique de Sélection UPF - Tous les UPFs définis ici sont automatiquement enregistrés
upf_selection: %{
# Paramètres de sélection basés sur DNS
dns_enabled: false,
dns_query_priority: [:ecgi, :tai, :rai, :sai, :cgi],
dns_suffix: "epc.3gppnetwork.org",
dns_timeout_ms: 5000,
# Règles de sélection statiques (évaluées par ordre de priorité)
rules: [
# Règle 1 : Trafic IMS - Priorité la Plus Élevée
%{
name: "Trafic IMS",
priority: 20,
match_field: :apn,
match_regex: "^ims",
upf_pool: [
%{remote_ip_address: "10.100.2.21", remote_port: 8805, weight: 80},
%{remote_ip_address: "10.100.2.22", remote_port: 8805, weight: 20}
]
},
# Règle 2 : APN Entreprise
%{
name: "Trafic Entreprise",
priority: 15,
match_field: :apn,
match_regex: "^(enterprise|corporate)\.apn",
upf_pool: [
%{remote_ip_address: "10.100.3.21", remote_port: 8805, weight: 100}
]
},
# R��gle 3 : Trafic Internet - Équilibré
%{
name: "Trafic Internet",
priority: 5,
match_field: :apn,
match_regex: "^internet",
upf_pool: [
%{remote_ip_address: "10.100.1.21", remote_port: 8805, weight: 33},
%{remote_ip_address: "10.100.1.22", remote_port: 8805, weight: 33},
%{remote_ip_address: "10.100.1.23", remote_port: 8805, weight: 34}
]
}
],
# Pool de secours - Utilisé lorsque aucune règle ne correspond et que DNS échoue
fallback_pool: [
%{remote_ip_address: "127.0.0.21", remote_port: 8805, weight: 100}
]
}
Fonctionnalités Clés
Format Actuel :
- ✅ Enregistrement Automatique : Tous les UPFs de
upf_selectionsont automatiquement enregistrés au démarrage - ✅ Configuration Centralisée : Toute la sélection UPF et la configuration des pairs dans une seule section
- ✅ Pools Requis : Toutes les règles utilisent le format
upf_pool(même pour un seul UPF) - ✅ Fallback Structuré : Pool de secours dédié avec distribution pondérée
- ✅ Intégration DNS : Paramètres DNS aux côtés des règles de sélection
- ✅ Enregistrement Dynamique : Les UPFs découverts par DNS sont automatiquement enregistrés lors de la première utilisation
- ��� Surveillance de la Santé : Tous les UPFs configurés sont surveillés avec des cœurs de 5 secondes
Migration depuis le Format Précédent :
- Supprimé : champ
sxb.peer_list(plus nécessaire) - Supprimé :
selection_listintégré dans les configurations de pairs - Toutes les définitions UPF vont maintenant dans les règles et le pool de secours de
upf_selection
Comment Fonctionnent les Pools UPF :
-
Sélection Consciente de la Santé : Seuls les UPFs sains reçoivent du trafic
- Sain = association PFCP active + moins de 3 cœurs consécutifs manqués
- Les UPFs non sains sont automatiquement filtrés
- Retourne à tous les UPFs si aucun n'est sain (échec rapide)
-
Support Actif/Standby : Utilisez
weight: 0pour les UPFs de secours chauds qui s'activent uniquement lorsque les primaires échouent- UPFs Actifs (poids > 0) : Reçoivent du trafic lorsqu'ils sont sains
- UPFs de Secours (poids == 0) : Reçoivent du trafic uniquement lorsque tous les UPFs actifs sont hors service
- Les UPFs de secours sont traités comme
weight: 1lorsqu'ils sont activés
-
Sélection Aléatoire Pondérée : Chaque session est attribuée aléatoirement à un UPF sain basé sur les poids
- Dans l'exemple ci-dessus : 70% vont à .21, 20% à .22, 10% à .23
- Poids plus élevé = plus de sessions attribuées à cet UPF
- Poids égaux = distribution égale
-
Enregistrement Automatique : Tous les UPFs dans les pools sont automatiquement enregistrés au démarrage
- Noms auto-générés :
"UPF-<ip>:<port>" - Paramètres par défaut : association PFCP passive, cœurs de 5 secondes
- Suivi de santé immédiat pour tous les UPFs configurés
- Noms auto-générés :
Sélection Consciente de la Santé avec Actif/Standby
Sélection Aléatoire Pondérée Exemple :
Pool: [
UPF-A: poids 50, sain ✓
UPF-B: poids 30, sain ✓
UPF-C: poids 20, sain ✓
]
Poids Total: 50 + 30 + 20 = 100
Plages de Poids :
UPF-A: 0-49 (50%)
UPF-B: 50-79 (30%)
UPF-C: 80-99 (20%)
Nombre aléatoire: 63 → Sélectionne UPF-B
Nombre aléatoire: 15 → Sélectionne UPF-A
Nombre aléatoire: 91 → Sélectionne UPF-C
Échec de Basculer Actif/Standby Exemple :
Pool Initial: [
UPF-A: poids 100, sain ✓ (Actif)
UPF-B: poids 0, sain ✓ (Standby)
]
Scénario 1: UPF-A Sain
→ Utiliser le Pool Actif : [UPF-A: 100]
→ Tout le trafic vers UPF-A
Scénario 2: UPF-A Échoue
→ Aucun UPF actif sain
→ Activer Standby : [UPF-B: 1]
→ Tout le trafic bascule vers UPF-B
→ Journaliser : "Tous les UPFs actifs hors service, activation des UPFs de secours"
Scénario 3: Les Deux Non Sains
→ Aucun UPF sain
→ Utiliser le pool complet : [UPF-A: 100, UPF-B: 0]
→ Sélectionner avec des poids (tentative de connexion, peut échouer)
→ Journaliser : "Aucun UPF sain dans le pool, utilisation du pool complet comme secours"
Modèles de Poids Communs :
# Distribution égale (25% chacun)
upf_pool: [
%{remote_ip_address: "10.0.1.1", remote_port: 8805, weight: 1},
%{remote_ip_address: "10.0.1.2", remote_port: 8805, weight: 1},
%{remote_ip_address: "10.0.1.3", remote_port: 8805, weight: 1},
%{remote_ip_address: "10.0.1.4", remote_port: 8805, weight: 1}
]
# Charge équilibrée primaire/sauvegarde (90% / 10%)
upf_pool: [
%{remote_ip_address: "10.0.1.21", remote_port: 8805, weight: 90},
%{remote_ip_address: "10.0.1.22", remote_port: 8805, weight: 10}
]
# Actif/Standby (100% primaire, 0% standby jusqu'à ce que le primaire échoue)
upf_pool: [
%{remote_ip_address: "10.0.1.21", remote_port: 8805, weight: 100}, # Actif
%{remote_ip_address: "10.0.1.22", remote_port: 8805, weight: 0} # Standby (uniquement lorsque actif échoue)
]
# Actif avec plusieurs de secours (charge équilibrée lorsqu'activée)
upf_pool: [
%{remote_ip_address: "10.0.1.1", remote_port: 8805, weight: 100}, # Actif
%{remote_ip_address: "10.0.1.2", remote_port: 8805, weight: 0}, # Standby 1
%{remote_ip_address: "10.0.1.3", remote_port: 8805, weight: 0} # Standby 2
]
# Résultat : Actif obtient 100%. Si actif échoue, les de secours obtiennent 50/50%.
# Test A/B (50% / 50%)
upf_pool: [
%{remote_ip_address: "10.0.1.100", remote_port: 8805, weight: 50}, # Ancienne version
%{remote_ip_address: "10.0.1.200", remote_port: 8805, weight: 50} # Nouvelle version
]
Cas d'Utilisation :
- Échec Actif/Standby : Utilisez
weight: 0pour les UPFs de secours chauds qui s'activent uniquement lorsque les primaires échouent - HA Consciente de la Santé : Bascule automatique lorsque les UPFs perdent l'association PFCP ou manquent des cœurs
- Mise à l'Échelle Horizontale : Distribuer la charge entre plusieurs UPFs pour augmenter la capacité
- Haute Disponibilité : Distribution automatique empêche la surcharge d'un seul UPF
- Déploiements Progressifs : Utilisez des poids pour les déploiements canaris (ex. : 95% ancien, 5% nouveau)
- Optimisation des Coûts : Routage de plus de trafic vers les UPFs de plus grande capacité
- Distribution Géographique : Équilibrer les sessions entre les UPFs de bord
Remplacements PCO (Options de Configuration de Protocole) :
Chaque règle de sélection UPF peut spécifier des valeurs PCO personnalisées qui remplacent la configuration PCO par défaut pour les sessions correspondantes. Cela permet à différents APNs ou types de trafic de recevoir des paramètres réseau différents.
Comment Fonctionnent les Remplacements PCO :
- Remplacements Partiels : Spécifiez uniquement les champs PCO que vous souhaitez remplacer
- Fallback par Défaut : Les champs non spécifiés utilisent les valeurs de la configuration PCO principale
- Spécifique à la Règle : Chaque règle peut avoir des remplacements PCO différents
- Fusion de Priorité : Le PCO de la règle prend la priorité sur le PCO par défaut
Hiérarchie de Population PCO
Ordre de Priorité pour Chaque Champ PCO :
- Remplacement PCO de Règle (Priorité la Plus Élevée)
- Découverte DNS P-CSCF (uniquement pour les adresses P-CSCF)
- Configuration PCO Globale (Priorité la Plus Basse / Fallback)
Exemple : La Règle IMS Remplace DNS, La Règle Entreprise Remplace Tout
Session IMS (correspond à la règle "Trafic IMS") :
├─ Serveurs DNS : DE GLOBAL (non remplacé dans la règle)
├─ P-CSCF : DE LA DÉCOUVERTE DNS (p_cscf_discovery_fqdn défini dans la règle)
│ └─ Fallback : DE LA RÈGLE si DNS échoue
└─ MTU : DE GLOBAL (non remplacé dans la règle)
Session Entreprise (correspond à la règle "Trafic Entreprise") :
├─ Serveurs DNS : DE LA RÈGLE (192.168.1.10, 192.168.1.11)
├─ P-CSCF : DE GLOBAL (non remplacé dans la règle)
└─ MTU : DE LA RÈGLE (1500)
Session par Défaut (aucune règle correspondante) :
├─ Serveurs DNS : DE GLOBAL
├─ P-CSCF : DE GLOBAL ou DNS si la découverte globale est activée
└─ MTU : DE GLOBAL
Champs de Remplacement PCO Disponibles :
primary_dns_server_address- Adresse IP du serveur DNS principalsecondary_dns_server_address- Adresse IP du serveur DNS secondaireprimary_nbns_server_address- Adresse IP du serveur WINS principalsecondary_nbns_server_address- Adresse IP du serveur WINS secondairep_cscf_ipv4_address_list- Liste des adresses IP des serveurs P-CSCF (pour IMS) - Voir Configuration PCO et Surveillance P-CSCF pour la découverte dynamique P-CSCFipv4_link_mtu_size- Taille MTU en octets
Découverte P-CSCF par Règle :
En plus des remplacements PCO, les règles de sélection UPF peuvent spécifier une découverte dynamique P-CSCF :
p_cscf_discovery_fqdn- (String) FQDN pour la découverte P-CSCF basée sur DNS (ex. :"pcscf.mnc380.mcc313.3gppnetwork.org")
Lorsque ce paramètre est défini :
- PGW-C effectue une recherche DNS pour le FQDN spécifié lors de l'établissement de session
- Le serveur DNS renvoie une liste d'adresses IP P-CSCF
- Les adresses P-CSCF découvertes sont envoyées à l'UE via PCO
- Si la recherche DNS échoue, retourne à
p_cscf_ipv4_address_listdu remplacement PCO (si spécifié) ou à la configuration PCO globale - Voir Surveillance P-CSCF pour le suivi des taux de succès/échec de découverte
Ceci est particulièrement utile pour :
- APNs IMS - Différentes réseaux IMS avec différents serveurs P-CSCF
- Déploiements multi-locataires - Différentes entreprises avec une infrastructure P-CSCF dédiée
- Routage Géographique - DNS renvoie le P-CSCF le plus proche en fonction de la localisation de l'UE
- Haute Disponibilité - DNS renvoie automatiquement uniquement les serveurs P-CSCF sains
Exemple : Trafic IMS avec P-CSCF Personnalisé :
rules: [
%{
name: "Trafic IMS",
priority: 20,
match_field: :apn,
match_regex: "^ims",
upf_pool: [
%{remote_ip_address: "10.100.2.21", remote_port: 8805, weight: 80},
%{remote_ip_address: "10.100.2.22", remote_port: 8805, weight: 20}
],
# Découverte P-CSCF : Interroger dynamiquement DNS pour les adresses P-CSCF
# La recherche DNS renvoie les IPs P-CSCF actuelles basées sur ce FQDN
p_cscf_discovery_fqdn: "pcscf.mnc380.mcc313.3gppnetwork.org",
# Les sessions IMS obtiennent des serveurs P-CSCF personnalisés (utilisés comme fallback si DNS échoue)
pco: %{
p_cscf_ipv4_address_list: ["10.101.2.100", "10.101.2.101"]
# DNS, NBNS, MTU utiliseront les valeurs par défaut de la configuration PCO principale
}
}
]
Exemple : Trafic Entreprise avec DNS Personnalisé :
rules: [
%{
name: "Trafic Entreprise",
priority: 15,
match_field: :apn,
match_regex: "^(enterprise|corporate)\.apn",
upf_pool: [
%{remote_ip_address: "10.100.3.21", remote_port: 8805, weight: 100}
],
# Les sessions d'entreprise obtiennent des DNS d'entreprise et un MTU personnalisé
pco: %{
primary_dns_server_address: "192.168.1.10",
secondary_dns_server_address: "192.168.1.11",
ipv4_link_mtu_size: 1500
# P-CSCF, NBNS utiliseront les valeurs par défaut de la configuration PCO principale
}
}
]
Exemple : Remplacement Complet (Tous les Champs PCO) :
rules: [
%{
name: "APN IoT - Entièrement Personnalisé",
priority: 10,
match_field: :apn,
match_regex: "^iot\.m2m",
upf_pool: [
%{remote_ip_address: "10.100.5.21", remote_port: 8805, weight: 100}
],
# Les sessions IoT obtiennent un PCO complètement personnalisé
pco: %{
primary_dns_server_address: "8.8.8.8",
secondary_dns_server_address: "8.8.4.4",
primary_nbns_server_address: "10.0.0.100",
secondary_nbns_server_address: "10.0.0.101",
p_cscf_ipv4_address_list: [], # Pas de P-CSCF pour IoT
ipv4_link_mtu_size: 1280 # MTU plus petit pour les appareils contraints
}
}
]
Cas d'Utilisation :
- IMS/VoLTE : Fournir des serveurs P-CSCF spécifiques au transporteur pour les services vocaux
- APNs Entreprise : Routage du trafic d'entreprise via des serveurs DNS d'entreprise
- IoT/M2M : Utiliser des DNS publics et un MTU optimisé pour les appareils à faible bande passante
- Roaming : Fournir des serveurs DNS locaux pour les abonnés en visite
- Différenciation de Service : Différents paramètres réseau par type de service
Sélection Basée sur DNS des UPF :
Activer la sélection dynamique des UPF basée sur les Informations de Localisation de l'Utilisateur (ULI) en utilisant des requêtes NAPTR DNS. Les paramètres DNS sont maintenant configurés dans la section upf_selection.
Remarque : Cela fournit une sélection UPF basée sur la géographie ou la topologie. Voir Interface PFCP pour la configuration de l'association PFCP avec les UPFs découverts dynamiquement et Gestion de Session pour les flux d'établissement de session.
upf_selection: %{
# Activer la sélection basée sur DNS
dns_enabled: true,
# Types de localisation à interroger par ordre de priorité
dns_query_priority: [:ecgi, :tai, :rai, :sai, :cgi],
# Suffixe DNS pour les requêtes NAPTR 3GPP
dns_suffix: "epc.3gppnetwork.org",
# Délai d'attente de requête DNS en millisecondes
dns_timeout_ms: 5000,
# ... règles et fallback_pool ...
}
La sélection basée sur DNS fonctionne comme suit :
- Priorité : La sélection DNS est utilisée uniquement lorsque AUCUNE règle statique ne correspond (priorité inférieure)
- Génération de Requête : Construit des requêtes DNS NAPTR basées sur la localisation de l'UE :
- Requête ECGI :
eci-<hex>.ecgi.epc.mnc<MNC>.mcc<MCC>.epc.3gppnetwork.org - Requête TAI :
tac-lb<hex>.tac-hb<hex>.tac.epc.mnc<MNC>.mcc<MCC>.epc.3gppnetwork.org - Les requêtes RAI, SAI, CGI suivent un format similaire à 3GPP TS 23.003
- Requête ECGI :
- Hiérarchie de Fallback : Essaie chaque type de localisation par ordre de priorité jusqu'à ce qu'une correspondance soit trouvée
- Correspondance de Pair : Les résultats DNS sont filtrés par rapport à la liste de pairs configurée
- Sélection : Choisit le pair correspondant (actuellement première correspondance, sélection basée sur la charge à venir)
Exemples d'Enregistrements DNS (configurer sur votre serveur DNS) :
; Enregistrement NAPTR pour TAC 100 dans PLMN 313-380
tac-lb64.tac-hb00.tac.epc.mnc380.mcc313.epc.3gppnetwork.org IN NAPTR 10 50 "a" "x-3gpp-upf:x-sxb" "" upf-edge-1.example.com.
; Enregistrement A pour l'UPF
upf-edge-1.example.com IN A 10.100.1.21
Cas d'Utilisation :
- MEC (Edge Computing) : Routage des sessions vers les UPFs de bord les plus proches géographiquement
- Découverte Dynamique des UPF : Ajouter/retirer des UPFs sans reconfigurer PGW-C
- Équilibrage de Charge : Distribuer la charge entre les UPFs en fonction de la localisation
- Slicing de Réseau : Routage de différentes tranches vers différents UPFs par localisation
Surveillance de la Santé des UPF
Sélection Automatique Consciente de la Santé : Le PGW-C surveille en continu la santé de tous les UPFs et exclut automatiquement les UPFs non sains de la sélection.
Critères de Vérification de Santé
Un UPF est considéré comme sain lorsque TOUTES les conditions suivantes sont remplies :
- Association PFCP Active : L'UPF a une association PFCP établie
- Réactivité des Cœurs : Moins de 3 cœurs consécutifs manqués
- Processus Actif : Le processus GenServer du pair UPF fonctionne
Un UPF est considéré comme non sain si L'UNE des conditions suivantes est vraie :
- L'association PFCP n'est pas établie (
associated: false) - 3 ou plus de délais d'attente de cœur consécutifs
- Le processus du pair UPF a échoué ou est non réactif
Mécanisme de Surveillance
Pour les UPFs Configurés (dans upf_selection) :
- Le suivi de santé commence immédiatement au démarrage
- L'association PFCP est surveillée en continu
- Des cœurs sont envoyés toutes les 5 secondes
- Le compteur
missed_heartbeats_consecutivesuit les échecs consécutifs - Tous les UPFs des règles et du pool de secours sont automatiquement enregistrés
Pour les UPFs Découverts par DNS (enregistrement dynamique) :
- Considérés comme sains jusqu'à la première tentative de session
- Enregistrés automatiquement lors de la première utilisation
- Le suivi de santé commence après l'enregistrement
Comportement de Sélection
Mode Actif/Standby (lors de l'utilisation de weight: 0) :
- Filtrer vers seulement les UPFs sains
- Séparer en actifs (poids > 0) et standby (poids == 0)
- Utiliser les UPFs actifs si l'un d'eux est sain
- Activer les UPFs de secours (traiter comme poids 1) si tous les actifs sont non sains
- Retourner au pool complet si aucun UPF sain n'existe
Mode Équilibré par Charge (tous poids > 0) :
- Filtrer vers seulement les UPFs sains
- Effectuer une sélection aléatoire pondérée parmi les UPFs sains
- Retourner au pool complet si aucun UPF sain n'existe
Journalisation :
[debug] Utilisation du pool UPF actif (2/3 UPFs sains, 1 standby)
[info] Tous les UPFs actifs hors service, activation des UPFs de secours (1 UPFs de secours, traitement poids 0 comme 1)
[warning] Aucun UPF sain dans le pool (3 au total), utilisation du pool complet comme secours
Vérification de la Santé des UPF
Programmatiquement :
# Vérifier si un UPF spécifique est sain
iex> PGW_C.PFCP_Node.is_peer_healthy?({10, 100, 1, 21})
true
# Obtenir des informations de santé détaillées
iex> PGW_C.PFCP_Node.get_peer_health({10, 100, 1, 21})
%{
associated: true,
missed_heartbeats: 0,
healthy: true,
registered: true
}
Via l'Interface Web :
- Naviguer vers
/upf_selectiondans le panneau de contrôle - Voir l'état de santé en temps réel pour tous les UPFs dans chaque pool
- Badges d'état : ✅ Actif-UP, ⏸️ Standby-Prêt, ❌ Actif-HORS SERVICE, 🟡 Non Associé
- Badges de rôle : ACTIF (poids > 0), STANDBY (poids == 0), DYNAMIQUE (découvert par DNS, pas dans la config)
- Compteur de manques de cœur affiché pour les UPFs associés
Meilleures Pratiques de Surveillance de la Santé
- Configurer les UPFs dans upf_selection : Tous les UPFs dans les règles et les pools de secours sont automatiquement surveillés
upf_selection: %{
rules: [