Putty|OpenSSH与Putty
OpenSSH与Putty
写在开始之前
其实这是一篇介绍Putty使用的文章,文章不会太关注于技术细节和其它客户端的比较,原本想把文章的题目叫“Putty的使用”,但是又觉得文章介绍的内容并非是Putty独有的功能,而是OpenSSH的一些功能,所以最终还是选择使用“OpenSSH与Putty”,希望这个题目会相对贴切一些。
每当看到一些朋友或同事使用SecureCRT的时候,我总是会问一句:“为什么使用SecureCRT呢,这个软件不免费,需要破解,需要安装……?”,一般得到的答复都是:“习惯了,刚开始接触就用这个,你用什么呢?”,没错,很多时候人总是让惯性所左右了,很多事情都是习惯了,因为习惯了,所以我要继续保持现状……,其实我刚开始接触SSH的时候,使用的也是SecureCRT,并且这个软件对Serial支持也很好,对于网管来说,再也不用忍受Windows自带的“超级终端”了。后来想让自己尽量尊重知识产权,尽量少使用破解、盗版软件,所以逐步替换机器上的破解软件,具体是什么时候开始使用Putty我也记不太清楚了,肯定是2006年以前的事情了,当时Putty还不支持Serial,现在最新版本已经支持了,虽然不支持Xmodem(需要使用的时候,可以使用超级终端嘛)。
因为前一段时间和段老师讨论通过SSH编辑远程主机上的UTF-8文件的时候讨论到了Putty,段老师建议我写一篇Putty的使用手册,发在我们的博客上,充分利用这个平台交流,所以这篇文章和大家见面了,由于本人水平有限,如有错误,欢迎指正。
SSH的出现
在2000年以前,如果你管理很多Unix或Linux的机器,你可能对telnet非常熟悉,因为要通过telnet远程管理这些主机。如果你是一个网管,登录交换机、路由器也只能通过telnet来实现,后来大家越来越重视网络安全,在各个Linux发行版本中默认启用的都是通过SSH远程登录,之后在交换机和路由器上也实现了通过SSH登录,以提高系统的安全性。
Secure Shell(SSH)在维基百科上的解释是:在两个网络设备之间通过安全通道传输数据的一种网络协议。专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。透过 SSH 可以对所有传输的数据进行加密,也能够防止 DNS 欺骗和 IP 欺骗。SSH 之另一项优点为其传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替 Telnet,又可以为FTP、POP、甚至为 PPP 提供一个安全的“通道”。相信总有一天你会和我有一样的感觉“Great SSH”。
为什么使用Putty
为什么使用Putty?我也问过我自己好多遍,为什么使用它,想来想去,我觉得首先它是开源的,其次它很小巧(putty.exe只有444K),再次免安装,在任何一台机器,只要上网下载putty.exe即可通过用户名/密码登录远程主机,Putty界面很简洁,整个屏幕只有标题栏和滚动栏,剩下的空间全是你的啦。
如果你还使用WinSCP来传输文件,WinSCP和Putty使用的是相同的Pageant(使用公钥验证),你只需在本地开一个Pageant,就可以使用WinSCP在你机器和远程主机之间传输文件,也可以使用Putty远程登录其它主机。
当然,Putty也不是十全十美的,至少现在我觉得是有一些缺陷;首先、Putty不能帮你保存密码,如果你习惯了SecureCRT,因为SecureCRT可以帮你保存密码,你可能会觉得很不习惯;其次、Putty最新版本虽然支持Serial,但是不支持Xmodem,如果你要升级交换机软件版本,需要通过Xmodem传输软件包,那Putty可能无能为力。
如何获得Putty
习惯使用搜索引擎,登录http://www.google.com输入putty,返回的第一条记录就是你要的答案。从http://www.chiark.greenend.org.uk/~sgtatham/putty/ 可以获得最新版本的Putty软件,你可以选择下载完整的zip软件包,也可以单独下载你需要的一个用程序。
- PuTTY (the Telnet and SSH client itself)
- PSCP (an SCP client, i.e. command-line secure file copy)
- PSFTP (an SFTP client, i.e. general file transfer sessions much like FTP)
- PuTTYtel (a Telnet-only client)
- Plink (a command-line interface to the PuTTY back ends)
- Pageant (an SSH authentication agent for PuTTY, PSCP and Plink)
- PuTTYgen (an RSA and DSA key generation utility).
一共包含了这些文件,一般比较常用的就是Putty、Pageant、PuttyGen。
Putty使用之基础篇
下载Putty.exe后第一运行出现这样的对话框:
当然,在配置文件区域(Saved Sessions)中只有一个Default Settings,当然了,你可以通过修改默认配置,然后为不同的主机保存不同的配置文件。如上图的(BSD_wzk CNC_wzk …)。
登录篇
基本使用方法很简单:
在Host Name(or IP address)输入你要登录主机的域名或IP地址,如果使用的是非默认端口,需要修改Port的值,然后选择Open即可连接主机,接着分别输入用户名和密码即可登录上远程主机。
小技巧:如果你觉得每次都输入用户名比较麻烦,下载最新版本的Putty(老版本不支持该功能),在Host Name(or IP address)输入 USER@host 即可省略用户名的输入,如: wzk@www.wenzk.net 下次登录的时候只需输入密码即可。
中文篇:
1、字符集问题
现在最新版本对中文的支持已经很不错了,如果是老版本除了需要关注字符编码问题,还需要关注这个地方的设置:
Window->Appearance->Font settings->Change…
注意使用“新宋体”,字号根据自己喜好即可,字符集选择“GB2312”,如下图:
不过似乎新版本不需这样配置(新版本的Putty,且不使用UTF-8编码),直接使用默认配置也可以正常显示中文,应该是一个进步吧。
2、字符编码问题
如果你使用Linux有7-8年左右,你可能会发现UTF-8编码使用越来越普遍了,现在Linux默认就使用UTF-8编码了。在RedHat 7.2默认配置:
[wzk@intranet ~]$ locale
LANG=en_US
LC_CTYPE=”en_US”
LC_NUMERIC=”en_US”
LC_TIME=”en_US”
LC_COLLATE=”en_US”
LC_MONETARY=”en_US”
LC_MESSAGES=”en_US”
LC_PAPER=”en_US”
LC_NAME=”en_US”
LC_ADDRESS=”en_US”
LC_TELEPHONE=”en_US”
LC_MEASUREMENT=”en_US”
LC_IDENTIFICATION=”en_US”
LC_ALL=
[wzk@intranet ~]$
而现在的Linux发行版本却是这样的(CentOS 5.2):
[wzk@netmon ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE=”en_US.UTF-8″
LC_NUMERIC=”en_US.UTF-8″
LC_TIME=”en_US.UTF-8″
LC_COLLATE=”en_US.UTF-8″
LC_MONETARY=”en_US.UTF-8″
LC_MESSAGES=”en_US.UTF-8″
LC_PAPER=”en_US.UTF-8″
LC_NAME=”en_US.UTF-8″
LC_ADDRESS=”en_US.UTF-8″
LC_TELEPHONE=”en_US.UTF-8″
LC_MEASUREMENT=”en_US.UTF-8″
LC_IDENTIFICATION=”en_US.UTF-8″
LC_ALL=
[wzk@netmon ~]$
现在越来越多的网页也使用UTF-8编码了,但是有很多老的代码使用的仍然是GB2312编码,在新的Linux发行版本中进行修改的时候可能会有很大的麻烦,vi之后发现是乱码,这个一般都是编码的问题。
一般说来,要正确显示汉字,编码方面需要有3个统一:客户端,Linux环境变量和文件编码。这三个方面的编码需要统一,必须以文件为准,因为你编辑的是文件,文件使用的是UTF-8编码,别的设置也设置成UTF-8编码,否则肯定出现乱码。
Putty设置使用UTF-8编码:
Window->Translation->Character set translation on recieved data->UTF-8
保存后,你客户端的UTF-8编码就设置成功了,默认使用的是“Use font encoding”。
Linux环境变量设置使用UTF-8编码:
一般来说新版本的Linux发行版都使用UTF-8编码了,可以使用locale命令来检查,如果不是,在BASH下可以使用export LANG=xx_XX.UTF-8来设置,xx_XX一般为zh_CN或en_US。
[wzk@intranet ~]$ export LANG=en_US.UTF-8
[wzk@intranet ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE=”en_US.UTF-8″
LC_NUMERIC=”en_US.UTF-8″
LC_TIME=”en_US.UTF-8″
LC_COLLATE=”en_US.UTF-8″
LC_MONETARY=”en_US.UTF-8″
LC_MESSAGES=”en_US.UTF-8″
LC_PAPER=”en_US.UTF-8″
LC_NAME=”en_US.UTF-8″
LC_ADDRESS=”en_US.UTF-8″
LC_TELEPHONE=”en_US.UTF-8″
LC_MEASUREMENT=”en_US.UTF-8″
LC_IDENTIFICATION=”en_US.UTF-8″
LC_ALL=
通过以上设置,你在Linux上通过VI打开一个UTF-8编码的文件就不会乱码了。在BSD上就更麻烦一些了,可以借助Google来搞定。
如果文件使用的是非UTF-8编码,而是普通的GBK或GB2312编码,在Putty的设置选择“Use font encoding”即可,Linux环境变量使用export LANG=xx_XX即可。
Putty使用之提高篇
1、公钥验证
对于很多人来说,可能习惯使用用户名/密码方式来登录服务器,使用密码验证带来的麻烦就是记忆一堆繁琐的密码,如果你管理很多机器,唯一的办法就是把所有机器的口令都设置成同一个,一般都建议使用与自己无关的口令,长度至少6位以上,包含字符(大小写)、数字和特殊符号,建议1-3月更换一次,记忆和更换密码将是很大的一个工程,如果完全依靠人脑来记忆这些没有任何规则的口令,几乎是不太可能的。
使用公钥验证可以很轻松的解决密码管理的问题,使用公钥验证,你根本不需要去关心系统上你的用户的密码是什么,因为你登录的时候不需要提供这个密码(除非你使用sudo),有些管理员为了安全,直接关闭密码验证,通过ssh登录根本不给你提供密码验证的机会,也就不用关心机器上用户的口令是否是弱口令的问题了。(现在把root口令设置成123456放在互联网上,不到一天的时间,再用root/123456或许就登录不上去了。)
公钥为什么安全,我个人觉得:1、因为公/私钥长度一般都是1024或2048位,如果别人要猜测你的私钥,要生成一个1024位的私钥并且与服务器上的公钥对应上应该不是很容易的事情吧(个人不懂密码学,所以不了解细节)。2、私钥一直是你自己保管的,别人(包括管理员)不可能获得你的私钥。3、私钥可以用一个PassPhrase保护起来,需要一个PassPhrase才能打开并使用你的私钥。
1)、如何生成公/私钥
需要使用公/私钥验证,首先必须生成一对密钥,当然你可以使用OpenSSH的ssh-keygen来生成,这里介绍使用图形化的PuttyGen.exe来生成。
在Parameters中可以选择密钥的类型(默认使用:SSH-2RSA),也可选择密钥的长度(默认:1024位)。点击“Generate”开始创建,创建的时候鼠标需要在空白框内移动,用于获取相对随机的随机数。
可以在Key passphrase中输入你的私钥的保护密码(这个必须记住,用来打开你的私钥,忘记就必须重新生成了)。
选择“Save private key”把生成的私钥保存成一个“.ppk”文件,以后Pageant.exe会用到。图中灰色框中显示的就是你的公钥(放到服务器上去的),类似以下内容(每个人生成的key是不一样的,每次生成的也不一样):
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiv/Unjvcm1GqvvtRET/IGk3nuR/YvlM1clRzoGi1LqY6zu6wgjT5q6VvfL3PHmBGx6V2GbHwvie91R5Y42oTsTvnUtryrPqfDisc3CIfCDBZjOWiPpSjwM46+Mjfj/xuyOe8NCcTkzcBlbx9ySQojRjiCnIt8oxESOYMlCbPvuc= rsa-key-20090122
到此为止,你的公/私钥就生成完毕了,记住:私钥自己保管好,任何人都不要给,否则你就需要更换你所有服务器上的公钥。公钥也保存好,建议放到某个web服务器上,让你可以从别的主机通过curl或wget下载得到,例如将文件保在http://mrtg.neu.edu.cn/authorized_keys中。
2)、如何处置公钥
公钥是放到服务器上的,对普通用户来说,应该把公钥放到什么地方呢?一般说来,OpenSSH默认配置(记住是默认配置,也有特殊的,具体可以问管理员)是使用用户目录下的.ssh/authorized_keys作为信任公钥列表,每行一个公钥(如果.ssh不存在,可以自己创建,如果authorized_keys不存在,这个文件一般都不存在,也可以自己创建)。以下演示如何创建该文件:
注意:用你自己的身份去创建目录和文件,最好保证目录权限为700,authorized_keys文件权限为600,在某些要求比较严的系统上会检查这个文件和目录的权限是否正确,如果有问题,就不允许你通过公钥验证登录。
3)、如何使用私钥登录服务器
在服务器上配置好后,你可以试着从客户端使用私钥登录服务器,使用SecureCRT的用户可能习惯在配置文件中选择一个私钥用户登录服务器,但是Putty不支持这种方式,Putty要使用公/私钥方式,必须在客户端启用Pageant.exe这个程序。
启动Pageant后,系统托盘上会有Pageant图标。
双击图标出现如下界面。
从上面可以看到,在Key list中没有任何私钥加入进来,所以我们要把刚才生成的私钥加入到列表中,选择“Add Key”,然后选择刚才保存的.ppk文件,输入打开私钥的PassPhrase,如图:
如果你使用不同的私钥登录不同的服务器,你也可以将多个私钥加入到Pageant中来,在登录系统的时候,Pageant会自动为你挑选一个私钥用于验证。
完成上述步骤后,重新登录你的服务器,看是否不再向你提示输入密码就可以登录进去了。
小窍门:如果你常使用的只有一个Key,每次打开Pageant.exe之后,然后点击系统托盘上的图标,然后添加Key,是否会太繁琐呢?解决办法:创建一个Pageant.exe的快捷方式,修改快捷方式的内容,把目标改成 D:\CommonSoft\putty\PAGEANT.EXE D:\xxx\xxx.PPK,这样每次点击这个快捷方式打开Pageant.exe直接提示输入xxx.ppk的PassPhrase,成功之后就这个key就加入到Pageant中了。
2、TCP Port Forwarding
相信用过SSL VPN的人知道这么一个功能,如下面的网络结构:
A —— B —— C
假设你是A,A无法访问C的TCP/23端口,但是B却可以访问C的TCP/23端口,A如何便捷的通过B访问到C呢,使用TCP Port Forwarding就可以实现这个功能了,不过仅限TCP协议。
如上图所示,A想通过B访问C(bbs.neu.edu.cn/TCP/23)的bbsd服务,只需通过如下设置即可:
修改当前Session的配置(在标题栏上点击鼠标右键,选择“Change Settings”即可),在Connection->Tunnels
Source port:是在你本机监听的一个端口,隧道建立之连接这个端口即可。
Destination:隧道的另一端是哪个机器,哪个端口,这里应该写bbs.neu.edu.cn:23。
因为是在本机监听端口,所以选择的是Local Forwarding。关于Remote类似,在远程监听端口,用于反向访问。
完成后点击Add添加,选择Apply应用。
配置完成后,在A机器上可以通过telnet localhost 1111访问C机器上的bbs.neu.edu.cn:23端口了。
再看看B机器的TCP连接情况
多了一条tcp 0 0 192.168.255.185:55043 202.118.1.82:23 ESTABLISHED,这个就是TCP Prot Forwarding的结果。
3、Socks代理
如果把TCP Port Forwarding看着是TCP的特定目的地址特定端口代理的话,那么Socks代理功能就是全能代理了,配合知名的Socks CAP v2,可以实现任何程序都通过服务器代理上网,也不用在服务器上安装任何代理软件(可谓是代理上网不留痕啊)。
配置Putty:
修改当前Session的配置(在标题栏上点击鼠标右键,选择“Change Settings”即可),在Connection->Tunnels
Source port:是在你本机监听的一个端口,也就是本机Socks代理的端口。
Destination:留空
类型选择:Dynamic(动态)
同样选择“Add”后选择“Apply”应用设置生效。
IE配置使用Socks代理方法如上图,使用IE访问互联网试试:
呵呵,测试而已。
记住,Socks代理利器:Sockscap,目前似乎最新版本是2.40。
4、WinSCP与Pageant
只要在客户端启动了Pageant,并且把相应的Key都加入到keylist中,在使用WinSCP的时候会自动使用Pageant中的私钥,无需使用密码。
之后选择Login即可,当然你也可以单独为某个主机选择一个私钥,个人比较习惯使用Pageant。
5、Key Agent Forwarding
前面已经介绍过使用Pageant的使用,在本机启用Pageant之后,登录任何服务器都不需要提供密码了,直接从Pageant取私钥进行验证。这种方式似乎有一点点缺陷,任何一台服务器都需要从A直接登录,即:
A ——– B
|
C
必须从A登录B和A登录C,如果A登录B之后,想从B登录C,此刻系统仍然提示输入密码,试图通过密码验证来登录服务器。如果A无法直接访问C,最傻瓜的方法是A把私钥在B服务器上放一份,在从B登录C的时候使用B上面的私钥登录,这样大大的降低了私钥的安全性。
为了解决这样一个问题,Key Agent Forwarding就诞生了,其目的是只要你在A上开启了Pageant,你登录B之后,从B登录其它任何服务器,公钥验证都可以Forwarding到A上面来验证。即从B登录C也不需要输入密码了,在B上也不需要保存一份私钥文件。配置Key Agent Forwarding如下:
修改Session配置,Connection->SSH->Auth,选上Allow agent forwarding即可。
A —— B —— C —— D
这样从A登录到B,在B通过ssh C可以直接使用公钥验证。
如果从在C上还希望ssh D也通过使用公钥验证,这在登录C的时候需要打开ssh的key agent forwarding,使用ssh –X C即可。
6、关于配置文件(段老师提供)
关于Session 配置的存储和备份,我补充一点,对于在多台计算机上使用putty或者系统备份与重装很有用:
1、Putty把session信息存储在注册表中,而不是配置文件里。要把配置信息导出来,可以用:
REG EXPORT HKCU\Software\SimonTatham\PuTTY Putty.reg
在新的计算机上导入:
REG IMPORT Putty.reg
2、使用另一个putty版本:portaPuTTY ,把session信息存储在配置文件,而不是注册表,可以算绿色软件了吧。软件下载地址:http://socialistsushi.com/2005/11/17/portaputty
7、其他
X11 frowarding … 等等功能,大家用用Google吧,都是SSH的功能,在Putty上也能体现。
结束语
罗罗嗦嗦的讲了一大堆,我自己都晕了,希望大家不要晕,能给不熟悉SSH和Putty的用户起到一个抛砖引玉的作用,或许某一天你会从你嘴里说出“Great SSH”。
No comments:
Post a Comment