让 Xorg 监听 TCP,但仅限于本地主机?

让 Xorg 监听 TCP,但仅限于本地主机?

我有一些 X 客户端程序需要访问 X 服务器。它只能通过 TCP 访问 X 服务器,而不能通过其他方法(如 unix 域套接字)访问。它将在与服务器相同的主机上运行,​​以简化操作。

那么,如何才能让我的 Xorg 服务器监听 TCP 端口 6000,但只监听来自本地主机的连接?

我发现如何让 X.org 监听端口 6000 上的远程连接?,它解释了如何启用远程主机的访问,但我并不真正想要远程访问(主要出于安全原因)。

我考虑过以某种方式将默认传输转发到 TCP,但我并没有真正找到有关默认传输是什么的信息。

(我在这里使用 kdm 作为我的显示管理器,但我想我可以为任一显示管理器转移解决方案,甚至可以切换显示管理器。)

有任何想法吗?

这是在 11.04 上的混合 Kubuntu-Ubuntu-XUbuntu 安装(最初是 Kubuntu,但我添加了 ubuntu-desktop 和 xubuntu-desktop。启动时它现在显示 Xubuntu 11.04)。我现在正在使用 gnome-classic 桌面,我想,来自 KDM。

答案1

看起来一个解决方法是使用socat如果 X 服务器尚未在 TCP 上运行,则下面的命令行似乎可以工作:

socat -d -d TCP-LISTEN:6000,fork,bind=localhost UNIX-CONNECT:/tmp/.X11-unix/X0

然后我可以做

xlogo -display localhost:0

localhost:1奇怪的是,如果我让它监听 6001,然后指定显示而不是localhost:0- 我得到 ,它似乎不起作用No protocol specified。看来我必须再次阅读 X 协议。(然后通过 JSch 退出Invalid MIT-MAGIC-COOKIE-1 key,但这是另一个问题。)

答案2

Xorg 代码目前没有任何选项可以控制监听哪些接口。添加它应该不难,但配置防火墙以阻止来自其他机器的 6000 端口的传入连接应该更容易。

答案3

只是一些其他的想法...

  1. 允许但用 xhost (和/或网络过滤)阻止

传统的实现方法是让 X 服务器监听 TCP 套接字并使用 xhost 确定允许连接哪些主机。请参阅 xhost(1) 的手册页。(此外,当然,正如先前的建议所指出的那样,IP 地址和端口过滤在这里也会有所帮助。)

  1. 仅监听本地接口

根据上述 alanc 的评论,那里现在没有代码,但差不多!

请记住,(几乎)所有主机都至少有两个接口,即环回接口 lo0(始终为 127.0.0.1)和普通以太网 eth0(或 wlan0 或其他,假设为 192.168.0.128),许多主机还有更多接口。通常,TCP/IP 服务器(即 X 服务器)将允许在其任何接口上向其任何 IP 地址发起传入连接,但大多数软件会允许您根据需要指定 IP 地址。实际工作由 bind(2) 完成,它采用 INADDR_ANY(0.0.0.0)或真实 IP 地址。

Xorg 服务器实现了 -name local-address,但不幸的是,这仅适用于 XDMCP(请参阅文件 os/xdmcp.c,据我所知,该文件正确实现了该功能。)我认为,X 协议的实际连接是由文件 /usr/include/X11/Xtrans/Xtranssock.c 中的 SocketINETCreateListener 完成的,它将地址设置为 INADDR_ANY,然后绑定到该地址而无需进一步处理。需要的是 -from 标志(由 os/xdmcp.c 作为 FromAddress 处理),以便在 Xtranssock.c 中的 SocketCreateListener() 之前以某种方式连接到变量“sockname”。当然,问题是所有传输操作实际上都是以传输中立的方式完成的,因此将信息放入 Xtranssock.c 中有点棘手。

文件路径等可能会有所不同,使用 Ubuntu 10.04 LTS 查看,并注意 Xtranssock.c 中的函数名称由宏 TRANS 更改。 http://cgit.freedesktop.org/xorg/xserver/tree/os/xdmcp.c

希望这有用。

亲切的问候

乔纳森。

相关内容