OSS 5G CoreのUPFからDNへパケットが流れるまで
1. はじめに
5G Coreはレイヤが多く、特にUPFがDNにパケットを送る処理(NAT / ルーティング / Forwarding) は多くのエンジニアにとってブラックボックスになりがちである。
free5gcやopen5gsでは、実は公式installationの手順の中でiptablesを使ったNAT変換を行っている。本記事ではその辺りを少し掘り下げて解説する。
2. gNB~UPF~DNのUser Planeパケットの流れ
分かり易くUplinkパケットを考えると通常UEからgNBを通してGTP Tunel経由でUPFに到達しその後UPFがGTPパケットのカプセル化解除を行いDNに向かってパケットを送信する。
その際free5gcやopen5gsの場合はUPFでGTPカプセル化解除を行った後Source IPをUPFのWANのIPアドレスに変換してTarget IPに向かってパケットを送信する事になる。
以下にUEから例えばPINGでgoogleなどのサーバにパケットを送信した場合のイメージを図示する。
-
①gNBはGTP Tunelを使ってパケットを送信する。

※10.60.0.1はUEのアドレス、142.250.199.110はgoogleサーバのアドレス
※192.168.56.172はgNBのGTP Tunelアドレス、192.168.56.161はUPFのGTP Tunelアドレス -
②UPFは①のパケットをGTP Tunelで受け取りGTPカプセル化解除を行う。

-
③UPFはDNに例えばこの場合はgoogleのサーバに向かってUEから送信されたPING(ICMP)を送信する際にNAT変換を行いSource IPをUPFのWANのIPアドレスに変換する。

※183.79.249.124はUPFのWANのアドレス
PING(ICMP)のReply応答のDLパケットは逆にUPFが受け取った後NATテーブルからUEのIPアドレスに戻してGTP Tunelを使ってgNBに送信する事になる。
3. まとめ
一番の大きな理由は払い出したUEのIPアドレスをそのままDN側にルーティング出来ないためと思われる。
基本的にUEのIPアドレスの使いどころが無い様に見えるがUPF内で管理しておりGTP TEIDと同じくUE IPアドレスは重要な識別情報となるため必須のパラメータとなる。
5G Core側のUser Planeパケットの導通確認を行う場合はUPFのLAN側でGTP Tunelのパケットを確認しWAN側でGTPパケットのカプセル化解除、NAT変換後にDNに送信したパケットを確認する事になる。
OSSのfree5gcの場合は具体的にはupfcfg.yamlで設定した下記のアドレスがLAN側となる。デフォルトは127.0.0.8となっているが実際の環境ではgNBとGTP Tunelで通信するIPアドレスを指定する。
gtpu:
ifList:
- addr: 127.0.0.8
WAN側は以下のコマンドで設定した<dn_interface>のNICとなる。
sudo iptables -t nat -A POSTROUTING -o <dn_interface> -j MASQUERADE
DNに抜ける際にSource IPがUEからではなくUPFから送信している様に見える点に注意が必要である。
Discussion