服务器架设篇 - CentOS 6.x

第十一章、远程连接服务器 SSH / XDMCP / VNC / RDP

关于文本接口登录主机的 ssh 及图形接口登录主机的 VNC/XDMCP 等方法

最近更新时间: 2011/11/24

维护网络服务器最简单的方式不是跑去实体服务器前面登录,而是通过远程连接服务器连接功能来登录主机, 然后再来进行其他有的没的维护就是了。Linux 主机几乎都会提供 sshd 这个连接服务,而且这个服务还是主动进行数据加密的! 消息在网络上面跑安全多了。同时我们还能通过 rsync 这个指令以 sshd 信道来达成异地数据备援的功能哩!相当不赖。 如果想要利用图形接口登录,那么缺省的 Xdmcp 配合 VNC 就能够使用图形接口在网络的另一端登录你的服务器! 如果你习惯使用 Windows 的远程桌面,那么 XRDP 也不要放过啰!

11.1 远程连接服务器

远程连接服务器对我们来说,可是一项很有用的工具啊!他可以让我们更方便的管理主机。 不过,方便归方便,但开放全世界都可以尝试登录你的主机并不个好主意,因为可能会有安全性的问题呐! 所以本章才要特别强调一下这个玩意儿啊!

11.1.1 什么是远程连接服务器

首先,我们来了解一下,什么是『远程连接服务器』? 这个东西的功能为何?我想,你应该已经听过,一部开放到互联网上的服务器,基本上,它可以不需要屏幕、键盘、 鼠标等等的周边配备,只要有基本的主板、CPU、RAM、硬盘再加上一块好一点的网络卡,并且连上互联网, 那这部主机就能够提供你有需要的网络服务了。但如果你需要重新设置这部主机,该如何登录主机取得类似 bash 的接口来操纵与进行修改呢?那就得要通过连接服务器的服务了。

是的!你猜对啦,远程连接服务器在提供你由远程通过文本或图形接口的方式来登录系统, 让你在远程的工作机前面登录 Linux 主机以取得可操控主机之接口 (shell),而登录后的操作感觉上就像坐在系统前面一样! 所以啦,你当然不需要远程网络服务器的键盘、鼠标、屏幕等等。你只要工作机可以正常连接到远程主机即可啊。

以鸟哥个人为例,目前鸟哥管理十几部的 Unix-Like 主机,这些主机都不放在同一个地方,分布在南台湾各处! 那么当有新的软件的漏洞被发布,或者是需要进行一些额外的设置的时候,是否鸟哥本人一定要到现场吗?当然不需要, 只要通过网络连接到该主机上面,就可以进行任何工作了!真的就好像在主机前面工作一般的轻松愉快! ^_^!这就是远程连接服务器啦!

Tips 鸟哥 很多人会说,我用 FTP 也要输入帐号密码来登录啊?那与这个章节谈到的登录有何不同?最大的不同在于取得的 shell 能进行的工作啦!用 ssh/telnet/VNC 等方式取得的文本或图形 shell 能够进行很多系统管理的任务,与单纯的 FTP 能进行的工作当然不同!
    连接服务器的功能作用之一:分享 Unix Like 主机的运算能力

当你的工作需要使用到 Linux 强大的编程语言编译功能时,那么你一定需要 Linux 对吧!而且最好是运算速度快一点的主机, 这个时候你可以将你研究室最快的那一部主机开放出来,设置一下远程连接服务器,让你的学生啦,或者是研究室的同仁啦, 可以通过这部机器帮他们进行研究的工作,这个时候,你的主机就可以让多人进行分享 Linux 运算的功能啦!

举例来说,鸟哥与昆山还有长荣大学的老师、同学们组建了一组服务器等级的集群架构电脑 (PC cluster), 目前我们在该电脑上面跑 MM5 、Models3 等大气与空气品质模式,要在这样的架构底下跑数值模式的原因, 主要就是考量运算能力。那会使用到该组电脑的有好多人,难道大家都在挤在一部屏幕前面工作?当然不需要啦! 这时候就是远程连接服务器的服务范围啰!

但是否每一部连到 Internet 上面的主机都应该要开放远程连接的功能呢?其实并不尽然, 还是需要针对你的主机来进行规划的,我们底下分服务器与工作站来说明:

    服务器类型 (Server) :有限度的开放连接

在一般对互联网开放服务的服务器中,由于开放的服务可能会有较为重要的信息,而远程连接程序连进主机之后, 可以进行的工作又太多了(几乎就像在主机前面工作一般!),因此服务器的远程连接程序通常仅针对少部分系统维护者开放而已! 除非必要,否则 Server 类型的主机还真的不建议开放连接的服务呢!

以鸟哥为例,我的主机提供了我们研究室使用 Mail 与 Internet 上面的 WWW 服务,如果还主动提供远程连接的话, 那么万一不小心被入侵,那可就伤脑筋了!因此,鸟哥仅开放『很小部分的网域』让系统管理员连进来, 其他来源的 IP 一律抵挡!不许使用远程连接的功能呢!

    工作站类型 (Workstation) :只对内网开放

所谓的工作站就是不提供互联网服务的主机,仅提供大量的运算能力给用户。 既然不提供互联网的服务,那你还开连接服务器干嘛?不是啦!像前面鸟哥提到的 PC cluster 大量运算的整组电脑, 也可以称之为工作站,因为它没有提供常见的网络服务嘛!不过必须要提供给用户登录的权限,这样大家才用的到运算功能啊! 此时你就得要针对内部,或者是特定的某些来源开放他们使用你的工作站啰!

11.1.2 有哪些可供登录的类型?

那么目前远程连接服务器的主要类型有哪些?如果以登录的连接接口来分类,基本上有文本接口与图形接口两种:

  • 文本接口明码: telnet, rsh 等为主,目前非常少用;
  • 文本接口密码: ssh 为主,已经取代上述的 telnet, rsh 等明码方式;
  • 图形接口: Xdmcp, VNC, RDP 等较为常见

在文本接口登录的连接服务器,主要有以『明码』发送数据的 telnet 服务器,及以加密技术进行数据加密再发送的 SSH 服务器!虽然 telnet 可以支持的用户端软件比较多,不过由于它是使用明码来发送数据,你的数据很容易遭到有心人士的截取! 所以近来我们都呼吁大家多使用 SSH 这一种连接方式

至于图形接口的连接服务器,比较简单的有 Xdmcp (X Display Manager Control Protocol),架设 Xdmcp 很简单, 不过用户端的软件比较少。另外一款目前很常见的图形连接服务器,就是 VNC (Virtual Network Computing), 通过 VNC server/client 软件来进行连接。如果你想要使用类似 Windows 的远程桌面连接,该功能使用的是 RDP (Remote Desktop Protocol),那你可得要架设 RDP 服务器才行。

Tips 鸟哥 图形接口最大的优点是『图形』啊!不过,因为是通过图形来发送,传输的数据量相当的大, 所以速度与安全性都有待考量。因此,我们仅建议你将图形接口的远程登录服务器开放在内部网域 (LAN) 就好了!
    数据发送的明码与密码

什么是『明码』与『加密』的数据封包发送模式呢?为什么 telnet 使用明码就比较不安全?所谓的明码就是: 『当我们的数据封包在网络上传输时,该数据封包的内容为数据的原始格式』, 也就是说,你使用 telnet 登录远程主机时,不是得要输入帐号密码吗?那你的帐号密码是以原本的数据格式传输, 所以如果被类似 tcpdump 之类的监听软件截取数据, 那你的帐密就有可能被窃取啦!

所以啦,万一你的数据封包里面含有信用卡数据、密码、身份确认等重要信息时,是否很危险呐? 因此,目前我们通常都希望使用可以将这些在网络上面跑的数据加密的技术,以增加数据在 Internet 上面发送的安全性啊!

Tips 鸟哥 说 ssh 比较安全,其实是通过 ssh 信道传输消息时,该消息在网络上面比较安全,因为数据是加密过的,即使被窃取, 对方可能也不会知道数据内容为何,因此信息比较安全。但这不代表 ssh 这个通信协定就比较安全喔!两者意义不同!


由于明码传输的 telnet, rsh 等连接服务器已经被 ssh 取代,并且在一些实际应用上已经很少看到 telnet 与 rsh 了, 因此本章在文本接口上着重于介绍 ssh 的应用,包括以 rsync 借由 ssh 信道来进行异地备援的任务等等。至于图形接口则会介绍 Xdmcp, VNC 与 RDP 喔!因为很多任务作站用户需要显示他们在工作站实作后的图形呈现,因此这部分也是很重要的呢!

11.2 文本接口连接服务器: SSH 服务器

由于先前的远程连接服务器大多是明码,而且协定也有些资安问题,因此后来就有 SSH 这个协定来取代上述这些咚咚。 那么 SSH 是什么呢?它有什么特异功能?简单的来说,SSH 是 Secure SHell protocol 的简写 (安全的壳程序协定),它可以通过数据封包加密技术,将等待传输的封包加密后再传输到网络上, 因此,数据消息当然就比较安全啰!这个 SSH 可以用来取代较不安全的 finger, R Shell (rcp, rlogin, rsh 等), talk 及 telnet 等连接模式。底下我们将先简介一下 SSH 的连接模式,来说明为什么 SSH 的数据消息会比较安全呢!

特别注意:这个 SSH 协定,在缺省的状态中,本身就提供两个服务器功能:

  1. 一个就是类似 telnet 的远程连接使用 shell 的服务器,亦即是俗称的 ssh ;
  2. 另一个就是类似 FTP 服务的 sftp-server !提供更安全的 FTP 服务。

11.2.1 连接加密技术简介

什么是『数据加密』呢?简单的说,就是将人们看的懂得原始电子数据,经过一些运算,让这些数据变成没有意义的乱码 (至少对人类来说),然后再让这个咚咚在网络上面传输,而当用户想要查阅这个数据时,再通过解密运算, 将这些咚咚反推出原始的电子数据。由于这些数据已经被重新处理过,所以,即使数据在互联网上被 cracker 监听而窃取,他们也不容易就推算得出来原始数据内容的。

Tips 鸟哥 鸟哥常常说,加密机制有点像是两个人之间的火星语对话啦!如果你跟你的朋友约定好使用你们制订的某种特别语言, 这个语言只对你们两个有意义。那么当你们两人讲话时,在旁边的人听到的只是一堆没有意义的声音,因为他们听不懂啊! 即使路人将你的声音录下来,只要他不知道你们的特殊用语,那他就不可能了解你们对话的内容啰。

加解密运算的机制与技术非常多,我们这里不去讨论复杂的理论问题,只谈对我们比较有关的一些加解密概念而已。 目前常见的网络封包加密技术通常是借由所谓的『非对称密钥系统』来处理的。 主要是通过两把不一样的公钥与私钥 (Public and Private Key) 来进行加密与解密的过程。由于这两把钥匙是提供加解密的功用, 所以在同一个方向的连接中,这两把钥匙当然是需要成对的!它的功用分别如下:

  • 公钥 (public key):提供给远程主机进行数据加密的行为,也就是说,大家都能取得你的公钥来将数据加密的意思;
  • 私钥 (private key):远程主机使用你的公钥加密的数据,在本地端就能够使用私钥来进行解密。由于私钥是这么的重要, 因此私钥是不能够外流的!只能保护在自己的主机上。

由于每部主机都应该有自己的密钥 (公钥与私钥),且公钥用来加密而私钥用来解密, 其中私钥不可外流。但因为网络连接是双向的,所以,每个人应该都要有对方的『公钥』才对!那如果以 ssh 这个通信协定来说,在用户端与服务器端的相对连接方向上,应该有如下的加密动作:

公钥与私钥在进行数据传输时的角色示意图
图 11.2-1、公钥与私钥在进行数据传输时的角色示意图

如上图所示,我们如果站在用户端的角度来看,那么,首先你必须要取得服务器端的公钥,然后将自己的公钥发送给服务器端, 最终在用户端上面的密钥会是『服务器的公钥加上用户端我自己的私钥』来组成的。

Tips 鸟哥 数据加密的技术真的相当的多,也各有其优缺点,有的运算速度快,但是不够安全;有的够安全,但是加密/解密的速度较慢~ 目前在 SSH 使用上,主要是利用 RSA/DSA/Diffie-Hellman 等机制喔!

目前 SSH 的协定版本有两种,分别是 version 1 与 version 2 ,其中 V2 由于加上了连接检测的机制, 可以避免连接期间被插入恶意的攻击码,因此比 V1 还要更加的安全。所以啰,请尽量使用 V2 版本即可,不要使用 V1 啰。 无论是哪种版本,都还是需要公私钥加密系统的,那么这些公钥与私钥是如何产生的呢?底下我们就来谈一谈啦!

    SSH 的连接行为简介

我们可以将 ssh 服务器端与用户端的连接步骤示意为下图,至于步骤说明如后:

ssh 服务器端与用户端的连接步骤示意图
图 11.2-2、ssh 服务器端与用户端的连接步骤示意图
  1. 服务器创建公钥档: 每一次启动 sshd 服务时,该服务会主动去找 /etc/ssh/ssh_host* 的文件,若系统刚刚安装完成时,由于没有这些公钥文件,因此 sshd 会主动去计算出这些需要的公钥文件,同时也会计算出服务器自己需要的私钥档;

  2. 用户端主动连接要求: 若用户端想要连接到 ssh 服务器,则需要使用适当的用户端程序来连接,包括 ssh, pietty 等用户端程序;

  3. 服务器发送公钥档给用户端: 接收到用户端的要求后,服务器便将第一个步骤取得的公钥文件发送给用户端使用 (此时应是明码发送,反正公钥本来就是给大家使用的!);

  4. 用户端记录/比对服务器的公钥数据及随机计算自己的公私钥: 若用户端第一次连接到此服务器,则会将服务器的公钥数据记录到用户端的用户家目录内的 ~/.ssh/known_hosts 。若是已经记录过该服务器的公钥数据,则用户端会去比对此次接收到的与之前的记录是否有差异。若接受此公钥数据, 则开始计算用户端自己的公私钥数据;

  5. 回传用户端的公钥数据到服务器端: 用户将自己的公钥发送给服务器。此时服务器:『具有服务器的私钥与用户端的公钥』,而用户端则是: 『具有服务器的公钥以及用户端自己的私钥』,你会看到,在此次连接的服务器与用户端的密钥系统 (公钥+私钥) 并不一样,所以才称为非对称式密钥系统喔。

  6. 开始双向加解密: (1)服务器到用户端:服务器发送数据时,拿用户的公钥加密后送出。用户端接收后,用自己的私钥解密; (2)用户端到服务器:用户端发送数据时,拿服务器的公钥加密后送出。服务器接收后,用服务器的私钥解密。

