为什么隧道 Xdmcp+ssh 不起作用?

为什么隧道 Xdmcp+ssh 不起作用?

我想通过 ssh 建立 Xdmcp 协议的隧道。访问 sisure 进行远程登录。一个简单的解决方案可以是 openvpn,但我想先尝试 socat+ssh。服务器是 Solaris 10 客户端是 Slackware 15。

在客户端

ssh -L 6667:localhost:6667 192.168.201.200

在服务器上

socat tcp4-listen:6667,reuseaddr,fork UDP:192.168.201.200:177

在客户端

sudo socat udp4-listen:177,reuseaddr,fork tcp:localhost:6667

现在在客户端上我运行 Xephyr 并......

Xephyr -query localhost -screen 1024x767  :2

在此输入图像描述

直接使用Xdcmp,无需隧道,但不安全

答案1

由于您告诉 Xephyr 将其查询发送到 localhost,因此它可能会将 XDMCP 数据包中显示的网络地址指定为 127.0.0.1。您的 socat->ssh->socat 管道可能不会更改数据包的内容。

(我不确定这种从 UDP 到 TCP 再回到 UDP 的协议转换是否会产生任何有害的副作用,但我假设它会。)

因此,Solaris 上的显示管理器会收到一条消息:“您好,我是位于 127.0.0.1:2 的 X11 显示器。您愿意管理我吗?”。假设在 Solaris 端启用了 XDMCP 支持,并且 XDMCP 协商成功,这将导致显示管理器建立经典的 X11 连接,以便在 127.0.0.1 上的 TCP 端口 6002(基于显示编号)上显示图形登录窗口,即在 Solaris 主机上。这显然根本不会到达 Slackware 主机。

(实际上,我希望 Solaris 10 系统默认为“不允许 XDMCP 访问”,但我假设已经完成了必要的配置。)

如果您还设置了从 Solaris 主机的端口 6002 到 Slackware 主机上的本地端口 6002 的 SSH 远程 TCP 转发,您可能会有所收获:

 ssh -L 6667:localhost:6667 -R 6002:localhost:6002 192.168.201.200

但 Xephyr 是一个现代 X11 服务器,因此默认情况下它甚至可能不侦听传入的 TCP 连接。您可能需要明确告诉它侦听传入的 TCP 连接:

Xephyr -listen tcp -query localhost -screen 1024x767 :2

通过这些更改,并假设 Solaris 端已正确设置为允许 XDMCP,您可能有机会实现此功能。或许。不过,我不会屏住呼吸。

一个可能的问题可能是,如果 XDMCP 协议将显示名称中继为:2,那么 Solaris 端的显示管理器可能会假设/tmp/.X11-unix/X2可以使用 Unix 套接字 at 来连接到查询显示服务器。如果Solaris主机有足够现代的sshd,你也可以转发它......但是使用Unix套接字会导致任何X11应用程序(包括显示管理器)假设显示器实际上是本地显示器,并尝试激活X11 协议扩展依赖于对 X11 服务器的共享内存访问。由于应用程序和服务器位于不同的计算机上,共享内存访问显然是不可能的。

然后您的 Xephyr X11 服务器就可以使用 Solaris Motif 窗口管理器所需的任何 X11 字体...

答案2

实际上我找到了这个解决方法

ssh -X -C 192.168.201.200 -t /usr/X11/bin/amd64/Xephyr :1 -query localhost

相关内容