文章目录
0 环境要求
0.1 软件
OS: Ubuntu 18.04
gcc 7.3.0
Go 1.14.4 linux/amd64
kernel version 5.0.0-23-generic
0.2 硬件
- 最低配置
CPU: Intel i5 processor
RAM: 4GB
Hard drive: 160GB
NIC: Any 1Gbps Ethernet card supported in the Linux kernel
- 推荐配置
CPU: Intel i7 processor
RAM: 8GB
Hard drive: 160GB
NIC: Any 10Gbps Ethernet card supported in the Linux kernel
1 安装
1.1 安装前提
1.1.1 内核
Linux内核应为5.0.0-23-generic
,可以通过uname -r
查询内核版本。
$ uname -r
5.0.0-23-generic
如果不符合版本号,使用下述语句进行内核的升级:
sudo apt-get install linux-image-5.0.0-23-generic
sudo apt-get install linux-headers-5.0.0-23-generic
reboot
1.1.2 Go
Go的版本应为1.14.4.linux-amd64
,可以通过go version
查询版本。
此前安装过其他版本的Go时,需要进行下述操作:
sudo rm -rf /usr/local/go
wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz
sudo tar -C /usr/local -zxvf go1.14.4.linux-amd64.tar.gz
如果是第一次安装Go,需要进行下述操作:
wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz
sudo tar -C /usr/local -zxvf go1.14.4.linux-amd64.tar.gz
mkdir -p ~/go/{bin,pkg,src}
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
echo 'export GOROOT=/usr/local/go' >> ~/.bashrc
echo 'export PATH=$PATH:$GOPATH/bin:$GOROOT/bin' >> ~/.bashrc
source ~/.bashrc
1.1.3 控制面依赖包
sudo apt -y update
sudo apt -y install mongodb wget git
sudo systemctl start mongodb
1.1.4 控制面依赖包
sudo apt -y update
sudo apt -y install git gcc cmake autoconf libtool pkg-config libmnl-dev libyaml-dev
go get -u github.com/sirupsen/logrus
在使用go get -u github.com/sirupsen/logrus
时,可能会出现报错package golang.org/x/sys/unix: unrecognized import path "golang.org/x/sys/unix" (https fetch: Get https://golang.org/x/sys/unix?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
。解决方案为
- golang 在 github 上建立了一个镜像库,下载github上的镜像库放入GOPATH下即可。
mkdir -p $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/sync.git
git clone https://github.com/golang/crypto.git
git clone https://github.com/golang/sys.git
- 或者通过添加代理的方式解决。
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
然后再进行go get -u github.com/sirupsen/logrus
操作。
1.1.5 网络设置
sudo sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o <dn_interface> -j MASQUERADE
sudo systemctl stop ufw
此处的<dn_iptables>
指的是真实网卡:lo
、ens33
或者ens38
。
1.2 安装控制面网元
1.2.1 克隆free5GC仓库
- 安装最新稳定版(v3.0.4)
cd ~
git clone --recursive -b v3.0.4 -j `nproc` https://github.com/free5gc/free5gc.git
cd free5gc
此处的nproc
为虚拟机的内核数,可以通过nproc
在终端直接获得。根据配置要求,这里我的nproc
为4
,下同此。
- 安装最新版
cd ~/free5gc
git checkout master
git submodule sync
git submodule update --init --jobs `nproc`
git submodule foreach git checkout master
git submodule foreach git pull --jobs `nproc`
1.2.2 安装Go模块依赖包
这里注意保持free5gc
的文件夹命名,不要进行修改,否则可能会出现编译失败的问题。
cd ~/free5gc
go mod download
在使用go mod download
时,出现报错。可以通过挂代理的方式解决,功效应该和上面是一样的。
# Linux / macOS
export GOPROXY=https://goproxy.io
# Windows
$env:GOPROXY = "https://goproxy.io"
在挂完代理之后,再使用go mod download
。
1.2.3 在free5GC中编译网络功能服务
- 编译单个网元
cd ~/free5gc
make amf
- 全部编译
cd ~/free5gc
make all
1.3 安装用户面网元
确保Linux内核应为5.0.0-23-generic
,具体指导见上。
1.3.1 获取Linux内核模块5G GTP-U
git clone -b v0.2.0 https://github.com/PrinzOwO/gtp5g.git
cd gtp5g
make
sudo make install
1.3.2 创建UPF
- 使用
make
创建
cd ~/free5gc
make upf
- 手动创建
cd ~/free5gc/src/upf
mkdir build
cd build
cmake ..
make -j `nproc`
1.3.3 自定义UPF
UPF配置文件在free5gc/src/upf/build/config/upfcfg.yaml
中,可根据需要进行配置。
2 运行
2.1 运行核心网
在运行单个网元前,先进行NRF
的运行,即
cd ~/free5gc
./bin/nrf
- 运行单个网元
cd ~/free5gc
./bin/amf
- 运行整个核心网
cd ~/free5gc
./run.sh
2.2 运行N3IWF
在运行N3IWF实例前,确保有3个网络接口:第一个连接AMF
,第二个连接UPF
,第三个用于IKE
程序。
第一步,给每个接口配置合适的IP地址;
第二步,给IPSec通信创建接口:
sudo ip link add ipsec0 type vti local <IKEBindAddress> remote 0.0.0.0 key <IPSecInterfaceMark>
第三步,给接口分配地址并挂起:
sudo ip address add <IPSecInterfaceAddress/CIDRPrefix> dev ipsec0
sudo ip link set dev ipsec0 up
第四步,使用管理员权限运行N3IWF:
cd ~/free5gc/
sudo ./bin/n3iwf
2.3 使用外部RAN运行多对一
参照sample config 进行使用。
2.4 在容器中部署
参照free5gc-compose进行部署。
3 测试
使用wireshark
捕获所有端口通信,并使用pfcp||icmp||gtp
进行筛选。
在运行测试示例前,对test.sh
进行赋权:
cd ~/free5gc
chmod +x ./test.sh
以下所有的测试都是在~/free5gc
目录下进行测试。
A. TestRegistration
./test.sh TestRegistration
B. TestGUTIRegistration
./test.sh TestGUTIRegistration
C. TestServiceRequest
./test.sh TestServiceRequest
D. TestXnHandover
./test.sh TestXnHandover
E. TestDeregistration
./test.sh TestDeregistration
F. TestPDUSessionReleaseRequest
./test.sh TestPDUSessionReleaseRequest
G. TestPaging
./test.sh TestPaging
H. TestN2Handover
./test.sh TestN2Handover
I. TestNon3GPP
./test.sh TestNon3GPP
J. TestReSynchronisation
./test.sh TestReSynchronisation
K. TestULCL
./test_ulcl.sh -om 3 TestRegistration