學習 Linux Kernel Network NS (namespace) - ianchen0119/Introduce-to-5GC Wiki

如果讀者有使用過像是 Docker 之類的 Container Engine,可能會知道 Docker 在 Linux 上實作 Docker Network 使用了 Network namespace 的技巧。 然而,本篇文章之所以會談 Network nameapce 並不是要介紹容器化技術,而是向大家分享 free5GC 是如何利用這項技術做出一些 procedural testing 的!

名詞解說

什麼是 namespace?

什麼是 bridge?

什麼是 veth?

進入正題

本篇文章會以 free5GC v3.1.1 的 test_multiUPF 腳本做介紹,帶大家理解 free5GC 如何利用 network ns 在一台 Host 上面啟動多個 UPF:

# Setup bridge
sudo ip link add veth0 type veth peer name br-veth0
sudo ip link set veth0 up
# sudo ip addr add 10.60.0.1 dev lo
sudo ip addr add 10.200.200.1/24 dev veth0
sudo ip addr add 10.200.200.2/24 dev veth0

sudo ip link add free5gc-br type bridge
sudo ip link set free5gc-br up
sudo ip link set br-veth0 up
sudo ip link set br-veth0 master free5gc-br

sudo iptables -I FORWARD 1 -j ACCEPT
# Setup network namespace
for i in $(seq -f "%02g" 1 $UPF_NUM); do
    sudo ip netns add "${UPFNS}${i}"

    sudo ip link add "veth${i}" type veth peer name "br-veth${i}"
    sudo ip link set "br-veth${i}" up
    sudo ip link set "veth${i}" netns "${UPFNS}${i}"

    sudo ip netns exec "${UPFNS}${i}" ip link set lo up
    sudo ip netns exec "${UPFNS}${i}" ip link set "veth${i}" up
#    sudo ip netns exec "${UPFNS}${i}" ip addr add "10.60.0.1${i}" dev lo
    sudo ip netns exec "${UPFNS}${i}" ip addr add "10.200.200.1${i}/24" dev "veth${i}"

    sudo ip link set "br-veth${i}" master free5gc-br

    if [ ${DUMP_NS} ]; then
        sudo ip netns exec "${UPFNS}${i}" tcpdump -i any -w "${UPFNS}${i}.pcap" &
        sleep 1
        TCPDUMP_PID_[${i}]=$(sudo ip netns pids "${UPFNS}${i}")
    fi

    cd NFs/upf/build && sudo -E ip netns exec "${UPFNS}${i}" ./bin/free5gc-upfd -c "${CONF_DIR}/multiUPF/upfcfg${i}.yaml" &
    sleep 1
done