2008年4月5日星期六

xrdp 远程桌面协议服务器

其实 Linux 实现的仅仅是 RDP 本身,而像 Windows 使用的远程桌面一个重要特点就是可以尽量避免传输 bitmap 信息,由于传输的是高级画图信息,这使得传输的数据量有明显减少,从而在一定的网络负荷下仍然可用。而 xrdp 一般仅仅是做一个 bitmap cache,并通过压缩减少网络流量,除非使用 libxup.so 模块(由于使用 X11rdp,传输的信息也是高层绘图信息)。

xrdp 说穿了是一个 proxy,它通过几个 lib*.so 与底层交互,如可以用服务器端的 VNC server,或者将 RDP 请求传送到一台 Windows 上进行共享。我们来看一看一个典型的 xrdp 服务是如何提供给用户的:一个 rdp client 连接到 xrdp,首先通过交换公钥建立可靠的数据通道,client 要求对应的屏幕大小和色彩深度,server 返回一个简易的模块选择界面,并要求 client 登录认证。client 完成了登录信息以后,server 首先依靠 sesman 进行认证,然后依照其选择的模块激活对应的功能,如 libvnc.so,建立连接。

client 可以选择的模块是由 server 在 /etc/xrdp/xrdp.ini 里面定义的。该文件有一个 global 的 section,主要是定义一些控制服务器的参数,如是否打开 bitmap cache,是否是用压缩等。后面一般是根据连接类型产生的 section,例如
[xrdp1]
name=sesman-Xvnc
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=-1
是一段 debian 中默认的配置,[] 里面是第一个 xrdp 模块,对应的 name 是显示给 client 看见的,调用的是 libvnc.so 和 VNC 服务器交互,username 使用 ask 表明向用户询问,也可以固定下来,ip 和 port 就是连接的 VNC 服务器地址。port=-1 表明使用默认的可用地址。又比如
[xrdp5]
name=rdp-any
lib=librdp.so
ip=ask
port=ask3389
是使用上级 RDP server,比如可以通过该连接访问处于 xrdp 后的 Windows 主机。另外还有一种
[xrdp6]
name=sesman-X11rdp
lib=libxup.so
username=ask
password=ask
ip=127.0.0.1
port=-1
是利用 X11rdp,理论上应该是最快捷的了,可惜现在的 debian 并没有实现 X11rdp 的模块,有人已经在呼唤了。

关于 sesman,作用很简单认证,启动合适的 X,如 Xvnc 或者是 X11rdp,或者是连接到远程 Windows 上。控制其行为的是 /etc/xrdp/sesman.ini 文件,分为四个 section,global、logging、security、sessions。global 中重要的是设置了用户 WM,
[Globals]
ListenAddress=127.0.0.1
ListenPort=3350
EnableUserWindowManager=1
UserWindowManager=/etc/xrdp/startwm.sh
DefaultWindowManager=/etc/xrdp/startwm.sh
这使得我们可以依据自己的喜好定义自己的脚本。其实 startwm.sh 本身就是指向 /etc/X11/Xsession 的。

没有评论: