什麼是 tproxy 透明代理?
在 Istio 最新的 Ambient 模式中,使用了 tproxy 做透明流量劫持(見此博客 [1] ),這與 Sidecar 模式中基於 IPtables 的流量劫持方式有些許不同,這篇文文章,我們就就一起來探究下什麼是 tproxy。
什麼是代理?
在介紹透明代理之前,我們先了解下什麼是代理。
代理的功能
代理在互聯網中的用途非常廣泛,例如:
-
• 緩存請求:加快網絡響應速度,作用類似於 CDN;
-
• 請求過濾:用於網絡監管,屏蔽或允許對某些主機、網站的訪問;
-
• 請求轉發:用於負載均衡或作爲網絡中繼;
-
• 流量管理:對進出代理的流量進行細粒度的管理,例如按百分比發佈到不同的後端、超時和重試設置、熔斷等;
-
• 安全審計:記錄和限制客戶端請求,用於計費或審計;
代理的分類
代理的分類方式有很多,下圖根據代理的位置將其劃分爲了兩類:
-
• 前向代理(Forward Proxy):運行在客戶端側,代替客戶端想服務端發送請求,例如我們日常使用的各種科學上網代理;
-
• 反向代理(Reverse Proxy):代替服務端接受互聯網或外部請求,然後將請求路由到對應的服務端,例如各種 Web 服務器,在這裏 [2] 你可以看到一個代理列表;
代理可能與客戶端或服務器位於同一節點(或網絡空間,如 Kubernetes 中的 Pod),也可以位於遠端。另外還可以根據代理對客戶端或服務端是否可見(visible)來分爲透明代理和非透明代理,如下圖所示:
-
• 非透明代理:客戶端需要修改目的地址爲代理服務器的地址,並使用代理協議連接代理服務器;
-
• 透明代理:所謂透明代理,即客戶端和服務端感知不到代理的存在,客戶端無需修改目的地址,也不需要採用代理協議連接代理服務器,所有目的地址轉換都是在透明代理中完成的;
使用 tproxy 透明代理
tproxy
是 Linux 的內核模塊(自 Linux 2.2 版本開始引入),用於實現透明代理,其名稱中的字母 t
即代表透明(transparent)。
要使用透明代理首先需要把指定的數據包使用 iptables 攔截到指定的網卡上,然後在該網卡監聽並轉發數據包。
使用 tproxy
實現透明代理的步驟如下:
-
- 首先需要實現流量攔截:在 iptables 的
PREROUTING
鏈的mangle
表中創建一個規則,攔截流量發送給 tproxy 處理,例如iptables -t mangle -A PREROUTING -p tcp -dport 9080 -j TPROXY --on-port 15001 --on-ip 127.0.0.1 --tproxy-mark 0x1/0x1
,給所有目的地爲9080
端口的 TCP 數據包打上標記1
,你還可以指定來源 IP 地址或者 IP 集 [3] ,進一步縮小標記範圍,tproxy 監聽在15001
端口;
- 首先需要實現流量攔截:在 iptables 的
-
2. 創建一個路由規則,將所有帶有標記
1
的數據包查找特定的路由表:例如ip rule add fwmark 1 lookup 100
,讓所有fwmark
爲 1 的數據包查找100
路由表; -
- 將數據包映射到特定的本地地址:例如
ip rule add local 0.0.0.0/0 dev lo table 100
,在100
路由表中將所有 IPv4 地址聲明爲本地,當然這只是一個例子,實際使用時需要請將特定的 IP 的數據包轉發到本地的lo
迴環網卡;
- 將數據包映射到特定的本地地址:例如
-
4. 至此流量已被攔截到 tproxy 的監聽端口
15001
(從 Linux 內核空間進入用戶空間),你可以編寫網絡應用處理數據包或使用 Squid[4] 或 Envoy[5] 等支持 tproxy 的軟件來處理數據包;
透明代理的優點
透明代理具有以下優點:
-
• 透明代理提供更高的帶寬並減少傳輸延遲,從而提高服務質量;
-
• 用戶無需配置網絡和主機;
-
• 企業可以控制對其網絡服務的訪問;
-
• 用戶可以通過透明代理連接互聯網以繞過一些監管;
透明代理的缺點
透明代理有以下缺點:
-
• 如果透明代理配置不當,可能導致用戶無法連接互聯網,而對於不知情的用戶來說,他們無法排查和修改透明代理中的錯誤;
-
• 透明代理的安全性無法得到保證,因爲被攔截的用戶流量可能被透明代理篡改;
-
• 透明代理可能緩存用戶信息,導致用戶隱私泄露的風險;
總結
透明代理作爲代理中的一類重要類型,它的用途廣泛,不論是 xray、clash 等代理軟件,還是 Istio 服務網格中得使用了應用。瞭解它的原理和工作方式有助於我們科學正確的使用代理,而是否使用透明代理取決於你對它的信任和了解程度。
參考
-
• tproxy-example - github.com[6]
-
• Linux transparent proxy support - powerdns.org[7]
-
• Feature: TPROXY version 4.1+ Support - wiki.squid-cache.org[8]
引用鏈接
[1]
見此博客: https://jimmysong.io/blog/ambient-mesh-l4-traffic-path/
[2]
在這裏: https://jimmysong.io/awesome-cloud-native/#proxy
[3]
IP 集: https://ipset.netfilter.org/
[4]
Squid: http://www.squid-cache.org/
[5]
Envoy: https://www.envoyproxy.io/
[6]
tproxy-example - github.com: https://github.com/kristrev/tproxy-example
[7]
Linux transparent proxy support - powerdns.org: https://powerdns.org/tproxydoc/tproxy.md.html
[8]
Feature: TPROXY version 4.1+ Support - wiki.squid-cache.org: https://wiki.squid-cache.org/Features/Tproxy4
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/sm0FvppqKgbZzVUOVBIxwQ