让Xorg监听TCP,但只能监听localhost?


12

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

因此,如何使我的Xorg服务器侦听TCP端口6000,但仅侦听来自localhost的连接?

我发现了如何使X.org侦听端口6000上的远程连接?,它说明了如何启用对远程主机的访问,但是我实际上并不需要远程访问(主要出于安全原因)。

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

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

有任何想法吗?

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


所有人都想知道X客户端是什么:实际上,它是Java SSH实现(JSch),试图将X转发到另一台主机。我认为Java不能真正访问Unix域套接字。同样的问题也适用于我的另一个(现在已暂停)项目,在该项目中,我想用纯Java实现X客户端(例如,通过读/写套接字,而不使用某些窗口库)。
圣保罗Ebermann

@ Paulo,Java实际上可以使用Unix域套接字(您可以编写本机库,该库将提供对所需syscall的访问,或者只是查找已编写的库)。但是,最后,您实际上失去了Java的主要优点:高可移植性。因此,如果您真的很需要,可以很轻松地用Java编写X客户端库,它将在PF_LOCAL上运行。还要注意,TCP over环回接口的开销比标准的unix套接字高得多。
ulidtko 2011年

是的,我找到了一些库,但是只要我不知道实际的UDS地址,这对我就没有帮助。这在某处有记录吗?
圣保罗Ebermann

1
@ Paulo,Unix域套接字通常使用文件系统的名称空间。他们的地址是文件名。各个文件节点是“特殊套接字文件”。在我的系统上,我有许多连接/tmp/.X11-unix/X0-这 AF_UNIX地址的示例(netstat -x用来查看您自己的地址)。X11协议规范应确定要连接的确切地址。如果您正在为该协议编写客户端库,那么您确实必须阅读它。
ulidtko 2011年

1
/tmp/.X11-unix/X0也作为套接字(OpenSUSE)存在,我将在家里再次检查(在问题中命名的Ubuntu系统上)。现在我只需要看看如何在6000处将其转发到TCP套接字即可。
PaŭloEbermann 2011年

Answers:


8

似乎可以使用解决方法socat。如果X服务器尚未在TCP上运行,则下面的命令行似乎有效:

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

那我就可以

xlogo -display localhost:0

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


是!!我一直在寻找一种方法,使xserver-allow-tcp=true X已经 -nolisten tcp/etc/X11/xinit/xserverrc不重新启动的情况下启动。仅以我为例,bind=0.0.0.0允许我的外部主机。
Marcos

5

Xorg代码当前没有任何选项可以控制要监听的接口。添加它应该不难,但是简单地配置防火墙以阻止从其他计算机到端口6000的传入连接,应该更容易。


2

只是其他一些想法...

  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协议的实际连接是由SocketINETCreateListener完成的。在文件/usr/include/X11/Xtrans/Xtranssock.c中,该文件将地址设置为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

希望有一定用处。

亲切的问候

乔纳森


目前,我正在使用魔术cookie身份验证,因此即使来自同一主机的连接也将被禁止。xhost会扩大访问范围,而不是缩小访问范围。
圣保罗Ebermann

而且我不认为我会入侵我的X服务器,但是感谢您提出建议。
圣保罗Ebermann

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.