我想通过 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,无需隧道,但不安全
由于您告诉 Xephyr 将其查询发送到 localhost,因此它可能会在 XDMCP 数据包中将显示的网络地址指定为 127.0.0.1。您的 socat->ssh->socat 管道可能不会更改数据包的内容。
(我不确定这种从 UDP 到 TCP 再回到 UDP 的协议转换是否会产生任何有害的副作用,但我假设它会。)
因此,Solaris 上的显示管理器会收到一条消息:“您好,我是位于 127.0.0.1:2 的 X11 显示器。您愿意管理我吗?”。假设在 Solaris 端启用了 XDMCP 支持,并且 XDMCP 协商成功,这将导致显示管理器建立经典的 X11 连接,以便向 TCP 端口 6002 显示图形登录窗口(基于显示编号)。 .. 在 127.0.0.1 上,即在 Solaris 主机上。这显然根本不会到达 Slackware 主机。
(实际上,我希望 Solaris 10 系统默认为“不允许 XDMCP 访问”,但我假设已经完成了必要的配置。)
如果您还设置了从 Solaris 主机的端口 6002 到 Slackware 主机上的本地端口 6002 的 SSH 远程 TCP 转发,您可能会有所收获:
但 Xephyr 是一个现代 X11 服务器,因此默认情况下它甚至可能不侦听传入的 TCP 连接。您可能需要明确告诉它侦听传入的 TCP 连接:
通过这些更改,并假设 Solaris 端已正确设置为允许 XDMCP,您可能有机会实现此功能。或许。不过,我不会屏住呼吸。
一个可能的问题可能是,如果 XDMCP 协议将显示名称中继为
:2
,那么 Solaris 端的显示管理器可能会假设/tmp/.X11-unix/X2
可以使用 Unix 套接字 at 来连接到查询显示服务器。如果Solaris主机有足够现代的sshd
,你也可以转发它......但是使用Unix套接字会导致任何X11应用程序(包括显示管理器)假设显示器实际上是本地显示器,并尝试激活X11 协议扩展依赖于对 X11 服务器的共享内存访问。由于应用程序和服务器位于不同的计算机上,共享内存访问显然是不可能的。然后您的 Xephyr X11 服务器就可以使用 Solaris Motif 窗口管理器所需的任何 X11 字体...
实际上我找到了这个解决方法