📑

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