RAN CN 테스트베드 구축/OAI+Free5GC (RAN-Core)

5G Network Slicing QoS 실험을 위한 Multi-UE 환경 구축

gksyb4235 2026. 4. 30. 21:36

참고 : OAI에서 Multi-UE를 돌리는 법은 아래와 같다.

https://gitlab.eurecom.fr/oai/openairinterface5g/-/blob/5964174c405da7fa8226351ff6df871ba5eb6e0b/doc/NR_SA_Tutorial_OAI_multi_UE.md

 

doc/NR_SA_Tutorial_OAI_multi_UE.md · 5964174c405da7fa8226351ff6df871ba5eb6e0b · oai / openairinterface5G · GitLab

Openairinterface 5G Wireless Implementation

gitlab.eurecom.fr

 

 

UE Conf 파일 생성


그리고 ue1.conf 파일을 만들어준다. ue2.conf, ue3.conf도 마찬가지

 

 

ue1.conf 파일을 실행한다.

cd ~/openairinterface5g/tools/scripts
sudo ./multi-ue.sh -c1
sudo ./multi-ue.sh -o1

sudo ip netns exec ue1 /home/user/openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem \
  -O /home/user/openairinterface5g/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue1.conf \
  -r 106 \
  --numerology 1 \
  --band 78 \
  -C 3619200000 \
  --rfsim \
  --uicc0.imsi 208930000000001 \
  --rfsimulator.serveraddr 10.201.1.100 \
  --telnetsrv \
  --telnetsrv.listenport 9095

 

ue2.conf 파일을 실행한다.

cd ~/openairinterface5g/tools/scripts
sudo ./multi-ue.sh -c2
sudo ./multi-ue.sh -o2

sudo ip netns exec ue2 /home/user/openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem \
  -O /home/user/openairinterface5g/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue2.conf \
  -r 106 \
  --numerology 1 \
  --band 78 \
  -C 3619200000 \
  --rfsim \
  --uicc0.imsi 208930000000002 \
  --rfsimulator.serveraddr 10.202.1.100 \
  --telnetsrv \
  --telnetsrv.listenport 9096

 

ue3.conf 파일

cd ~/openairinterface5g/tools/scripts
sudo ./multi-ue.sh -c3
sudo ./multi-ue.sh -o3

sudo ip netns exec ue3 /home/user/openairinterface5g/cmake_targets/ran_build/build/nr-uesoftmodem \
  -O /home/user/openairinterface5g/targets/PROJECTS/GENERIC-NR-5GC/CONF/ue3.conf \
  -r 106 \
  --numerology 1 \
  --band 78 \
  -C 3619200000 \
  --rfsim \
  --uicc0.imsi 208930000000003 \
  --rfsimulator.serveraddr 10.203.1.100 \
  --telnetsrv \
  --telnetsrv.listenport 9097

 

UE IP 주소 확인하는 명령어

sudo ip netns exec ue1 ip route
sudo ip netns exec ue2 ip route
sudo ip netns exec ue3 ip route

 

 

OAI RAN + Free5GC 환경에서 GTP-U 터널을 통해 UE와 DN 간 양방향 트래픽을 전송해 QoS 실험을 수행한다.

-----------<OAI>----------//-----------------<Free5GC>----------------

[UE namespace] ←→ [OAI RAN] ←GTP-U 터널→ [Free5GC UPF] ←→ [DN/Internet]
  10.60.0.1      192.168.200.128      192.168.200.100    외부 네트워크
  10.61.0.1                           (Docker: 10.100.200.11)
  10.62.0.1

 

현재 OAI 서버 (192.168.200.128)의 환경은 다음과 같다.

  • 역할: RAN (gNB/eNB)
  • 주요 인터페이스:
    • ens34(Host-only): 192.168.200.128 (Free5GC와 통신)
    • v-ue1@if6: 10.201.1.1/24 (UE1 namespace와 연결)
    • v-ue2@if8: 10.202.1.1/24 (UE2 namespace와 연결)
    • v-ue3@if10: 10.203.1.1/24 (UE3 namespace와 연결)

 

  •  

 

OAI 서버 초기 설정 (192.168.200.128)


