Linux 核心 GTP 隧道模組

文件作者

Harald Welte <laforge@gnumonks.org> 和 Andreas Schultz <aschultz@tpip.net>

在 'drivers/net/gtp.c' 中,您可以找到 GTP 隧道端點的核心級實現。

什麼是 GTP

GTP 是通用隧道協議,它是一種 3GPP 協議,用於在移動站(電話、調變解調器)和外部分組資料網路(如網際網路)之間的互連之間隧道傳輸使用者 IP 負載。

因此,當您從手機啟動“資料連線”時,手機將使用控制平面來發出訊號,以便在該外部資料網路和手機之間建立此類隧道。因此,隧道端點駐留在手機和閘道器中。所有中間節點僅傳輸封裝的資料包。

電話本身不實現 GTP,而是使用一些其他依賴於技術的協議棧來傳輸使用者 IP 負載,例如 LLC/SNDCP/RLC/MAC。

在蜂窩運營商基礎設施中的某個網路元素(GPRS/EGPRS 或經典 UMTS 情況下的 SGSN,3G femtocell 情況下的 hNodeB,4G/LTE 情況下的 eNodeB),蜂窩協議棧被轉換為 GTP *而不中斷端到端隧道*。因此,中間節點僅執行一些特定的中繼功能。

在某個時刻,GTP 資料包最終到達所謂的 GGSN (GSM/UMTS) 或 P-GW (LTE),它們終止隧道,解封裝資料包並將其轉發到外部分組資料網路。這可以是公共網際網路,但也可以是任何私有 IP 網路(甚至理論上是一些非 IP 網路,如 X.25)。

您可以在 3GPP TS 29.060 協議規範中找到協議規範,可從 3GPP 網站公開獲取:http://www.3gpp.org/DynaReport/29060.htm

為了方便起見,下面提供了 v13.6.0 的直接 PDF 連結:http://www.etsi.org/deliver/etsi_ts/129000_129099/129060/13.06.00_60/ts_129060v130600p.pdf

Linux GTP 隧道模組

該模組實現隧道端點的功能,即能夠解封裝手機發起的上行鏈路中的隧道 IP 資料包,並封裝從外部分組網路接收到的原始 IP 資料包,以下行鏈路傳送到手機。

它*僅*實現所謂的“使用者平面”,攜帶使用者 IP 負載,稱為 GTP-U。它不實現“控制平面”,控制平面是一種用於建立和拆除 GTP 隧道的信令協議 (GTP-C)。

因此,為了有一個正常工作的 GGSN/P-GW 設定,您將需要一個使用者空間程式來實現 GTP-C 協議,然後使用核心中 GTP-U 模組提供的 netlink 介面來配置核心模組。

這種分離的架構遵循其他協議的隧道模組,例如 PPPoE 或 L2TP,您還可以在其中執行使用者空間守護程式來處理隧道建立、身份驗證等,並且只有資料平面在核心內部加速。

不要被術語混淆:GTP 使用者平面透過核心加速路徑,而 GTP 控制平面進入使用者空間 :)

該模組的官方主頁位於 https://osmocom.org/projects/linux-kernel-gtp-u/wiki

支援 Linux 核心 GTP-U 的使用者空間程式

在撰寫本文時,至少有兩個自由軟體實現實現了 GTP-C,並且可以使用 netlink 介面來使用 Linux 核心 GTP-U 支援

使用者空間庫/命令列實用程式

有一個名為“libgtpnl”的使用者空間庫,它基於 libmnl,並實現了針對核心 GTP 模組提供的 netlink 介面的 C 語言 API

http://git.osmocom.org/libgtpnl/

協議版本

GTP-U 有兩個不同的版本:v0 [GSM TS 09.60] 和 v1 [3GPP TS 29.281]。兩者都在核心 GTP 模組中實現。版本 0 是一個遺留版本,並且在最近的 3GPP 規範中已棄用。

GTP-U 使用 UDP 傳輸 PDU。 接收 UDP 埠對於 GTPv1-U 為 2151,對於 GTPv0-U 為 3386。

GTP-C 有三個版本:v0、v1 和 v2。 由於核心不實現 GTP-C,因此我們不必擔心這一點。 使用者空間中的控制平面實現負責實現這一點。

IPv6

3GPP 規範表明 IPv4 或 IPv6 可以用於內部(使用者)IP 層,也可以用於外部(傳輸)層。

不幸的是,核心模組目前既不支援使用者 IP 負載的 IPv6,也不支援外部 IP 層的 IPv6。 非常歡迎修復此問題的補丁或其他貢獻!

郵件列表

