分立部署OAI核心网与容器版ueransim
1.任务说明
有两台机器,服务器A与主机B,A与B通过网线直连,在A上部署OAI基础核心网,在B上部署docker 版ueransim,实现ueransim的成功接入。
我使用的服务器A与主机B上此前已下载部署过核心网与ueransim,此篇文章主要解决如何在两台机器上分立部署的问题。
在一台机器上进行部署的详细链接:基于Docker的UERANSIM多基站接入5GCN
2.部署前提
服务器A上在windows系统中安装了VM虚拟机,其上安装ubuntu18.04系统。下载部署成功了OAI核心网(版本v1.5.0)。
主机B上在windows系统中安装了VM虚拟机,其上安装ubuntu18.04系统。下载了OAI核心网(用于测试)与docker版 ueransim仿真基站,并测试可以成功接入。
3.部署过程
3.1网络配置
首先需要进行两台机器的网络配置,让两台机器可以互相ping通。
服务器A上网络配置如下:
将服务器的NIC4接口与虚拟机的VMnet4映射桥接起来,在虚拟机种选中使用VMnet4网络
对主机B进行相似操作
然后配置两个虚拟机使用到网络为静态IP,以使两机器能长期通信
#打开配置网络文件
sudo vim /etc/netplan/01-network-manager-all.yaml
此为服务器A上配置
此为主机B上配置,两机器上保持网段在同一网段
#应用改网络设置
sudo netplan apply
然后测试两机器是否接通,通过互相ping的方式,可以互相ping通
3.2核心网启动 (此为错误发现过程)
#核心网网络转发的配置
sudo sysctl net.ipv4.conf.all forwarding=1
sudo iptables -P FORWARD ACCEPT
#进入核心网启动文件夹
cd /oai-cn5g-fed/docker-compose
#启动核心网
docker-compose -f docker-compose-basic-vpp-nrf.yaml up -d
尝试启动核心网启动成功
在主机B上添加路由转发,转发到服务器A上的demo-oai网桥(错误的多余步骤,正确的路由转发见后文)
#192.168.70.0来自于核心网启动的docker-compose.yaml文件里network下的设置
sudo ip route add 192.168.70.0/24 via 192.168.12.3 dev ens33
sudo ip route add 192.168.72.0/24 via 192.168.12.3 dev ens33
在主机B上测试是否可以ping到核心网,其中192.168.70.1是核心网demo-oai网桥,成功ping通,说明主机B可以与核心网进行通信
3.3启动容器化ueransim(此为错误发现与解决过程)
3.3.1直接启动问题发现
启动ueranism,发现无法启动,ueransim1的启动需要依托网络demo-oai-public-net,主机B上并没有创建这个网络,服务器A上启动OAI核心网后是创建了这个网络的。
很显然,这里涉及到了容器之间的跨机器工作问题,主机B上启动docker版ueransim依赖demo-oai-public-net网络,但主机B上的容器无法找到武器A上创建的网络,同时涉及到docker-compose网络配置的问题
下图分别为核心网docker-compose文件与ueransim的docke-compose文件中的网络配置
3.3.2问题解决
思路:修改ueransim的docker-compose文件,使其可以连接到服务器A上的核心网
先对docker-compose文件中各个参数的意义有所了解如:基于Docker的UERANSIM多基站接入5GCN
学习容器跨主机进行通信Docker容器跨主机通讯的几种方式
主要参考链接为:两种常用的跨主机Docker容器互通方法
跨主机容器通信
文章中将两台机器的docker0网桥连接起来,docker启动的时候会在主机上自动创建一个docker0网桥,实际上是一个Linux网桥,所有容器的启动如果在docker run的时候没有指定网络模式的情况下都会挂载到docker0网桥上。这样容器就可以和主机甚至是其他容器之间通讯了。我们使用的是自己创建的网桥demo-oai-public-net ,所以不是接通docker0,而是接通两个机器上的demo-oai-public-net。
在docker版ueransim的docker-compose.yaml文件里加入所需的网桥:
原来:
现在:
之所以如此添加是因为启动的核心网是docker-compose-basic-nrf-vpp版本,此更改依据要接入的核心网版本进行对应的更改。
除此以外其他相关设置如:LINK_IP、 NGAP_IP、GTP_IP 、NGAP_PEER_IP、GNB_IP_ADDRESS也需进行相应更改
ueransim docker-compose.yaml文件更改后全文如下:
version: '3.8'
services:
#对名字进行了更改,避免重名
ueransim33:
container_name: ueransim33
image: ueransim:latest
privileged: true
environment:
# GNB Congig Parameters
- MCC=208
- MNC=95
- NCI=0x000000010
- TAC=0xa000
#此三个ip网段对应本地创建的demo-oai的网段,最后141可更改,但此三个需相同
- LINK_IP=192.168.60.141
- NGAP_IP=192.168.60.141
- GTP_IP=192.168.62.141
#此为核心网amf的接入ip
- NGAP_PEER_IP=192.168.70.132
- SST=222
- SD=123
- IGNORE_STREAM_IDS=true
# UE Config Parameters
- NUMBER_OF_UE=1
- IMSI=208950000000031
- KEY=0C0A34601D4F07677303652C0462535B
- OP=63bfa50ee6523365ff14c1f45f88737d
- OP_TYPE=OPC
- AMF_VALUE=8000
- IMEI=356938035643803
- IMEI_SV=0035609204079514
#此为ue接入gnb的ip,更改为LINK_IP
- GNB_IP_ADDRESS=192.168.60.141
- PDU_TYPE=IPv4
- APN=default
- SST_0=222
- SD_0=123
- SST_C=222
- SD_C=123
- SST_D=222
- SD_D=123
networks:
#下面网络均更改与最下面的networks一致
public_net:
ipv4_address: 192.168.60.141
public_net_access:
ipv4_address: 192.168.62.141
healthcheck:
test: /bin/bash -c "ifconfig uesimtun0"
interval: 10s
timeout: 5s
retries: 5
#创建出与核心网同名网桥,但网段不同避免冲突
networks:
public_net:
driver: bridge
name: demo-oai-public-net
ipam:
config:
- subnet: 192.168.60.0/24
driver_opts:
com.docker.network.bridge.name: "demo-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"
结构图如下:
将主机B上容器接入服务器A上demo-oai网桥,在主机B上添加如下路由:
sudo route add -net 192.168.70.0/24 gw 192.168.12.3
sudo route add -net 192.168.72.0/24 gw 192.168.12.3
将服务器A与主机B上demo-oai网桥接通,在服务器A上添加如下路由:
sudo route add -net 192.168.60.0/24 gw 192.168.12.33
sudo route add -net 192.168.62.0/24 gw 192.168.12.33
启动docker版 ueransim
docker-compose -f ueransim33.yaml up -d
查看ueransim日志:
docker ueransim33 logs
成功开启了uesimtun0,代表启动成功:
4.说明及纯享版开启流程
服务器A与主机B上添加的路由规则重启后会消失,所以每次都需重新添加
4.1开启流程纯享版
上面主要进行了几个工作 :
- 基础准备:两机器上核心网与ueransim的下载与部署测试;
- 两机器网线直连
- 两机器设置静态ip可以互相ping通
- 两机器设置路由转发以及ueransim的docker-compose.yaml文件修改,让主机B的ueransim容器数据可以传入服务器A的核心网网桥demo-oai里
- 启动核心网
- 启动基站
其中1、2、3以及4中yaml文件的修改是一劳永逸的,详情参照上文。其他步骤是每次开启都需重新操作的,如下:
服务器A设置路由转发:
sudo sysctl net.ipv4.conf.all.forwarding=1
sudo iptables -P FORWARD ACCEPT
sudo route add -net 192.168.60.0/24 gw 192.168.12.33
主机B设置路由转发:
sudo route add -net 192.168.70.0/24 gw 192.168.12.3
服务器A开启核心网:
docker-compose -f docker-compose-basic-vpp-nrf.yaml up -d
主机B开启ueransim:
docker-compose -f ueransim33.yaml up -d
查看是否生成uesimtun0:
docker ueransim33 logs