命令行也强大之ssh高阶:转发与隧道


http://liuzuhuijunlian.blog.163.com/blog/static/72489767201143111047638/

古人以“夜不闭户”、“路不拾遗”来形容大治之世。他们认为大治时,人们的道德水平已经很高了。而早期Internet的形成似乎也是符合这种思想的。Internet的初衷是相互信任和相互分享,它的这种“信任”建立在“大治”甚至“天下大同”的假想上。随着互联网的商业化和平民化,Internet的安全性就显得越来越脆弱了,不仅网络攻击、网络诈骗盛行,也有一些网络管理者肆意检测、更改、阻断用户通信的行为SSH的一些特性在很多场合可以解决这些问题。

ssh的基本用法在命令行也强大之ssh一 文中做了最基本的介绍。ssh是安全的远程登录工具,在与远程主机进行交互时,ssh协议把原始数据进行了加密并压缩,从而保证了数据在网络传输过程的安 全。利用这一原理,我们也可以用ssh把其它的明文传输的TCP数据流通过ssh的连接传输,这就是本文要讲到的ssh转发/隧道技术。下图表示一个 ssh连接(图片来自http://www.ssh.com)

ssh的转发有四类:远程转发、本地转发、动态转发和X转发。把TCP流重定向到ssh连接叫做“转发”,这个ssh连接叫做“隧道”。

假设场景:受限网络内主机A,受限网络防火墙F,受限网络外主机B,受限网络外主机C、D、E。用户为主机A的管理者且拥有主机B的ssh账 号,B、C、D、E可以正常连接。因为防火墙F的策略,A与C、D、E完全不能连接,A与B受限连接(当A与B的连接内有关键字“SB”则阻断连接,且只 能由A与B连接,不能由B主动连接,可类比为NAT)。
下图为场景图(用Dia v0.96.1绘制)


一、远程转发

将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口.--摘自ssh的中文Manual
命令格式为:

? View Code BASH
ssh -R ::

假设主机A提供了HTTP服务,即在受限网络内部可以访问的网页服务器。但这个服务因为防火墙策略或者NAT路由的原因导致在Internet无法访问。那么我们就可以将本地的HTTP服务远程转发到Internet上的主机B

? View Code BASH
ssh -fNgR 80:localhost:80 root@host-B

然后在Internet上可以通过访问 http://host-B来访问主机A上的HTTP服务了

如果没有主机B的root账号,则只能远程转发到1024以后的端口号

? View Code BASH
ssh -fNgR 8080:localhost:80 lige@host-B

然后在Internet上可以通过访问http://host-B:8080来访问主机A上的HTTP服务。
值得注意的是搭建了wordpress的主机只能运行在80端口,如果转发后的端口不是80,那么将无法使用,这应该算是wp的bug吧

而且因为主机A到主机B之间是通过隧道连接的,即使网页中含有关键字“SB”,也无法被大防火墙检测到(泪流满面,终于讲到关键了)

附加参数简要说明:

? View Code BASH
-N      不执行远程命令. 用于转发端口. -n      把 stdin 重定向到 /dev/null (实际上防止从 stdin 读取数据).  ssh在后台运行时一定会用到这个选项. 它的常用技巧是远程运行 X11 程序. -f      要求 ssh 在执行命令前退至后台. 它用于当 ssh 准备询问口令或密语,但是用户希望它在后台进行. 该选项隐含了 -n 选项. 在远端机器上启动X11 程序的推荐手法就是类似于 ssh -f host xterm 的命令. -C      要求进行数据压缩 -g      允许远端主机连接本地转发的端口

关于建立隧道和使用隧道的网络原理,见文章末尾

二、本地转发

将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. --摘自ssh的中文Mannul

它的命令格式为

? View Code BASH
ssh -L ::

和远程转发原理类似但方向相反。假设主机B有HTTP服务,但因为受限网络内其它主机因憎恶“大防火墙”F而不愿意直接访问主机B(这种心理我也有)。那就可以通过本地转发了

? View Code BASH
ssh -fNgL 80:localhost:80 root@host-B

因为和远程转发类似,后面就不再详述。

三、动态转发

指定一个本地机器 “动态的” 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接,该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持SOCKS 协议, ssh 将充当 SOCKS 服务器.只有 root 才能转发特权端口. --摘自ssh的中文manual

可以这样理解,远程转发和本地转发都是在隧道上传输一个服务,比如例子中的HTTP数据流。而动态转发则是为了在隧道上传输多种不确定的网络服务。它的表现就把远端ssh服务器当作了一个安全的代理服务器。

命令格式为

? View Code BASH
$ ssh -D

假设主机A想要访问受限网络所限制访问的主机C、D、E等,或者想要访问主机B上的“SB”内容。则可有D选项建立动态隧道

? View Code BASH
ssh -CfNg -D 8888 lige@host-B

然后你就有了一个安全的socks 5代理。这个代理ip是127.0.0.1,端口为刚才指定的8888。如何使用socks 5代理在本文就不再讲了。大防火墙可能还存在一些技术来防止socks 5代理,可以参考socks代理的远端DNS解析一文

还有一个plink工具,包含在PuTTY软件包,可以在windows和linux下使用,它的格式为:

? View Code CMD
PLINK.EXE -C -D 127.0.0.1:7777 -N -pw SSH密码 SSH用户名@SSH的IP地址

四、X转发

X转发是一个令人惊奇但实际上用处不大的功能。因为我所能管理的远端主机都是无图形界面的,所以本部分内容我不保证正确。

大家都知道GUI软件与X之间也是通过TCP连接的,所以X转发与其它转发也没有本质区别,甚至它简单得都不应该和其它几种转发相提并论。X转发用的选项为”-X”

首先要在客户端指定X Server的位置

? View Code BASH
export DISPLAY=:.

然后执行

? View Code BASH
 ssh -X lige@hot-B

补充:可能的问题:

1. ssh的基本用法
http://blog.lilinux.net/2010/02/command-ssh/以及ssh的man文档

2. windows下的ssh客户端
PuTTY和其中的plink

3. 如何查看隧道是否建立完善
查看进程:

? View Code BASH
ps aux | grep ssh

查看端口:

? View Code BASH
netstat -ntl

4. 因为F,连接还是不稳定,隧道经常无法使用
去除-N,-n,-f选项,进入远程shell,输入一些需要频繁交互数据的命令,使连接一直处于活动状态。比如

? View Code BASH
top

我更推荐用这样的命令,对系统的负载消耗更小(而且更加美观)

? View Code BASH
watch -n1 "date"

5. 更多的实例
本文写的例子都是假设场景,近期将写一个实例应用。预计网址为http://blog.lilinux.net/2010/02/ssh-instance/

 

附ssh隧道原理

 

对网络原理不太懂或不感兴趣的可以忽略此部分

总的来说:Tunnel实际上是一个TCP连接,这个连接和普通的SSH登录的连接并没有本质上的区别

假设有两台主机A和B,IP分别是IP_A和IP_B,是要把主机A的22端口映射到主机B的10022端口

连接的建立过程是这样的:

1. 建立TUNNEL (在A主机上执行命令)
ssh命令,把A的端口映射到B主机(ssh -NfR 10022:localhost:22 USER_B@IP_B)
这个步骤实际上是这样的:
(1)ssh命令是ssh客户端,这条命令是指在A主机上登录B主机,并且A主机请求将A主机的22号端口映射到B主机的10022端口。
(2)B主机接受远程登录请求后,检测发现用户的权限足以创建10022端口,且10022端口并未使用。则B主机开启一个监听端口:10022
(3)这条命令成功结束后,A主机有了一个后台进程登录到B主机,这个登录的连接正是“TUNNEL”。
而B主机相应也有这么一个后台进程,此外B主机还增开了一个监听端口:10022
(4)在这个过程中,B是Server,A是Client。那么A是以一个任意端口连接到B的ssh监听端口。所设这个连接是
IP_A:12345 —— IP_B:22

2. 连接映射端口 (在B主机上执行命令)
连接映射端口 ( ssh USER_A@localhost -p 10022)
这个步骤实际上是这样的:
(1)主机B连接自己的一个监听端口10022
于是主机B以一个任意的端口连接10022: IP_B:23456 ——- IP_B:10022
(2)10022端口实际是由主机B的sshd来维护的,sshd发现有连接到10022的端口的数据。
将数据封装成ssh包,通过已经建立好的TUNNEL传输到对端主机A的12345端口(TUNNEL建立时的初始端口)
(3)主机A的12345端口收到数据后,经过TUNNEL的建立进程的处理(解开ssh包),把数据转到主机A的端口22(建立TUNNEL时指定的端口)
(4)因此,这个反向的连接就建立起来了

3. TUNNEL与TCP连接的关系
(1)TUNNEL本质是一个TCP连接
(2)TUNNEL的作用用于传输其它TCP连接的数据
(3)对用户而言,TUNNEL就是它们可见的TCP连接传输的一个“隧道”
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值