如果您對如何從您自己的軟體中使用核心 GTP 模組有疑問,或者想為程式碼做出貢獻,請使用 osmocom-net-grps 郵件列表進行相關討論。 可以透過 osmocom-net-gprs@lists.osmocom.org 訪問該列表,用於管理您的訂閱的 mailman 介面位於 https://lists.osmocom.org/mailman/listinfo/osmocom-net-gprs

問題跟蹤器

Osmocom 專案在 https://osmocom.org/projects/linux-kernel-gtp-u/issues 維護核心 GTP-U 模組的問題跟蹤器

歷史/致謝

該模組最初由 Harald Welte 於 2012 年建立,但從未完成。 Pablo 進來完成了 Harald 留下的爛攤子。 但由於缺乏使用者興趣,它從未合併。

2015 年,Andreas Schultz 挺身而出,修復了更多錯誤,使用新功能對其進行了擴充套件,並最終推動我們所有人使其成為主線,並在 4.7.0 中合併。

架構細節

本地 GTP-U 實體和隧道識別

GTP-U 使用 UDP 傳輸 PDU。 接收 UDP 埠對於 GTPv1-U 為 2152,對於 GTPv0-U 為 3386。

每個 IP 地址只有一個 GTP-U 實體(因此,只有一個 SGSN/GGSN/S-GW/PDN-GW 例項)。 隧道端點識別符號 (TEID) 對於每個 GTP-U 實體都是唯一的。

特定隧道僅由目標實體定義。 由於目標埠是恆定的,因此只有目標 IP 和 TEID 定義一個隧道。 源 IP 和埠對於隧道沒有意義。

因此

  • 傳送時,遠端實體由遠端 IP 和隧道端點 ID 定義。 源 IP 和埠沒有意義,可以隨時更改。

  • 接收時,本地實體由本地目標 IP 和隧道端點 ID 定義。 源 IP 和埠沒有意義,可以隨時更改。

[3GPP TS 29.281] 第 4.3.0 節定義瞭如下內容

The TEID in the GTP-U header is used to de-multiplex traffic
incoming from remote tunnel endpoints so that it is delivered to the
User plane entities in a way that allows multiplexing of different
users, different packet protocols and different QoS levels.
Therefore no two remote GTP-U endpoints shall send traffic to a
GTP-U protocol entity using the same TEID value except
for data forwarding as part of mobility procedures.

上面的定義僅定義了兩個遠端 GTP-U 端點*不應*傳送到同一 TEID,它*不*禁止或排除這種情況。 事實上,提到的移動程式使得 GTP-U 實體必須接受來自多個或未知對等方的 TEID 的流量。

因此,接收端專門基於 TEID 而不是基於源 IP 來識別隧道!

APN 與網路裝置

GTP-U 驅動程式為每個 Gi/SGi 介面建立一個 Linux 網路裝置。

[3GPP TS 29.281] 呼叫 Gi/SGi 參考點為一個介面。 這可能會給人留下 GGSN/P-GW 只能有一個此類介面的印象。

正確的是,Gi/SGi 參考點定義了基於 GTP-U 隧道和基於 IP 的網路的 +3GPP 分組域 (PDN) 之間的互連。

在任何 3GPP 文件中都沒有規定限制 GGSN/P-GW 實現的 Gi/SGi 介面的數量。

[3GPP TS 29.061] 第 11.3 節明確指出,特定 Gi/SGi 介面的選擇是透過接入點名稱 (APN) 進行的

2. each private network manages its own addressing. In general this
   will result in different private networks having overlapping
   address ranges. A logically separate connection (e.g. an IP in IP
   tunnel or layer 2 virtual circuit) is used between the GGSN/P-GW
   and each private network.

   In this case the IP address alone is not necessarily unique.  The
   pair of values, Access Point Name (APN) and IPv4 address and/or
   IPv6 prefixes, is unique.

為了支援重疊地址範圍用例,每個 APN 都對映到一個單獨的 Gi/SGi 介面(網路裝置)。

注意

接入點名稱純粹是一個控制平面 (GTP-C) 概念。 在 GTP-U 級別,只有隧道端點識別符號存在於 GTP-U 資料包中,並且網路裝置是已知的

因此,對於給定的 UE,IP 到 PDN 網路的對映為

  • 網路裝置 + MS IP -> 對等 IP + 對等 TEID,

以及從 PDN 到 IP 網路

  • 本地 GTP-U IP + TEID -> 網路裝置

此外,在將接收到的 T-PDU 注入網路裝置之前,會根據 PDP 上下文中記錄的 IP 檢查 MS IP。