Chinaunix首页 | 论坛 | 博客
  • 博客访问: 525111
  • 博文数量: 120
  • 博客积分: 3991
  • 博客等级: 中校
  • 技术积分: 1113
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-31 15:57
文章分类

全部博文(120)

文章存档

2011年(3)

2010年(6)

2009年(111)

我的朋友

分类: 系统运维

2011-04-19 15:17:26

简介
SSH的的Port Forward,中文可以称为端口转发,是SSH的一项非常重要的功能。它可以建立一条安全的SSH通道,并把任意的TCP连接放到这条通道中。本文仔细讨论SSH的这种非常有用的功能。
LocalForward
LocalForward顾名思意,是把本地的端口(Port)转发出去。SSH应用中,所以谓的本地端(local)就是指你面前操作的机器。通常也叫 作客户端(client),也就是你运行SSH命令的机器,而远程端(remote)就是你SSH打算连接的机器,通常也叫做服务器(server)。 例如:你运行命令ssh 这时,你运行ssh 命令的机器就是Local,而你要连接的机器: 就是Remote。
下面来看一个本地转发的例子:有一个FTP服务器,地址为" ftp.exp.com" ,端口为21,通常我们连接这个FTP可以使用 $ lftp ftp.exp.com 现在如果我们使用本地转发(Local Forward) $ ssh -L 2202:ftp.exp.com:21 ssh.exp.com运行这个命令后,SSH程序会把所有发往本地2202端口的内容都转发到 ftp.exp.com 服务器的21端口上,这就是SSH的端口转发的含义。
  • -L 是ssh命令的选项,表示开启本地端口转发(Local Forward)
  • 2202:ftp.exp.com:21 2202指定ssh程序将要监听的本地端口,注意,每个端口只能被监听一次。
  • ftp.exp.com:21 指定ssh将本地2202监听到的内容转发到ftp.exp.com服务器的21端口
所以,在端口转发后我们运行新的FTP连接命令: $ lftp -p 2202 localhost 同样可以连接到FTP上。虽然同样的最终效果,但是中间的过程已经大不一样了。
下面就讨论一下,以及转发后,ssh究竟作了什么。以及为什么要作端口转发, 命令: $ ssh -L 2202:ftp.exp.com:21 ssh.exp.com 实现的具体步骤如下:
  1. 首先,我们运行了ssh程序
  2. ssh程序登陆到 ssh.exp.com服务器上。
  3. ssh程序绑定你指定的本地网卡(127.0.0.1)的本地端口2202。
  4. 当任意一个程序如lftp连接到2202端口时。本地的ssh接受这个连接
  5. 本地ssh通过加密的SSH通道,通知服务器,让服务器连接目标也就是ftp.exp.com:21
  6. 本地ssh把从本地端口2202所以接受到的任何内容通过加密的通道传给服务器。
  7. 服务器把接受到的数据通过已经建立好的到目标的连接,以明文,也就未加密的形式传给目标
整个过程可表示为: 本地:127.0.0.1:2202<==加密==>SSH服务器:ssh.exp.com;<==明文==>目标: ftp.exp.com:21
Local Forward的意义
  1. 使用Local Forward后,首先可以看到,在本地与SSH服务器之间的数据传输是加密的,也就是在在本地的机器上,没有程序可以知道,你与目标服务器之间的实际通讯内容,因为所有这些内容先通过加密通道传到服务器上,然后才用明文的方式传到目标服务器。
  2. 其次,如果你不能直接连到目录服务器,而SSH服务器能,这时,SSH服务器就充当了个代理服务器的功能。使你可以“直接”的连到目标服务器。
Local Forward 端口的安全
从一开始的例子可以看到,当我们Local Forward一个端口,实际上打开了一个通向目录服务器的门,这时我们自然会关心这个门的安全问题。打开的端口是一个标准的网络应用端口,除了本地机 器,如果还有另外一台机器,也想连接这个端口,那就可能会产生安全问题。当然SSH在默认的情况是,不允许除了本机以外的,其它机器连到这个端口的。这就 是说,当你运行机器A上运行了Local Forward命令: $ ssh -L 2202:ftp.exp.com:21 ssh.exp.com 那么,你只能在机器A上运行连接命令: $ lftp -p 2202 localhost 也就是说,这个端口只能被机器A看见,假设机器A的IP是:192.168.1.3,另一台机器B,想连机器A的端口: $ lftp -p 2202 192.168.1.3 默认情况下,为了安全起见,SSH会拒绝机器B的连接请求。如果你想让机器A的端口,让其它机器也能连接。你需要开启一选项: -g。或者在(in ~/.ssh/config or /etc/ssh/ssh_config)中开启: GatewayPorts yes
一级高级技巧:SSH一些有用的选项
运行命令: $ ssh -L 2202:ftp.exp.com:21 ssh.exp.com 会你登陆到 ssh.exp.com 服务器上,事实上你只想维持一个连接,而不需要在SSH服务器上运行什么程序。SSH的 -f 选项可以把SSH的连接放到后台,使用这个命令后,SSH可以把这个联接放到后台。但要求必需在SSH服务器上运行一个命令,如果命令运行完了,这个连接也关闭。所以为了维持一个长时间的连接,你必跟一个能在SSH服务器上长时间运行的命令,通常这个命令是像sleep 30d这样,能运行30天的命令。所以更高级的命令如下: ssh -f -L 2202:ftp.exp.com:21 ssh.exp.com "sleep 30d"
选一个能长时间运行的命令,有时并不是一件简单的事,sleep 30d在三十天后也结束了。所以SSH又提供了一个选项-N,可以达到同样的效果,并且在没有意外的情况下,一直运行下去。更为简洁的有效的命令: ssh -f -N -L 2202:ftp.exp.com:21 ssh.exp.com
参考文献
阅读(7027) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~