Chinaunix首页 | 论坛 | 博客
  • 博客访问: 435300
  • 博文数量: 79
  • 博客积分: 8385
  • 博客等级: 中将
  • 技术积分: 3625
  • 用 户 组: 普通用户
  • 注册时间: 2005-09-26 14:42
文章分类

全部博文(79)

文章存档

2011年(10)

2010年(40)

2009年(21)

2008年(8)

分类: LINUX

2009-11-10 17:20:23

PuTTY 中文教程B 收藏

PuTTY 中文教程B
2008年04月24日 星期四 14:06

用 SSH Tunnels(SSH 隧道),突破防火墙

哇哦,突破防火墙!是不是忽然有了做黑客的感觉呢?呀!子弹,我躲——,身子往后仰,继续闪……,噢,肚皮被子弹蹭了一下。
简单的说一下,SSH 协议能够通过已经建立好的 SSH 加密链路来转发任意的网络连接,从而避免了网络中的明文传输,也就无法用一些 Sniffer 工具嗅探到我们的隐秘信息了。
先 说一下大致的使用过程,登录到主机上以后,就可以建立好一个 SSH 隧道,这时在你的机器本地会开放一个端口,通过本地的这个端口访问,就相当于在主机上去直接访问。很像代理服务器吧,如果隧道另一端的端口是动态的, SSH 隧道就是一个代理了,SSH 隧道的意思大致就是这个。通过 SSH 隧道,我们可以保证从我们这一段到主机那一端是安全的,不会被监听到。
说了这么多,实际演练演练就知道了。在 PuTTY 的 Connection-〉SSH-〉Tunnels 这里就是配置 SSH 隧道的。
Add new forwarded port 这里就是添加隧道转发端口的,其中 Source port 是隧道的源端口,也就是隧道的入口,连接隧道时要连接这个端口。Destination 这里是目的地,隧道的出口,输入的格式是: server:port。
还 要说明的一点是 SSH 隧道是有方向的,这个方向是由下面的单选按钮 Local/Remote/Dynamic 来决定的。如果下面的单选按钮选中的是 Local,那么 Destination 这里填写的目标是相对于远程主机而言,而非你的机器。这样的隧道可以称之为正向隧道,隧道的入口是在你的本地,出口在远程主机那一端。如果单选按钮选中的是 Remote,那么目标地址就是相对与你的机器而言,而非远程主机。这样的隧道称之为反向隧道,隧道的入口是远程主机那一端,隧道的出口则是你的本地机器。这与 Local 选项是相反的。而最后一个 Dynamic 则不用指明 Destination 目标地址,也就是说目标地址是动态的了,连入隧道时可以随意指定目标地址,而不像 Local/Remote 指明的固定目标地址,所以这样的隧道就成了变相的加密 socks5 代理服务器了。
看明白了么?是不是会有些糊涂?后面我会举个例子来详细说说的。

开 始演练,我们现在建立一条到远程主机 guantouping 上端口 7001 的隧道,在 guantouping 上可以用 nc -l -p 7001 localhost 这条命令建立一个监听本地到端口 7001 的连接,这样确保无法从其他机器访问这台主机的端口,只能在 guantouping 这台主机上用 telnet localhost 7001 来连接。现在我的机器 IP 是 192.168.6.25,如果直接用命令 telnet guantouping 7001 访问的话,那么在主机 guantouping 上会看到这样的提示:
[taylor@guantouping taylor]$ nc -l -p 7001 localhost
invalid connection to [192.168.6.200] from (UNKNOWN) [192.168.6.25] 1926
在这个配置面板上, Source port 上填写 8080,也就是我们要通过本地的 8080 端口来进入 SSH 隧道, Destination 这里填上 127.0.0.1:7001,就表示被登录的主机 guantouping 访问该主机本地的 127.0.0.1:7001 这个端口。正常登录到主机 guantouping 以后,SSH 隧道就建立好了。在我的机器 192.168.6.25 上输入命令 telnet localhost 8080,输入一些东西,就会在 guantouping 上看到有响应。在这里我用的是 nc,看起来方便一点,telnet 也是一样的。

