我有一些 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
只是一些其他的想法...
- 允许但用 xhost (和/或网络过滤)阻止
传统的实现方法是让 X 服务器监听 TCP 套接字并使用 xhost 确定允许连接哪些主机。请参阅 xhost(1) 的手册页。(此外,当然,正如先前的建议所指出的那样,IP 地址和端口过滤在这里也会有所帮助。)
- 仅监听本地接口
根据上述 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
希望这有用。
亲切的问候
乔纳森。