目录
我们已经实现了单个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部署
参考:
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文件的网络配置
-
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