在上述的第 4 步骤中,用户端的密钥是随机运算产生于本次连接当中的,所以你这次的连接与下次的连接的密钥可能就会不一样啦! 此外在用户端的用户家目录下的 ~/.ssh/known_hosts 会记录曾经连接过的主机的 public key ,用以确认我们是连接上正确的那部服务器。

例题:
如何产生新的服务器端的 ssh 公钥与服务器自己使用的成对私钥? (注:注意,本例题不要在已经正常运作的网络服务器上面,因为可能会造成其他用户端的困扰!)
答:
由于服务器提供的公钥与自己的私钥都放置于 /etc/ssh/ssh_host* ,因此你可以这样做:
[root@www ~]# rm /etc/ssh/ssh_host*  <==删除密钥档
[root@www ~]# /etc/init.d/sshd restart
正在停止 sshd:                         [  确定  ]
正在产生 SSH1 RSA 主机密钥:            [  确定  ] <==底下三个步骤重新产生密钥!
正在产生 SSH2 RSA 主机密钥:            [  确定  ]
正在产生 SSH2 DSA 主机密钥:            [  确定  ]
正在启动 sshd:                         [  确定  ]
[root@www ~]# date; ll /etc/ssh/ssh_host*
Mon Jul 25 11:36:12 CST 2011
-rw-------. 1 root root  668 Jul 25 11:35 /etc/ssh/ssh_host_dsa_key
-rw-r--r--. 1 root root  590 Jul 25 11:35 /etc/ssh/ssh_host_dsa_key.pub
-rw-------. 1 root root  963 Jul 25 11:35 /etc/ssh/ssh_host_key
-rw-r--r--. 1 root root  627 Jul 25 11:35 /etc/ssh/ssh_host_key.pub
-rw-------. 1 root root 1675 Jul 25 11:35 /etc/ssh/ssh_host_rsa_key
-rw-r--r--. 1 root root  382 Jul 25 11:35 /etc/ssh/ssh_host_rsa_key.pub
# 看一下上面输出的日期与文件的创建时间,刚刚创建的新公钥、私钥系统!

11.2.2 启动 SSH 服务

事实上,在我们使用的 Linux 系统当中,缺省就已经含有 SSH 的所有需要的软件了!这包含了可以产生密码等协定的 OpenSSL 软件与 OpenSSH 软件 (注1),所以呢,要启动 SSH 真的是太简单了!就直接给他启动就是了!此外,在目前的 Linux Distributions 当中,都是缺省启动 SSH 的,所以一点都不麻烦,因为不用去设置,他就已经启动了! 哇!真是爽快~无论如何,我们还是得说一说这个启动的方式吧!直接启动就是以 SSH daemon ,简称为 sshd 来启动的,所以,手动可以这样启动:

[root@www ~]# /etc/init.d/sshd restart
[root@www ~]# netstat -tlnp | grep ssh
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address  Foreign Address  State   PID/Program name
tcp        0      0 :::22          :::*             LISTEN  1539/sshd

需要注意的是,SSH 不但提供了 shell 给我们使用,亦即是 ssh protocol 的主要目的,同时亦提供了一个较为安全的 FTP server ,亦即是 ssh-ftp server 给我们当成是 FTP 来使用!所以,这个 sshd 可以同时提供 shell 与 ftp 喔!而且都是架构在 port 22 上面的呢!所以,底下我们就来提一提,那么怎么样由 Client 端连接上 Server 端呢?同时,如何以 FTP 的服务来连接上 Server 并且使用 FTP 的功能呢?

11.2.3 ssh 用户端连接程序 - Linux 用户

如果你的用户端是 Linux 的话,那么恭喜你了,缺省的情况下,你的系统已经有底下的所有指令,可以不必安装额外的软件喔! 底下就来介绍一下这些指令吧!


  • ssh :直接登录远程主机的指令

SSH 在 client 端使用的是 ssh 这个指令,这个指令可以指定连接的版本 (version1, version2), 还可以指定非正规的 ssh port (正规 ssh port 为 22)。不过,一般的用法可以使用底下的方式:

[root@www ~]# ssh [-f] [-o 参数项目] [-p 非正规端口口] [帐号@]IP [指令]
选项与参数:
-f :需要配合后面的 [指令] ,不登录远程主机直接发送一个指令过去而已;
-o 参数项目:主要的参数项目有:
	ConnectTimeout=秒数 :连接等待的秒数,减少等待的时间
	StrictHostKeyChecking=[yes|no|ask]:缺省是 ask,若要让 public key
           主动加入 known_hosts ,则可以设置为 no 即可。
-p :如果你的 sshd 服务启动在非正规的端口口 (22),需使用此项目;
[指令] :不登录远程主机,直接发送指令过去。但与 -f 意义不太相同。

# 1. 直接连接登录到对方主机的方法 (以登录本机为例):
[root@www ~]# ssh 127.0.0.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
RSA key fingerprint is eb:12:07:84:b9:3b:3f:e4:ad:ba:f1:85:41:fc:18:3b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '127.0.0.1' (RSA) to the list of known hosts.
root@127.0.0.1's password: <==在这里输入 root 的密码即可!
Last login: Mon Jul 25 11:36:06 2011 from 192.168.1.101
[root@www ~]# exit  <==离开这次的 ssh 连接
# 由于 ssh 后面没有加上帐号,因此缺省使用当前的帐号来登录远程服务器

一般使用 ssh 登录远程主机,都会填写『 ssh 帐号@主机IP 』的格式, 意思是说,使用该主机的某帐号登录的意思。但是很多朋友都不喜欢写帐号,亦即使用『 ssh 主机IP 』的格式。 如同上面的范例情况。要注意喔,如果不写帐号的话,那么会以本地端电脑的帐号来尝试登录远程。 也就是说,如果近端与远程具有相同的帐号,那么不写帐号也没有关系,如上表中的范例。但是,为了以后习惯着想, 还是一开始就使用类似 email 的方式来登录远程主机,这样的行为习惯比较好啦!

上面出现的消息中,开头 RSA 的那行后面接的就是远程服务器的公钥指纹码,如果确定该指纹码没有问题,那么你就得要输入 yes 来将该指纹码写入服务器公钥记录档 (~/.ssh/known_hosts),以方便未来比对该服务器的正确性之用。 注意是要写 yes 喔,单纯输入 Y 或 y 是不会被接受的~此外, 由于该主机的公钥已经被记录,因此未来重复使用 ssh 登录此主机时,就不会出现这个指纹码提示了。

# 2. 使用 student 帐号登录本机
[root@www ~]# ssh student@127.0.0.1
student@127.0.0.1's password:
[student@www ~]$ exit
# 由于加入帐号,因此切换身份成为 student 了!另外,因为 127.0.0.1 曾登录过,
# 所以就不会再出现提示你要增加主机公钥的消息啰!

# 3. 登录对方主机运行过指令后立刻离开的方式:
[root@www ~]# ssh student@127.0.0.1 find / &> ~/find1.log
student@localhost's password:
# 此时你会发现怎么画面卡住了?这是因为上头的指令会造成,你已经登录远程主机,
# 但是运行的指令尚未跑完,因此你会在等待当中。那如何指定系统自己跑?

# 4. 与上题相同,但是让对方主机自己跑该指令,你立刻回到近端主机继续工作:
[root@www ~]# ssh -f student@127.0.0.1 find / &> ~/find1.log
# 此时你会立刻注销 127.0.0.1 ,但 find 指令会自己在远程服务器跑喔!

上述的范例当中,第 4 个范例最有用!如果你想要让远程主机进行关机的指令,如果不加上 -f 的参数, 那你会等待对方主机关机完毕再将你踢出连接,这比较不合理。因此,加上 -f 就很重要~因为你会指定远程主机自己跑关机, 而不需要在空空等待。例如:『ssh -f root@some_IP shutdown -h now 』之类的指令啰。

# 5. 删除掉 known_hosts 后,重新使用 root 连接到本机,且自动加上公钥记录
[root@www ~]# rm ~/.ssh/known_hosts
[root@www ~]# ssh -o StrictHostKeyChecking=no root@localhost
Warning: Permanently added 'localhost' (RSA) to the list of known hosts.
root@localhost's password:
# 如上所示,不会问你 yes 或 no 啦!直接会写入 ~/.ssh/known_hosts 当中!

鸟哥上课常常使用 ssh 连接到同学的电脑去看他有没有出错,有时候会写 script 来进行答案侦测。 此时如果每台电脑都在主动加上公钥档记录,都得要输入『 yes 』,会累死!那么加上这个 StrictHostKeyChecking=no 就很有帮助啦!他会不询问自动加入主机的公钥到文件中,对于一般用户帮助不大,对于程序脚本来说, 这玩意儿可就很不错用了!

    服务器公钥记录档: ~/.ssh/known_hosts

当你登录远程服务器时,本机会主动的用接收到的服务器的 public key 去比对 ~/.ssh/known_hosts 有无相关的公钥, 然后进行底下的动作:

  • 若接收的公钥尚未记录,则询问用户是否记录。若要记录 (范例中回答 yes 的那个步骤) 则写入 ~/.ssh/known_hosts 且继续登录的后续工作;若不记录 (回答 no) 则不写入该文件,并且离开登录工作;

  • 若接收到的公钥已有记录,则比对记录是否相同,若相同则继续登录动作;若不相同,则出现警告信息, 且离开登录的动作。这是用户端的自我保护功能,避免你的服务器是被别人伪装的。

虽然说服务器的 ssh 通常可能会改变,问题是,如果是测试用的主机,因此常常在重新安装,那么服务器的公钥肯定经常不同, 果真如此的话,你就无法继续登录了!那怎办?让我们来仿真一下这个行为吧!让你比较有印象啦!

例题:
仿真服务器重新安装后,假设服务器使用相同的 IP ,造成相同 IP 的服务器公钥不同,产生的问题与解决之道为何?
答:
利用前一小节讲过的方式,删除原有的系统公钥,重新启动 ssh 让你的公钥更新:
rm  /etc/ssh/ssh_host*
/etc/init.d/sshd restart
然后重新使用底下的方式来进行连接的动作:
[root@www ~]# ssh root@localhost
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @ <==就告诉你可能有问题
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
a7:2e:58:51:9f:1b:02:64:56:ea:cb:9c:92:5e:79:f9.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:1 <==冒号后面接的数字就是有问题数据行号
RSA host key for localhost has changed and you have requested strict checking.
Host key verification failed.
上述的表格出现的错误消息中,特殊字体的地方在告诉你:/root/.ssh/known_hosts 的第 1 行,里面的公钥与这次接收到的结果不同, 很可能被攻击了!那怎办?没关系啦!请你使用 vim 到 /root/.ssh/known_hosts ,并将第 1 行(冒号 : 后面接的数字就是了) 删除,之后再重新 ssh 过,那系统又会重新问你要不要加上公钥啰!就这么简单! ^_^

    仿真 FTP 的文件传输方式: sftp

ssh 是登录远程服务器进行工作,那如果你只是想要从远程服务器下载或上传文件呢? 那就不是使用 ssh 啦,而必须要使用 sftp 或 scp。这两个指令也都是使用 ssh 的信道 (port 22),只是仿真成 FTP 与拷贝的动作而已。我们先谈谈 sftp ,这个指令的用法与 ssh 很相似,只是 ssh 是用在登录而 sftp 在上传/下载文件而已。

[root@www ~]# sftp student@localhost
Connecting to localhost...
student@localhost's password: <== 这里请输入密码啊!
sftp> exit  <== 这里就是在等待你输入 ftp 相关指令的地方了!

进入到 sftp 之后,那就跟在一般 FTP 模式下的操作方法没有两样了!底下我们就来谈一谈, sftp 这个接口下的使用指令吧!

针对远方服务器主机 (Server) 之行为
变换目录到 /etc/test 或其他目录 cd /etc/test
cd PATH
列出目前所在目录下的文件名 ls
dir
创建目录 mkdir directory
删除目录 rmdir directory
显示目前所在的目录 pwd
更改文件或目录群组 chgrp groupname PATH
更改文件或目录拥有者 chown username PATH
更改文件或目录的权限 chmod 644 PATH
其中,644 与权限有关!回去看基础篇!
创建链接档 ln oldname newname
删除文件或目录 rm PATH
更改文件或目录名称 rename oldname newname
离开远程主机 exit (or) bye (or) quit
针对本机 (Client) 之行为(都加上 l, L 的小写 )
变换目录到本机的 PATH 当中 lcd PATH
列出目前本机所在目录下的文件名 lls
在本机创建目录 lmkdir
显示目前所在的本机目录 lpwd
针对数据上传/下载的行为
将文件由本机上传到远程主机 put [本机目录或文件] [远程]
put [本机目录或文件]
如果是这种格式,则文件会放置到目前远程主机的目录下!
将文件由远程主机下载回来 get [远程主机目录或文件] [本机]
get [远程主机目录或文件]
若是这种格式,则文件会放置在目前本机所在的目录当中!可以使用通配符,例如:
get *
get *.rpm
亦是可以的格式!

就整体而言, sftp 在 Linux 底下,如果不考虑图形接口,那么他已经可以取代 FTP 了呢!因为所有的功能都已经涵盖啦!因此,在不考虑到图形接口的 FTP 软件时,可以直接关掉 FTP 的服务,而改以 sftp-server 来提供 FTP 的服务吧! ^_^

