一尘不染

X11转发在docker中运行的GUI应用

docker

首先,我已经阅读了关于SO的类似问题的答案,但是没有一个起作用。

情况:

  • 带有GUI的应用程序在Arch Linux下的docker容器(CentOS 7.1)中运行。(机器A)
  • 机器A连接了一个监视器。
  • 我想通过Arch Linux客户端计算机上的X11转发访问此GUI。(机器B)

什么有效:

  • GUI在机器A上本地工作(/tmp/.X11-unix安装在Docker容器中)。
  • X11转发任何在docker外部运行的应用程序(X11转发已设置并正确运行以用于非docker使用)。
  • 我什至可以在远程登录时切换用户,将.Xauthority文件复制到其他用户,并且X11转发也可以。

一些设置信息:

  • Docker网络是“桥接”的。
  • 容器可以到达主机(防火墙已打开)。
  • DISPLAY 变量在容器中设置(由于sshd正在侦听的TCP端口6010,因此设置为host-ip-addr:10.0)。
  • 到达X转发端口(6010)的数据包正从容器(tcpdump选中)到达主机。

什么不起作用:

  • Docker应用程序的X11转发
  • 错误:

X11 connection rejected because of wrong authentication.

xterm: Xt error: Can't open display: host-ip-addr:10.0

我尝试过的事情:

  • ssh -Y在计算机B上使用选项启动客户端ssh
  • "X11ForwardTrusted yes"ssh_config放在机器B上
  • xhost + (因此允许任何客户端连接)在计算机B上
  • Host *ssh_config放在机器B上
  • X11UseLocalhost no在计算机A上放入sshd_config(以允许非本地客户端)
  • xauth add使用机器A上的登录用户从容器中添加X auth令牌
  • 只需将.Xauthority文件从工作用户复制到容器中
  • 使shure .Xauthority文件具有正确的权限和所有者

我如何才能禁用所有X安全功能并使其正常工作?

甚至更好:我如何使其与安全性一起使用?

至少有一种方法可以进行广泛的调试,以查看问题出在哪里?


阅读 1082

收藏
2020-06-17

共1个答案

一尘不染

好的,这是东西:

1)登录到远程机器

2)检查设置了哪个显示 echo $DISPLAY

3)运行 xauth list

4)复制对应于您的行 DISPLAY

5)输入您的Docker容器

6)xauth add <the line you copied>*

7)将DISPLAY设置为 export DISPLAY=<ip-to-host>:<no-of-display>

*到目前为止还好吧?

这并不是什么新鲜事……不过,这里有一个转折:xauth list登录用户打印的行看起来像这样(在我的情况下):

<hostname-of-machine>/unix:<no-of-display> MIT-MAGIC-COOKIE-1 <some number here>

因为我使用桥接docker设置,所以X转发端口不在本地侦听,因为sshd在容器中未运行。将上面的行更改为:

<ip-of-host>:<no-of-display> MIT-MAGIC-COOKIE-1 <some number here>

本质上:移除/unix零件。

<ip-of-host> 是sshd运行所在的IP地址。

如上设置DISPLAY变量。

因此错误是DISPLAY环境变量中的名称与xauth list/
.Xauthority文件中的条目不是“相同”的,因此客户端可能无法正确进行身份验证。

我切换回不受信任的X11转发设置。

X11UseLocalhost no但是,sshd_config文件中的设置很重要,因为传入的连接将来自“不同”的计算机(docker容器)。

2020-06-17