--- tags: 5GC --- # NextEPC Installation on KVM Use **Wirelab NextEPC** or [Official NextEPC commit `2afb6b`](https://github.com/acetcom/nextepc/commit/e2afb6b2fce6414ec086f516f7bce86e15fbccf6) [ToC] ## Preparation ### KVM Environment Setup * VM NIC Cards 1. For connecting Internet * Netowrk source: `Virtual network - NAT` * Interface name in VM: `ens3` (in this example) 2. NIC for connecting eNB: * Netowrk 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 PLMN: MCC: 208 MNC: 93 MME GID: 1 MME Code: 1 TAC: 1 ``` * USIM Information (in this example) ``` IMSI 208930000000003 K 8baf473f2f8fd09487cccbd7097c6862 OPc 8e27b6af0e692e750f32667a3b14605d ``` ``` IMSI 460990000072000 K 0123456789ABCDEF0123456789ABCDEF OP 0123456789ABCDEF0123456789A46099 ``` ``` IMSI 466680123457005 K 000102030405060708090A0B0C0D0E0F OP 00112233445566778899AABBCCDDEEFF ``` ## Installation *You can either follow instructions from Part A ~ Part C or directly execute the shell on the bottom of this document.* ### Part A. Compile Source Code #### Prerequisites Install Mongo DB with Package Manager. ```bash sudo apt-get update sudo apt-get -y install mongodb sudo systemctl start mongodb (if '/usr/bin/mongod' is not running) ``` To run NextEPC with least privilege, TUN device permission should be a crw-rw-rw-(666). ```bash ls -al /dev/net/tun crw-rw-rw- 1 root 28 10, 200 Feb 11 05:13 /dev/net/tun ``` Write the configuration file for the TUN deivce. ```bash sudo sh -c "cat << EOF > /etc/systemd/network/99-nextepc.netdev [NetDev] Name=pgwtun Kind=tun EOF" ``` Check *IPv6 Kernel Configuration*. Although you can skip this process, we recommend that you set this up to support IPv6-enabled UE. ```bash sysctl -n net.ipv6.conf.pgwtun.disable_ipv6 (if the output is 0 and IPv6 is enabled, skip the followings) sudo sh -c "echo 'net.ipv6.conf.pgwtun.disable_ipv6=0' > /etc/sysctl.d/30-nextepc.conf" sudo sysctl -p /etc/sysctl.d/30-nextepc.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-nextepc.network [Match] Name=pgwtun [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 pgwtun iface pgwtun inet static address 45.45.0.1 netmask 255.255.0.0 iface pgwtun inet6 static pre-up modprobe ipv6 address cafe::1 netmask 64 ``` Restart pgwtun interface ``` sudo ip a flush pgwtun sudo systemctl restart networking # Check if pgwtun is up sudo apt-get -y install net-tools ifconfig pgwtun ``` #### MME, SGW, PGW, 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://github.com/acetcom/nextepc cd nextepc autoreconf -iv ./configure --prefix=`pwd`/install make -j `nproc` make install ``` #### Self-test We provide a program that checks whether the installation is correct. After running the wireshark, select `loopback` interface, filter `s1ap || diameter || gtpv2 || gtp` and run `./test/testepc`. You can see the virtually created packets. [[testepc.pcapng]](http://nextepc.org/static/pcapng/testepc.pcapng) ```bash ./test/testepc ``` #### Run in all-in-one mode The daemon `nextepc-epcd` includes both *MME*, *SGW*, *PGW*, *HSS*, and *PCRF*. So, instead of running all 5 daemons, you can just run `nextepc-epcd` in your development environment. ```bash ./nextepc-epcd ``` * While running `nextepc-epcd` * All logs for MME, SGW, PGW, PCRF, and HSS are written to `./install/var/log/nextepc/nextepc.log`. * All settings are managed in one place for `./install/etc/nextepc/nextepc.conf`. * You can find the log/conf path at the beginning of running screen. * You can user ``-f`` argument to specify config file to be used. ### Part B. 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 ``` Running WebUI ```bash cd webui npm run dev ``` Now the web server is running on _http://localhost:3000_. ### Part C. Configuration #### Modify NextEPC config file Modify `./install/etc/nextepc/nextepc.conf` 1. mme-slap address (line 66) ``` mme: s1ap: addr: <IP of GW NIC to eNB: 192.188.2.2> ``` 2. sgw-gtpu address (line 212) ``` sgw: gtpu: addr: <IP of GW NIC to eNB: 192.188.2.2> ``` 3. MME GUMMEI (line 100) ``` mme: gummei: plmn_id: mcc: <eNB MCC: 208> mnc: <eNB MNC: 93> mme_gid: <eNB MME GID: 1> mme_code: <eNB MME Code: 1> ``` 4. MME TAI (line 139) ``` mme: 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 affects immediately NextEPC without restaring any daemon. ### 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 pgwtun -j ACCEPT ``` [Option 2] or configure as auto run on boot ```bash sudo sh -c "cat << EOF > /etc/init.d/epc-network-setup #!/bin/sh ### BEGIN INIT INFO # Provides: epc-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 pgwtun -j ACCEPT EOF" sudo chmod 755 /etc/init.d/epc-network-setup sudo /etc/init.d/epc-network-setup sudo ln -s /etc/init.d/epc-network-setup /etc/rc3.d/S99epc-network-setup sudo ln -s /etc/init.d/epc-network-setup /etc/rc4.d/S99epc-network-setup sudo ln -s /etc/init.d/epc-network-setup /etc/rc5.d/S99epc-network-setup ``` ## Rebuild Project To completely rebuild after modifying source code ```bash (Control-C kill nextepc-epcd) make maintainer-clean rm -rf ./install git pull autoreconf -iv ./configure --prefix=`pwd`/install make -j `nproc` make install ./nextepc-epcd ``` ## Troubleshooting ### Notice for Modifying Config File 1. Use space for ident, **DO NOT use tab** 2. A white space must be added between the **colon** and **value** after the item nam. e.g. ``addr: 192.188.2.2`` ### ./test/testepc Test Failed 1. Make sure all config file and environment settings are correct. 2. Kill testepc process which didn't finish correctly ```bash killall -9 testepc ``` 3. Remove test subscriber left by previous failed test ([Issue #57](https://github.com/acetcom/nextepc/issues/57#issuecomment-386177165)) ``` $ mongo > use nextepc > db.subscribers.find() ### (Check the test subscriber) > db.subscribers.drop() ### Remove all subscriber > db.subscribers.find() ### (Check that all subscribers are empty) ``` ### ./nextepc-epcd Error Occurred 1. ``ERRR: - The certificate is expired`` ([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 testepc or $ killall -9 nextepc-epcd ``` ### Rebuild Error 1. ``config.status: error: cannot find input file: `Makefile.in'`` ([Issue #68](https://github.com/rscada/libmbus/issues/68)) ```bash autoheader \ && aclocal \ && libtoolize --ltdl --copy --force \ && automake --add-missing --copy \ && autoconf \ && ./configure ``` ## References * https://github.com/acetcom/nextepc * http://nextepc.org/guides/2-build/ * http://nextepc.org/guides/3-configuration/ * https://github.com/acetcom/nextepc/issues/18 ## \[ Shell Script \] *Please make some modifications to the environment variables on the top of this script if needed according to the actual condition.* Bash Script for Ubuntu 18.04 Minimal Installation ```bash #!/bin/sh set -o xtrace set -e ##### [Env Variables] ##### GIT_REPO=https://gitlab.com/wirelab/nextepc.git if [ $# != 8 ] then NIC_INTERNET=ens3 NIC_eNB=ens4 NIC_eNB_IP=192.188.2.2 PLMN_MCC=208 PLMN_MNC=93 MME_GID=1 MME_CODE=1 TAC=1 else NIC_INTERNET=$1 NIC_eNB=$2 NIC_eNB_IP=$3 PLMN_MCC=$4 PLMN_MNC=$5 MME_GID=$6 MME_CODE=$7 TAC=$8 fi ##### Clone Git Repo ##### sudo apt-get -y install git git clone $GIT_REPO ##### Install NextEPC ##### sudo apt-get -y update sudo apt-get -y install mongodb net-tools sudo systemctl start mongodb sudo sh -c "cat << EOF > /etc/systemd/network/99-nextepc.netdev [NetDev] Name=pgwtun Kind=tun EOF" sudo systemctl enable systemd-networkd sudo systemctl restart systemd-networkd if [[ $(sysctl -n net.ipv6.conf.pgwtun.disable_ipv6) != 0 ]]; then sudo sh -c "echo 'net.ipv6.conf.pgwtun.disable_ipv6=0' > /etc/sysctl.d/30-nextepc.conf" sudo sysctl -p /etc/sysctl.d/30-nextepc.conf fi sudo sh -c "cat << EOF > /etc/systemd/network/99-nextepc.network [Match] Name=pgwtun [Network] Address=45.45.0.1/16 Address=cafe::1/64 EOF" sudo systemctl restart systemd-networkd 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 cd nextepc autoreconf -iv ./configure --prefix=`pwd`/install make -j `nproc` make install ##### Install Web UI ##### sudo apt-get -y install curl curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash - sudo apt-get -y install nodejs cd webui npm install cd .. ##### Self-Test ##### # Running self test after modifying config may fail sleep 10 ./test/testepc ##### NextEPC Config ##### CONFIG_PATH=./install/etc/nextepc CONFIG=$CONFIG_PATH/nextepc.conf # Backup the original config cp $CONFIG $CONFIG_PATH/nextepc.conf.original sed -i "66s/.*/ addr: $NIC_eNB_IP\n/" $CONFIG sed -i "213s/.*/ addr: $NIC_eNB_IP\n/" $CONFIG sed -i "103s/.*/ mcc: $PLMN_MCC/" $CONFIG sed -i "104s/.*/ mnc: $PLMN_MNC/" $CONFIG sed -i "105s/.*/ mme_gid: $MME_GID/" $CONFIG sed -i "106s/.*/ mme_code: $MME_CODE/" $CONFIG sed -i "142s/.*/ mcc: $PLMN_MCC/" $CONFIG sed -i "143s/.*/ mnc: $PLMN_MNC/" $CONFIG sed -i "144s/.*/ tac: $TAC/" $CONFIG ##### Network Config ##### sudo sh -c "cat << EOF > /etc/init.d/epc-network-setup #!/bin/sh ### BEGIN INIT INFO # Provides: epc-network-setup # Required-Start: networkd # Required-Stop: networkd # Default-Start: networkd # Default-Stop: networkd # Short-Description: # Description: # ### END INIT INFO ifconfig $NIC_eNB $NIC_eNB_IP sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' iptables -t nat -A POSTROUTING -o $NIC_INTERNET -j MASQUERADE iptables -I INPUT -i pgwtun -j ACCEPT EOF" sudo chmod 755 /etc/init.d/epc-network-setup sudo /etc/init.d/epc-network-setup sudo ln -s /etc/init.d/epc-network-setup /etc/rc3.d/S99epc-network-setup sudo ln -s /etc/init.d/epc-network-setup /etc/rc4.d/S99epc-network-setup sudo ln -s /etc/init.d/epc-network-setup /etc/rc5.d/S99epc-network-setup ##### Start the Standalone Deamon ##### ./nextepc-epcd ```