---
tags: 5GC
---
# free5GC Installation on KVM
## Minimum Requirement
- Software
- OS: Ubuntu 18.04
- Linux kernel: 4.15.0-43-generic
- gcc 7.3.0
- Go 1.11.4
- QEMU emulator 2.11.1
- Hardware
- CPU: Intel i5 processor
- RAM: 4GB
- Hard drive: 160G
- NIC card: 1Gbps ethernet card
- Hardware recommended
- CPU: Intel i7 processor
- RAM: 8GB
- Hard drive: 160G
- NIC card: 10Gbps ethernet card
## Hardware Tested
eNB
- GemTek WLTGFC-101 (4G LTE Small Cell)
UE
- LG C90 cellular phone
- D-Link DWR-932C dongle via USB cable
## Preparation
### KVM Environment Setup
* VM NIC Cards
1. NIC for connecting to the Internet
* Network source: `Virtual network - NAT`
* Interface name in VM: `ens3` (in this example)
2. NIC for connecting to eNB:
* Network source: Host device `<Host Interface Name>`
* Interface name in VM: `ens4` (in this example)
### Collect eNodeB and USIM Information
* eNodeB information (in this example)
```!
IP Address: 192.188.2.1
Gateway: 192.188.2.2 (IP of NIC connected to eNB)
PLMN:
MCC: 208
MNC: 93
MME GID: 1
MME Code: 1
TAC: 1
```
* USIM information (in this example)
```!
IMSI 208930000000003
K 8baf473f2f8fd09487cccbd7097c6862
OPc 8e27b6af0e692e750f32667a3b14605d
```
## Installation
*You can either follow the instructions from Part A ~ Part C or simply run the shell listed in the end of this document.*
### Part A. Compile Source Code
#### Prerequisites
Install MongoDB 3.6.3, Golang 1.11.4.
```bash
sudo apt-get update
sudo apt-get -y install mongodb wget git
sudo systemctl start mongodb (if '/usr/bin/mongod' is not running)
# Check if golang is installed
go version
# If not, run commands below
wget -q https://storage.googleapis.com/golang/getgo/installer_linux
chmod +x installer_linux
./installer_linux
source ~/.bash_profile
rm -f installer_linux
go get -u -v "github.com/gorilla/mux"
go get -u -v "golang.org/x/net/http2"
go get -u -v "golang.org/x/sys/unix"
```
To run free5GC with least privilege, TUN device permission should be a crw-rw-rw-(666).
```bash
ls -al /dev/net/tun
crw-rw-rw- 1 root root 10, 200 Jan 14 13:09 /dev/net/tun
```
Write the configuration file for the TUN device.
```bash
sudo sh -c "cat << EOF > /etc/systemd/network/99-free5gc.netdev
[NetDev]
Name=uptun
Kind=tun
EOF"
sudo systemctl enable systemd-networkd
sudo systemctl restart systemd-networkd
```
Check *IPv6 Kernel Configuration*. Although you can skip this step, we suggest that you set this up to support IPv6-enabled UE.
```bash
sysctl -n net.ipv6.conf.uptun.disable_ipv6
(if the output is 0 and IPv6 is enabled, skip the followings)
sudo sh -c "echo 'net.ipv6.conf.uptun.disable_ipv6=0' > /etc/sysctl.d/30-free5gc.conf"
sudo sysctl -p /etc/sysctl.d/30-free5gc.conf
```
You are now ready to set the IP address on TUN device. If IPv6 is disabled for TUN device, please remove `Address=cafe::1/64` from below.
```bash
sudo sh -c "cat << EOF > /etc/systemd/network/99-free5gc.network
[Match]
Name=uptun
[Network]
Address=45.45.0.1/16
Address=cafe::1/64
EOF"
sudo systemctl enable systemd-networkd
sudo systemctl restart systemd-networkd
```
Add the following lines into `/etc/network/interfaces` for network-manager service
```
auto uptun
iface uptun inet static
address 45.45.0.1
netmask 255.255.0.0
iface uptun inet6 static
pre-up modprobe ipv6
address cafe::1
netmask 64
```
Restart uptun interface
```
sudo ip a flush uptun
sudo systemctl restart networking
# Check if uptun is up
sudo apt-get -y install net-tools
ifconfig uptun
```
#### AMF, SMF, UPF, HSS, and PCRF
Install the depedencies for building the source
```bash
sudo apt-get -y install autoconf libtool gcc pkg-config git flex bison libsctp-dev libgnutls28-dev libgcrypt-dev libssl-dev libidn11-dev libmongoc-dev libbson-dev libyaml-dev
```
Git clone and compile
```bash
git clone https://bitbucket.org/nctu_5g/free5gc.git
cd free5gc
autoreconf -iv
./configure --prefix=`pwd`/install
make -j `nproc`
make install
```
### Part B. VM Internal Network Environment Setting
\[Option 1\] Need to run on every boot
```bash
sudo ifconfig ens4 192.188.2.2
sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
sudo iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
sudo iptables -I INPUT -i uptun -j ACCEPT
```
\[Option 2\] or configure as auto run on boot
```bash
sudo sh -c "cat << EOF > /etc/init.d/ngc-network-setup
#!/bin/sh
### BEGIN INIT INFO
# Provides: ngc-network-setup
# Required-Start: networkd
# Required-Stop: networkd
# Default-Start: networkd
# Default-Stop: networkd
# Short-Description:
# Description:
#
### END INIT INFO
ifconfig ens4 192.188.2.2
sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
iptables -I INPUT -i uptun -j ACCEPT
EOF"
sudo chmod 755 /etc/init.d/ngc-network-setup
sudo /etc/init.d/ngc-network-setup
sudo ln -s /etc/init.d/ngc-network-setup /etc/rc3.d/S99ngc-network-setup
sudo ln -s /etc/init.d/ngc-network-setup /etc/rc4.d/S99ngc-network-setup
sudo ln -s /etc/init.d/ngc-network-setup /etc/rc5.d/S99ngc-network-setup
```
### Part C. Run
#### Run in all-in-one mode
The daemon ``free5gc-ngcd`` includes *AMF*, *SMF*, *UPF*, *HSS*, and *PCRF*. Thus, instead of running all 5 daemons, you can just run ``free5gc-ngcd`` in your development environment.
```bash
./free5gc-ngcd
```
* While running `free5gc-ngcd`
* All logs for AMF, SMF, UPF, HSS, and PCRF are written to `./install/var/log/free5gc/free5gc.log`.
* All settings are managed in one place for `./install/etc/free5gc/free5gc.conf`.
* You can find the log/conf path at the beginning of the running screen.
* You can user ``-f`` argument to specify config file to be used.
#### Run functions separately
We also provide 5GC functions running separately.
```
./free5gc-upfd
./free5gc-amfd
./free5gc-smfd
./nextepc-hssd
./nextepc-pcrfd
```
Note: We also provide a [**reference**](https://www.free5gc.org/cluster) for 5GC functions running in separate machines.
#### \[Optional\] Self-test
We provide a program that checks whether the installation is correct.
After running the wireshark, select `loopback` interface, and then filter `s1ap || diameter || gtpv2 || gtp` and run `./test/testngc`. You can see the packets virtually created.
```bash
./test/testngc -f install/etc/free5gc/test/free5gc.testngc.conf
```
### Part D. Web User Interface
Install [Node.js](https://nodejs.org/) and [NPM](https://www.npmjs.com/)
```bash
sudo apt-get -y install curl
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get -y install nodejs
```
Install the dependencies to run WebUI (first time)
```bash
cd webui
npm install
```
Run WebUI
```bash
cd webui
npm run dev
```
Now the web server is running on _http://localhost:3000_.
The default username and password are "**admin**" and "**1423**".
## Core Network Configuration
#### free5GC configuration file
Modify `./install/etc/free5gc/free5gc.conf`
1. amf-slap address (line 67)
```yaml
amf:
s1ap:
addr: <IP of GW NIC to eNB: 192.188.2.2>
```
2. upf-gtpu address (line 162)
```yaml
smf:
upf:
addr: <IP of GW NIC to eNB: 192.188.2.2>
```
3. AMF GUMMEI (line 91)
```yaml
amf:
gummei:
plmn_id:
mcc: <eNB MCC: 208>
mnc: <eNB MNC: 93>
mme_gid: <eNB MME GID: 1>
mme_code: <eNB MME Code: 1>
```
4. AMF TAI (line 130)
```yaml
amf:
tai:
plmn_id:
mcc: <eNB MCC: 208>
mnc: <eNB MNC: 93>
tac: <eNB TAC: 1>
```
#### Add subscriber (UE)
* Add a subscriber by the Web UI
* Run the web server: `cd ./webui && npm run dev`
* Visit _http://localhost:3000_
```
- Username : admin
- Password : 1423
```
* Add a subscriber with `IMSI`, `K`, `OPc`
```!
- Go to Subscriber Menu.
- Click `+` Button to add a new subscriber.
- Fill the IMSI, security context(K, OPc, AMF), and APN of the subscriber.
- Click `SAVE` Button
```
* This addition will take effect immediately on free5GC without restaring any daemon.
## Rebuild Project
To completely rebuild the project after modifying source code
```bash
(Control-C kill free5gc-ngcd)
make maintainer-clean
rm -rf ./install
git pull
autoreconf -iv
./configure --prefix=`pwd`/install
make -j `nproc`
make install
./free5gc-ngcd
```
## Troubleshooting
### Note for modifying configuration file
1. Use space for indent. **DO NOT use tab**.
2. A white space must be added between the **colon** and **value** after the item name, e.g. ``addr: 192.188.2.2``
### ./test/testngc test failure
1. Make sure all configuration files and environment settings are correct.
2. Kill testngc process which didn't finish correctly
```bash
killall -9 testngc
```
3. Remove test subscriber left by previous failed test ([NextEPC issue #57](https://github.com/acetcom/nextepc/issues/57#issuecomment-386177165))
```
$ mongo
> use free5gc
> db.subscribers.find() ### (Check the test subscriber)
> db.subscribers.drop() ### Remove all subscriber
> db.subscribers.find() ### (Check that all subscribers are empty)
```
### ./free5gc-ngcd errors
1. ``ERRR: - The certificate is expired`` ([NextEPC issue #94](https://github.com/acetcom/nextepc/issues/94))
```bash
cd support/freeDiameter
./make_certs.sh .
cd ../..
make install
```
2. ``Address already in use``
```
$ killall -9 testngc
or
$ killall -9 free5gc-ngcd
```
### Rebuild failure
1. ``config.status: error: cannot find input file: `Makefile.in'`` ([NextEPC issue #68](https://github.com/rscada/libmbus/issues/68))
```bash
autoheader \
&& aclocal \
&& libtoolize --ltdl --copy --force \
&& automake --add-missing --copy \
&& autoconf \
&& ./configure
```
## Appendix A: Program the SIM Card
Install packages:
```bash
sudo apt-get install pcscd pcsc-tools libccid python-dev swig python-setuptools python-pip libpcsclite-dev
sudo pip install pycrypto
```
Download PySIM
```bash
git clone git://git.osmocom.org/pysim.git
```
Change to pyscard folder and install
```bash
cd <pyscard-path>
sudo /usr/bin/python setup.py build_ext install
```
Verify your reader is ready
```bash
sudo pcsc_scan
```
Check whether your reader can read the SIM card
```bash
cd <pysim-path>
./pySim-read.py –p 0
```
Program your SIM card information
```bash
./pySim-prog.py -p 0 -x 208 -y 93 -t sysmoUSIM-SJS1 -i 208930000000003 --op=8e27b6af0e692e750f32667a3b14605d -k 8baf473f2f8fd09487cccbd7097c6862 -s 8988211000000088313 -a 23605945
```