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 支援
OpenGGSN(C 中的經典 2G/3G GGSN):https://osmocom.org/projects/openggsn/wiki/OpenGGSN
ergw(Erlang 中的 GGSN + P-GW):https://github.com/travelping/ergw
使用者空間庫/命令列實用程式¶
有一個名為“libgtpnl”的使用者空間庫,它基於 libmnl,並實現了針對核心 GTP 模組提供的 netlink 介面的 C 語言 API
協議版本¶
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。