Implementação de Core 5G e RAN (Open5GS/UERANSIM) usando namespaces Linux. Cada NF corre no seu próprio namespace, o que garante isolamento e organização.
Instalação de ferramentas de compilação, bibliotecas de rede e utilitários básicos.
sudo apt update
sudo apt install -y build-essential cmake libsctp-dev libssl-dev libyaml-dev \
iproute2 iptables net-tools curl iputils-ping gitO Open5GS utiliza o MongoDB para armazenar os dados dos subscritores.
sudo apt install -y mongodb-org
sudo systemctl start mongod
sudo systemctl enable mongodInstalação a partir do repositório oficial.
Nota: Os serviços do systemd são desativados para permitir a execução manual controlada pelos scripts de gestão.
sudo add-apt-repository ppa:open5gs/latest
sudo apt update
sudo apt install -y open5gs
sudo systemctl stop open5gs-*
sudo systemctl disable open5gs-*Compilação do simulador de rádio.
cd ~
git clone https://github.com/aligungr/UERANSIM
cd UERANSIM
make
# Os executáveis (nr-gnb, nr-ue) ficarão localizados em ~/UERANSIM/build/Scripts localizados na raiz do projeto para gestão do ciclo de vida da rede.
| Ficheiro | Função |
|---|---|
setup_network.sh |
Cria a bridge br-5g, namespaces (ns-gnb1, ns-gnb2), IPs e rotas estáticas. |
start_open5gs.sh |
Inicia os processos do Core (AMF, SMF, UPF, etc.) dentro dos namespaces apropriados. |
stop_open5gs.sh |
Termina todos os processos e liberta recursos do sistema. |
reset_network.sh |
Limpa as configurações de rede (remove bridge, interfaces virtuais e rotas). |
add_subscribers.sh |
Regista os utilizadores (UE1 e UE2) na base de dados MongoDB. |
diagnose.sh |
Ferramenta de diagnóstico para verificar o estado dos processos e interfaces. |
Devem ser copiados para /etc/open5gs/ antes de iniciar.
- Core Network:
amf.yaml,smf.yaml,nssf.yaml,pcf.yaml,upf.yaml,upf2.yaml - Radio Access Network (UERANSIM):
gnb1.yaml,gnb2.yaml,ue1.yaml,ue2.yaml
Execute o script de reinício para preparar o ambiente limpo e iniciar os serviços centrais.
sudo bash stop_open5gs.sh
sudo bash reset_network.sh
sudo bash setup_network.sh
sudo bash start_open5gs.shApós iniciar, registe os subscritores e verifique o estado:
sudo bash add_subscribers.sh
sudo bash diagnose.shAbra terminais separados para visualizar os logs de cada componente.
Terminal 2 (gNodeB 1):
sudo ip netns exec ns-gnb1 /home/$USER/UERANSIM/build/nr-gnb -c /etc/open5gs/gnb1.yamlTerminal 3 (gNodeB 2):
sudo ip netns exec ns-gnb2 /home/$USER/UERANSIM/build/nr-gnb -c /etc/open5gs/gnb2.yamlTerminal 4 (UE 1 - Conecta ao gNB1):
sudo ip netns exec ns-gnb1 /home/$USER/UERANSIM/build/nr-ue -c /etc/open5gs/ue1.yamlTerminal 5 (UE 2 - Conecta ao gNB2):
sudo ip netns exec ns-gnb2 /home/$USER/UERANSIM/build/nr-ue -c /etc/open5gs/ue2.yamlPara testar a conectividade de dados (Internet) através da rede 5G simulada, utilize a interface de túnel uesimtun0 criada dentro dos namespaces.
Teste de Ping (UE1):
sudo ip netns exec ns-gnb1 ping -I uesimtun0 -c 4 8.8.8.8Teste de Ping (UE2):
sudo ip netns exec ns-gnb2 ping -I uesimtun0 -c 4 8.8.8.8Abaixo encontra-se o mapa de IPs configurados dentro dos Namespaces Linux. Todos os componentes estão ligados à bridge central br-5g (Gateway: 10.100.0.1).
| Componente | Namespace | Interface | IP Fixo (Core) | Rede/Subnet |
|---|---|---|---|---|
| MongoDB | (Host) | br-5g | 10.100.0.1 | Core Network |
| NRF | ns-nrf | eth0 | 10.100.0.10 | Core Network |
| AMF | ns-amf | eth0 | 10.100.0.5 | Core Network |
| SMF | ns-smf | eth0 | 10.100.0.4 | Core Network |
| UPF 1 | ns-upf1 | eth0 | 10.100.0.7 | Core Network |
| UPF 2 | ns-upf2 | eth0 | 10.100.0.8 | Core Network |
| AUSF | ns-ausf | eth0 | 10.100.0.11 | Core Network |
| UDM | ns-udm | eth0 | 10.100.0.12 | Core Network |
| PCF | ns-pcf | eth0 | 10.100.0.13 | Core Network |
| NSSF | ns-nssf | eth0 | 10.100.0.14 | Core Network |
| BSF | ns-bsf | eth0 | 10.100.0.15 | Core Network |
| UDR | ns-udr | eth0 | 10.100.0.20 | Core Network |
| SCP | ns-scp | eth0 | 10.100.0.200 | Core Network |
| gNB 1 | ns-gnb1 | eth0 | 10.100.0.30 | RAN (Rádio) |
| gNB 2 | ns-gnb2 | eth0 | 10.100.0.31 | RAN (Rádio) |
| UE (User Equipment) | Ligado a | Slice ID | IP Atribuído (Tun) | Gateway (UPF) |
|---|---|---|---|---|
| UE 1 | gNB 1 | SST: 1 (Internet) | 10.45.x.x |
10.45.0.1 (UPF1) |
| UE 2 | gNB 2 | SST: 2 (Serviços) | 10.46.x.x |
10.46.0.1 (UPF2) |
flowchart TB
subgraph Host ["Host Linux (127.0.0.1)"]
subgraph Bridge ["Rede de Gestão (Bridge br-5g: 10.100.0.0/24)"]
direction TB
subgraph Control_Plane ["Control Plane (Sinalização)"]
direction TB
NRF("<b>NRF</b><br/>10.100.0.10"):::cp
SCP("<b>SCP</b><br/>10.100.0.200"):::cp
subgraph Auth_Data ["Dados & Auth"]
direction LR
UDM("<b>UDM</b><br/>10.100.0.12"):::cp
AUSF("<b>AUSF</b><br/>10.100.0.11"):::cp
UDR("<b>UDR</b><br/>10.100.0.20"):::cp
Mongo[("<b>MongoDB</b><br/>10.100.0.1")]:::db
end
subgraph Policy_Slice ["Políticas & Slicing"]
direction LR
PCF("<b>PCF</b><br/>10.100.0.13"):::cp
NSSF("<b>NSSF</b><br/>10.100.0.14"):::cp
BSF("<b>BSF</b><br/>10.100.0.15"):::cp
end
subgraph Main_Control ["Gestão de Sessão & Mobilidade"]
direction LR
AMF("<b>AMF</b><br/>10.100.0.5"):::main_cp
SMF("<b>SMF</b><br/>10.100.0.4"):::main_cp
end
end
subgraph User_Plane ["User Plane (Dados)"]
direction LR
UPF1("<b>UPF 1</b> (Internet)<br/>IP: 10.100.0.7<br/>(Subnet UE: 10.45.0.1)"):::up
UPF2("<b>UPF 2</b> (Slice2)<br/>IP: 10.100.0.8<br/>(Subnet UE: 10.46.0.1)"):::up
end
end
subgraph RAN ["Radio Access Network (UERANSIM)"]
direction LR
GNB1("<b>gNB 1</b><br/>IP: 10.100.0.30"):::ran
UE1("<b>UE 1</b><br/>Tun: 10.45.x.x"):::ue
GNB2("<b>gNB 2</b><br/>IP: 10.100.0.31"):::ran
UE2("<b>UE 2</b><br/>Tun: 10.46.x.x"):::ue
end
end
subgraph Internet ["External Network"]
WWW((Internet)):::ext
end
%% Ligações RAN -> Core
GNB1 -- "N2 (SCTP)" --> AMF
GNB2 -- "N2 (SCTP)" --> AMF
GNB1 -- "N3 (GTP)" --> UPF1
GNB2 -- "N3 (GTP)" --> UPF2
%% Ligações Internas Core
AMF <--> SMF
SMF <--> UPF1
SMF <--> UPF2
%% Saída para Internet (NAT)
UPF1 -- NAT --> WWW
UPF2 -- NAT --> WWW
%% Ligações Rádio (Simuladas)
UE1 -.-> GNB1
UE2 -.-> GNB2
%% Ligações de Dados
UDR -.-> Mongo
UDM <--> UDR
AUSF <--> UDM
AMF <--> AUSF
%% Estilos
classDef cp fill:#e1f5fe,stroke:#01579b,color:black;
classDef main_cp fill:#81d4fa,stroke:#01579b,stroke-width:2px,color:black;
classDef db fill:#c8e6c9,stroke:#2e7d32,color:black;
classDef up fill:#ffccbc,stroke:#bf360c,stroke-width:2px,color:black;
classDef ran fill:#ffe0b2,stroke:#e65100,stroke-width:2px,color:black;
classDef ue fill:#d1c4e9,stroke:#4527a0,color:black;
classDef ext fill:#b2ebf2,stroke:#006064,color:black;
- AMF (Access and Mobility Management Function): Gestão de acessos e mobilidade
- SMF (Session Management Function): Gestão de sessões de dados
- UPF (User Plane Function): Encaminhamento de tráfego de utilizador
- NRF (Network Repository Function): Registo e descoberta de serviços
- PCF (Policy Control Function): Controlo de políticas
- AUSF (Authentication Server Function): Autenticação de utilizadores
- UDM (Unified Data Management): Gestão de dados de subscritores
- gNodeB: Estação base 5G
- UE (User Equipment): Equipamento do utilizador (smartphone, tablet, etc.)
- SST (Slice/Service Type):
1 - SD (Slice Differentiator): Não definido (padrão)
- Serviço: Acesso à internet geral
- APN/DNN:
internet
- SST:
2 - SD:
112233 - Serviço: Rede isolada ou específica
- APN/DNN:
slice2
A rede de acesso é composta por dois gNBs, cada um situado em uma área de rastreamento (TAC) distinta, simulando cobertura geográfica ou lógica separada.
- Identificação: TAC
1 - Endereçamento IP:
10.100.0.30 - Suporte a Slices: Configurado para transmitir (broadcast) suporte tanto à Slice 1 quanto à Slice 2
- Função: Atuar como ponto de acesso primário para usuários de tráfego geral
- Identificação: TAC
2 - Endereçamento IP:
10.100.0.31 - Suporte a Slices: Também suporta Slice 1 e Slice 2
- Função: Atuar como ponto de acesso secundário ou dedicado para testes de mobilidade e segregação
- Identificador:
imsi-999700000000001 - Ponto de Acesso: Forçado a conectar-se via gNB 1 (
10.100.0.30) - Requisição de Serviço: Solicita estabelecimento de sessão PDU na Slice 1 (SST 1)
- Comportamento: O tráfego deste usuário é roteado para a APN
internet, seguindo o fluxo padrão de banda larga
- Identificador:
imsi-999700000000002 - Ponto de Acesso: Forçado a conectar-se via gNB 2 (
10.100.0.31) - Requisição de Serviço: Solicita explicitamente a Slice 2 (SST 2, SD
112233) - Comportamento: O tráfego é isolado na APN
slice2. O Core Network valida o par SST/SD e, se autorizado, estabelece o túnel GTP correspondente
- A interface
uesimtun0é criada automaticamente pelo UERANSIM quando o UE se conecta com sucesso