1. IP 포워딩 활성화
(OAI 서버가 패킷을 UE namespace와 Free5GC 간에 전달할 수 있도록 설정)


net.ipv4.ip_forward=1: Linux 커널이 패킷을 라우팅할 수 있도록 허용
이 설정이 없으면 패킷이 인터페이스 간 전달되지 않음

# IP 포워딩 활성화 (즉시 적용)
sudo sysctl -w net.ipv4.ip_forward=1

# 영구 설정 (재부팅 후에도 유지)
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf

 

 

cat /proc/sys/net/ipv4/ip_forward
# 출력: 1 (활성화됨)

 

 

 

iptables FORWARD 정책 설정
패킷이 인터페이스 간 전달될 수 있도록 방화벽 정책 설정


# FORWARD 체인의 기본 정책을 ACCEPT로 변경

sudo iptables -P FORWARD ACCEPT


이는 -P FORWARD ACCEPT: FORWARD 체인의 기본 정책(Policy)을 ACCEPT로 설정하는 것이다.
기본적으로 Linux는 FORWARD 체인이 DROP일 수 있으므로 ACCEPT로 변경하여 모든 포워딩 트래픽을 허용한다.

 

sudo iptables -L FORWARD -n -v
# 출력 첫 줄: Chain FORWARD (policy ACCEPT ...)

 



UE 트래픽 포워딩 규칙 추가
이를 통해 Free5GC에서 오는 UE 대역 트래픽을 명시적으로 허용


# UE1 대역 (10.60.0.0/24) 포워딩 규칙
sudo ip netns exec ue1 ip route add default dev oaitun_ue1
sudo iptables -A FORWARD -i ens34 -d 10.60.0.0/24 -j ACCEPT
sudo iptables -A FORWARD -s 10.60.0.0/24 -o ens34 -j ACCEPT

# UE2 대역 (10.61.0.0/24) 포워딩 규칙
sudo ip netns exec ue2 ip route add default dev oaitun_ue1
sudo iptables -A FORWARD -i ens34 -d 10.61.0.0/24 -j ACCEPT
sudo iptables -A FORWARD -s 10.61.0.0/24 -o ens34 -j ACCEPT

# UE3 대역 (10.62.0.0/24) 포워딩 규칙
sudo ip netns exec ue3 ip route add default dev oaitun_ue1
sudo iptables -A FORWARD -i ens34 -d 10.62.0.0/24 -j ACCEPT
sudo iptables -A FORWARD -s 10.62.0.0/24 -o ens34 -j ACCEPT
  • -A FORWARD: FORWARD 체인에 규칙 추가(Append)
  • -i ens34: 입력 인터페이스가 ens34
  • -d 10.60.0.0/24: 목적지가 UE 대역
  • -o ens34: 출력 인터페이스가 ens34
  • -s 10.60.0.0/24: 소스가 UE 대역
  • -j ACCEPT: 패킷 허용

 

트래픽은 다음과 같이 흐른다

 

 

# OAI 서버에서 실행
sudo iptables -L FORWARD -n -v | grep -E "10.60|10.61|10.62"

 

 

 

iptables 규칙 영구 저장


# OAI 서버에서 실행
# iptables-persistent 패키지 설치
sudo apt-get update
sudo apt-get install -y iptables-persistent

 

설치 중 질문:
"Save current IPv4 rules?" → Yes 선택
"Save current IPv6 rules?" → Yes 선택

 

전체 설정 확인

# OAI 서버에서 실행
# 1. IP 포워딩 확인
echo "=== IP Forwarding ==="
cat /proc/sys/net/ipv4/ip_forward

# 2. iptables FORWARD 정책 확인
echo -e "\n=== iptables FORWARD Policy ==="
sudo iptables -L FORWARD -n -v | head -10

# 3. NAT 테이블 확인
echo -e "\n=== NAT Table ==="
sudo iptables -t nat -L POSTROUTING -n -v

# 4. 라우팅 테이블 확인
echo -e "\n=== Routing Table ==="
ip route show

# 5. UE namespace 목록 확인
echo -e "\n=== UE Namespaces ==="
sudo ip netns list

