Slide 1

Slide 1 text

簡易 DRA の自作を振り返る 2023/02/16 BBSakura Networks 株式会社 金井真澄

Slide 2

Slide 2 text

● 金井真澄 (@masu_mi) ● 2021年2月から中途入社 ● 学生時代は、完全WKB解析(いまはリサージェンス理論らしい) ● 新卒では、ウェブ企業でバックエンド・プラットフォーム開発 ○ BBS入社前、モバイルコアってなんですか ? ○ BBS入社後、モバイルコアって難しい ● 1歳、3歳のこどもが2人、つくば市在住 自己紹介

Slide 3

Slide 3 text

はなすこと ● DRAもどき の周辺知識を整理する ○ ターゲットは入社前のわたし ■ モバイル網はじめまして ■ LTEとか一般用語は知っている ○ OCXな人に「バグ直してあげよう」と思ってもらう ● DRAもどきの紹介 ○ 動機と機能と苦労と未達

Slide 4

Slide 4 text

DRA: Diameter Relay Agent です

Slide 5

Slide 5 text

DRA: Diameter Relay Agent です ● Diameter (RFC6733)は AAA(認証・認可・課金)のフレームワークプロトコル ● 概念的には2層ある ○ ベースプロトコル: コネクション管理に関わる ○ アプリケーション: 実際に動かしたい AAA 色々 ● EPC (LTEのコアシステム) でも使われている ● TCP, SCTP (+ IPSec/TLS) セッション上で動く ● Server/Client モデルで間に Agent を差し込める ● 各ノードは realm, host で識別される ○ realm defined in RFC4282

Slide 6

Slide 6 text

Diameterのメッセージの流れる例 Req. Ans. Ans. Req. Client Server Agent Ans. Req. Diameterコネクション Agent Diameter メッセージ Agent Agent Realm start.local Host cli-0.start.local Realm dst.local Host srv-0.dst.local ● 各ノードは Realm, Host で識別される ○ Realm は RFC4282 に定義されている

Slide 7

Slide 7 text

Diameterのルーティング Req. Req. Client Agent Agent Agent Agent

Slide 8

Slide 8 text

● どの Diameter Peer にメッセージを送るのか? ○ 少なくとも Destination-Realm、Application-ID に依存させられることが求められてる ● Diameter Peer とのコネクション ○ Diameter Peer は事前に設定されている ○ Diameter Peer はDNSを使って動的に解決される Diameter ルーティングどうする? Req. Req. Client Agent Agent Agent Agent

Slide 9

Slide 9 text

● どの Diameter Peer にメッセージを送るのか? ○ 少なくとも Destination-Realm、Application-ID に依存させられることが求められてる ● Diameter Peer とのコネクション ○ Diameter Peer は事前に設定されている ○ Diameter Peer はDNSを使って動的に解決される Diameter ルーティングどうする? Req. Req. Client Agent Agent Agent Agent

Slide 10

Slide 10 text

Diameter Message ref. RFC6733 #3. Diameter Header

Slide 11

Slide 11 text

Diameter Message Diameter Header Diameterはフレームワーク 色々なアプリケーションが動く 値は IANAのAAA 配下のApplication-ID モバイルは 3GPP TS 29.230 も参考に コマンドのパラメータ Destination-Realm もここ

Slide 12

Slide 12 text

● どの Diameter Peer にメッセージを送るのか? ○ 少なくとも Destination-Realm、Application-ID に依存させられることが求められてる ● Diameter Peer とのコネクション ○ Diameter Peer は事前に設定されている ○ Diameter Peer はDNSを使って動的に解決される Diameter ルーティングどうする? Req. Req. Client Agent Agent Agent Agent

Slide 13

Slide 13 text

Diamter コネクションはどの Application ID を流せるか決まっています。 コネクション確立時の Capabilities Exchangeで決まります。 使われる AVP ● Auth-Application-Id ● Acct-Application-Id ● Vendor-Specific-Application-Id なんでも通す relay のアプリケーションIDは 4294967295(0xffffffff) Diameter コネクションの確立 CER Node Node CEA DWR DWA DWR DWA

Slide 14

Slide 14 text

● RFC6733で4つAgentが定められている ○ Relay: ■ ルーティングに関わる AVP しか参照しない ■ アプリケーションレベルの知識をもって判断しない ● (セッションやサーバーの状態を関知しない ) ○ Proxy: アプリケーションレベルの知識を持って判断する ○ Redirect: ルーティングせず宛先を通知してリダイレクトさせる ■ Result-Code: DIAMETER_REDIRECT_INDICATION ○ Translation: ほかAAAプロトコル(RADIUS, …)との変換 ● モバイル網で追加定義されている ○ Diameter Edge Agent ■ DRA + α (イントラネットワークを隠す : realm/host を書き換え) ○ ref. GSMA IR.88: EPS Roaming Guidelines DRA: Diameter Relay Agent です

Slide 15

Slide 15 text

● RFC6733で4つAgentが定められている ○ Relay: ■ ルーティングに関わる AVP しか参照しない ■ アプリケーションレベルの知識をもって判断しない ● (セッションやサーバーの状態を関知しない ) ○ Proxy: アプリケーションレベルの知識を持って判断する ○ Redirect: ルーティングせず宛先を通知してリダイレクトさせる ■ Result-Code: DIAMETER_REDIRECT_INDICATION ○ Translation: ほかAAAプロトコル(RADIUS, …)との変換 ● モバイル網で追加定義されている ○ Diameter Edge Agent ■ DRA + α (イントラネットワークを隠す : realm/host を書き換え) ○ ref. GSMA IR.88: EPS Roaming Guidelines DRA: Diameter Relay Agent です

Slide 16

Slide 16 text

