分立部署Ueransim和5GCN_v1.5.0原理及实现

目录

1. 宿主机及虚拟机的互通

1.1 互通

1.2 虚拟机静态ip配置

2. 5GC部署

2.1 PC1启动核心网

2.2 核心网docker-compose文件的网络配置

public_net

public_net_access

public_net_core

3. UERANSIM部署

3.1 原始配置文件

external

3.2 配置文件修改

3.2.1 UERANSIM配置文件修改

3.2.2 路由配置

3.3 UERANSIM启动

4. 实际演示

4.1 路由添加

核心网侧

基站侧

4.2 核心网启动

4.3 基站启动

5. 数据测试(待完成)

6. 取消部署

6.1 基站取消部署

6.2 核心网取消部署


我们已经实现了单个ueransim和5GC在一台虚拟机中的部署多个基站接入5GC以及多用户接入5GC,接下来我们就需要进一步拓展我们的功能。为了更真实的模拟接入网核心网链路,我们接下来将仿真基站ueransim(部署于VM2)和核心网5GC(部署于VM1)分开部署在两台不同设备上。下面就开始我们的教程

需求场景:

PC1和PC2互通
PC1和PC1-VM1、PC2-VM2互通
PC2和PC1-VM1、PC2-VM2互通
PC1-VM1和PC2-VM2互通

1. 宿主机及虚拟机的互通

1.1 互通

物理机环境:Windows10

将两台物理机连通只需要一点:修改ip在同一网段即可(能互ping)

两台虚拟机能互通也只需一点:确认VMnet0桥接连接至物理网卡,且ip为同网段下的静态ip

参考:

(226条消息) 配置两台物理机的VMware 虚拟机互联互通_vm虚拟机和物理机之间互通_段帅星的博客-CSDN博客https://blog.csdn.net/weixin_47003048/article/details/108539009在实现物理机互通以及虚拟机桥接之后,需要对虚拟机进行静态ip的修改,已保证每次启动之后ip不会变更

1.2 虚拟机静态ip配置

  • 进入配置文件夹
cd /etc/netplan
  • 备份旧配置文件内容为 00-installer-config.yaml_before(备份一下养成好习惯嘻嘻)
sudo cp 00-installer-config.yaml  00-installer-config.yaml_before
  • 修改配置文件
sudo vim 00-installer-config.yaml
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    enp0s5:   # 网卡名称
      dhcp4: no     # 关闭dhcp
      dhcp6: no    #这行可省略
      addresses: [10.211.55.10/24]  # 静态ip
      gateway4: 10.211.55.1     # 网关
      nameservers:
        addresses: [8.8.8.8, 114.114.114.114] #dns
  •  最后使配置生效
sudo netplan apply

至此,我们的需求全部实现:

PC1和PC2互通✔
PC1和PC1-VM1、PC2-VM2互通✔
PC2和PC1-VM1、PC2-VM2互通✔
PC1-VM1和PC2-VM2互通✔

2. 5GC部署

参考:

(227条消息) OAI容器化部署核心网和虚拟机站UERANSIM_༜黎明之光༜的博客-CSDN博客https://blog.csdn.net/weixin_44810982/article/details/129301416?spm=1001.2014.3001.5502

2.1 PC1启动核心网

通过docker-compose启动核心网yaml文件

oai-cn5g-fed/docker-compose$ docker-compose -f docker-compose-basic-vpp-nrf.yaml up -d
Creating mysql   ... done
Creating oai-nrf ... done
Creating vpp-upf ... done
Creating oai-udr ... done
Creating oai-udm    ... done
Creating oai-ext-dn ... done
Creating oai-ausf   ... done
Creating oai-amf    ... done
Creating oai-smf    ... done

查看核心网启动脚本对于网络的设置:

networks:
    public_net:
        driver: bridge
        name: demo-oai-public-net
        ipam:
            config:
                - subnet: 192.168.70.0/24
        driver_opts:
            com.docker.network.bridge.name: "demo-oai"
    public_net_access:
        name: oai-public-access
        ipam:
            config:
                - subnet: 192.168.72.0/24
        driver_opts:
            com.docker.network.bridge.name: "cn5g-access"
    public_net_core:
        name: oai-public-core
        ipam:
            config:
                - subnet: 192.168.73.0/24
        driver_opts:
            com.docker.network.bridge.name: "cn5g-core"