这 就是正向 SSH 隧道的一个例子,大家实地操作几次也就会明白了。最上面有个复选框是“Local ports accept connections from other hosts”,这个选项的作用是允许其他主机连接你机器上的隧道入口,默认情况下建立好隧道以后,只允许本地链接。只有选中这个复选框才允许其他主机连接你的本地隧道入口。

象特洛伊木马一样建立一条 SSH 反向隧道

下面要说的就是选中单选按钮 Remote 后建立的反向 SSH 隧道,这样的隧道做什么用呢?一般防火墙都是允许从内往外链接,而不允许从外到内的链接,除非在防火墙上做好nat或端口转发。现在,你在防火墙的内部,但是又想让外面的人链接到你的机器上。防火墙厚厚的城门紧闭,外面的人进不来,只有你能从里面打开这扇防护严密的大门,就像一个特洛伊木马一样,你主动连接出去建立一个反向的 SSH 隧道,然后外面的人就可以通过这个反向的 SSH 隧道轻松突破防火墙链接到的你的本地机器。看下面这个图:
在 Source port 这里填写 8080,也就是隧道的入口是端口8080,Destination 这里填写 localhost:7001,也就是隧道的出口是本地的 7001 端口,下面的单选按钮要选中 Remote,表示建立的隧道是个反向隧道,填写完毕别忘记点 Add 按钮,在上面就可以看到显示的是 R8080 localhost:7001。成功登录远程主机 guantouping 后,反向隧道就建立好了。在远程主机 guantouping 上输入命令 telnet localhost 8080 就可以连接到你的本地端口7001。


哈 哈,这样一个特洛伊木马般的反向 SSH 隧道就建立完毕了。我们在远程主机上连接 8080 端口,其实就连接到了我们本地机器的7001 端口了。上面共有两个复选框,我们提到了一个,已经说了,选中以后就允许其他机器连接隧道入口了。那第二个“Remote ports do the same (SSH-2 only)”,则是给反向隧道使用的,也就是说远程主机的那个反响隧道入口也做同样的事情,也就是允许其他机器连接远程主机上的反向隧道入口,不过一般情况下这个选项都不会起作用的 ^_^。

把 PuTTY 作为一个安全的代理服务器来使用

这个简单,在 Source port 那里填写上 1080,Destination 这里空下不填,选中下面的 Dynamic,最后别忘了点 Add 按钮。
登录远程主机后,一个代理服务器就建立好了,这个代理服务器的地址就是 localhost:1080,还是加密的哦。据说国外某著名的主机供应商就提供远程的 SSH 链接,通过这个方法我们就建立了一个加密的 socks5 代理,可以轻松绕过万恶的 GFW 去拥抱 Wikipedia,波~~~,来一口。

设置 PuTTY 的默认设置

每次登录主机,无一例外的修改字体,修改字符集,修改窗口的大小,指定私钥文件,允许 X11 转发,……
几台主机还好说,几十个上百个主机这样三天两头的设置也会让唐僧烦了的。
选中一个先前配置好的会话,点 Load 按钮。

然后修改Saved Sessions会话名称 和 Host Name 这里的主机地址,点Save

如果在 Saved Sessions 这里和上面的 Host Name 清空,点 Save 按钮,就可以把设置保存为默认设置。

备份 PuTTY 的设置

用 PuTTY 最不爽的就是,它把所有的设置都保存到注册表了,本来这不是什么问题。但是难免会重装一下机器,用下面的命令可以备份 PuTTY 的所有设置
regedit /e PuTTY.config.reg "HKEY_CURRENT_USER\Software\SimonTatham\PuTTY"

删除 PuTTY 的设置

如果只是在其他机器上临时用了一个 PuTTY,用完以后想删除 PuTTY 的配置,就在控制台里输入如下的命令:
putty.exe -cleanup

用 PuTTYgen 来生成密钥,以后可以不用密码登录服务器了

PuTTYgen 是密钥生成器,用来生成一对公钥和私钥供 PuTTY、PSCP、Plink、Pagent 来使用。
直接运行 PuTTYgen 可以看到如下的界面。

