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"…