Aller au contenu principal

Guide de Configuration d'OmniPGW

Référence Complète pour la Configuration de runtime.exs

par Omnitouch Network Services


Table des Matières

  1. Aperçu
  2. Structure du Fichier de Configuration
  3. Configuration des Métriques
  4. Configuration Diameter/Gx
  5. Configuration S5/S8
  6. Configuration Gn/Gp (GGSN)
  7. Configuration Sxb/PFCP
  8. Configuration du Pool IP UE
  9. Configuration PCO
  10. Configuration de l'Interface Web
  11. Exemple Complet
  12. 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ètreTypePar DéfautDescription
enabledBooleantrueActiver l'exportateur de métriques
ip_addressString (IP)"0.0.0.0"Adresse de liaison (0.0.0.0 = toutes les interfaces)
portInteger9090Port HTTP pour le point de terminaison /metrics
registry_poll_period_msInteger10_000Intervalle 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ètreTypeRequisDescription
listen_ipString (IP)OuiAdresse d'écoute Diameter
hostString (FQDN)OuiOrigin-Host d'OmniPGW (doit être FQDN)
realmString (Domaine)OuiOrigin-Realm d'OmniPGW
peer_listListeOuiConfigurations des pairs PCRF

Configuration des Pairs :

ParamètreTypeRequisDescription
hostString (FQDN)OuiIdentité Diameter PCRF
realmString (Domaine)OuiDomaine PCRF
ipString (IP)OuiAdresse IP PCRF
initiate_connectionBooleanOuiSi 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ètreTypePar DéfautDescription
local_ipv4_addressString (IPv4)RequisAdresse IPv4 de l'interface S5/S8
local_ipv6_addressString (IPv6)nilAdresse IPv6 de l'interface S5/S8 (optionnel)
local_portInteger2123Port UDP pour GTP-C (port standard 2123)
request_timeout_msInteger500Délai d'attente par tentative de réessai en millisecondes
request_attemptsInteger3Nombre 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éseauDélai d'Attente RecommandéTemps d'Attente Total
Faible latence (<50ms)200-300ms600-900ms
Normal (50-150ms)500ms (par défaut)1.5s
Haute latence (>150ms)1000-2000ms3-6s
Satellite/instable2000-3000ms6-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ètreTypePar DéfautDescription
local_ipv4_addressString (IPv4)RequisAdresse IPv4 de l'interface Gn (adresse GGSN)
local_ipv6_addressString (IPv6)nilAdresse IPv6 de l'interface Gn (optionnel, rarement utilisé)
local_portInteger2123Port UDP pour GTP-C v1 (partagé avec S5/S8)

Paramètres DNS