例题:
假设 localhost 为远程服务器,且服务器上有 student 这个用户。你想要 (1)将本机的 /etc/hosts 上传到 student 家目录,并 (2)将 student 的 .bashrc 拷贝到本机的 /tmp 底下,该如何通过 sftp 达成?
答:
[root@www ~]# sftp student@localhost
sftp> lls /etc/hosts   <==先看看本机有没有这个文件
/etc/hosts
sftp> put /etc/hosts   <==有的话,那就上传吧!
Uploading /etc/hosts to /home/student/hosts
/etc/hosts                        100%  243     0.2KB/s   00:00
sftp> ls               <==有没有上传成功?看远程目录下的文件名
hosts
sftp> ls -a            <==那有没有隐藏档呢?
.               ..              .bash_history   .bash_logout
.bash_profile   .bashrc         .mozilla        hosts
sftt> lcd /tmp         <==切换本机目录到 /tmp 
sftp> lpwd             <==只是进行确认而已!
Local working directory: /tmp
sftp> get .bashrc      <==没问题就下载吧!
Fetching /home/student/.bashrc to .bashrc
/home/student/.bashrc             100%  124     0.1KB/s   00:00
sftp> lls -a           <==看本地端文件文件名
.        .font-unix   keyring-rNd7qX  .X11-unix
..       .gdm_socket  lost+found      scim-panel-socket:0-root
.bashrc  .ICE-unix    mapping-root    .X0-lock
sftp> exit             <==离开吧!

如果你不喜欢使用文本接口进行 FTP 的传输,那么还可以通过图形接口来连接到 sftp-server 哩! 你可以利用二十一章 FTP 服务器提到的 Filezilla 来进行连接的啦! 如此一来,与服务器之间的文件传输就方便多了吧!

    文件异地直接拷贝: scp

通常使用 sftp 是因为可能不知道服务器上面有什么文件名的文件存在,如果已经知道服务器上的文件文件名了, 那么最简单的文件传输则是通过 scp 这个指令喔!最简单的 scp 用法如下:

[root@www ~]# scp [-pr] [-l 速率] file  [帐号@]主机:目录名 <==上传
[root@www ~]# scp [-pr] [-l 速率] [帐号@]主机:file  目录名 <==下载
选项与参数:
-p :保留原本文件的权限数据;
-r :拷贝来源为目录时,可以拷贝整个目录 (含子目录)
-l :可以限制传输的速度,单位为 Kbits/s ,例如 [-l 800] 代表传输速限 100Kbytes/s

# 1. 将本机的 /etc/hosts* 全部拷贝到 127.0.0.1 上面的 student 家目录内
[root@www ~]# scp /etc/hosts* student@127.0.0.1:~
student@127.0.0.1's password: <==输入 student 密码
hosts                        100%  207         0.2KB/s   00:00
hosts.allow                  100%  161         0.2KB/s   00:00
hosts.deny                   100%  347         0.3KB/s   00:00
# 文件名显示                   进度  容量(bytes) 传输速度  剩余时间
# 你可以仔细看,出现的消息有五个字段,意义如上所示。

# 2. 将 127.0.0.1 这部远程主机的 /etc/bashrc 拷贝到本机的 /tmp 底下
[root@www ~]# scp student@127.0.0.1:/etc/bashrc /tmp

其实上传或下载的重点是那个冒号 (:) 啰!连接在冒号后面的就是远程主机的文件。 因此,如果冒号在前,代表的就是从远程主机下载下来,如果冒号在后,则代表本机数据上传啦! 而如果想要拷贝目录的话,那么可以加上 -r 的选项!

例题:
假设本机有个文件文件名为 /root/dd_10mb_file ,这个文件有 10 MB 这么大。假设你想要上传到 127.0.0.1 的 /tmp 底下去, 而且你在 127.0.0.1 上面有 root 这个帐号的使用权。但由于带宽很宝贵,因此你只想要花费 100Kbyes/s 的传输量给此一动作, 那该如何下达指令?
答:
由于缺省不存在这个文件,因此我们得先使用 dd 来创建一个大文件:
dd if=/dev/zero of=/root/dd_10mb_file bs=1M count=10
创建妥当之后,由于是上传数据,观察 -l 的选项中,那个速率用的是 bit ,转成容量的 bytes 需要乘上 8 倍,因此指令就要这样下达:
scp -l 800 /root/dd_10mb_file root@127.0.0.1:/tmp

11.2.4 ssh 用户端连接程序 - Windows 用户

与 Linux 不同的是,缺省的 Windows 并没有 ssh 的用户端程序,因此所有的程序都得要下载其他第三方软件才行。 常见的软件主要有 pietty, psftp 及 filezilla 等。底下就让我们来谈谈这几个软件吧。

    直接连接的 pietty

在 Linux 底下想要连接 SSH 服务器,可以直接利用 ssh 这个指令,在 Windows 操作系统底下就得要使用 pietty 或 putty 这两个玩意儿,这两者的下载点请参考 (注2):

在 putty 的官方网站上有很多的软件可以使用的,包括 putty/pscp/psftp 等等。他们分别对应了 ssh/scp/sftp 这三个指令就是了。而鸟哥爱用的 pietty 则是台湾的林弘德先生根据 putty 所改版而成的。由于 pietty 除了完整的兼容于 putty 之外,还提供了菜单与较为完整的文本编码,实在很好用呢,所以底下鸟哥就以 pietty 来作为介绍啰。在你下载 pietty 完成后,双击该文件,就会出现如下的画面啰:

pietty 的启动画面示意图
图 11.2-3、pietty 的启动画面示意图

在上图中箭头为 1 的地方请填写相关的主机名称或者是 IP ,箭头 2 当然务必选择 SSH 那一项,至于箭头 3 的地方,鸟哥比较喜欢菜单出现的样式,因为可以直接修改一些 pietty 的环境设置值,所以鸟哥是选择菜单啦! 若没有问题,按下『连接』后,就会出现如下等待登录与输入帐/密数据的画面:

pietty 的登录与使用画面示意图
图 11.2-4、pietty 的登录与使用画面示意图

这个图标会让你以为是在主机前面工作吧!而且上头还有菜单可以随时调整类似字形、字体、字符编码等等的重要环境参数。 尤其是字符编码的问题,有时候你会发现打开文件时,竟然画面当中会有乱码而不是正常的中文显示, 那就是编码的问题。要解决这个问题时,你必须要牢记下面的三个跟语系编码有关的数据要相同才行:

  • 文本文件本身在存盘时所挑选的语系;
  • Linux 程序 (如 bash 软件) 本身所使用的语系 (可用 LANG 变量调整);
  • pietty 所使用的语系。

我们知道 Linux 本身的编码可以通过 LANG 这个变量来调整,那该如何调整 pietty 的中文编码呢?你可以通过图 11.2-4 菜单列当中的『选项』来处理,如下所示:

调整 pietty 的语系编码方式 (与中文较相关)
图 11.2-5、调整 pietty 的语系编码方式 (与中文较相关)

在『选项』的『字符编码』里面可以挑选 big5 (cp950) 或者是 unicode (utf8) 的中文编码,让它符合你的 Linux 与文件所保存的数据格式,那中文本就 OK 的啦! ^_^!如果想要作更细部的设置时,可以选择图 11.2-5 上头最底下的那个『详细设置』项目, 就会出现如下图标。其中更为重要的是『键盘右侧的数字键想要生效』时, 可以按照下图的指示来启动数字键的功能:

pietty 软件环境详细设置,与键盘右侧数字键相关者
图 11.2-6、pietty 软件环境详细设置,与键盘右侧数字键相关者

将上图中箭头 2 所指的那个项目勾选起来且按下『Apply』之后,你键盘右侧的数字键才能够正常的使用呢,否则按右侧数字键会是乱码啦。 再来,你可以调整 pietty 滚动条的记忆行数,这样当数据太多时,你依旧可以调整滚动条来查阅之前的数据。设置的方法如下:

调整画面可以记忆的行数,可让用户回去看较多之前的画面
图 11.2-7、调整画面可以记忆的行数,可让用户回去看较多之前的画面

调整完这些常用的数据后,再来这是最重要的:『你要以哪一个版本的 SSH 算法登录?』前面说过,我们缺省是以 version2 来登录的,所以这里我们可以调整为 2 那个项目!这样每次登录都会以 version 2 的模式登录主机了!

设置登录服务器时使用的 ssh 算法版本
图 11.2-8、设置登录服务器时使用的 ssh 算法版本

整个 pietty 的使用与相关设置流程就是这样!如此一来,你就可以在 Windows 上面以 SSH 的协定,登录远程的 Linux 主机噜!粉方便吧! ^_^ !如果想要中文支持的话,目前 pietty 已经支持中文啦!你可以输入中文喔!不过需要修改一下字符集, 选择图 11.2-5 『选项』内的『字体』就会出现如下图标:

选择中文的字形与编码
图 11.2-9、选择中文的字形与编码

将(1)字体设置为细明体、(2)字集设置为『Big5』,如此一来,你的 pietty 就支持中文的输入啰!

那么上面我们作的这些设置值都记录在哪里啊?呵呵!都记录在 Windows 的注册表当中啊!你可以在 Windows 的系统当中,在『开始』-->『运行』后,出现的框框内输入『regedit』, 之后会出现一个大窗口。请在左边的画面当中选择『 HKEY_CURRENT_USER --> Software --> SimonTatham --> PuTTY --> Sessions』, 就可以看到你的设置值啰! ^_^! 这样,也就可以保存你的设置值啰~

    使用 sftp-server 的功能: psftp

在 putty 的官方网站上也提供 psftp 这支程序。这一支程序的重点则在使用 sftp-server。使用的方式可以直接点击 psftp 这个文件,让他直接启动,则会出现下面的图样:

psftp: no hostname specified; use "open host.name" to connect
psftp>

这个时候可以填入你要连接上去的主机名称,例如我的区域内网络 192.168.100.254 这部主机:

psftp: no hostname specified; use "open host.name" to connect
psftp> open 192.168.100.254
login as: root
root@192.168.100.254's password:
Remote working directory is /root
psftp> <== 这里就在等待你输入 FTP 的指令了!

呵呵!这样就登录主机啦!很简单吧!然后其他的使用方式跟前面提到的 sftp 一样哩!加油的使用吧!

    图形化接口的 sftp 用户端软件: Filezilla

SSH 所提供的 sftp 功能只能利用纯文本接口的 psftp 来连接吗?有没有图形接口的软件呢?呵呵!当然有! 那就是非常有用的 Filezilla 啰!Filezilla 是图形接口的一个 FTP 用户端软件,使用上非常的方便, 至于详细的安装与使用流程请参考第二十一章 vsftpd 的说明喔!

11.2.5 sshd 服务器细部设置