LTE の大雑把な説明 端末 SIM IPサービス (インターネットとか) モバイル網 基地 局

Slide 17

Slide 17 text

LTE の大雑把な説明 UE SIM IPサービス (インターネットとか) eNB SGW PGW MME HSS E-UTRAN EPC Non-Roaming アーキテクチャ for 3GPP: E-UTRANの例 3GPP TS 23.401 + 3GPP TS 36.300 S6a

Slide 18

Slide 18 text

LTE の大雑把な説明 UE SIM IPサービス (インターネットとか) eNB SGW PGW MME HSS E-UTRAN EPC Non-Roaming アーキテクチャ for 3GPP: E-UTRANの例 3GPP TS 23.401 + 3GPP TS 36.300 S6a HOとか端末の移動を管理 ユーザー情報を管理

Slide 19

Slide 19 text

LTE の大雑把な説明 ローミング UE SIM IPサービス (インターネットとか) eNB SGW PGW MME HSS E-UTRAN EPC Roaming アーキテクチャ for 3GPP: E-UTRANの例 3GPP TS 23.401 + 3GPP TS 36.300 S6a HOとか端末の移動を管理 ユーザー情報を管理 HPLMN VPLMN

Slide 20

Slide 20 text

ローミングアーキテクチャ GSMA IR.80 Bi-lateral アーキテクチャ

Slide 21

Slide 21 text

DRAを作ってみた動機 ● ちょっとした検証で必要になった ● 自分で書いて知識を増やしたかった ● すでにGoのライブラリの利用例があった ● 拡張したり実験できるものがあると便利 ○ ルーティング設定を自分で拡張しやすい ○ 負荷分散や再送ポリシーも自由にいじれる ○ wasm runtime 入れてみるとか ○ クラスタ化して設定更新を簡単にしたい ○ ノード間通信を単純化したい

Slide 22

Slide 22 text

どんな機能にしたか ● Realm, Host 用にパターンマッチ ● Peer (対向ノード)のグループ形成 ○ パターンマッチを使う ● Peerグループの用途 ○ ルーティングの送り先 ○ 負荷分散 ○ リトライ ● ルーティングのルール設定 ○ Application-ID ○ Destination/Origin × Realm/Host (簡易のワイルドカード )

Slide 23

Slide 23 text

パターンマッチ いろんな場所の Realm や Host に対して使う。 ● 2種類のワイルドカードをそれぞれ1つまで使える ○ * : ピリオドを含まない ○ **: ピリオドを含む ● 理由 ○ 現実的なケースを扱える ○ 正規表現より軽い

Slide 24

Slide 24 text

設定のイメージ グループの設定(yaml) group: local: { realm: "net.test", host: "**" } # == {realm:"net.test"} vnf: { realm: "remote.test", host: "nf*.remote.test" } others: { realm: "**", host: "**" } # == {}

Slide 25

Slide 25 text

ルーティングの設定(yaml) route: - { dest_realm: "net.local", next: "local" } - { dest_host: "vnf.**.remote.test", next: "vnf" } - { application_id: 10, dest_realm: "**.remote.test", next: "vnf" } - { next: "default" } 設定のイメージ

Slide 26

Slide 26 text

グルーピング + ルーティングの結果 設定のイメージ local vnf others dest-realm == "net.local" LB realm: net.local dest-host == "nf**" OR application_id == 10 && ... any それ以外

Slide 27

Slide 27 text

実装で他にやったこと ● フォワード時のループ検知 ○ Route-Record AVP に自分の Host を追記してループ検知可能にする ○ Route-Record AVP をみてループ検知処理 ● 再送処理 ○ タイムアウト起因では Diameterヘッダ内の T フラグを立てる ○ ロードバランスのためにアルゴリズム設定可にする ○ 再送中に発生するイベント対応 ● コネクション断対応 ○ 再送処理に割り込み ○ 再接続

Slide 28

Slide 28 text

実装で他にやったこと 苦労したこと ● フォワード処理の仕様対応 ○ Route-Record AVP に自分の Host を追記してループ検知可能にする ○ Route-Record AVP をみてループ検知処理 ● 再送処理 ○ タイムアウト起因では Diameterヘッダ内の T フラグを立てる ○ ロードバランスのためにアルゴリズム設定可にする ○ 再送中に発生するイベント対応 ● コネクション断対応 ○ 再送処理に割り込み ○ 再接続

Slide 29

Slide 29 text

定番の問題で面白みは少ない ● ライブラリ都合で Req/Ans 対応付けが自作 ○ Diameter ヘッダ内の Hop-by-Hop-ID を利用する ● イベントの並行制御とリソース解放の組み合わせ ○ リトライは複数 Diameter コネクションが関わる ■ 互いに関連する管理テーブルがある ○ 再送中に起きるイベントが色々ある ■ Answer 受信 ■ タイムアウト、Txタイムアウト ■ 送信元コネクション切断 ■ 送信先コネクション切断 ■ サーバー停止 苦労したところ: 再送制御

Slide 30

Slide 30 text

これからのこと ● 純粋な relay になってないので対応 ○ 辞書にない Application IDやAVP のエラーを無視したい ○ ついでにライブラリのインタフェースを整えて Agent 実装を単純化 ● レートリミット機能実装 ● Peer discovery DNS を使った動的なコネクション確立  ● vrf のようPeer毎にルーティングルールを変更 ● wasm runtime で使えるAPIを拡充する ● 設定をConsul管理にしてクラスタ化 ○ クラスタのノード間通信を単純化 ● 設定の可視化

Slide 31

Slide 31 text

● だいたい1ヶ月半で一周しました ● 検証環境の変更を設定で吸収できたことがあり満足です ● 自作は勉強なるし楽しいですね ● 時間が許せば合間に育てたい おわり