ParamètreTypePar DéfautDescription
primary_ipv4Tuple{8, 8, 8, 8}Serveur DNS principal pour la réponse PCO
secondary_ipv4Tuple{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ètreTypePar DéfautDescription
local_ip_addressString (IP)RequisAdresse d'écoute PFCP
local_portInteger8805Port 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 :

  1. Règles Statique - Routage basé sur des motifs avec des pools d'équilibrage de charge
  2. Paramètres DNS - Découverte dynamique UPF basée sur la localisation
  3. Pool de Secours - Pool par défaut lorsque aucune règle ne correspond et que DNS échoue

Ordre de Priorité de Sélection

  1. Règles Statique (Priorité la Plus Élevée) - Routage basé sur des motifs avec des pools d'équilibrage de charge
  2. Sélection Basée sur DNS (Priorité Inférieure) - Découverte dynamique UPF basée sur la localisation
  3. 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 CorrespondanceDescriptionExemple de Motif
:imsiIdentité Internationale de l'Abonné Mobile^313380.* (opérateur américain)
:apnNom du Point d'Accès / DNN^internet\. ou ^ims\.
:serving_network_plmn_idIdentifiant du réseau de service^313380$
:sgw_ip_addressAdresse IP SGW^10\.100\..*
:uli_tai_plmn_idIdentifiant PLMN de la Zone de Suivi^313.*
:uli_ecgi_plmn_idIdentifiant PLMN de la Cellule E-UTRAN^313.*

Comparaison des Méthodes de Sélection

MéthodeQuand UtiliserAvantagesInconvénients
Pools UPFDéploiements en productionÉquilibrage de charge, HA, poids flexiblesNécessite plusieurs UPFs
Basé sur APNDifférenciation de serviceRoutage IMS/Internet séparémentConfiguration statique
Basé sur IMSIScénarios de RoamingRoutage géographiqueComplexité des regex
Basé sur DNSMEC/Edge computingDynamique, conscient de la localisationNécessite une infrastructure DNS
Pool de SecoursFilet de sécuritéToujours avoir un UPFPeut ne pas être optimal
Mode Dry-RunTester les configsTest 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 :

  1. 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
  2. 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
  3. 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é
  4. 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_selection sont 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_list inté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 :

  1. 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)
  2. Support Actif/Standby : Utilisez weight: 0 pour 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: 1 lorsqu'ils sont activés
  3. 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
  4. 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

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: 0 pour 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 :

  1. Remplacements Partiels : Spécifiez uniquement les champs PCO que vous souhaitez remplacer
  2. Fallback par Défaut : Les champs non spécifiés utilisent les valeurs de la configuration PCO principale
  3. Spécifique à la Règle : Chaque règle peut avoir des remplacements PCO différents
  4. 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 :

  1. Remplacement PCO de Règle (Priorité la Plus Élevée)
  2. Découverte DNS P-CSCF (uniquement pour les adresses P-CSCF)
  3. 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 principal
  • secondary_dns_server_address - Adresse IP du serveur DNS secondaire
  • primary_nbns_server_address - Adresse IP du serveur WINS principal
  • secondary_nbns_server_address - Adresse IP du serveur WINS secondaire
  • p_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-CSCF
  • ipv4_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 :

  1. PGW-C effectue une recherche DNS pour le FQDN spécifié lors de l'établissement de session
  2. Le serveur DNS renvoie une liste d'adresses IP P-CSCF
  3. Les adresses P-CSCF découvertes sont envoyées à l'UE via PCO
  4. Si la recherche DNS échoue, retourne à p_cscf_ipv4_address_list du remplacement PCO (si spécifié) ou à la configuration PCO globale
  5. 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 :

  1. Priorité : La sélection DNS est utilisée uniquement lorsque AUCUNE règle statique ne correspond (priorité inférieure)
  2. 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&lt;MNC>.mcc&lt;MCC>.epc.3gppnetwork.org
    • Requête TAI : tac-lb<hex>.tac-hb<hex>.tac.epc.mnc&lt;MNC>.mcc&lt;MCC>.epc.3gppnetwork.org
    • Les requêtes RAI, SAI, CGI suivent un format similaire à 3GPP TS 23.003
  3. Hiérarchie de Fallback : Essaie chaque type de localisation par ordre de priorité jusqu'à ce qu'une correspondance soit trouvée
  4. Correspondance de Pair : Les résultats DNS sont filtrés par rapport à la liste de pairs configurée
  5. 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 :

  1. Association PFCP Active : L'UPF a une association PFCP établie
  2. Réactivité des Cœurs : Moins de 3 cœurs consécutifs manqués
  3. 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_consecutive suit 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) :

  1. Filtrer vers seulement les UPFs sains
  2. Séparer en actifs (poids > 0) et standby (poids == 0)
  3. Utiliser les UPFs actifs si l'un d'eux est sain
  4. Activer les UPFs de secours (traiter comme poids 1) si tous les actifs sont non sains
  5. Retourner au pool complet si aucun UPF sain n'existe

Mode Équilibré par Charge (tous poids > 0) :

  1. Filtrer vers seulement les UPFs sains
  2. Effectuer une sélection aléatoire pondérée parmi les UPFs sains
  3. 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_selection dans 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é

  1. 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: [