基本上,所有的 sshd 服务器详细设置都放在 /etc/ssh/sshd_config 里面!不过,每个 Linux distribution 的缺省设置都不太相同,所以我们有必要来了解一下整个设置值的意义为何才好! 同时请注意,在缺省的文件内,只要是缺省有出现且被注解的设置值 (设置值前面加 #),即为『默认值!』,你可以依据它来修改的哩。

[root@www ~]# vim /etc/ssh/sshd_config
# 1. 关于 SSH Server 的整体设置,包含使用的 port 啦,以及使用的密码演算方式
# Port 22
# SSH 缺省使用 22 这个port,也可以使用多个port,即重复使用 port 这个设置项目!
# 例如想要开放 sshd 在 22 与 443 ,则多加一行内容为:『 Port 443 』
# 然后重新启动 sshd 这样就好了!不过,不建议修改 port number 啦!

Protocol 2
# 选择的 SSH 协定版本,可以是 1 也可以是 2 ,CentOS 5.x 缺省是仅支持 V2。
# 如果想要支持旧版 V1 ,就得要使用『 Protocol 2,1 』才行。

# ListenAddress 0.0.0.0
# 监听的主机适配器!举个例子来说,如果你有两个 IP,分别是 192.168.1.100 及 
# 192.168.100.254,假设你只想要让 192.168.1.100 可以监听 sshd ,那就这样写:
# 『 ListenAddress 192.168.1.100 』默认值是监听所有接口的 SSH 要求

# PidFile /var/run/sshd.pid
# 可以放置 SSHD 这个 PID 的文件!上述为默认值

# LoginGraceTime 2m
# 当用户连上 SSH server 之后,会出现输入密码的画面,在该画面中,
# 在多久时间内没有成功连上 SSH server 就强迫断线!若无单位则缺省时间为秒!

# Compression delayed
# 指定何时开始使用压缩数据模式进行传输。有 yes, no 与登录后才将数据压缩 (delayed)

# 2. 说明主机的 Private Key 放置的文件,缺省使用下面的文件即可!
# HostKey /etc/ssh/ssh_host_key        # SSH version 1 使用的私钥
# HostKey /etc/ssh/ssh_host_rsa_key    # SSH version 2 使用的 RSA 私钥
# HostKey /etc/ssh/ssh_host_dsa_key    # SSH version 2 使用的 DSA 私钥
# 还记得我们在主机的 SSH 连接流程里面谈到的,这里就是 Host Key ~

# 3. 关于注册表的消息数据放置与 daemon 的名称!
SyslogFacility AUTHPRIV
# 当有人使用 SSH 登录系统的时候,SSH 会记录信息,这个信息要记录在什么 daemon name
# 底下?缺省是以 AUTH 来设置的,即是 /var/log/secure 里面!什么?忘记了!
# 回到 Linux 基础去翻一下。其他可用的 daemon name 为:DAEMON,USER,AUTH,
# LOCAL0,LOCAL1,LOCAL2,LOCAL3,LOCAL4,LOCAL5,

# LogLevel INFO
# 登录记录的等级!嘿嘿!任何消息!同样的,忘记了就回去参考!

# 4. 安全设置项目!极重要!
# 4.1 登录设置部分
# PermitRootLogin yes
# 是否允许 root 登录!缺省是允许的,但是建议设置成 no!

# StrictModes yes
# 是否让 sshd 去检查用户家目录或相关文件的权限数据,
# 这是为了担心用户将某些重要文件的权限设错,可能会导致一些问题所致。
# 例如用户的 ~.ssh/ 权限设错时,某些特殊情况下会不许用户登录

# PubkeyAuthentication yes
# AuthorizedKeysFile      .ssh/authorized_keys
# 是否允许用户自行使用成对的密钥系统进行登录行为,仅针对 version 2。
# 至于自制的公钥数据就放置于用户家目录下的 .ssh/authorized_keys 内

PasswordAuthentication yes
# 密码验证当然是需要的!所以这里写 yes 啰!

# PermitEmptyPasswords no
# 若上面那一项如果设置为 yes 的话,这一项就最好设置为 no ,
# 这个项目在是否允许以空的密码登录!当然不许!

# 4.2 认证部分
# RhostsAuthentication no
# 本机系统不使用 .rhosts,因为仅使用 .rhosts太不安全了,所以这里一定要设置为 no

# IgnoreRhosts yes
# 是否取消使用 ~/.ssh/.rhosts 来做为认证!当然是!

# RhostsRSAAuthentication no #
# 这个选项是专门给 version 1 用的,使用 rhosts 文件在 /etc/hosts.equiv
# 配合 RSA 演算方式来进行认证!不要使用啊!

# HostbasedAuthentication no
# 这个项目与上面的项目类似,不过是给 version 2 使用的!

# IgnoreUserKnownHosts no
# 是否忽略家目录内的 ~/.ssh/known_hosts 这个文件所记录的主机内容?
# 当然不要忽略,所以这里就是 no 啦!

ChallengeResponseAuthentication no
# 允许任何的密码认证!所以,任何 login.conf 规定的认证方式,均可适用!
# 但目前我们比较喜欢使用 PAM 模块帮忙管理认证,因此这个选项可以设置为 no 喔!

UsePAM yes
# 利用 PAM 管理用户认证有很多好处,可以记录与管理。
# 所以这里我们建议你使用 UsePAM 且 ChallengeResponseAuthentication 设置为 no 
 
# 4.3 与 Kerberos 有关的参数设置!因为我们没有 Kerberos 主机,所以底下不用设置!
# KerberosAuthentication no
# KerberosOrLocalPasswd yes
# KerberosTicketCleanup yes
# KerberosTgtPassing no
 
# 4.4 底下是有关在 X-Window 底下使用的相关设置!
X11Forwarding yes
# X11DisplayOffset 10
# X11UseLocalhost yes
# 比较重要的是 X11Forwarding 项目,他可以让窗口的数据通过 ssh 信道来发送喔!
# 在本章后面比较高端的 ssh 使用方法中会谈到。

# 4.5 登录后的项目:
# PrintMotd yes
# 登录后是否显示出一些信息呢?例如上次登录的时间、地点等等,缺省是 yes
# 亦即是打印出 /etc/motd 这个文件的内容。但是,如果为了安全,可以考虑改为 no !

# PrintLastLog yes
# 显示上次登录的信息!可以啊!缺省也是 yes !

# TCPKeepAlive yes
# 当达成连接后,服务器会一直发送 TCP 封包给用户端借以判断对方式否一直存在连接。
# 不过,如果连接时中间的路由器暂时停止服务几秒钟,也会让连接中断喔!
# 在这个情况下,任何一端死掉后,SSH可以立刻知道!而不会有僵尸进程的发生!
# 但如果你的网络或路由器常常不稳定,那么可以设置为 no 的啦!

UsePrivilegeSeparation yes
# 是否使用权限较低的进程来提供用户操作。我们知道 sshd 启动在 port 22 ,
# 因此启动的进程是属于 root 的身份。那么当 student 登录后,这个设置值
# 会让 sshd 产生一个属于 sutdent 的 sshd 进程来使用,对系统较安全

MaxStartups 10
# 同时允许几个尚未登录的连接画面?当我们连上 SSH ,但是尚未输入密码时,
# 这个时候就是我们所谓的连接画面啦!在这个连接画面中,为了保护主机,
# 所以需要设置最大值,缺省最多十个连接画面,而已经创建连接的不计算在这十个当中

# 4.6 关于用户抵挡的设置项目:
DenyUsers *
# 设置受抵挡的用户名,如果是全部的用户,那就是全部挡吧!
# 若是部分用户,可以将该帐号填入!例如下列!
DenyUsers test

DenyGroups test
# 与 DenyUsers 相同!仅抵挡几个群组而已!

# 5. 关于 SFTP 服务与其他的设置项目!
Subsystem       sftp    /usr/lib/ssh/sftp-server
# UseDNS yes
# 一般来说,为了要判断用户端来源是正常合法的,因此会使用 DNS 去反查用户端的主机名
# 不过如果是在内网互连,这项目设置为 no 会让连接达成速度比较快。

基本上,CentOS 缺省的 sshd 服务已经算是挺安全的了,不过还不够!建议你 (1)将 root 的登录权限取消; (2)将 ssh 版本设置为 2 。其他的设置值就请你依照自己的喜好来设置了。 通常不建议进行随便修改啦!另外,如果你修改过上面这个文件(/etc/ssh/sshd_config),那么就必需要重新启动一次 sshd 这个 daemon 才行!亦即是:

  • /etc/init.d/sshd restart

11.2.6 制作不用密码可立即登录的 ssh 用户

你或许已经想到了,既然 ssh 可以使用 scp 来进行网络拷贝的话,那么我能不能将 scp 的指令放置于 crontab 服务中, 让我们的系统通过 scp 直接在背景底下自行定期的进行网络拷贝与备份呢?抱歉,答案是:『缺省状况下不允许此动作』的! 为甚么呢?因为缺省状况下,你必须要通过远程登录,与 scp 交互的输入密码才行啊!但 crontab 又不会让你有终端接口输入密码, 所以该进程就会一直卡住而无法在 crontab 内运行成功喔! 那怎办?我们要放弃这个好用的网络拷贝工具吗?当然不是啦!我们可以通过密钥认证系统来处理的!

既然 SSH 可以使用密钥系统来比对数据,并且提供用户数据的加密功能,那么可不可能利用这个 Key 就提供用户自己进入主机,而不需要输入密码呢?呵呵!好主意!我们可以将 Client 产生的 Key 给他拷贝到 Server 当中,所以, 以后 Client 登录 Server 时,由于两者在 SSH 要连接的信号传递中,就已经比对过 Key 了, 因此,可以立即进入数据传输接口中,而不需要再输入密码呢!在实作上的步骤可以是:

  1. 用户端创建两把钥匙:想一想,在密钥系统中,是公钥比较重要还是私钥比较重要? 当然是私钥比较重要!因此私钥才是解密的关键啊!所以啰,这两把钥匙当然得在发起连接的用户端建置才对。利用的指令为 ssh-keygen 这个命令;

  2. 用户端放置好私钥文件:将 Private Key 放在 Client 上面的家目录,亦即 $HOME/.ssh/ , 并且得要注意权限喔!

  3. 将公钥放置服务器端的正确目录与文件名去:最后,将那把 Public Key 放在任何一个你想要用来登录的服务器端的某 User 的家目录内之 .ssh/ 里面的认证文件即可完成整个进程。

说是好像很困难的样子,其实步骤真的很简单,我们依序来进行作业好了!假设前提如下,该进行的步骤则如下图:

  • Server 部分为 www.centos.vbird 这部 192.168.100.254 的主机,欲使用的帐号为 dmtsai ;
  • Client 部分为 clientlinux.centos.vbird 这部 192.168.100.10 的 vbirdtsai 这个帐号, 该帐号要用来登录 192.168.100.254 这部主机的 dmtsai 帐号。
制作不需要密码的 ssh 帐号基本流程
图 11.2-10、制作不需要密码的 ssh 帐号基本流程
    1. 用户端创建两把钥匙:

创建的方法很简单,在 clientlinux.centos.vbird 这部主机上面以 vbirdtsai 的身份来创建两把钥匙即可。 不过,需要注意的是,我们有多种密码算法,如果不指定特殊的算法,则缺省以 RSA 算法来处理:

[vbirdtsai@clientlinux ~]$ ssh-keygen [-t rsa|dsa] <==可选 rsa 或 dsa
[vbirdtsai@clientlinux ~]$ ssh-keygen  <==用缺省的方法创建密钥
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vbirdtsai/.ssh/id_rsa): <==按 enter
Created directory '/home/vbirdtsai/.ssh'. <==此目录若不存在则会主动创建
Enter passphrase (empty for no passphrase): <==按 Enter 不给密码
Enter same passphrase again: <==再输入一次 Enter 吧!
Your identification has been saved in /home/vbirdtsai/.ssh/id_rsa. <==私钥档
Your public key has been saved in /home/vbirdtsai/.ssh/id_rsa.pub. <==公钥档
The key fingerprint is:
0f:d3:e7:1a:1c:bd:5c:03:f1:19:f1:22:df:9b:cc:08 vbirdtsai@clientlinux.centos.vbird

[vbirdtsai@clientlinux ~]$ ls -ld ~/.ssh; ls -l ~/.ssh
drwx------. 2 vbirdtsai vbirdtsai 4096 2011-07-25 12:58 /home/vbirdtsai/.ssh
-rw-------. 1 vbirdtsai vbirdtsai 1675 2011-07-25 12:58 id_rsa      <==私钥档
-rw-r--r--. 1 vbirdtsai vbirdtsai  416 2011-07-25 12:58 id_rsa.pub  <==公钥档

请注意上面喔,我的身份是 vbirdtsai ,所以当我运行 ssh-keygen 时,才会在我的家目录底下的 .ssh/ 这个目录里面产生所需要的两把 Keys ,分别是私钥 (id_rsa) 与公钥 (id_rsa.pub)。 ~/.ssh/ 目录必须要是 700 的权限才行!另外一个要特别注意的就是那个 id_rsa 的文件权限啦!他必须要是 -rw------- 且属于 vbirdtsai 自己才行!否则在未来密钥比对的过程当中,可能会被判定为危险而无法成功的以公私钥成对文件的机制来达成连接喔。 其实,创建私钥后缺省的权限与文件名放置位置都是正确的,你只要检查过没问题即可。

    2. 将公钥文件数据上传到服务器上:

因为我们要登录 www.centos.vbird 是以 dmtsai 的身份,因此我们就得要将上个步骤创建的公钥 (id_rsa.pub) 上传到服务器上的 dmtsai 用户才行。那如何上传呢?最简单的方法当然就是使用 scp 嘛!

[vbirdtsai@clientlinux ~]$ scp ~/.ssh/id_rsa.pub dmtsai@192.168.100.254:~
# 上传到 dmtsai 的家目录底下即可。

    3. 将公钥放置服务器端的正确目录与文件名:

还记得 sshd_config 里面谈到的 AuthorizedKeysFile 这个设置值吧?该设置值就是在指定公钥数据应该要放置的文件名啰!所以,我们必须要到服务器端的 dmtsai 这个用户身份下, 将刚刚上传的 id_rsa.pub 数据附加到 authorized_keys 这个文件内才行。作法有点像这样:

# 1. 创建 ~/.ssh 文件,注意权限需要为 700 喔!
[dmtsai@www ~]$ ls -ld .ssh
ls: .ssh: 没有此一文件或目录
# 由于可能是新建的用户,因此这个目录不存在。不存在才作底下创建目录的行为

[dmtsai@www ~]$ mkdir .ssh; chmod 700 .ssh
[dmtsai@www ~]$ ls -ld .ssh
drwx------. 2 dmtsai dmtsai 4096 Jul 25 13:06 .ssh
# 权限设置中,务必是 700 且属于用户本人的帐号与群组才行!

# 2. 将公钥文件内的数据使用 cat 转存到 authorized_keys 内
[dmtsai@www ~]$ ls -l *pub
-rw-r--r--. 1 dmtsai dmtsai 416 Jul 25 13:05 id_rsa.pub <==确实有存在

[dmtsai@www ~]$ cat id_rsa.pub >> .ssh/authorized_keys
[dmtsai@www ~]$ chmod 644 .ssh/authorized_keys
[dmtsai@www ~]$ ls -l .ssh
-rw-r--r--. 1 dmtsai dmtsai 416 Jul 25 13:07 authorized_keys
# 这个文件的权限设置中,就得要是 644 才可以!不可以搞混了!


这样就搞定密钥系统啰!以后你从 clientlinux.centos.vbird 的 vbirdtsai 登录到 www.centos.vbird 的 dmtsai 用户时, 就不需要任何的密码啰!举例来说,你可以这样测试看看啰:

例题:
通过上述的案例练习成功后,请在 clientlinux 的 vbirdtsai 身份中,将系统的 /etc/hosts* 文件拷贝给 www.centos.vbird 的 dmtsai 用户的家目录。
答:
[vbirdtsai@clientlinux ~]$ scp /etc/hosts* dmtsai@192.168.100.254:~
hosts                                        100%  187     0.2KB/s   00:00
hosts.allow                                  100%  161     0.2KB/s   00:00
hosts.deny                                   100%  347     0.3KB/s   00:00
# 你会发现,原本会出现的那个密码提示数据不会出现了喔!

[vbirdtsai@clientlinux ~]$ ssh dmtsai@192.168.100.254 "ls -l"
-rw-r--r--. 1 dmtsai dmtsai 196 2011-07-25 13:09 hosts
-rw-r--r--. 1 dmtsai dmtsai 370 2011-07-25 13:09 hosts.allow
-rw-r--r--. 1 dmtsai dmtsai 460 2011-07-25 13:09 hosts.deny
-rw-r--r--. 1 dmtsai dmtsai 416 2011-07-25 13:05 id_rsa.pub
# 确实有拷贝到对方去了!有显示出正确的远程数据哩!

很简单的步骤吧!这样一来,使用 ssh 相关的用户端指令就可以不需密码的手续了!无论如何,在创建密钥系统的步骤中你要记得的是:

  • Client 必须制作出 Public & Private 这两把 keys,且 Private 需放到 ~/.ssh/ 内;
  • Server 必须要有 Public Key ,且放置到用户家目录下的 ~/.ssh/authorized_keys,同时目录的权限 (.ssh/) 必须是 700 而文件权限则必须为 644 ,同时文件的拥有者与群组都必须与该帐号吻合才行。

未来,当你还想要登录其他的主机时,只要将你的 public key (就是 id_rsa.pub 这个文件) 给他 copy 到其他主机上面去,并且添加到某帐号的 ~/.ssh/authorized_keys 这个文件中!哈哈!成功!

11.2.7 简易安全设置

老实说,大家都被『SSH 是个安全的服务』所欺骗了!其实 sshd 并不怎么安全的!翻开 openssh 的过去历史来看,确实有很多人是利用 ssh 的程序漏洞来取得远程主机 root 的权限,进一步黑掉对方的主机!所以这玩意儿说实话,也不是很安全的啦!