点击 Generate 按钮就开始生成一个公钥和私钥对,生成完毕后,点下面的 Save private key 就可以把私钥保存起来,扩展名是 .ppk 的文件。
Load 按钮可以把先前保存的私钥重新打开,然后做些修改,比如修改注释和私钥口令,或者把 PuTTY 格式的私钥转换为 OpenSSH 格式的。

开始用 PuTTYgen 创建密钥

单击 Generate 按钮,然后你会看到进度条上面有个提示“Please generate some radomness by moving the mouse over the blank area.”,意思就是让你用鼠标在空白区域随机移动。随着鼠标在空白区域的移动,进度条会一直走下去。停止移动鼠标,进度条也就停止了。那我们就移动鼠标,直到进度条走满为止。

等进度条走完之后,会出现下面的界面

最上面那个大大的只读文本框里面是公钥,用来保存到 OpenSSH 的 authorized_keys 文件中,这个文件中的每一行都是一个公钥。默认情况下,这个文件位于 Linux 用户主目录的 .ssh/ 子目录中,如果文件和目录都不存在,可以直接创建。
但 是创建的文件、目录和用户主目录($HOME, $HOME/.ssh, $HOME/.ssh/authorized_keys)的权限有个限制就是对除了本帐户的其他所有帐户都要求是只读的,否则的话,即使公钥、私钥都匹配无误,也是无法登入系统的。这是 SSH 服务器的一个安全要求,因为如果别的帐户可以修改你的 authorized_keys 的话,恶意的增加一个公钥,那对方不用你的帐户口令也能以你的帐户登入系统了。对于一些特殊要求,你可以在 SSH 服务器的配置文件 sshd_config 中用指令
StrictModes no
来取消这个限制。在 sshd_config 的帮助手册中可以看到
     StrictModes
             Specifies whether sshd should check file modes and ownership of
             the user’s files and home directory before accepting login. This
             is normally desirable because novices sometimes accidentally
             leave their directory or files world-writable. The default is
             “yes”.
小技巧:每次修改 authorized_keys 这个文件时,你可以用如下的命令来修改,确保所有的文件属性和权限无误
mkdir -p $HOME/.ssh && touch $HOME/.ssh/authorized_keys \
&& chmod go-w $HOME $HOME/.ssh $HOME/.ssh/authorized_keys && vim $HOME/.ssh/authorized_keys
还有一个要强调的是那个 Key comment,这是密钥的注释,一定要修改。因为这个密钥是给自己用的,所以最起码要输入自己的名字,用默认的注释很容易和其他人的密钥混淆的。如果担心自己的密码忘记了,可以在后面加上密码提示,当然了,不要让别人用注释猜出你的密钥口令。比如,我可以把注释修改为
ChaiFeng [20061120] w.z.
后面的 w.z. 就是我的密码提示,能猜出来么?呵呵

输入注释,上面的公钥也会随之发生变化。
现在最重要的是,输入自己的密钥口令。就是 Key passphrase 和 Confirm passphrase 这个两个输入框。
如果不输入口令,直接保存私钥会看到这个提示。为了安全起见还是输入口令吧,要不任何人得到这个私钥都可以不用口令登入系统了。

最后单击 Save private key 来保存私钥吧,保存到自己认为安全的地方,比如存放到私人的 USB 闪存盘上。需要登录时,插上 USB 闪存盘。登录完毕后就可以把 USB 闪存盘取下来,哈哈,这样子就比较安全了。
大 家也注意到了,还有个 Save public key 按钮,这个是保存 SSH2 格式的公钥,有些 SSH 服务器要求用这种格式的公钥文件。一般情况下,我们是不需要的,所以这里也就保存了。以后还想的话,就用 PuTTYgen 把私钥 Load 出来,然后再保存也可以。

用密钥登录服务器的流程