接下来让我们来分析一下该docker-compose网络配置的含义

2.2 核心网docker-compose文件的网络配置

参考:(229条消息) Docker network driver分类及介绍 Bridge、host、overlay、macvlan(1)_driver: bridge_知者智者的博客-CSDN博客https://blog.csdn.net/lclfans1983/article/details/115009864

  • public_net

public_net:
        driver: bridge
        name: demo-oai-public-net
        ipam:
            config:
                - subnet: 192.168.70.0/24
        driver_opts:
            com.docker.network.bridge.name: "demo-oai"

driver: bridge

brige: docker 默认的network driver。如果不显示指定driver类型,docker默认会使用bridge模式的network。通常,当应用程序运行在独立的容器中,并且要相互通信,可以使用bridge模式,并且我们也可以建立自定义网络名称,这个网络名称就比较随意了。Bridge模式下容器与docker host的网络是相互隔离的。

name: demo-oai-public-net

brige的网络名称定义为demo-oai-public-net

ipam:

Ipam 代表 IP 地址管理。这是配置文件的部分,您可以在其中传递接下来的几个 ip 设置,参考docker官网,因此后面的subnet: 192.168.70.0/24就表示demo-oai-public-net的ip为192.168.70.0;子网掩码为24个1,后面的8bit全为0,即11111111 11111111 11111111 00000000 转换为10进制为 255.255.255.0

driver_opts:

指定一个选项列表,作为键值对传递给该卷的驱动程序。这些选项与驱动有关,因此外部网桥demo-oai传递给demo-oai-public-net

通过ifconfig命令可以查询到变更了ip的demo-oai端口 

  • public_net_access

 public_net_access:
        name: oai-public-access
        ipam:
            config:
                - subnet: 192.168.72.0/24
        driver_opts:
            com.docker.network.bridge.name: "cn5g-access"

通过上面的解释,我们不难明白 public_net_access的网段为192.168.72.0,子网掩码为255.255.255.0,同时将该网络与cn5g-access相接。

  • public_net_core

public_net_core:
        name: oai-public-core
        ipam:
            config:
                - subnet: 192.168.73.0/24
        driver_opts:
            com.docker.network.bridge.name: "cn5g-core"

同理:

3. UERANSIM部署

3.1 原始配置文件

原始的docker-compose-ueransim-vpp.yaml文件网络配置如下

networks:
    public_net:
        external:
            name: demo-oai-public-net
    public_net_access:
        external:
            name: oai-public-access
  • external

如果设置为 true ,则指定此卷是在 Compose 之外创建的。 docker-compose up 不会尝试创建它,如果它不存在则会引发错误。

对于 2.0 版格式, external 不能与其他卷配置键( driver 、 driver_opts 、 labels )结合使用。2.1及更高版本不再存在此限制。您可以在Compose文件中分别指定卷的名称和用于引用它的名称。因此

external:
            name: demo-oai-public-net

表示使用外部已存在的网络,该网络的名称为demo-oai-public-net,同理,下面的public_net_access也是直接和oai-public-access连接。但是由于UERANSIM和5GC并非在一台设备中,因此UERANSIM不可能识别到存在于PC1-VM1中的demo-oai-public-net。因此这里涉及到了容器跨设备间的通信

3.2 配置文件修改

为了实现容器跨设备通信,需要首先设置路由,参考:

(234条消息) 【OpenAirInterface】分立部署核心网与容器化ueransim仿真基站_月早十的博客-CSDN博客https://blog.csdn.net/qq_41224270/article/details/129489451简言之,要想两台设备上的容器相通,首先需要让两台设备设置到对方的路由ip,再将我们的容器挂在到对应的ip上,即可实现跨设备的容器通信。

3.2.1 UERANSIM配置文件修改

由于demo-oai-public-net和public_net_access均是在另外一台设备上,本机并不存在这两个网络,因此不再使用external命令,而是遵循核心网的网络配置方式,使用driver:bridge方式建立自定义的网络,并且给赋予它对应的网段ip和子网掩码即可,修改方式如下:

networks:
    public_net:
        driver: bridge
        name: ueransim-oai-public-net
        ipam:
            config:
                - subnet: 192.168.60.0/24
        driver_opts:
            com.docker.network.bridge.name: "ueransim-oai"
    public_net_access:
        name: oai-public-access
        ipam:
            config:
                - subnet: 192.168.62.0/24
        driver_opts:
            com.docker.network.bridge.name: "cn5g-access"

修改完成以后,需要在双方的设备上设置路由,将两个网段给连接在一起

3.2.2 路由配置

我们要做的是将核心网所在的demo-oai(ip 192.168.70.0/24)与UERANSIM所在的ueransim-oai(ip 192.168.60.0/24)连接在一起

  • 核心网侧路由设置
sudo route add -net 192.168.60.0/24 gw 192.168.12.33
# gw 192.168.12.33是该虚拟机连接物理网卡时所对应的ip
  • ueransim侧路由设置
sudo route add -net 192.168.70.0/24 gw 192.168.12.3
# gw 192.168.12.3是核心网与ueransim相连网卡对应ip

最后可以使用

$ route -n

 查询所配置的路由信息

3.3 UERANSIM启动

  • 启动
$ docker-compose -f [ueranism文件名].yaml up -d
  • 基站日志查询
$ docker [基站容器名] logs
  • AMF日志查询
$ docker logs oai-amf

4. 实际演示

4.1 路由添加

  • 核心网侧

(docker-compose-host)$ sudo sysctl net.ipv4.conf.all.forwarding=1
(docker-compose-host)$ sudo iptables -P FORWARD ACCEPT
sudo route add -net 192.168.60.0/24 gw 192.168.12.33

查询ip:

lab@lab-virtual-machine:~$ ifconfig
cn5g-access: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.72.1  netmask 255.255.255.0  broadcast 192.168.72.255
        ether 02:42:d0:d5:b8:c6  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

cn5g-core: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.73.1  netmask 255.255.255.0  broadcast 192.168.73.255
        ether 02:42:8e:d5:47:4e  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