sshd 之所谓的『安全』其实指的是『 sshd 的数据是加密过的,所以他的数据在 Internet 上面传递时是比较安全的。至于 sshd 这个服务本身就不是那样安全了!所以说:『非必要,不要将 sshd 对 Internet 开放可登录的权限,尽量局限在几个小范围内的 IP 或主机名称即可!这很重要的喔!

好了,那么关于安全的设置方面,有没有什么值得注意的呢?当然是有啦!我们可以先建议几个项目吧!分别可以由底下这三方面来进行:

  • 服务器软件本身的设置强化:/etc/ssh/sshd_config
  • TCP wrapper 的使用:/etc/hosts.allow, /etc/hosts.deny
  • iptables 的使用: iptables.rule, iptables.allow
    服务器软件本身的设置强化:/etc/ssh/sshd_config

一般而言,这个文件的缺省项目就已经很完备了!所以,事实上是不太需要更动他的! 但是,如果你有些用户方面的顾虑,那么可以这样修正一些问题呢!

  • 禁止 root 这个帐号使用 sshd 的服务;
  • 禁止 nossh 这个群组的用户使用 sshd 的服务;
  • 禁止 testssh 这个用户使用 sshd 的服务;

除了上述的帐号之外,其他的用户则可以正常的使用系统。现在鸟哥假设你的系统里面已经有 sshnot1, sshnot2, sshnot3 加入 nossh 群组, 同时系统还有 testssh, student 等帐号。相关的帐号处理请自行参考基础篇来设置,底下仅是列出观察的重点:

# 1. 先观察一下所需要的帐号是否存在呢?
[root@www ~]# for user in sshnot1 sshnot2 sshnot3 testssh student; do \
> id $user | cut -d ' ' -f1-3 ; done
uid=507(sshnot1) gid=509(sshnot1) groups=509(sshnot1),508(nossh)
uid=508(sshnot2) gid=510(sshnot2) groups=510(sshnot2),508(nossh)
uid=509(sshnot3) gid=511(sshnot3) groups=511(sshnot3),508(nossh)
uid=511(testssh) gid=513(testssh) groups=513(testssh)
uid=505(student) gid=506(student) groups=506(student)
# 若上述帐号并不存在你的系统,请自己建置出来!UID/GID 与鸟哥的不同也没关系!

# 2. 修改 sshd_config 并且重新启动 sshd 吧!
[root@www ~]# vim /etc/ssh/sshd_config
PermitRootLogin no  <==约在第 39 行,请拿掉注解且修改成这样
DenyGroups  nossh   <==底下这两行可以加在文件的最后面
DenyUsers   testssh

[root@www ~]# /etc/init.d/sshd restart

# 3. 测试与观察相关的帐号登录情况吧!
[root@www ~]# ssh root@localhost  <==并请输入正确的密码
[root@www ~]# tail /var/log/secure
Jul 25 13:14:05 www sshd[2039]: pam_unix(sshd:auth): authentication failure; 
logname= uid=0 euid=0 tty=ssh ruser= rhost=localhost  user=root
# 你会发现出现这个错误消息,而不是密码输入错误而已。

[root@www ~]# ssh sshnot1@localhost  <==并请输入正确的密码
[root@www ~]# tail /var/log/secure
Jul 25 13:15:53 www sshd[2061]: User sshnot1 from localhost not allowed because
a group is listed in DenyGroups

[root@www ~]# ssh testssh@localhost  <==并请输入正确的密码
[root@www ~]# tail /var/log/secure
Jul 25 13:17:16 www sshd[2074]: User testssh from localhost not allowed 
because listed in DenyUsers

从上面的结果来看,你就会发现到,不同的登录帐号会产生不一样的注册表结果。因此,当你老是无法顺利使用 ssh 登录某一部主机时,记得到该服务器上去检查看看注册表,说不定就会顺利的让你解决问题啰!在我们的测试机上面,请还是放行 root 的登录喔!

    /etc/hosts.allow 及 /etc/hosts.deny

举例来说,你的 sshd 只想让本机以及区网内的主机来源能够登录的话,那就这样作:

[root@www ~]# vim /etc/hosts.allow
sshd: 127.0.0.1 192.168.1.0/255.255.255.0 192.168.100.0/255.255.255.0

[root@www ~]# vim /etc/hosts.deny
sshd : ALL 

    iptables 封包过滤防火墙

多几层保护也很好的!所以也可以使用 iptables 喔! 参考:第九章、防火墙与 NAT 服务器内的实际脚本程序,你应该在 iptables.rule 内将 port 22 的放行功能取消,然后再到 iptables.allow 里面添加这行:

[root@www ~]# vim /usr/local/virus/iptables/iptables.allow
iptables -A INPUT -i $EXTIF -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i $EXTIF -s 192.168.100.0/24 -p tcp --dport 22 -j ACCEPT

[root@www ~]# /usr/local/virus/iptables/iptables.rule

上述的方法处理完毕后,如果你还是一部测试机,那么记得要将设置值还原回来呦!最后, 『鸟哥呼吁大家,不要开放 SSH 的登录权限给所有 Internet 上面的主机~』 这很重要喔~因为如果对方可以 ssh 进入你的主机,那么...太危险了~

11.3 最原始图形接口: Xdmcp 服务的激活

考虑一个情况,如果你的 Linux 主机主要是用来作为图形处理时,而且同时有多人需要用到那个功能, 那么一部 Linux 是否一次仅能提供一个人处理那个软件呢?嘿嘿!那可不一定喔!因为 Linux 有相当优秀的 X Window System 啊!现在就来谈谈第一个图形接口的远程连接服务器吧!

11.3.1 X Window 的 Server/Client 架构与各组件

由于我们 Linux 使用的图形接口是所谓的 X-Window System 的东西,这玩意儿是能够跨平台的,目前在 Linux 上头开发的图形接口软件,几乎都是使用这个 X 的架构来处理,所以啰,你就不能够不知道 X Window 啦! 我们在基础篇第三版的二十四章已经讲过 X Window 啦, 因此这里只会作个简单的介绍,以方便大家来了解为何我们的软件是这么安装与设置喔!

X Window System 在运作的过程中,又因控制的数据不同而分为 X Server 与 X Client 两种进程,虽然说是 X Server/Client , 但是他的作用却与网络主机的 Server/Client 架构大异其趣喔~先来说说 X Server/Client 这两种进程所负责的任务先:

  • X Server: 这组进程主要负责的是屏幕画面的绘制与显示。 X Server 可以接收来自 X client 的数据,将这些数据绘制呈现为图面在屏幕上。 此外,我们移动鼠标、点击数据、由键盘输入数据等等,也会通过 X Server 来传达到 X Client 端,而由 X Client 来加以运算出应绘制的数据;

  • X Client: 这组进程主要负责的是数据的运算。 X Client 在接受到 X Server 传来的数据后 (例如移动鼠标、点击 icon 等动作),会经由本身的运算而得到鼠标应该要如何移动、 点击的结果应该要出现什么样的数据、键盘输入的结果应该要如何呈现等等,然后将这些结果告知 X Server ,让他自行去绘制到屏幕上。
Tips 鸟哥 鸟哥常常开玩笑的说, X server 就是画布,而 X client 就是手拿画笔的画家。你得要先有画布 (管理好所有可显示的硬件后) 之后画家的想法 (计算出来的绘图数据) 才能够绘制到画布上!

由于每一支 X client 都是独立存在的进程,因此在图形显示会发生一些叠图的问题 (想像一下每一个 X client 都是一个很自我的画家, 每个画家都不承认对方的存在,都自顾自的在画布上面作画,最后的结果会是如何?)。因此,后来就有一组特殊的 X client 在进行管理所有的其他 X client 程序,这个总管的咚咚就是 Window Manager!

  • Window Manager (WM):是一组控制所有 X client 的管理程序,并同时提供例如任务栏、 背景桌面、虚拟桌面、窗口大小、窗口移动与重叠显示等任务。Window manager 主要由一些大型的计划案所开发而来,常见的有 GNOME, KDE, XFCE 等

既然 X Window System 是 Linux 上面的一组程序,那么它如何启动的呢?早期的用户在登录系统后,必须要自己先启动 X server 程序,然后再启动个别的 Window manager ,若有其他需求,再启动其他额外的 X client 就是了。这么麻烦!所以为了简化启动个人图形接口的步骤,后来还有所谓的 Display Manager (DM) 这玩意喔!

  • Display Manager (DM):提供用户登录的画面以让用户可以借由图形接口登录。 在用户登录后,可通过 display manager 的功能去调用其他的 Window manager ,让用户在图形接口的登录过程变得更简单。 由于 DM 也是启动一个等待输入帐号密码的图形数据,因此 DM 会主动去唤醒一个 X Server 然后在上头加载等待输入的画面就是了。

在目前新发布的 Linux distributions 中,通常启动图形接口让用户登录的方式中,都是先运行 Display Manager 程序, 该程序会主动加载一个 X Server 程序,然后再提供一个等待输入帐号密码的接口程序,之后再根据用户的选择去启动所需要的 Window Manager 程序,最后就由用户直接操作 WM 来玩图形接口啰。

