网络命名空间、ssh、X11

网络命名空间、ssh、X11

ssh -Y ...从一台机器(=客户端)连接(通过)到另一台机器(=服务器,实际上在我的局域网中,但它不相关);然后我在服务器上启动一个新的网络命名空间(简称 NNS),我启动一个 xterm(从默认命名空间),它在我的客户端上完美显示,最后,从 xterm 中,我加入非默认 NNS ,

ip netns exec NNSName bash

我可以检查我是否在新的 NNS 中,

ip netns identify $$

我可以在新的 NNS 中运行复杂的程序,例如 OpenVPN。

问题就在这里:我想xeyes从新的 NNS 中启动一个图形应用程序(即使只是暂时),但我不能,我总是被告知:Unable to open DISPLAY=...

诚然,我只尝试了显而易见的方法:

DISPLAY=:0.0
DISPLAY=:10.0
DISPLAY=localhost:10.0
DISPLAY=localhost:20.0
DISPLAY=ClientName:10.0
DISPLAY=ClientIPAddress:10.0

始终xhost +在客户端上,用于纯粹的调试目的。

我没有任何问题:

  1. 通过从客户端到服务器的连接,在服务器上ssh -Y ....运行并在客户端上显示;xeyes

  2. 在服务器上启动一个新的 NNS,并启动 NNS 内的图形应用程序以显示在服务器上(IE,在这种情况下忘记客户端)。

当我将这两个东西放在一起(ssh 和命名空间)时,我无法在服务器的新 NNS 中运行的客户端应用程序上显示。

看来标准 TCP 端口 6010 属于与默认 NNS 的 ssh 会话,而新 NNS 应该拥有自己的端口。我当然可以在新的 NNS 中启动 ssh 服务器并直接从客户端连接到服务器的新 NNS,但我想知道:有没有更简单的方法可以做到这一点,IE在客户端的 X11 服务器上显示在服务器的新 NNS 中运行的图形应用程序?

答案1

我遇到了类似的情况,这是我的解决方法。

一些背景:我必须跨越命名空间内的多个 selenium Firefox 实例,以便将它们与不同的 IP 地址绑定。但如你所知,我遇到了错误:

Error: Can't open display: localhost:10.0

我没有像 Marius 建议的那样使用 unix 套接字,而是将 SSHD X11Forwarding 绑定到 * 而不是 localhost(在配置中添加“X11UseLocalhost no”)并使用 socat 重定向简单的 TCP 连接。

注意这样做的安全后果!!!

在 sshd 上进行此更改后,当您从此登录时,显示将自动更改:

 DISPLAY=localhost:10.0

对于类似的事情:

 DISPLAY=10.0.0.1:10.0

之后我只需要重定向:

ip netns exec my-NNS socat tcp-listen:6010,reuseaddr,fork tcp:192.168.5.130:6010 &

然后你应该能够使用 xeyes、firefox、x-whatever-you-want...:

ip netns exec my-NNS xeyes &

瞧!

答案2

事实上,似乎没有任何标准的做法。

有一个最明显的解决方案:从网络名称空间内启动服务器ssh,然后使用常用选项从任何远程计算机连接到它,

ssh -Y [email protected]

那么任何图形程序都可以在远程机器的X11服务器上启动。同一主题的各种变体,例如vnc,也可以。

或者,可以使用常用的工具:iptablesnetcatsocat。这是方法socat:技巧是,虽然localhost服务器上的空间和新的网络命名空间上的空间已经分开,但它们的 X11 unix 套接字却没有分开。事实上,您可以从网络命名空间立即打开图形应用程序,这些应用程序将显示在其父计算机的 X 服务器上。因此,通过强制网络命名空间写入其父机器上的新 unix 套接字,我们可以将发送到新套接字的数据重定向到客户X 服务器通过服务器计算机上通常的 ssh X11 转发,甚至无需连接新的网络命名空间,从而提供了更简单的解决方案。

操作如下:在新的网络命名空间中,

export DISPLAY=:1

这将写入一个新的 Unix 套接字,/tmp/.X11-unix/X1该套接字尚未连接到任何东西。在远程客户端中,使用命令

socat exec:'ssh me@remoteserver socat unix-l\:/tmp/.X11-unix/X1 -' unix:/tmp/.X11-unix/X0

(注意 的转义:)。上面的命令将unix/:1服务器上套接字的输入发送到unix/:0客户端上的套接字。您可能必须放松本地(= 在客户端上)控制并检查(= = ) 套接字xhost的所有权。这比以前的方法要简单得多:不需要在新的网络命名空间上设置 ssh 服务器,甚至不需要获取 IP 地址。它还绕过了 X11 授权的所有问题,例如使用允许某些远程用户或使用 MIT magic cookies (我什至不确定这是否可以完成)。unix/:1:1/tmp/.X11-unix/X1xhostsocat

还有其他方法可以做到这一点(例如,通过抑制-nolisten tcp客户端 X 服务器上的选项,然后使用 socat 将:1unix 套接字转发到客户端的端口 TCP6000),但是,即使忽略它们会导致严重的安全问题,它们也是如此任何想象都不是标准的。

相关内容