11.4 华丽的图形接口: VNC 服务器
就如同刚刚上头讲到的,使用 xdmcp 可能会启动多个不同的埠口,导致防火墙设定上面比较困扰些。那有没有简单一点的图形接口连接方式? 其实还有很多啦,在这里我们先来讲一个比较简单的,那就是 VNC (Virtual Network Computing) 这玩意儿啦!(注6)
11.4.1 预设的 VNC 服务器:使用 twm window manager
VNC server 会在服务器端启动一个监听用户要求的端口,一般端口号码在 5901 ~ 5910 之间。当客户端启动 X server 联机到 5901 之后, VNC server 再将一堆预先设定好的 X client 透过这个联机传递到客户端上,最终就能够在客户端显示服务器的图形接口了。
不过需要注意的是,预设的 VNC server 都是独立提供给『单一』一个客户端来联机的,因此当你要使用 VNC 时, 再联机到服务器去启动 VNC server 即可。所以,一般来说, VNC server 都是使用手动启动的,然后使用完毕后, 再将 VNC server 关闭即可。整个作法其实很简单喔!你可以这样作:
[root@www ~]# vncserver [:号码] [-geometry 分辨率] [options]
[root@www ~]# vncserver [-kill :号码]
选项与参数:
:号码 :就是将 VNC server 开在哪个埠口,如果是 :1 则代表 VNC 5901 埠口
-geometry :就是分辨率,例如 1024x768 或 800x600 之类的
options :其他 X 相关的选项,例如 -query localhost 之类的
-kill :将已经启动的 VNC 埠口删除!依据身份控制喔。
[root@www ~]# yum install tigervnc-server
# 这个是必须要的服务器软件,注意软件的名称喔!与之前的版本不同!
# 将 VNC server 启动在 5903 埠口
[root@www ~]# vncserver :3
You will require a password to access your desktops.
Password: <==输入 VNC 的联机密码,这是建立 VNC 时所需要的
Verify: <==再输入一次相同的密码
xauth: creating new authority file /root/.Xauthority
New 'www.centos.vbird:3 (root)' desktop is www.centos.vbird:3
Creating default startup script /root/.vnc/xstartup
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/www.centos.vbird:3.log
[root@www ~]# netstat -tulnp | grep X
tcp 0 0 0.0.0.0:5903 0.0.0.0:* LISTEN 4361/Xvnc
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 1755/Xorg
tcp 0 0 0.0.0.0:6003 0.0.0.0:* LISTEN 4361/Xvnc
tcp 0 0 :::6000 :::* LISTEN 1755/Xorg
tcp 0 0 :::6003 :::* LISTEN 4361/Xvnc
# 已经启动所需要的埠口啰!
在上述的指令操作中,你要知道的几个项目是:
- 密码至少需要六个字符
- 依据使用 vncserver 的身份,将刚刚建立的密码放置于该账号家目录下。例如上述的身份是使用 root 身份,因此密码文件会放在 /root/.vnc/passwd 这个档案中但是若该档案已经存在,则不会出现建立密码的画面。
- 当客户端联机成功后,服务器将会传送 /root/.vnc/startx 内的 X client 给客户端喔!
那如果你想要修改 VNC 密码呢?很简单,那就使用 vncpasswd 吧!
[root@www ~]# ls -l /root/.vnc/passwd
-rw-------. 1 root root 8 Jul 26 15:08 /root/.vnc/passwd
[root@www ~]# vncpasswd
Password: <==就是这里开始输入新的密码啊!
Verify:
[root@www ~]# ls -l /root/.vnc/passwd
-rw-------. 1 root root 8 Jul 26 15:15 /root/.vnc/passwd
# 看吧!时间有更新喔!这个档案的内容更动过啰!
接下来开始放行 5903 这个埠口的联机防火墙规则吧!因为预计可能会开放 11 个 VNC 的埠口,所以干脆一口气开放 11 个埠口吧!
[root@www ~]# vim /usr/local/virus/iptables/iptables.allow
iptables -A INPUT -i $EXTIF -s 192.168.100.0/24 -p tcp --dport 5900:5910 -j ACCEPT
[root@www ~]# /usr/local/virus/iptables/iptables.rule
[root@www ~]# iptables-save
-A INPUT -s 192.168.100.0/24 -i eth0 -p tcp -m tcp --dport 5900:5910 -j ACCEPT
# 要看得到上面这行才 OK 喔!
11.4.2 VNC 的客户端联机软件
与 xdmcp 很类似啦, VNC 客户端在 Linux 系统上面有默认的软件,但是在 Windows 系统上面则必须要额外安装其他软件。 我们先来谈谈 Linux 的 VNC 用户软件吧!
- Linux 客户端程序: vncviewer
用在 Linux 客户端的 VNC 程序,那就是 vncviewer。只是,这个软件默认没有安装,所以你得要使用 yum 安装完毕后再来联机吧!不过一样要注意,服务器端的防火墙一样要设定妥当喔!然后开始在客户端的图形接口上执行底下数据:
[root@clientlinux ~]# yum install tigervnc
[root@clientlinux ~]# vncviewer 192.168.10.254:3
# 这个指令请一定一定要在图形接口上面执行才行喔!很重要!别忘了!
图 11.4-1、在 Linux 客户端执行 vncviewer 程序示意
在上图当中输入刚刚的 root 的 VNC 联机密码,请注意喔,是 VNC 的联机密码,而不是 root 的登入密码! 这两者是差很多的!也由于启动 VNC 的身份是 root ,因此这里才使用 root 的 VNC 联机密码。 所以,很多时刻,我们都是建议使用一般身份来启动 VNC server 的啦!当你输入正确的 VNC 联机密码后, 会出现如下的图示啰:
图 11.4-2、在 Linux 客户端执行 vncviewer 程序示意
与以前的 VNC server 较大的差异,在 CentOS 6.x 当中,tigervnc-server 这套软件会主动的依据服务器端的图形接口登入方式给予正确的图形显示接口,而不是以前那样给予一个丑丑的 twm 而已! 这样我们就可以减少还得要修改一些有的没有的配置文件了!真是棒! 联机成功后,请在客户端关闭这个 vncviewer 的联机,因为接下来我们要准备由 Windows 联机到服务器的 port 5903 啰!
- Windows 客户端程序: realvnc
Windows 底下可用的 vnc client 软件不少,但是鸟哥比较熟悉的是 realvnc 这家公司出品的 GNU 的自由软件! 你可以在底下的连结下载到最简单的版本,是不用钱的自由软件版本喔!(鸟哥仅下载不用安装的 viewer 版本而已!)
直接执行 vnc-viewer 软件,然后就会看到如下的画面:
图 11.4-3、Windows Real VNC 客户端联机示意图
如上图所示,你在 server 字段填上 IP:port 的数据即可,然后按下『OK』吧!
图 11.4-4、Windows Real VNC 客户端联机示意图
由于 VNC server 需要的仅是联机的 VNC 密码而已,因此上图中的 Username 可以不用填,老实说,这个程序它也不会让你填~ 呵呵!填完按下『OK』即可!接下来就会出现正确的画面啰!
图 11.4-5、Windows Real VNC 客户端联机示意图
11.4.3 VNC 搭配本机的 Xdmcp 画面
如果因为某些特殊因素,你得要使用 VNC 来搭配 xdmcp 的输出时,那就直接在服务器透过底下的指令来处理即可! 要注意喔,你必须要已经启动了 xdmcp 了喔!而且,我们底下使用 student 的身份来启动这个 VNC 吧!
# 1\. 要确定 xdmcp 已经启动了才可以:
[root@www ~]# netstat -tlunp | grep 177
udp 0 0 0.0.0.0:177 0.0.0.0:* 1734/gdm-binary
# OK 的!确实有启动的啦!如果没有看到 177 的话,回到 [11.3](#xdmcp) 去处理处理
# 2\. 切换成 student,并且启动 VNC server 在 :5
[root@www ~]# su - student
[student@www ~]$ vncserver :5 -query localhost
You will require a password to access your desktops.
Password:
Verify:
xauth: creating new authority file /home/student/.Xauthority
New 'www.centos.vbird:5 (student)' desktop is www.centos.vbird:5
Creating default startup script /home/student/.vnc/xstartup
Starting applications specified in /home/student/.vnc/xstartup
Log file is /home/student/.vnc/www.centos.vbird:5.log
# 3\. 取消 xstartup 的启动内容
[student@www ~]$ vim /home/student/.vnc/xstartup
....(前面省略)....
#xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#twm &
# 将这个档案的内容,全部都加上 # 批注掉
# 4\. 重新启动 vncserver 喔!
[student@www ~]$ vncserver -kill :5
[student@www ~]$ vncserver :5 -query localhost
接下来请使用 root 的身份加入 5905 的端口防火墙规则,然后自行使用 Linux 的 vncviewer 或 Windows 的 RealVNC 来联机,你就会发现如下的画面:
图 11.4-6、透过 VNC 通道取得 xdmcp 画面
我们这只 VNC 的联机程序是 student 身份,但是我们却可以透过 xdmcp 的登入功能来登入 root 身份喔! 因为在服务器上面的 Xvnc 程序是 student 拥有,这样会比较好啦!了解呼?
11.4.4 开机就启动 VNC server 的方法
请注意,你不要将 vncserver 的指令写入在 /etc/rc.d/rc.local 中,否则可能会产生 localhost 无法登入的问题。 那该如何让你的 VNC server 在一开机就启动而不须要登入执行指令呢?可以的,但是你得要修改一下配置文件。 我们底下使用 student 的身份启动 VNC server,而启动的方式为使用 xdmcp 登入画面,启动的埠口就定在 5901 好了。 那你应该这样作:
[root@www ~]# vim /etc/sysconfig/vncservers
VNCSERVERS="1:student"
VNCSERVERARGS[1]="-query localhost"
# 上述两行的 1 指的就是那个埠口 5901 喔!要注意!
[root@www ~]# /etc/init.d/vncserver restart
[root@www ~]# chkconfig vncserver on
有够好简单吧!这样每次开机就搞定你的 VNC server 啰!
11.4.5 同步的 VNC :可以透过图示同步教学
另外,有些朋友一定会觉得奇怪,那就是,为甚么我的 VNC 服务器的 server / client 端画面并不是同步的呢? 这是因为 Linux 本身提供多个 VNC server ,她们是各自独立的,所以当然就不会与 tty7 的画面同步了。 但是如果你想要与 Linux 的 tty7 同步的话,可以利用 VNC 释出的给 X Server 使用的模块来加以设定即可。
那使用这个模块有甚么好处啊?就是可以让两个图形接口在 server/client 都是一样的, 所以,如果你想要教你的朋友你是如何设定的,那就可以透过这个机制来处理,你的朋友在远程就能够知道你一步一步进行的过程! 这样很不赖吧!详细的作法可以参考底下的连结:
我们也来实做一下吧 (在 CentOS 6.x 当中并没有 xorg.conf 这个配置文件喔!所以,如果你要使用这些数据的话, 恐怕得要自行使用 X -configure 去建置 xorg.conf 后,再挪到 /etc/X11/ 去,然后才改的到设定!):
[root@www ~]# yum install tigervnc-server-module
[root@www ~]# vim /etc/X11/xorg.conf
Section "Screen"
Identifier "Screen0"
Device "Videocard0"
DefaultDepth 24
# VBird
Option "passwordFile" "/home/student/.vnc/passwd"
SubSection "Display"
Viewport 0 0
Depth 24
EndSubSection
EndSection
# VBird
Section "Module"
Load "vnc"
EndSection
# 假设你的 vnc 密码档案放置在 /home/student/.vnc/passwd 里头,
# 这个时候就得要将密码文件内容写到 Screen 这个 section 当中了
[root@www ~]# init 3 ; init 5
[root@www ~]# netstat -tlunp | grep X
tcp 0 0 0.0.0.0:5900 0.0.0.0:* LISTEN 7445/Xorg
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 7445/Xorg
tcp 0 0 :::6000 :::* LISTEN 7445/Xorg
# 注意看喔!这几个 port 启动的 PID 都一样喔!所以会启动一个 port 5900 啰!
之后你可以使用『 vncviewer 192.168.100.254 』来联机即可,不需要加上 :0 之类的埠口。 然后你可以看一下客户端与服务器端的图形接口,你会发现到两者移动鼠标时,两者的画面会同步运作喔! 非常有趣呢!只不过这个动作还是只允许一条 VNC 联机,不能让所有客户端都连到 port 5900 ,这真是太可惜了!