# 6. UE1 namespace 상세 정보
echo -e "\n=== UE1 Details ==="
echo "IP Addresses:"
sudo ip netns exec ue1 ip addr show | grep -E "inet |oaitun|v-ue"
echo "Routes:"
sudo ip netns exec ue1 ip route show

# 7. UE2 namespace 상세 정보
echo -e "\n=== UE2 Details ==="
echo "IP Addresses:"
sudo ip netns exec ue2 ip addr show | grep -E "inet |oaitun|v-ue"
echo "Routes:"
sudo ip netns exec ue2 ip route show

# 8. UE3 namespace 상세 정보
echo -e "\n=== UE3 Details ==="
echo "IP Addresses:"
sudo ip netns exec ue3 ip addr show | grep -E "inet |oaitun|v-ue"
echo "Routes:"
sudo ip netns exec ue3 ip route show

 

위를 수행하면 다음과 같은 결과가 나온다.

=== IP Forwarding ===
1

=== iptables FORWARD Policy ===
Chain FORWARD (policy ACCEPT 12 packets, 1008 bytes)
 pkts bytes target     prot opt in     out     source               destination
   20  1680 DOCKER-USER  0    --  *      *       0.0.0.0/0            0.0.0.0/0
   20  1680 DOCKER-FORWARD  0    --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     0    --  lo     v-eth1  0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     0    --  v-eth1 lo      0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     0    --  lo     v-eth1  0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     0    --  v-eth1 lo      0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     0    --  lo     v-eth1  0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     0    --  v-eth1 lo      0.0.0.0/0            0.0.0.0/0

=== NAT Table ===
Chain POSTROUTING (policy ACCEPT 3771 packets, 384K bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 MASQUERADE  0    --  *      !docker0  172.17.0.0/16        0.0.0.0/0
    1    60 MASQUERADE  0    --  *      lo      10.201.1.0/24        0.0.0.0/0
    0     0 MASQUERADE  0    --  *      lo      10.201.1.0/24        0.0.0.0/0
    0     0 MASQUERADE  0    --  *      lo      10.201.1.0/24        0.0.0.0/0
    0     0 MASQUERADE  0    --  *      lo      10.201.1.0/24        0.0.0.0/0
    0     0 MASQUERADE  0    --  *      lo      10.202.1.0/24        0.0.0.0/0
    0     0 MASQUERADE  0    --  *      lo      10.203.1.0/24        0.0.0.0/0

=== Routing Table ===
default via 192.168.112.2 dev ens33 proto dhcp src 192.168.112.128 metric 100
10.201.1.0/24 dev v-eth1 proto kernel scope link src 10.201.1.100
10.202.1.0/24 dev v-eth2 proto kernel scope link src 10.202.1.100
10.203.1.0/24 dev v-eth3 proto kernel scope link src 10.203.1.100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
192.168.112.0/24 dev ens33 proto kernel scope link src 192.168.112.128 metric 100
192.168.200.0/24 dev ens34 proto kernel scope link src 192.168.200.128 metric 101

=== UE Namespaces ===
ue3 (id: 2)
ue2 (id: 1)
ue1 (id: 0)

=== UE1 Details ===
IP Addresses:
    inet 127.0.0.1/8 scope host lo
5: v-ue1@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    inet 10.201.1.1/24 scope global v-ue1
8: oaitun_ue1: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
    inet 10.60.0.1/24 scope global oaitun_ue1
Routes:
default dev oaitun_ue1 scope link
10.60.0.0/24 dev oaitun_ue1 proto kernel scope link src 10.60.0.1
10.201.1.0/24 dev v-ue1 proto kernel scope link src 10.201.1.1

=== UE2 Details ===
IP Addresses:
    inet 127.0.0.1/8 scope host lo
2: oaitun_ue1: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
    inet 10.61.0.1/24 scope global oaitun_ue1
7: v-ue2@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    inet 10.202.1.2/24 scope global v-ue2
Routes:
10.61.0.0/24 dev oaitun_ue1 proto kernel scope link src 10.61.0.1
10.202.1.0/24 dev v-ue2 proto kernel scope link src 10.202.1.2

=== UE3 Details ===
IP Addresses:
    inet 127.0.0.1/8 scope host lo
2: oaitun_ue1: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 500
    inet 10.62.0.1/24 scope global oaitun_ue1
9: v-ue3@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    inet 10.203.1.3/24 scope global v-ue3
Routes:
10.62.0.0/24 dev oaitun_ue1 proto kernel scope link src 10.62.0.1
10.203.1.0/24 dev v-ue3 proto kernel scope link src 10.203.1.3

 

 

 

 

Free5GC 서버 초기 설정 (192.168.200.100)


Free5GC 환경 정보


  • Free5GC 서버 (192.168.200.100)
  • 역할: 5G Core Network (AMF, SMF, UPF 등)
  • 주요 인터페이스:
    • ens34: 192.168.200.100 (OAI RAN과 통신)
    • br-free5gc: 10.100.200.1/24 (Docker 네트워크)

 

UPF Docker 컨테이너


  • 컨테이너 이름: upf
  • 이미지: free5gc/upf:v4.2.2
  • IP 주소: 10.100.200.11/24 (eth0)
  • GTP 인터페이스: upfgtp (GTP-U 터널용)
  • 커널 모듈: gtp5g
  • 지원 DNN: internet
  • UE IP 대역:
    • 10.60.0.0/16
    • 10.61.0.0/16
    • 10.62.0.0/16
  • NAT 인터페이스: eth0 (DN으로 나가는 트래픽)

 

upf 설정 확인


# Free5GC 서버에서 실행
# UPF 컨테이너 실행 상태 확인
sudo docker ps | grep upf

 

✅ 컨테이너가 Up 상태
✅ 포트 2152 (GTP-U)가 바인딩됨

 

 

UPF 컨테이너 네트워크 확인


# Free5GC 서버에서 실행
# UPF 컨테이너 내부 IP 주소 확인
sudo docker exec -it upf ip addr show

 

✅ eth0: 10.100.200.11/24 (Docker 네트워크)
✅ upfgtp: GTP-U 터널 인터페이스 존재

 

 

 UPF 컨테이너 라우팅 확인


# Free5GC 서버에서 실행
# UPF 컨테이너 내부 라우팅 테이블 확인
sudo docker exec -it upf ip route

 

  • UPF는 기본적으로 10.100.200.1 (br-free5gc)을 게이트웨이로 사용
  • UE 대역(10.60.0.0/16 등)으로 가는 트래픽은 gtp5g 커널 모듈이 자동으로 GTP-U 터널로 처리

 

 

Free5GC 호스트 라우팅 설정 (핵심!)


# 현재 라우팅 테이블 확인
# Free5GC 서버에서 실행
ip route show

 

 

❌ 10.60.0.0/24 via 192.168.200.128: UE 트래픽을 OAI 서버로 보내면 안됨.
✅ 올바른 경로: UE 트래픽을 UPF 컨테이너(10.100.200.11)로 보내야 함.

만약 10.60.x.x 대역의 라우팅 경로가 없다면 아래 명령어로 추가

 

 

라우팅 추가법

# Free5GC 서버에서 실행
# UPF 컨테이너로 올바른 라우팅 추가
sudo ip route add 10.60.0.0/16 via 10.100.200.11 dev br-free5gc
sudo ip route add 10.61.0.0/16 via 10.100.200.11 dev br-free5gc
sudo ip route add 10.62.0.0/16 via 10.100.200.11 dev br-free5gc

 

  • 10.60.0.0/16: UE1 대역 (원래 설정은 /16)
  • via 10.100.200.11: UPF 컨테이너 IP
  • dev br-free5gc: Docker 네트워크 브리지

 

 

 

Traffic Test

 


UE에서 Free5GC로 ping 테스트 (Uplink)
🖥️ 작업 위치: OAI 서버 (192.168.200.128)


# OAI 서버에서 실행
# UE1에서 Free5GC 서버로 ping
sudo ip netns exec ue1 ping -c 4 192.168.200.100

 

 

 

Free5GC에서 UE로 ping 테스트 (Downlink)
🖥️ 작업 위치: Free5GC 서버 (192.168.200.100)


# Free5GC 서버에서 실행
# Free5GC에서 UE1로 ping
ping -c 4 10.60.0.1