Laboratorium 5G krok po kroku: Open5GS, UERANSIM i Wireshark

- 1. Najważniejsze w skrócie
- 2. Z czego składa się laboratorium 5G?
- 3. Czego potrzebujesz przed startem?
- 4. Krok 1: Jak zainstalować MongoDB i Open5GS?
- 5. Krok 2: Jak dodać abonenta do Open5GS?
- 6. Krok 3: Jak zbudować UERANSIM?
- 7. Krok 4: Jak zarejestrować UE i zestawić sesję PDU?
- 8. Krok 5: Jak przechwycić i odczytać ruch 5G w Wiresharku?
- 9. Pięć ćwiczeń, które pokazują bezpieczeństwo 5G w praktyce
- 10. Najczęstsze problemy i jak je rozwiązać
- 11. Szkolenie z bezpieczeństwa 5G dla Twojego zespołu
Laboratorium 5G to kompletna sieć 5G Standalone uruchomiona na jednej maszynie wirtualnej, bez żadnego nadawania radiowego. Open5GS zapewnia rdzeń 5G (AMF, SMF, UPF, AUSF, UDM, NRF i pozostałe funkcje), UERANSIM symuluje stację bazową gNB i urządzenie UE, a Wireshark pozwala obejrzeć każdy komunikat: NGAP, NAS, PFCP, GTP-U i HTTP/2. To najszybszy sposób, żeby zobaczyć na własne oczy procedury opisane w specyfikacjach 3GPP.
W tym przewodniku zbudujesz laboratorium od zera, zarejestrujesz urządzenie w sieci, zestawisz sesję danych i przeanalizujesz ruch. Na koniec wykonasz pięć ćwiczeń, które pokazują najważniejsze mechanizmy bezpieczeństwa 5G w praktyce. Teorię do każdego kroku znajdziesz w przewodniku po architekturze sieci 5G.
Najważniejsze w skrócie
- Wystarczy jedna maszyna wirtualna z Ubuntu. Wszystkie elementy komunikują się po adresach pętli zwrotnej 127.0.0.x, więc cały ruch przechwycisz na interfejsie lo.
- Nic nie nadaje w eterze. UERANSIM symuluje łącze radiowe po IP. Laboratorium nie wymaga pozwoleń radiowych i nie zakłóca żadnej sieci.
- Domyślna konfiguracja Open5GS jest laboratoryjna, nie produkcyjna. AMF preferuje algorytm NEA0 (brak szyfrowania NAS), funkcje rdzenia rozmawiają po HTTP bez TLS, a UERANSIM wysyła identyfikator w schemacie null. Dzięki temu wszystko widać w Wiresharku, ale w produkcji każde z tych ustawień trzeba zmienić.
- Pięć ćwiczeń: analiza rejestracji, nieudane uwierzytelnienie, sesja PDU i tunel GTP-U, ruch SBI bez TLS oraz włączenie ochrony SUCI (Profile A).
Z czego składa się laboratorium 5G?
| Element | Projekt | Odpowiednik w prawdziwej sieci | Domyślny adres w labie |
| Rdzeń 5G (5GC) | Open5GS | Rdzeń operatora lub sieci prywatnej | AMF: 127.0.0.5 (NGAP, SCTP 38412); UPF: 127.0.0.7 (GTP-U, UDP 2152; PFCP); funkcje SBI na porcie 7777 |
| Stacja bazowa gNB | UERANSIM nr-gnb | Stacja bazowa 5G (bez warstwy radiowej) | 127.0.0.1 |
| Urządzenie UE | UERANSIM nr-ue | Telefon, modem, czujnik z kartą SIM | Interfejs uesimtun0, adres z puli 10.45.0.0/16 |
| Baza abonentów | MongoDB | Baza UDR operatora | localhost |
| Analiza ruchu | Wireshark / tshark | Sonda w sieci operatora | Interfejs lo |
Różnica względem prawdziwej sieci jest jedna, ale istotna: UERANSIM nie implementuje warstwy fizycznej radia. Procedury RRC, NAS, NGAP, PFCP i GTP-U przebiegają jednak zgodnie ze standardem, więc to, co zobaczysz w Wiresharku, odpowiada temu, co dzieje się w produkcyjnym rdzeniu.
Czego potrzebujesz przed startem?
- Maszyny wirtualnej z Ubuntu 22.04 LTS (dokumentacja Open5GS opisuje instalację MongoDB właśnie dla tej wersji). Ten przewodnik zakłada, że wszystkie elementy działają na jednej maszynie.
- Uprawnień administratora (sudo) i dostępu do internetu w czasie instalacji.
- Migawki (snapshotu) maszyny przed rozpoczęciem ćwiczeń, żeby w każdej chwili wrócić do czystego stanu.
- Izolacji: laboratorium nie powinno być osiągalne z sieci firmowej ani z internetu. Domyślne hasła, brak TLS i brak szyfrowania są tu celowe, ale tylko w izolowanym środowisku.
Krok 1: Jak zainstalować MongoDB i Open5GS?
Open5GS przechowuje dane abonentów w MongoDB. Najpierw instalujesz bazę, potem rdzeń z oficjalnego repozytorium PPA.
MongoDB (według dokumentacji Open5GS, wersja 8.0 dla Ubuntu 22.04):
sudo apt update
sudo apt install -y gnupg curl
curl -fsSL https://pgp.mongodb.com/server-8.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/8.0 multiverse" | \
sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list
sudo apt update
sudo apt install -y mongodb-org
sudo systemctl start mongod
sudo systemctl enable mongod
Open5GS:
sudo add-apt-repository ppa:open5gs/latest
sudo apt update
sudo apt install open5gs
Pakiet instaluje każdą funkcję rdzenia jako osobną usługę systemd (np. open5gs-amfd, open5gs-smfd, open5gs-upfd). Konfiguracje znajdziesz w /etc/open5gs/, a logi w /var/log/open5gs/.
Routing ruchu z UE do internetu. UPF przydziela urządzeniom adresy z puli 10.45.0.0/16 na interfejsie ogstun. Żeby ping z UE wyszedł poza maszynę, włącz przekazywanie pakietów i NAT:
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -s 10.45.0.0/16 ! -o ogstun -j MASQUERADE
Jeśli na maszynie działa zapora ufw, może blokować ten ruch. Dokumentacja Open5GS opisuje, jak to sprawdzić.
Panel WWW (opcjonalnie). Open5GS ma panel do zarządzania abonentami. Wymaga Node.js (dokumentacja używa wersji 20) i instaluje się poleceniem:
curl -fsSL https://open5gs.org/open5gs/assets/webui/install | sudo -E bash -
Panel działa pod adresem http://localhost:9999, a domyślne konto to admin z hasłem 1423. Zmień hasło od razu po zalogowaniu, nawet w labie.
Krok 2: Jak dodać abonenta do Open5GS?
Sieć wpuści tylko urządzenie, którego dane (IMSI, klucz K i OPc) zna UDM. Domyślny plik konfiguracyjny UE w UERANSIM zawiera gotowe wartości testowe, więc najprościej dodać do bazy dokładnie tego abonenta.
| Parametr | Wartość testowa (z config/open5gs-ue.yaml w UERANSIM) |
| IMSI | 999700000000001 (MCC 999, MNC 70) |
| Klucz K | 465B5CE8B199B49FAA5F0A2EE238A6BC |
| OPc | E8ED289DEBA952E4283B54E88E6183CA |
| Wycinek | SST 1, DNN internet |
Najszybciej zrobisz to skryptem open5gs-dbctl z repozytorium Open5GS (korzysta z mongosh, instalowanego razem z mongodb-org):
wget https://raw.githubusercontent.com/open5gs/open5gs/main/misc/db/open5gs-dbctl
chmod +x open5gs-dbctl
./open5gs-dbctl add 999700000000001 465B5CE8B199B49FAA5F0A2EE238A6BC E8ED289DEBA952E4283B54E88E6183CA
Polecenie add tworzy abonenta z wartościami domyślnymi, w tym DNN internet i wycinkiem SST 1. Alternatywnie dodasz go ręcznie w panelu WWW.
Uwaga: to publicznie znane klucze testowe. Nigdy nie używaj ich poza laboratorium.
Krok 3: Jak zbudować UERANSIM?
UERANSIM kompiluje się ze źródeł. Według dokumentacji projektu wymaga CMake 3.17 lub nowszego, a starszy CMake z repozytorium apt nie wystarczy, dlatego instaluje się go przez snap:
sudo apt install make gcc g++ libsctp-dev lksctp-tools iproute2
sudo snap install cmake --classic
cd ~
git clone https://github.com/aligungr/UERANSIM
cd ~/UERANSIM
make
Po kompilacji w katalogu ~/UERANSIM/build znajdziesz programy nr-gnb (stacja bazowa), nr-ue (urządzenie), nr-cli (konsola do sterowania) i nr-binder (narzędzie do kierowania ruchu aplikacji przez połączenie UE).
Domyślne pliki config/open5gs-gnb.yaml i config/open5gs-ue.yaml są już zgodne z domyślną konfiguracją Open5GS: ten sam PLMN 999/70, AMF pod adresem 127.0.0.5 na porcie 38412, wycinek SST 1 i DNN internet. Nie musisz nic zmieniać.
Krok 4: Jak zarejestrować UE i zestawić sesję PDU?
Uruchom stację bazową i urządzenie w dwóch osobnych terminalach:
# Terminal 1: stacja bazowa gNB (łączy się z AMF przez NGAP)cd ~/UERANSIM
./build/nr-gnb -c config/open5gs-gnb.yaml
# Terminal 2: urządzenie UE (wymaga uprawnień do utworzenia interfejsu TUN)cd ~/UERANSIM
sudo ./build/nr-ue -c config/open5gs-ue.yaml
W logach gNB powinno pojawić się zestawienie połączenia NG z AMF, a w logach UE kolejno: rejestracja, uwierzytelnienie, Security Mode, zakończona rejestracja i zestawiona sesja PDU. Po zestawieniu sesji UE tworzy interfejs uesimtun0 z adresem z puli 10.45.0.0/16.
Sprawdź połączenie i stan urządzenia:
ip addr show uesimtun0 # adres przydzielony przez SMF
ping -I uesimtun0 8.8.8.8 # ruch idzie tunelem GTP-U przez UPF
./build/nr-cli --dump # lista działających UE i gNB
./build/nr-cli imsi-999700000000001 --exec "status"
./build/nr-cli imsi-999700000000001 --exec "ps-list"
Konsola nr-cli udostępnia też polecenia, które przydadzą się w ćwiczeniach, m.in. ps-establish (nowa sesja PDU), ps-release (zwolnienie sesji) i deregister normal (wyrejestrowanie). Logi rdzenia znajdziesz w /var/log/open5gs/amf.log, smf.log i upf.log.
Krok 5: Jak przechwycić i odczytać ruch 5G w Wiresharku?
Ponieważ wszystkie elementy działają na jednej maszynie, cały ruch płynie przez interfejs pętli zwrotnej. Uruchom przechwytywanie przed startem gNB i UE, żeby zobaczyć pełną procedurę od pierwszego komunikatu:
sudo tshark -i lo -w lab5g.pcap \
-f "sctp or udp port 2152 or udp port 8805 or tcp port 7777"
Plik lab5g.pcap otwórz w Wiresharku i użyj filtrów wyświetlania:
| Filtr | Co pokazuje | Interfejs |
| ngap | Sygnalizacja między gNB a AMF | N2 (SCTP 38412) |
| nas-5gs | Komunikaty NAS między UE a AMF (wewnątrz NGAP) | N1 |
| pfcp | Sterowanie UPF przez SMF | N4 (UDP 8805) |
| gtp | Tunele GTP-U z ruchem użytkownika | N3 (UDP 2152) |
| http2 | Wywołania API między funkcjami rdzenia | SBI (TCP 7777) |
Odczytanie zabezpieczonych komunikatów NAS. Po procedurze Security Mode komunikaty NAS są chronione. W domyślnej konfiguracji Open5GS AMF preferuje szyfrowanie NEA0, czyli „szyfrowanie zerowe”: wiadomości mają ochronę integralności, ale ich treść nie jest szyfrowana. Wireshark domyślnie i tak pokazuje je jako zaszyfrowane. Włącz preferencję nas-5gs.null_decipher (w Wiresharku: Preferences, Protocols, NAS-5GS), aby zdekodować ich zawartość. W tshark:
tshark -r lab5g.pcap -o nas-5gs.null_decipher:TRUE -Y "nas-5gs"
Ta preferencja działa tylko dla NEA0. Komunikatów zaszyfrowanych algorytmami NEA1, NEA2 lub NEA3 nie odczytasz w ten sposób.
Ruch SBI. Funkcje Open5GS rozmawiają po HTTP/2 bez TLS na porcie 7777. Jeśli Wireshark nie rozpozna go automatycznie, użyj opcji Decode As i wskaż HTTP2 dla portu TCP 7777.
Pięć ćwiczeń, które pokazują bezpieczeństwo 5G w praktyce
Każde ćwiczenie ma ten sam układ: cel, kroki, co obserwować i co z tego wynika dla sieci produkcyjnej. Przed każdym ćwiczeniem zatrzymaj UE (Ctrl+C) i uruchom przechwytywanie od nowa.
Ćwiczenie 1: Jak przebiega rejestracja i co widać w eterze?
Cel: prześledzić rejestrację od Registration Request do Registration Complete.
Kroki: uruchom przechwytywanie, potem gNB i UE. W Wiresharku ustaw filtr nas-5gs i włącz nas-5gs.null_decipher.
Co obserwować:
- W Registration Request pole SUCI ma identyfikator schematu ochrony 0 (null scheme). To ustawienie z pliku UE (protectionScheme: 0), więc numer abonenta (MSIN) jest widoczny jawnie.
- Authentication Request zawiera RAND i AUTN, a Authentication Response wartość RES*.
- W Security Mode Command sprawdź wybrane algorytmy. Przy domyślnej konfiguracji AMF (ciphering_order: [NEA0, NEA1, NEA2]) zobaczysz szyfrowanie NEA0 i integralność NIA2.
- Registration Accept przekazuje urządzeniu 5G-GUTI i listę dozwolonych wycinków.
Wniosek dla produkcji: schemat null i NEA0 to ustawienia laboratoryjne. W sieci produkcyjnej SUCI powinno używać Profile A lub B, a lista algorytmów szyfrowania w AMF powinna zaczynać się od NEA2 lub NEA1. Więcej w artykule Ataki na sieć 5G.
Ćwiczenie 2: Co się dzieje, gdy klucz abonenta się nie zgadza?
Cel: zobaczyć, jak 5G-AKA chroni przed urządzeniem z nieprawidłowym kluczem.
Kroki: skopiuj plik UE (cp config/open5gs-ue.yaml config/ue-zly-klucz.yaml), zmień w kopii jeden znak w polu key i uruchom UE z tym plikiem.
Co obserwować:
- Sieć wysyła Authentication Request jak zwykle.
- UE nie może poprawnie zweryfikować AUTN, bo liczy go innym kluczem, i odpowiada komunikatem Authentication Failure z przyczyną MAC failure (kod 5GMM #20).
- Sieć kończy procedurę odrzuceniem. Rejestracja się nie udaje, a w amf.log pojawia się wpis o nieudanym uwierzytelnieniu.
Wniosek dla produkcji: nieudane uwierzytelnienia to ważny sygnał dla SOC. Pojedyncze zdarzenie bywa błędem konfiguracji karty, ale seria z wielu urządzeń wymaga sprawdzenia. Upewnij się, że takie wpisy z logów AMF trafiają do SIEM.
Ćwiczenie 3: Jak wygląda sesja PDU i tunel GTP-U?
Cel: prześledzić zestawienie sesji danych i zobaczyć ruch użytkownika w tunelu.
Kroki: po rejestracji wykonaj ping -I uesimtun0 8.8.8.8. W Wiresharku przejrzyj kolejno filtry pfcp, ngap i gtp.
Co obserwować:
- PFCP Session Establishment Request od SMF do UPF z regułami PDR (wykrywanie pakietów) i FAR (przekazywanie).
- PDU Session Resource Setup w NGAP, czyli moment, w którym gNB dostaje informacje o tunelu.
- Pakiety GTP-U z identyfikatorem tunelu (TEID), a w środku zwykłe pakiety ICMP z adresu UE.
Wniosek dla produkcji: GTP-U nie szyfruje ruchu. Treść pakietów użytkownika jest czytelna dla każdego, kto ma dostęp do sieci między gNB a UPF. Dlatego standard wymaga obsługi IPsec na interfejsie N3, a PFCP (N4) musi być dostępny wyłącznie dla SMF i UPF.
Ćwiczenie 4: Dlaczego ruch SBI wymaga TLS?
Cel: zobaczyć, jakie informacje wymieniają funkcje rdzenia, gdy SBI działa bez TLS.
Kroki: w przechwyconym ruchu ustaw filtr http2 (w razie potrzeby Decode As dla portu 7777) i znajdź wywołania z procedury rejestracji, np. ścieżki zaczynające się od /nausf-auth/ i /nudm-.
Co obserwować:
- Rejestrację funkcji w NRF i odkrywanie usług.
- Wywołania uwierzytelnienia między AMF, AUSF i UDM oraz pobieranie danych subskrypcji.
- Pełną treść żądań i odpowiedzi JSON, czytelną bez żadnych kluczy.
Wniosek dla produkcji: w laboratorium brak TLS ułatwia naukę, ale w produkcji oznacza, że każdy z dostępem do sieci rdzenia widzi dane abonentów i wymianę związaną z uwierzytelnieniem. TS 33.501 wymaga, by wszystkie funkcje wspierały wzajemnie uwierzytelniony TLS. Szczegóły opisujemy w artykule Rdzeń 5G jako mikroserwisy.
Ćwiczenie 5: Jak włączyć ochronę SUCI (Profile A)?
Cel: zamienić schemat null na szyfrowanie identyfikatora kluczem publicznym sieci i porównać oba żądania rejestracji.
Kroki:
- Sprawdź, czy w /etc/open5gs/hnet/ istnieje klucz curve25519-1.key, który domyślna konfiguracja UDM (/etc/open5gs/udm.yaml) przypisuje do identyfikatora 1 i schematu 1 (Profile A). Jeśli go nie ma, wygeneruj go poleceniem z komentarza w pliku konfiguracyjnym UDM i zrestartuj UDM:
ls /etc/open5gs/hnet/
sudo openssl genpkey -algorithm X25519 -out /etc/open5gs/hnet/curve25519-1.key
sudo systemctl restart open5gs-udmd
- Odczytaj klucz publiczny w postaci 64 znaków szesnastkowych (to ostatnie 32 bajty klucza publicznego X25519 zapisanego w formacie DER):
sudo openssl pkey -in /etc/open5gs/hnet/curve25519-1.key -pubout -outform DER \
| tail -c 32 | xxd -p -c 32
- W pliku UE ustaw protectionScheme: 1, homeNetworkPublicKeyId: 1 i wpisz odczytany klucz w homeNetworkPublicKey.
- Uruchom UE ponownie i przechwyć rejestrację.
Co obserwować: w Registration Request identyfikator schematu ochrony ma wartość 1 (ECIES Profile A), a zamiast jawnego MSIN pole SUCI zawiera klucz efemeryczny, szyfrogram i znacznik MAC. Rejestracja kończy się sukcesem, bo UDM odszyfrowuje SUCI swoim kluczem prywatnym.
Wniosek dla produkcji: prywatność identyfikatora w 5G działa tylko wtedy, gdy ktoś wygeneruje klucze sieci domowej, zapisze klucz publiczny na kartach i ochroni klucz prywatny. W sieciach prywatnych to ustawienie często zostaje na schemacie null.
Najczęstsze problemy i jak je rozwiązać
| Objaw | Prawdopodobna przyczyna | Co sprawdzić |
| gNB nie łączy się z AMF | AMF nie działa albo nasłuchuje na innym adresie | systemctl status open5gs-amfd, sekcja ngap w /etc/open5gs/amf.yaml, amf.log |
| Rejestracja odrzucona od razu | Niezgodny PLMN lub abonent nie istnieje w bazie | MCC/MNC w amf.yaml, pliku gNB i pliku UE; IMSI w bazie |
| Błąd uwierzytelnienia | Inny klucz K lub OPc w bazie i w pliku UE | Wartości key, op i opType w pliku UE |
| Brak interfejsu uesimtun0 | UE uruchomione bez uprawnień albo sesja PDU nie powstała | sudo, logi UE i smf.log, DNN internet i SST 1 u abonenta |
| Ping z uesimtun0 nie przechodzi | Brak przekazywania pakietów lub NAT, zapora | sysctl net.ipv4.ip_forward, reguła MASQUERADE, ufw |
| W Wiresharku brak treści NAS | Wyłączona preferencja lub szyfrowanie inne niż NEA0 | nas-5gs.null_decipher, wybrany algorytm w Security Mode Command |
Szkolenie z bezpieczeństwa 5G dla Twojego zespołu
Ten przewodnik daje podstawy: działającą sieć, umiejętność czytania procedur w Wiresharku i pierwsze wnioski dla produkcji.
Jeśli Twój dział IT przygotowuje się do wdrożenia prywatnej sieci 5G albo ma już utrzymywać jej rdzeń, możemy przeprowadzić szkolenie dla całego zespołu. Zakres dopasowujemy do Waszej infrastruktury i poziomu zespołu, a ćwiczenia prowadzimy w izolowanym laboratorium, takim jak opisane w tym artykule. Przykładowe moduły:
- Network slicing w praktyce: kilka wycinków, kilku abonentów i weryfikacja, co faktycznie jest od siebie odseparowane.
- Hardening rdzenia: algorytmy NAS, TLS i OAuth 2.0 w SBI, ograniczenie dostępu do PFCP i NGAP, zarządzanie kluczami SUCI.
- Monitoring i detekcja: które zdarzenia z AMF, NRF i UPF przesyłać do SIEM i jak budować reguły.
- Testy odporności: jak bezpiecznie i w kontrolowanych warunkach sprawdzać stabilność rdzenia przed wdrożeniem nowej wersji.
- Rdzeń na Kubernetes: uruchomienie funkcji sieciowych w kontenerach i segmentacja sieci w klastrze.
Oprócz szkoleń wspieramy zespoły IT przy projektowaniu, wdrażaniu i przeglądzie bezpieczeństwa sieci 5G oraz infrastruktury, na której działa rdzeń.