demo-oai: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.70.1  netmask 255.255.255.0  broadcast 192.168.70.255
        ether 02:42:20:0b:e4:9a  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:1c:0f:aa:71  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.12.3  netmask 255.255.255.0  broadcast 192.168.12.255
        inet6 fe80::20c:29ff:fead:3a03  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:ad:3a:03  txqueuelen 1000  (Ethernet)
        RX packets 835  bytes 61453 (61.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 867  bytes 56186 (56.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 1508  bytes 125342 (125.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1508  bytes 125342 (125.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

检查路由:

lab@lab-virtual-machine:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.12.1    0.0.0.0         UG    20100  0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 ens33
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.12.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.60.0    192.168.12.33   255.255.255.0   UG    0      0        0 ens33
192.168.70.0    0.0.0.0         255.255.255.0   U     0      0        0 demo-oai
192.168.72.0    0.0.0.0         255.255.255.0   U     0      0        0 cn5g-access
192.168.73.0    0.0.0.0         255.255.255.0   U     0      0        0 cn5g-core
  • 基站侧

ueransim-host$ sudo route add -net 192.168.70.0/24 gw 192.168.12.3

查询ip:

lab@lab-virtual-machine:~$ ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:eb:d3:80:a0  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.12.33  netmask 255.255.255.0  broadcast 192.168.12.255
        inet6 fe80::20c:29ff:fe19:5f43  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:19:5f:43  txqueuelen 1000  (Ethernet)
        RX packets 2004  bytes 156970 (156.9 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1655  bytes 103490 (103.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 2802  bytes 233946 (233.9 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2802  bytes 233946 (233.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

查询路由:

lab@lab-virtual-machine:~$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.12.1    0.0.0.0         UG    20100  0        0 ens33
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 ens33
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
192.168.12.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.70.0    192.168.12.3    255.255.255.0   UG    0      0        0 ens33

4.2 核心网启动

docker-compose -f docker-compose-basic-vpp-nrf.yaml up -d

或者使用python3脚本启动(该脚本包含了状态自检)

oai-cn5g-fed/docker-compose$  python3 ./core-network.py --type start-basic-vpp --scenario 1

4.3 基站启动

  • 启动之前先在基站侧ping一下核心网的demo-oai网桥,确保两台设备能够正常通信
lab@lab-virtual-machine:~$ ping 192.168.70.1 -c 4
PING 192.168.70.1 (192.168.70.1) 56(84) bytes of data.
64 bytes from 192.168.70.1: icmp_seq=1 ttl=64 time=2.55 ms
64 bytes from 192.168.70.1: icmp_seq=2 ttl=64 time=2.52 ms
64 bytes from 192.168.70.1: icmp_seq=3 ttl=64 time=2.45 ms
64 bytes from 192.168.70.1: icmp_seq=4 ttl=64 time=2.49 ms

--- 192.168.70.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3014ms
rtt min/avg/max/mdev = 2.459/2.508/2.550/0.034 ms
  • 启动
docker-compose -f ueransim33.yaml up -d

我们可以发现容器创建了两个不同的网络

lab@lab-virtual-machine:~/oai-cn5g-fed/docker-compose$ ifconfig
cn5g-access: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.62.1  netmask 255.255.255.0  broadcast 192.168.62.255
        inet6 fe80::42:75ff:fe3f:dc2  prefixlen 64  scopeid 0x20<link>
        ether 02:42:75:3f:0d:c2  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 33  bytes 4590 (4.5 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

demo-oai: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.60.1  netmask 255.255.255.0  broadcast 192.168.60.255
        inet6 fe80::42:8cff:fe03:fe3e  prefixlen 64  scopeid 0x20<link>
        ether 02:42:8c:03:fe:3e  txqueuelen 0  (Ethernet)
        RX packets 11  bytes 1384 (1.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 39  bytes 7777 (7.7 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  •  ueransim日志查询
docker ueransim33 logs

同时,利用grep命令,我们也能够获得unsimtun0的ip地址

  • oai-amf日志查询
[2023-03-15T12:09:07.110215] [AMF] [amf_app] [info ] |----------------------------------------------------gNBs' information-------------------------------------------|
[2023-03-15T12:09:07.110218] [AMF] [amf_app] [info ] |    Index    |      Status      |       Global ID       |       gNB Name       |               PLMN             |
[2023-03-15T12:09:07.110226] [AMF] [amf_app] [info ] |      1      |    Connected     |         0x1       |         UERANSIM-gnb-208-95-1        |            208, 95             | 
[2023-03-15T12:09:07.110230] [AMF] [amf_app] [info ] |----------------------------------------------------------------------------------------------------------------|
[2023-03-15T12:09:07.110233] [AMF] [amf_app] [info ] 
[2023-03-15T12:09:07.110236] [AMF] [amf_app] [info ] |----------------------------------------------------------------------------------------------------------------|
[2023-03-15T12:09:07.110239] [AMF] [amf_app] [info ] |----------------------------------------------------UEs' information--------------------------------------------|
[2023-03-15T12:09:07.110242] [AMF] [amf_app] [info ] | Index |      5GMM state      |      IMSI        |     GUTI      | RAN UE NGAP ID | AMF UE ID |  PLMN   |Cell ID|
[2023-03-15T12:09:07.110251] [AMF] [amf_app] [info ] |      1|       5GMM-REGISTERED|   208950000000031|               |               1|          1| 208, 95 |    256|
[2023-03-15T12:09:07.110254] [AMF] [amf_app] [info ] |----------------------------------------------------------------------------------------------------------------|

可以发现基站顺利接入,并且一个UE也顺利注册。

5. 数据测试(待完成)

测试方法与基于Docker的UERANSIM多基站接入5GCN_༜黎明之光༜的博客-CSDN博客类似,任然使用oai提供的oai-ex-dn容器与ueransim进行数据传输测试

6. 取消部署

6.1 基站取消部署

docker-compose -f ueransim33.yaml down

6.2 核心网取消部署

docker-compose -f docker-compose-basic-vpp-nrf.yaml down

或者

python3 ./core-network.py --type stop-basic-vpp --scenario 1

猜你喜欢

转载自blog.csdn.net/weixin_44810982/article/details/129510012
GCN