例题:
在 CentOS 6.x 当中,若缺省为 init 5 的情况下,那么最终启动图形接口的是哪一只程序?
答:
分析 /etc/init/* 当中的文件,会发现有个文件的内容是这样:
[root@www ~]# cat /etc/init/prefdm.conf
start on stopped rc RUNLEVEL=5
stop on starting rc RUNLEVEL=[!5]
console output
respawn
respawn limit 10 120
exec /etc/X11/prefdm -nodaemon
你可以分析 /etc/X11/prefdm 的内容,就能够发现其实该行启动的就是一个 X display manager 程序了喔!

例题:
登录 init 5 的 CentOS 6.x 之前,先到 tty1 去查阅一下 X server 是由哪一支程序所唤醒的?
答:
我们可以通过 pstree 来观察进程间的相关性喔!同时注意,缺省的 CentOS 6.x 的 X server 程序名称为 Xorg 的哩。
[root@www ~]# pstree -p
init(1)-+-NetworkManager(1086)
....(中间省略)....
        |-gdm-binary(2642)---gdm-simple-slav(2661)-+-Xorg(2663)
        |                                          |-gdm-session-wor(2746)
....(后面省略)....
由上述的数据来看,gdm-binary 可以唤醒 Xorg 喔!同理,我们也会知道提供认证的图形画面应该是由 gdm-session 所提供的喔!

    X Window System 用在网络上的方式: XDMCP

当 X server, X client 都在同一部主机上面的时候,你可以很轻松的启动一个完整的 X Window System。 但是如果你想要通过这个机制在网络上面启动 X 呢?此时你得先在用户端启动一个 X server 将图形接口绘图所需要的硬件设备配置好, 并且启动一个 X server 常见的接收端口口 (通常是 port 6000),然后再由服务器端的 X client 取得绘图数据,再将数据绘制成图啰。 通过这个机制,你可以在任何一部启动 X server 登录服务器喔!而且不管你的操作系统是啥呢!意义就像下图, 如此一来,你就可以取得服务器所提供的图形接口环境啦!

X server/client 的架构
图 11.3-1、X server/client 的架构

但是如果你是使用最笨的方法在用户端自己启动 X server ,然后在告诉服务器将 X client 程序一个一个的加载回来, 那就太累人了吧!我们之前上面不是提到过可以用 display manager 来管理用户的登录与启动 X 吗?那服务器能不能提供一个类似的服务, 那我们直接通过服务器的 display manager 就能够提供我们登录的认证与加载自己选择的 window manager 的话,这样就太棒了! 能够达到吗?当然可以啊!那就是通过 Xdmcp (X display manager control protocol) (注3) 啦!

Xdmcp 启动后会在服务器的 udp 177 开始监听,然后当用户端的 X server 连接到服务器的 port 177 之后, 我们的 Xdmcp 就会在用户端的 X server 放上用户输入帐密的图形接口程序啰!那你就能通过这个 Xdmcp 去加载服务器所提供的类似 Window Manager 的相关 X client 啰!那你就能够取得图形接口的远程连接服务器哩!赞吧!

那么什么时候会出现多用户连入服务器取得 X 的情况呢?以鸟哥的例子来说,鸟哥实验室有一组 Linux 在进行数值仿真, 他输出的结果是 NetCDF 文件,我们必须使用 PAVE 这一套软件去处理这些数据。但是我们有两三个人同时都会使用到那个功能, 偏偏 Linux 主机是放在机架柜里面的,要我们挤在那个小小的空间前面『站着』操作电脑,可真是讨人厌啊~ 这个时候,我们就会架设图形接口的远程登录服务器,让我们可以『多人同时以图形接口登录 Linux 主机』来操作我们自己的进程!很棒,不是吗!

11.3.2 设置 gdm 的 XDMCP 服务

既然是所谓的 Xdmcp 协定,那么是否意味着与 X display manager 有关呢?没错啦! Xdmcp 协定是由 DM 程序所提供的。 我们的 CentOS 缺省的 DM 为 GNOME 这个计划所提供的 gdm 哩!因此,你想要启动 Xdmcp 服务,那就得要针对 gdm 这个程序来设置啰。 这个 gdm 的设置数据都放置在 /etc/gdm/ 目录下,而我们所要修改的设置档其实仅是一个 /etc/gdm/custom.conf (注4) 文件而已。

Tips 鸟哥 X11 提供的 display manager 为 xdm ,而著名的 KDE 与 GNOME 也都有自己的 display manager 管理进程,分别是 kdm 与 gdm 。你可以通过三者中任何一者的 display manager 的设置档来启动 xdmcp 这个协定呢~

不过,因为我们安装的基准是『Basic server』,所以很多图形接口软件并没有被安装起来。因此,在实作 Xdmcp 之前,我们得先安装图形接口才行喔!使用 yum groupinstall 来安装吧!

# 先检查看看与 X 相关的软件群组有哪些?
[root@www ~]# yum grouplist
   Desktop
   Desktop Platform
   X Window System
# 这三个算是最重要的项目了!得要安装起来才行喔!gdm 是在 Destop 中! 

[root@www ~]# yum groupinstall "Desktop" "Desktop Platform" \
> "X Window System"

上面进行完毕后,现在才能开始搞定 custom.conf 啦!来试玩看看!

[root@www ~]# vim /etc/gdm/custom.conf
[security]           <==在与资安方面有关的信息,大多指登录相关事宜
AllowRemoteRoot=yes  <==xdmcp 缺省不许 root 登录,得用这个项目才能以 root 登录
DisallowTCP=false    <==这个项目在允许用户端使用 TCP 的方式连接到 xdmcp

[xdmcp]              <==就是这个小节的重点之一啰!
Enable=true          <==启动 xdmcp 的最重要项目啰!
# 上述特殊字体的部份就是你得要自己添加的内容啰!

[root@www ~]# init 5
# 上述这个指令会切换到 X 图形画面,如果确定要使用 gdm,runlevel 得调整到 5 才好
# 果真如此的话,那就得要调整 /etc/inittab 啰!

[root@www ~]# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address  Foreign Address   State    PID/Program name
tcp        0      0 0.0.0.0:6000   0.0.0.0:*         LISTEN   4557/Xorg
tcp        0      0 :::6000        :::*              LISTEN   4557/Xorg
udp        0      0 0.0.0.0:177    0.0.0.0:*                  4536/gdm-binary
# 上述的 port 6000 是由 DisallowTCP=false 项目启动的,port 177 才是我们要的

上述的动作鸟哥是在 runlevel 3 底下启动的,如果你是在 runlevel 5 底下时,因此你也可以利用『 init 3 && init 5 』来重新启动图形接口。但如果你是在 runlevel 3 底下并且不希望变更成为 runlevel 5 呢?那又该如何启动 port 177 啊?如果是这样的话,那么你可以这样启动 xdmcp 啦:

[root@www ~]# init 3
[root@www ~]# runlevel
5 3 <==左边的是前一个 runlevel,右边的是目前的,因此目前是 runlevel 3
[root@www ~]# gdm   <==这样就启动 xdmcp 啰!
[root@www ~]# vim /etc/rc.d/rc.local
/usr/sbin/gdm

现在你知道如何在不同的 runlevel 启动 xdmcp 了吧?如果是 runlevel 5 ,因为在 /etc/inittab 就已经有自动启动 gdm 了, 所以你只要顺利启动 runlevel 5 即可。但如果你是在 runlevel 3 的话,因为这样 gdm 就不会被系统的启动流程启动, 那你只好自己在 /etc/rc.d/rc.local 里面指定启动他啰!这样了解呼?不过,既然你都要使用 xdmcp 了,所以建议您直接启动在 runlevel 5 即可!接下来,你得要开放用户端对你的 port 177 连接才行! 请自行修改你的防火墙规则,开放 udp port 177 吧!鸟哥这里假设你使用鸟哥的防火墙脚本,那你这样作就好了:

[root@www ~]# vim /usr/local/virus/iptables/iptables.rule
iptables -A INPUT -p UDP -i $EXTIF --dport 177 --sport 1024:65534 \
 -s 192.168.100.0/24 -j ACCEPT #xdmcp
# 注意喔!特点是使用 UDP 端口口以及加入来源端 IP 网域的控管!

[root@www ~]# /usr/local/virus/iptables/iptables.rule
[root@www ~]# iptables-save | grep 177
-A INPUT -s 192.168.100.0/24 -i eth0 -p udp -m udp --sport 1024:65534 --dport 177 -j ACCEPT
# 确实有开放 port 177 ,而且是 udp 的端口口喔!要注意这两个项目。

11.3.3 用户系统为 Linux 的登录方式

由于 Linux 本身的窗口就是由 X server 提供来的,因此使用 Linux 登录远程的图形服务器是很简单的啦! 但是因为启动 X 的方式不同而已数种启动方式,底下我们就讲讲两个常见的启动方式:

    在不同的 X 环境下启动连接: 直接用 X

如果你的用户端已经在 runlevel 5 了,因此其实你已经有一个 X 窗口的环境,这个环境的显示终端机就称为『 :0 』。 在 CentOS 6.x 的环境中,如果原本就是 runlevel 5 的环境,那么这个图形接口的 :0 是在 tty1 终端机啦!如果是由 runlevel 3 启动图形接口,那就是在 tty7 喔!由于已经有一个 X 了,因此你必须要在另外的终端机启动另一个 X 才行!那个新的 X 就称为 :1 接口,其实通常就在 tty7 或 tty8 啦!但因为 X server 要接受 X client 必须要有授权才行, 所以你得先在窗口接口开放接受来自服务器的 X client 数据。

此外,虽然你在用户端是以主动的方式连接到服务器的 udp port 177 ,但是服务器的 X client 却会主动的连接到你用户端的 X server,因此,你必须要开放来自服务器端主动对你的 TCP port 6001 (因为是 :1 接口) 的防火墙连接才行喔!那就来实做看看:

# 1. 放行 X client 传来的数据:在 X Window 的画面当中激活 shell 输入:
[root@clientlinux ~]# xhost + 192.168.100.254
192.168.100.254 being added to access control list
# 注意!你是用户端!且假设我刚刚那部 Linux 主机的 IP 为 192.168.100.254

# 2. 开始放行防火墙,因为我们启动 port 6001 ,所以你在用户端这样作:
[root@clientlinux ~]# vim /usr/local/virus/iptables/iptables.allow
iptables -A INPUT -i $EXTIF -s 192.168.100.0/24 -p tcp --dport 6001 -j ACCEPT

[root@clientlinux ~]# /usr/local/virus/iptables/iptables.rule
[root@clientlinux ~]# iptables-save
-A INPUT -s 192.168.100.0/24 -p tcp -m tcp --dport 6001 -j ACCEPT
# 要能看到上面这一行才行呦!

# 3. 在文本接口 (例如 tty1) 下输入如下的指令:
[root@clientlinux ~]# X -query 192.168.100.254 :1
# 进入 X Window 啰!

如果一切顺利的话,那么你在 clientlinux.centos.vbird 就会看到如下的画面(注意主机名称):

在用户端连上 Xdmcp 成功的画面
图 11.3-2、在用户端连上 Xdmcp 成功的画面

在上图中输入正确的帐号与密码之后,你在 tty8 (:1) 就会有个窗口接口啰!那你如果想要回到本机的窗口接口, 就回到 tty7 (:0) 即可切换成功!(在 runlevel 5 时,:0 在 tty1 ,而 :1 在 tty7 喔!)那想要关闭 tty8 该如何是好?你不能够在 tty8 注销啦,因为注销后,系统会重新开一个等待登录的画面,你还是没办法关闭的。你得要回到刚刚启动 X 的 tty1 然后按下 [ctrl]-c 中断连接即可!

    在同一个 X 底下启动另一个 X: 使用 Xnest

如果常常在 tty7, tty8 切换来去的话,偶而会忘记到底在哪个接口了,尤其是当你的桌面都一模一样时, 那就更难判断了。有没有办法直接在 tty7 启动另一个窗口来加载远程服务器的图形接口呢?可以的,那就通过 Xnest 吧! 这指令需要在 X 的环境下使用喔!它的简单用法如下:

[root@www ~]# Xnest -query 主机名 -geometry 分辨率 :1
选项与参数:
-query    :后面接 xdmcp 服务器的主机名称或 IP 啰
-geometry :后面接画面的分辨率,例如 1024x768 或 800x600 等之类的分辨率

# 根据上述数据,使用 800x600 连上 192.168.100.254 那部主机:
[root@www ~]# yum install xorg-x11-server-Xnest
[root@www ~]# Xnest -query 192.168.100.254 -geometry 640x480 :1

如果一切顺利的话,那你就会在 tty7 的本机 X 环境下看到如下的画面 (底下的画面是已经登录的情况!)

在用户端的 X 顺利连上 Xdmcp 的画面
图 11.3-3、在用户端的 X 顺利连上 Xdmcp 的画面

一开始的图标会与图 11.3-2 一样,就是出现输入帐密的画面,如果输入正确的帐密后, 就会出现上述的图标了。仔细看一下画面当中的终端机标头,你就会发现确实是两部主机的桌面呢!这样有没有更棒棒? ^_^! 要关闭这个 X 就简单多了!直接按下关闭,或者是中断那个 Xnest 的程序即可。

11.3.4 用户系统为 Windows 的登录方式: Xming

由于 Windows 本身并没有提供缺省的 X server ,因此我们得要自行安装 X server 在 Windows 上面才行。 目前常见的 X server 有底下这几个:

其中 X-Win32 与 Exceed 都属于商业软件,而 Xming 则属于轻量级的自由软件,说是轻量级并非说它不好, 而是因为 Xming 的文件真的很小,而该有的功能都有了,所以算是很不赖的一个软件喔!因此底下鸟哥是以 Xming (注5) 作范例来介绍的。

  1. 安装:你可以使用缺省的方法,一直下一步的安装下去,就能够顺利的安装好 Xming 这套 X server 的软件啰。

  2. 启动:请在『开始』-->『程序集』-->『Xming』-->『XLaunch』打开设置连接到 xdmcp 的方式。底下我们会使用区网内的广播 (broadcast) 来找到 xdmcp 服务器的方式。启动 XLaunch 之后会出现如下的图标:

    Xming 的 Xdmcp 连接方式示意图
    图 11.3-4、Xming 的 Xdmcp 连接方式示意图

    记得上面的图标要选择 One window 或 Fullscreen 或 One window without titlebar 才能够使用 XDMCP 喔!选择完毕后按『下一步』 就会出现如下的画面:

    Xming 的 Xdmcp 连接方式示意图
    图 11.3-5、Xming 的 Xdmcp 连接方式示意图

    上述的图标当中共有三种传递 X client 的方法,在这个小节当中我们要连到 xdmcp ,所以你得要选择第三个喔!之后再下一步会出现下图:

    Xming 的 Xdmcp 连接方式示意图
    图 11.3-6、Xming 的 Xdmcp 连接方式示意图

    这里当然就是连接到你想要连上去的 xdmcp 服务器啰!将他的 IP 填上去吧!之后再下一步去:

    Xming 的 Xdmcp 连接方式示意图
    图 11.3-7、Xming 的 Xdmcp 连接方式示意图

    上图的项目与数据的互相拷贝粘贴有关,保留默认值即可。按下下一步吧!

    Xming 的 Xdmcp 连接方式示意图
    图 11.3-8、Xming 的 Xdmcp 连接方式示意图

    出现上图就是设置完毕了,给它按下『完成』之后,你就会发现如同图 11.3-2 的画面出现,你就能够开始在 Windows 底下连上图形接口的 Linux Server 啰!很轻松吧!
    重点在 Server 与 Client 的防火墙上

其实从上面的设置当中你会发现, XDMCP 不论是在 Server 还是 Client 的设置上面都很简单!但是有时候你就是会发现, 明明所有的动作都做完了,但是就是没有办法连上 Xdmcp 服务器!最容易发生错误的其实就是防火墙啦!因为虽然我们用户端启动 X server 后,会主动连接到服务器端的 Xdmcp (port 177),但是,接下来却是服务器主动连接到我们用户端的 X server (可能是 port 6000~6010)。 因此,如果你只是设置了服务器的防火墙而已,那么很可能出现问题的应该就是用户端的防火墙忘记打开提供服务器主动连接的规则啰! 这点是必须要跟大家说明的喔!

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
# 已经启动所需要的端口口啰!

在上述的指令操作中,你要知道的几个项目是:

  1. 密码至少需要六个字符
  2. 依据使用 vncserver 的身份,将刚刚创建的密码放置于该帐号家目录下。例如上述的身份是使用 root 身份,因此密码档会放在 /root/.vnc/passwd 这个文件中但是若该文件已经存在,则不会出现创建密码的画面。
  3. 当用户端连接成功后,服务器将会发送 /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
# 这个指令请一定一定要在图形接口上面运行才行喔!很重要!别忘了!
在 Linux 用户端运行 vncviewer 进程示意
图 11.4-1、在 Linux 用户端运行 vncviewer 进程示意

在上图当中输入刚刚的 root 的 VNC 连接密码,请注意喔,是 VNC 的连接密码,而不是 root 的登录密码! 这两者是差很多的!也由于启动 VNC 的身份是 root ,因此这里才使用 root 的 VNC 连接密码。 所以,很多时刻,我们都是建议使用一般身份来启动 VNC server 的啦!当你输入正确的 VNC 连接密码后, 会出现如下的图标啰:

在 Linux 用户端运行 vncviewer 进程示意
图 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 软件,然后就会看到如下的画面:

Windows Real VNC 用户端连接示意图
图 11.4-3、Windows Real VNC 用户端连接示意图

如上图所示,你在 server 字段填上 IP:port 的数据即可,然后按下『OK』吧!

Windows Real VNC 用户端连接示意图
图 11.4-4、Windows Real VNC 用户端连接示意图

由于 VNC server 需要的仅是连接的 VNC 密码而已,因此上图中的 Username 可以不用填,老实说,这个程序它也不会让你填~ 呵呵!填完按下『OK』即可!接下来就会出现正确的画面啰!

Windows Real VNC 用户端连接示意图
图 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 去处理处理

# 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 来连接,你就会发现如下的画面:

通过 VNC 信道取得 xdmcp 画面
图 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 ,这真是太可惜了!

11.5 仿真的远程桌面系统: XRDP 服务器

使用上面的图形接口的连接服务器都有一个问题,除了连接机制的不同之外,上头的 Xdmcp 与 VNC 原则上,数据都没有加密。 因此上面的动作大多仅适合局域网路内运作,不要连上 Internet 比较好。那如果你真的想要通过加密的方式运作 VNC, 那可能得要通过下一小节的介绍才能够有好的处理结果。那么我们知道 Windows 的远程桌面 (Remote Desktop Procotol, RDP, 注7) 其实是具有连接加密功能的,所以,能不能在 Linux 上面装一个 RDP Server 呢?是可以的,那就是 XRDP 服务器 (注8)。

很可惜的是,我们的 CentOS 6.x 缺省并没有提供 XRDP 的服务器,如果你有兴趣的话,可以自行编译 xrdp 软件, 但鸟哥有找到 Fedora 基金会提供的 RHEL 额外软件计划 (注9),你可以到底下的链接去找到你对应的版本:

鸟哥还是觉得 yum 是好东西,因此鸟哥找到的 CentOS 6.x x86_64 版本的网址后,将它设置在 yum 设置档内,就可以使用 yum 安装了:

[root@www ~]# vim /etc/yum.repos.d/fedora_epel.repo
[epel]
name=CentOS-$releasever - Epel
baseurl=http://download.fedora.redhat.com/pub/epel/6/x86_64/
gpgcheck=0
enabled=1

[root@www ~]# yum clean all
[root@www ~]# yum install xrdp

这样就安装好了 xrdp 软件了,接着下来就得要开始来设置它啰!老实说,在一般的主机上面安装好这个 xrdp 之后,你根本不需要调整任何设置档,保留好设置档就好了,然后启动它,并且设置开机后启动,未来只要用远程连接连到这部主机, 系统就会启动 5910~5920 以上的 VNC 端口口,然后你就能够通过 RDP 的协定取得 VNC 的画面,最后就能够登录系统啰!

[root@www ~]# /etc/init.d/xrdp start
[root@www ~]# chkconfig xrdp on
[root@www ~]# netstat  | grep xrdp
tcp        0      0 127.0.0.1:3350  0.0.0.0:*     LISTEN    6615/xrdp-sesman
tcp        0      0 0.0.0.0:3389    0.0.0.0:*     LISTEN    6611/xrdp
# 远程桌面的端口口是 3389 ,但是 xrdp 会再连到本机的 3350 去唤醒一个 VNC 的连接。
# 但是尚未连接之前,并不会起动任何的 VNC 端口口就是了。

如果你是使用 Windows 系统,那么通过『开始』-->『程序集』-->『附属应用程序』-->『远程桌面连接』, 在出现的画面中输入这部 xrdp 服务器的 IP 之后,如果顺利连上就会出现如下的画面:

连上服务器的 XRDP 服务后,会出现的连接信息
图 11.5-1、连上服务器的 XRDP 服务后,会出现的连接信息

连上服务器的 XRDP 服务后,会出现的连接信息
图 11.5-2、连上服务器的 XRDP 服务后,会出现的连接信息

输入正确的帐号密码,嘿嘿!搞定!画面就出现啰!如果你还想要更进一步的了解 xrdp 的设置档,那么请到 /etc/xrdp/ 目录底下瞧瞧,然后再通过 man 去看看相关的设置档信息,就能够理解设置值啰!鸟哥测试过,不用修改任何设置, 使用远程桌面就已经很顺畅啰! ^_^

不过你要注意的是,因为 xrdp 最终会自动激活 VNC ,因此你还是必须要安装 tigervnc-server 才行! 否则 xrdp 应该还是无法运作的呦!

11.6 SSH 服务器的高端应用

事实上 ssh 真的很好用!你甚至不需要启动甚么 xdmcp, vnc, xrdp 等等服务,使用 ssh 的加密信道就能够在用户端启动图形接口! 此外,我们知道很多服务都是没有加密的,那么能不能将这些服务通过 ssh 信道来加密呢?嘿嘿!当然是可以! 在这个章节当中,我们就来谈谈一些 ssh 的高端应用吧!

11.6.1 启动 ssh 在非正规端口口 (非 port 22)

从前面的章节里面我们就曾经提过, sshd 这个服务其实并不是很安全,所以很多 ISP 在入口处就已经将 port 22 关闭了!为什么要这么作呢?这是因为很多网站管理员并没有定期的进行软件 update ,而且为了方便,又很开心的将 port 22 对全世界开放。由于很多 cracker 会使用扫描程序乱扫整个 Internet 的端口口漏洞,这个 port 22 就是一个很常被扫描的端口口啦!为了杜绝这个问题,所以 ISP 先帮你把关,先将 port 22 关闭!这也是为了整个区网好!

只是,像鸟哥这种没有 ssh 就快要活不下去的人,关闭了 port 22 那鸟哥的头都痛了!没有办法工作啊! 那怎办?没关系,其实我们可以将 ssh 开放在非正规的端口口。如此一来, cracker 不会扫描到该端口口,而你的 ISP 又没有对该端口口进行限制,那你就能够使用 ssh 啰!很棒吧!那就来试看看。我们底下将 ssh 开放在 port 22 及 port 23 试看看 (请注意, port 23 不能够有被使用喔!)。

    设置 ssh 在 port 22 及 23 两个端口口的设置方式
[root@www ~]# vim /etc/ssh/sshd_config
Port 22
Port 23    <==注意喔!要有两个 Port 的设置才行!

[root@www ~]# /etc/init.d/sshd restart

但是这一版的 CentOS 却将 SSH 规范 port 仅能启动于 22 而已,所以此时会出现一个 SELinux 的错误!那怎办?没关系, 根据 setroubleshoot 的提示,我们必须要自行定义一个 SELinux 的规则放行模块才行!有没有很难呢?其实还算简单! 整体流程是这样的:

# 1. 于 /var/log/audit/audit.log 找出与 ssh 有关的 AVC 信息,并转为本地模块
[root@www ~]# cat /var/log/audit/audit.log | grep AVC | grep ssh | \
>  audit2allow -m sshlocal > sshlocal.te  <==扩展名要是 .te 才行
[root@www ~]# grep sshd_t /var/log/audit/audit.log | \
>  audit2allow -M sshlocal  <==sshlocal 就是刚刚创建的 .te 文件名
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i sshlocal.pp   <==这个指令会编译出这个重要的 .pp 模块!

# 2. 将这个模块加载系统的 SELinux 管理当中!
[root@www ~]# semodule -i sshlocal.pp

# 3. 再重新启动 sshd 并且观察端口口吧!
[root@www ~]# /etc/init.d/sshd restart
[root@www ~]# netstat -tlunp | grep ssh
tcp        0      0 0.0.0.0:22   0.0.0.0:*    LISTEN      7322/sshd
tcp        0      0 0.0.0.0:23   0.0.0.0:*    LISTEN      7322/sshd
tcp        0      0 :::22        :::*         LISTEN      7322/sshd
tcp        0      0 :::23        :::*         LISTEN      7322/sshd

有没有很简单!这样你就能够使用 port 22 或 port 23 连接到你的 sshd 服务喔!

    非正规端口口的连接方式

由于缺省的 ssh, scp, sftp 都是连接到 port 22 的,那么如何使用这些指令连接到 port 23 呢? 我们使用 ssh 当练习好了:

[root@www ~]# ssh -p 23 root@localhost
root@localhost's password:
Last login: Tue Jul 26 14:07:41 2011 from 192.168.1.101
[root@www ~]# netstat -tnp | grep 23
tcp  0  0 ::1:23               ::1:56645              ESTABLISHED 7327/2
tcp  0  0 ::1:56645            ::1:23                 ESTABLISHED 7326/ssh
# 因为网络是双向的,因此自己连自己 (localhost),就会抓到两只连接!

这样,你就能够避过一些 ISP 或者是 cracker 的扫描了!注意一下,不要将 port 开放在某些既知的端口口上, 例如你开放在 port 80 的话,那你就没有办法启动正常的 WWW 服务啦!注意注意!

11.6.2 以 rsync 进行同步镜像备份

我们曾在基础篇第三版第二十五章里头谈到 Linux 的备份策略, 该篇曾介绍常用的备份指令,包括 tar, dd, cp 等等,不过当时并未介绍网络,所以有个很棒的网络工具没有介绍, 那就是这个地方要谈到的 rsync 啦!这个 rsync 可以作为一个相当棒的异地备援系统的备份指令喔! 因为 rsync 可以达到类似『镜相 (mirror) 』的功能呢!

rsync 最早是想要取代 rcp 这个指令的,因为 rsync 不但传输的速度快,而且他在传输时, 可以比对本地端与远程主机欲拷贝的文件内容,而仅拷贝两端有差异的文件而已,所以传输的时间就相对的降低很多! 此外, rsync 的传输方式至少可以通过三种方式来运作:

  • 在本机上直接运作,用法就与 cp 几乎一模一样,例如:
    rsync -av /etc /tmp (将 /etc/ 的数据备份到 /tmp/etc 内)

  • 通过 rsh 或 ssh 的信道在 server / client 之间进行数据传输,例如:
    rsync -av -e ssh user@rsh.server:/etc /tmp (将 rsh.server 的 /etc 备份到本地主机的 /tmp 内)

  • 直接通过 rsync 提供的服务 (daemon) 来传输,此时 rsync 主机需要启动 873 port:
    1. 你必须要在 server 端启动 rsync , 看 /etc/xinetd.d/rsync 即可;
    2. 你必须编辑 /etc/rsyncd.conf 设置档;
    3. 你必须设置好 client 端连接的密码数据;
    4. 在 client 端可以利用:rsync -av user@hostname::/dir/path /local/path

其实三种传输模式差异在于有没有冒号 (:) 而已,本地端传输不需要冒号,通过 ssh 或 rsh 时,就得要利用一个冒号 (:), 如果是通过 rsync daemon 的话,就得要两个冒号 (::) ,应该不难理解啦!因为本地端处理很简单, 而我们的系统本来就有提供 ssh 的服务,所以,底下鸟哥将直接介绍利用 rsync 通过 ssh 来备份的动作喔。 不过,在此之前咱们先来看看 rsync 的语法吧!

[root@www ~]# rsync [-avrlptgoD] [-e ssh] [user@host:/dir] [/local/path]
选项与参数:
-v :观察模式,可以列出更多的信息,包括镜像时的文件文件名等;
-q :与 -v  相反,安静模式,略过正常信息,仅显示错误消息;
-r :递归拷贝!可以针对『目录』来处理!很重要!
-u :仅更新 (update),若目标文件较新,则保留新文件不会覆盖;
-l :拷贝链接档的属性,而非链接的目标源文件案内容;
-p :拷贝时,连同属性 (permission) 也保存不变!
-g :保存源文件案的拥有群组;
-o :保存源文件案的拥有人;
-D :保存源文件案的设备属性 (device)
-t :保存源文件案的时间参数;
-I :忽略更新时间 (mtime) 的属性,文件比对上会比较快速;
-z :在数据传输时,加上压缩的参数!
-e :使用的信道协定,例如使用 ssh 信道,则 -e ssh
-a :相当于 -rlptgoD ,所以这个 -a 是最常用的参数了!
更多说明请参考 man rsync 的解说!

# 1. 将 /etc 的数据备份到 /tmp 底下:
[root@www ~]# rsync -av /etc /tmp
....(前面省略)....
sent 21979554 bytes  received 25934 bytes  4000997.82 bytes/sec
total size is 21877999  speedup is 0.99
[root@www ~]# ll -d /tmp/etc /etc
drwxr-xr-x. 106 root root 12288 Jul 26 16:10 /etc
drwxr-xr-x. 106 root root 12288 Jul 26 16:10 /tmp/etc <==瞧!两个目录一样!
# 第一次运作时会花比较久的时间,因为首次创建嘛!如果再次备份呢?

[root@www ~]# rsync -av /etc /tmp
sent 55716 bytes  received 240 bytes  111912.00 bytes/sec
total size is 21877999  speedup is 390.99
# 比较一下两次 rsync 的传输与接受数据量,你就会发现立刻就跑完了!
# 传输的数据也很少!因为再次比对,仅有差异的文件会被拷贝。

# 2. 利用 student 的身份登录 clientlinux.centos.vbird 将家目录拷贝到本机 /tmp
[root@www ~]# rsync -av -e ssh student@192.168.100.10:~ /tmp 
student@192.168.100.10's password:  <==输入对方主机的 student 密码
receiving file list ... done
student/
student/.bash_logout
....(中间省略)....
sent 110 bytes  received 697 bytes  124.15 bytes/sec
total size is 333  speedup is 0.41

[root@www ~]# ll -d /tmp/student
drwx------. 4 student student 4096 Jul 26 16:52 /tmp/student
# 瞧!这样就做好备份啦!很简单吧!

你可以利用上面的范例二来做为备份 script 的参考!不过要注意的是,因为 rsync 是通过 ssh 来传输数据的,所以你可以针对 student 这个家伙制作出免用密码登录的 ssh 密钥! 如此一来往后异地备援系统就能够自动的以 crontab 来进行备份了!简单到爆!

免密码的 ssh 帐号我们在上头已经讲过了,撰写 shell script 的能力也是必须要有的!利用 rsync 来进行你的备份工作吧! ^_^!至于更多的 rsync 用法可以参考本章后面所列出的参考网站(注10)喔!

例题:
在 clientlinux.centos.vbird (192.168.100.10) 上面,使用 vbirdtsai 的身份创建一只脚本,这只脚本可以在每天的 2:00am 主动的以 rsync 配合 ssh 取得 www.centos.vbird (192.168.100.254) 的 /etc, /root, /home 三个目录的镜像到 clientlinux.centos.vbird 的 /backups/ 底下。
答:
由于必须要通过 ssh 信道,且必须要使用 crontab 例行工作调度,因此肯定要使用密钥系统的免密码帐号。我们在 11.2.6 小节已经谈过相关作法, vbirdtsai 已经有了公钥与私钥文件,因此不要再使用 ssh-keygen 了,直接将公钥文件拷贝到 www.centos.vbird 的 /root/.ssh/ 底下即可。 实际作法可以是这样的:
# 1. 在 clientlinux.centos.vbird 将公钥档拷贝给 www.centos.vbird 的 root
[vbirdtsia@clientlinux ~]$ scp ~/.ssh/id_rsa.pub root@192.168.100.254:~

# 2. 在 www.centos.vbird 上面用 root 建置好 authorized_keys
[root@www ~]# ls -ld id_rsa.pub .ssh
-rw-r--r--. 1 root root  416 Jul 26 16:59 id_rsa.pub <==有公钥档
drwx------. 2 root root 4096 Jul 25 11:44 .ssh       <==有 ssh 的相关目录

[root@www ~]# cat id_rsa.pub >> ~/.ssh/authorized_keys
[root@www ~]# chmod 644 ~/.ssh/authorized_keys

# 3. 在 clientlinux.centos.vbird 上面撰写 script 并测试运行:
[vbirdtsai@clientlinux ~]$ mkdir ~/bin ; vim ~/bin/backup_www.sh
#!/bin/bash
localdir=/backups
remotedir="/etc /root /home"
remoteip="192.168.100.254"

[ -d ${localdir} ] || mkdir ${localdir}
for dir in ${remotedir}
do
        rsync -av -e ssh root@${remoteip}:${dir} ${localdir}
done

[vbirdtsai@clientlinux ~]$ chmod 755 ~/bin/backup_www.sh
[vbirdtsai@clientlinux ~]$ ~/bin/backup_www.sh
# 上面在测试啦!第一次测试可能会失败,因为鸟哥忘记 /backups 需要 root
# 的权限才能够创建。所以,请您再以 root 的身份去 mkdir 及 setfacl 吧!

# 4. 创建 crontab 工作
[vbirdtsai@clientlinux ~]$ crontab -e
0 2 * * * /home/vbirdtsai/bin/backup_www.sh

11.6.3 通过 ssh 信道加密原本无加密的服务

现在我们知道 ssh 这个信道可以加密,而且,我们更知道 rsync 缺省已经可以通过 ssh 信道来进行加密以进行镜像传输。 既然如此,那么其他的服务能不能通过这个 ssh 进行数据加密来发送信息呢?当然可以!很棒呢这个功能! 要介绍实做之前,我们先用图标来谈一下作法。

假设服务器上面有启动了 VNC 服务在 port 5901 ,用户端则使用 vncviewer 要连接到服务器上的 port 5901 就是了。 那现在我们在用户端电脑上面启动一个 5911 的端口口,然后再通过本地端的 ssh 连接到服务器的 sshd 去,而服务器的 sshd 再去连接服务器的 VNC port 5901 。整个连接的图标如下所示:

通过本地端的 ssh 加密连接到远程的服务器示意图
图 11.6-1、通过本地端的 ssh 加密连接到远程的服务器示意图

假设你已经通过上述各个小节创建好服务器 (www.centos.vbird) 上面的 VNC port 5901 ,而用户端则没有启动任何的 VNC 端口口。 那么你该如何通过 ssh 来进行加密呢?很简单,你可以在用户端电脑 (clientlinux.centos.vbird) 运行底下的指令:

[root@clientlinux ~]# ssh -L 本地端口口:127.0.0.1:远程端口口 [-N] 远程主机
选项与参数:
-N :仅启动连接信道,不登录远程 sshd 服务器
本地端口口:就是打开 127.0.0.1 上面一个监听的端口口
远程端口口:指定连接到后面远程主机的 sshd 后,sshd 该连到哪个端口口进行传输

# 1. 在用户端启动所需要的端口口进行的指令
[root@clientlinux ~]# ssh -L 5911:127.0.0.1:5901 -N 192.168.100.254
root@192.168.100.254's password:
   <==登录远程仅是打开一个监听端口口,所以停止不能动作

# 2. 在用户端在另一个终端机测试看看,这个动作不需要作,只是查阅而已
[root@clientlinux ~]# netstat -tnlp| grep ssh
tcp  0   0 0.0.0.0:22           0.0.0.0:*            LISTEN      1330/sshd
tcp  0   0 127.0.0.1:5911       0.0.0.0:*            LISTEN      3347/ssh
tcp  0   0 :::22                :::*                 LISTEN      1330/sshd
[root@clientlinux ~]# netstat -tnap| grep ssh
tcp  0   0 192.168.100.10:55490 192.168.100.254:22   ESTABLISHED 3347/ssh
# 在用户端启动 5911 的端口口是 ssh 启动的,同一个 PID 也连接到远程喔!

接下来你就可以在用户端 (192.168.100.10, clientlinux.centos.vbird) 使用『 vncviewer localhost:5911 』来连接, 但是该连接却会连到 www.centos.vbird (192.168.100.254) 那部主机的 port 5901 喔!不相信吗? 当你达成 VNC 连接后,到 www.centos.vbird 那部主机上面瞧瞧就知道了:

# 3. 在服务器端测试看看,这个动作不需要作,只是查阅而已
[root@www ~]# netstat -tnp | grep ssh
tcp   0  0 127.0.0.1:59442     127.0.0.1:5901        ESTABLISHED 7623/sshd: root
tcp   0  0 192.168.100.254:22  192.168.100.10:55490  ESTABLISHED 7623/sshd: root
# 明显的看到 port 22 的进程同时连接到 port 5901 喔!

那如何取消这个连接呢?先关闭 VNC 之后,然后再将 clientlinux.centos.vbird 的第一个动作 (ssh -L ...) 按下 [ctrl]-c 就中断这个加密信道啰!这样会使用了吗?你可以将这个动作用在任何服务上喔!

11.6.4 以 ssh 信道配合 X server 传递图形接口

从前一个小节我们知道 ssh 可以进行程序的加密传递,亦即 ssh 信道啦!那么可不可以用在 X 上面呢? 意思是说,那我能不能不要启动甚么很复杂的接口,就是在原有的接口底下使用 ssh 信道,将我所需要的服务器上面的图形接口传过来就好了? 是可以的喔!鸟哥用一个 Windows 上面的 Xming X server 作范例好了。整个动作是这样的:

  • 先在 Windows 上面启动 XLaunch,并设置好连接到 www.centos.vbird 的相关信息;
  • 启动 Xming 程序,会取得一个 xterm 程序,该程序是 www.centos.vbird 的程序;
  • 开始在 xterm 上面运行 X 软件,就会在 Windows 桌面上面显示啰!

那我们就开始来处理一下 Xming 这个程序吧!启动 XLaunch 之后出现下图模样:

启动 XLaunch 程序-选择显示模式
图 11.6-2、启动 XLaunch 程序-选择显示模式

记得上图中要选择 Multiple windows 会比较漂亮喔!然后按下『下一步』会出现下图:

设置 XLaunch 程序-选择连接方式
图 11.6-3、设置 XLaunch 程序-选择连接方式

我们要启动一只程序,并且是开放在 ssh/putty 之类的软件帮忙进行 ssh 信道的创建喔!然后下一步吧。

设置 XLaunch 程序-设置远程连接的相关参数
图 11.6-4、设置 XLaunch 程序-设置远程连接的相关参数

Xming 会主动的启动一个 putty 的进程帮你连进 sshd 服务器,所以这里得要帮忙设置好帐号密码的相关信息。 鸟哥这里假设你的 sshd 尚未取消 root 登录,因此这里使用 root 的权限喔!

设置 XLaunch 程序-是否支持拷贝粘贴功能
图 11.6-5、设置 XLaunch 程序-是否支持拷贝粘贴功能

使用默认值吧!直接下一步。

设置 XLaunch 程序-完成设置
图 11.6-6、设置 XLaunch 程序-完成设置

很简单!这样就完成设置了!请按下完成,你就会看到 Windows 的桌面竟然出现如下的图标了!

Windows 桌面出现的 X client 程序
图 11.6-7、Windows 桌面出现的 X client 程序

上面这只程序就是 xterm 这个 X 的终端机程序。你可以在上面输入指令,该指令会发送到 Linux server , 然后再将你要运行的图形数据通过 ssh 信道发送到目前的 Windows 上面的 Xming ,你的 Linux 完全不用启动 VNC, X, xrdp 等服务!只要有 sshd 就搞定了!就是这么简单!例如鸟哥输入几个游戏程序, 你的 Windows 窗口 (看任务栏就知道了) 就会出现这样的情况:

Tips 鸟哥 事实上,我们的 basic server 安装方式并没有帮你安装 xterm 喔!所以,你得要自己安装 xterm 才行! yum install xterm 就安装好啦!然后上面的动作再重来一次,就可以成功啰!而底下的图标里面的相关软件, 也是需要你自己安装的呦! ^_^
Windows 桌面出现的 X client 程序
图 11.6-8、Windows 桌面出现的 X client 程序

11.7 重点回顾

  • 远程连接服务器可以让用户在任何一部电脑登录主机,以使用主机的资源或管理与维护主机;
  • 常见的远程登录服务有 rsh, telnet, ssh, vnc, xdmcp 及 RDP 等;
  • telnet 与 rsh 都是以明码传输数据,当数据在 Internet 上面传输时较不安全;
  • ssh 由于使用密钥系统,因此数据在 Internet 上面传输时是加密过的,所以较为安全;
  • 但 ssh 还是属于比较危险的服务,请不要对整个 Internet 开放 ssh 的可登录权限,可利用 iptables 规范可登录范围;
  • ssh 的 public Key 是放在服务器端,而 private key 是放在 client 端;
  • ssh 的连接机制有两种版本,建议使用可确认连接正确性的 version 2 ;
  • 使用 ssh 时,尽量使用类似 email 的方式来登录,亦即: ssh username@hostname
  • client 端可以比对 server 传来的 public key 的一致性,利用的文件为 ~user/.ssh/known_hosts;
  • ssh 的 client 端软件提供 ssh, scp, sftp 等程序;
  • 制作不需要密码的 ssh 帐号可利用 ssh-keygen -t rsa 来制作 public, private Key pair;
  • 上述指令所制作出的 public key 必须要上传到 server 的 ~user/.ssh/authorized_keys 文件中;
  • Xdmcp 是通过 X display manager (xdm, gdm, kdm 等) 所提供的功能协定;
  • 若 client 端为 Linux 时,需要在 X 环境下以 xhost 增加可连接到本机 X Server 的 IP 才行;
  • 除了 Xdmcp 之外,我们可以利用 VNC 来进行 X 的远程登录架构;
  • VNC 缺省开的 port number 为 5900 开始,每个 port 仅允许一个连接;
  • rsync 可通过 ssh 的服务信道或 rsync --daemon 的方式来连接传输,其主要功能可以通过类似镜像备份, 仅备份新的数据,因此传输备份速度相当快速!

11.8 本章习题

  • Telnet 与 SSH 都是远程连接服务器,为何我们都会推荐使用 SSH 而避免使用 Telnet 呢?原因何在?
    因为 Telnet 除了使用『明码』发送数据外,本身 telnet 就是很容易被入侵的一个服务器,所以当然也就比较危险了。 至于 ssh 其实也不是很安全的!由台湾电脑危机处理小组的文档可以明显的发现 openssl + openssh 也是常常有漏洞在发布!不过,比起 telnet 来说,确实是稍微安全一些!
  • 请尝试说明 SSH 在 Server 与 Client 端连接时的封包加密机制;
    利用 key pair 来达到加密的机制:Server 提供 Public Key 给 Client 端演算 Private key ,以提供封包发送时的加密、解密!
  • 请问 SSH 的设置档是哪一个?如果我要修改让 root 无法使用 SSH 连接进入我的 SSH 主机,应该如何设置?又,如果要让 badbird 这个用户无法登录 SSH 主机,该如何设置?
    SSH 设置档文件名为 sshd_config ,通常放置在 /etc/ssh/sshd_config 内;如果不想让 root 登录,可以修改 sshd_config 内的参数成为:『PermitRootLogin no 』,并重新启动 ssh 来设置!如果要让 badbird 用户无法登录,同样在 sshd_config 里面设置为:『DenyUsers badbird』即可!
  • 在 Linux 上,缺省的 Telnet 与 SSH 服务器使用的端口口(port number)各为多少?
    telnet 与 ssh 的端口口分别是:23 与 22!请参考 /etc/services 喔!
  • 如果发现我无法在 Client 端使用 ssh 程序登录我的 Linux 主机,但是 Linux 主机却一切正常,可能的原因为何?(防火墙、known_hosts...)
    无法登录的原因可能有很多,最好先查找一下 /var/log/messages 里面的错误消息来判断,当然,还有其他可能的原因为:
    1. 被防火墙挡住了,请以 iptables -L -n 来察看,当然也要察看 /etc/hosts.deny;
    2. 可能由于主机重新开机过, public key 改变了,请修改你的 ~/ssh/known_hosts 里面的主机 IP ;
    3. 可能由于 /etc/ssh/sshd_config 里面的设置问题,导致你这个用户无法使用;
    4. 在 /etc/passwd 里面,你的 user 不具有可以登录的 shell ;
    5. 其他因素(如帐号密码过期等等)
  • 既然 ssh 是比较安全的数据封包发送方式,那么我就可以在 Internet 上面开放我的 Linux 主机的 SSH 服务了吗?!请说明你选择的答案的原因!
    最好不要对 Internet 开放你的 SSH 服务,因为 SSH 的加密函数库使用的是 openssl ,一般 Linux distribution 使用的 SSH 则是 openssh ,这两个套件事实上仍有不少的漏洞被发布过,因此,最好不要对 Internet 开放,毕竟 SSH 对于主机的使用权限是很高的!

11.9 参考数据与延伸阅读

修改历史:
  • 2002/11/14:第一次完成
  • 2003/03/08:加入标头说明,与修改部分内容,例如 Telnet 服务器软件的安装等等,以及 SSH 的 putty 使用中文状态!
  • 2003/09/09:将本文进行一些修订,此外,加入了课后练习!
  • 2005/07/02:将旧的文章移动到 这里
  • 2005/07/07:好不容易将 VNC 还有 XDMCP 给他写了写~大家帮鸟哥参考看看啊~
  • 2005/07/09:加入了让 VNC 与 tty7 同步的 vnc.so 模块的说明
  • 2005/11/22:加入了 RSH 服务器 的相关数据!
  • 2006/09/18:将 putty 的介绍转成 pietty 的介绍!因为 pietty 更好用!另外也将 rsh 重新改写一下,校稿过!
  • 2006/09/19:加入 rsync 的简易说明与操作!最文末的习题可以瞧一瞧!
  • 2011/02/15:将旧的基于 CentOS 4.x 的文章移动到 此处
  • 2011/02/17:忍痛删除 telnet 服务器,毕竟真的很少用了~包括那个 rsh 也不再介绍!有兴趣的请参考 CentOS 4.x 的旧文章吧
  • 2011/02/20:将 sshd 服务器作个简单的修改了,增加一些篇幅来说明相关例题与实做,尤其是 ~/.ssh/authorized_keys 的权限
  • 2011/02/23:修改了许多 Xdmcp, VNC 的设置与图标,最重要是加入 xrdp 的安装与使用
  • 2011/02/24:加入 Xming 通过 X11 forward from ssh 的方式!
  • 2011/07/25:将基于 CentOS 5.x 的版本移动到此处
  • 2011/07/26:将所有的图标以及相关的网站 IP 通通改为 CentOS 6.x 以及第三章谈到的区网架构啰!
  • 2011/11/24:经由网友的回报,在 ssh 连接方式里面谈到的公私钥系统是错误的!经过查找后,已经将正确的版本放上去了!
  • 2011/11/24:由于是较大幅度的改版,所以旧版也将它保留下来,按这里连接。
2002/11/14以来统计人数
计数器
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计