上面杂七杂八的说了一堆创建密钥时的事情,大家会不会已经有些乱了呢?我把这个过程再罗列一遍:
  1. 如果没有公钥/密钥对,就用 PuTTYgen 创建一个,已经有了就可以忽略这一步。一个公钥/密钥对可以用在不同的服务器上,所以也不需要重复创建,关键要有足够强健的密码和安全的存放。
  2. 象先前一样输入帐户名和口令登录到主机上。
  3. 输入如下命令,来编辑 authorized_keys 文件
    mkdir -p $HOME/.ssh && touch $HOME/.ssh/authorized_keys \
    && chmod go-w $HOME $HOME/.ssh $HOME/.ssh/authorized_keys && vim $HOME/.ssh/authorized_keys


  4. 这个文本框里的公钥粘贴到 vim 中去,需要说明几点:这个文本框里的内容是一行的,粘贴到 vim 中时,别忘了按字母 o 这个键,否则的话,粘贴进去后,开头的 ssh-rsa 会变成 sh-rsa,为什么呢?哈哈,想想吧。
    为什么不按字母键 i 呢?这个在 vim 中不就是插入么?原因是我很懒,按字母 o,我可以节省一次按回车键。虽然按大写 O 也行,那我不是还得再按一下 Shift 键么?
    别 忘了,在 PuTTY 中默认的粘贴可是按鼠标右键哦,然后按一下 ESC 键,然后输入 :wq 保存退出,等等,大家先别着急的输入 :wq,既然输入冒号还得按下 Shift 键,那我们就干脆直接两下大写的字母 Z,也就是 ZZ。怎么样?vim 也一样保存退出了吧。这次又节省了一次按键和两次寻找字母的移动,把懒得优良传统再一次在实践中发扬光大。
  5. 如果已经有了私钥,第4步里的那个公钥忘记保存了,就用 PuTTYgen 把这个私钥 Load 上去,然后重新复制一下公钥吧。
  6. 在 PuTTY 的配置 Connection->SSH->Auth 这里面,指定上私钥,然后记得保存 Session,以后就不需要重复这一步了。
  7. 最好也指定上自动登录的用户名,还记得这里吗?
  8. 开始登录吧,这次你会看到一个不同于以往的登录提示

    现在输入的口令可不是主机上这个账户的口令了,而是先前创建的这个密钥的口令。以后不管这个账户的口令是什么,即使再复杂,也和我们没关系了。只要这个账户的 $HOME/.ssh/authorized_keys 文件中,有我们的公钥,我们就随时用匹配的私钥都可以登录了。配合后面提到的 Pagent,我们连输入密钥口令这一步也可以忽略过去。
  9. 登录成功了,别忘了按 Ctrl+d 注销哦。
以后这些步骤就不需要再重复了,只需要打开 PuTTY 后,双击一下保存的会话名称,输入密钥口令。

Pagent 加载密钥,每次开机后只需要输入一次密钥口令

终于轮到 Pagent 出场了,双击一下 Pagent.exe,嗯,没反应?再双击一下,咦?出来个提示,说已经运行了。

看看右下角吧,在这里呢

双击一下 Pagent 的图标,出来这样一个界面。很简洁的,Add Key 是添加私钥,Remove Key 是把选中的私钥从 Pagent 中卸载了。

好,现在单击 Add Key 按钮添加私钥,我把这个演示用的私钥保存到 C:\ 了

然后会出现输入密钥口令的对话框,输入正确的密钥后,单击 OK

这时,在 Pagent 的窗口中就能看到我们的私钥已经装载上去了。

现在打开 PuTTY,选择先前保存的 Session,双击一下。只要自动登录用户名设置上,主机上改帐户的 authorized_keys 文件里也有匹配的公钥。哈哈,发现没有?完全不需要口令,我们已经登录到系统了。
在 Pagent 的图标上点右键,也可以快捷的选择已经保存的会话。

建 议大家把 Pagent 放到启动组里面,这样每次一开机,Pagent 自动运行,然后我们只需要把私钥装载一下,然后我们就可以一直享受自动登录系统的乐趣了。再配合上以后会讲到的 Plink、PSCP 这些,我们可以实现很多工作的自动化进行。完全不需要每次输入用户名、口令、输入又长又多的命令,再做一些烦躁的文件备份,最后还得记得注销系统,难道不觉得麻烦么?这一切烦恼很快就会远离我们了,继续往下看吧。
阅读(1912) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~