demonstrate 的 blog » 日志 » ssh tunnel
ssh tunnel
demonstrate 发表于 2008-03-07 10:59:28
ssh 作为 Linux 里面的瑞士军刀之一,其重要的 tunnel 能力
为我们带来了穿透某些网络的可能。比较重要的命令是
ssh -R 和 ssh -L,前者在服务器端打开一个端口,并将
接收到的数据 forward 到客户端网络(通过客户端把数据发
出去,而从服务器端到客户端的数据传输使用 ssh 隧道);
后者在客户端打开一个端口,并将接收到的数据 forward
到服务器端网络。我们来看下面的例子:

在这个网络中,我们以校园网为例(见左侧),一般需要
一台我能控制的主机 My Host,还有一些我需要访问的主机。
由于校园网多数使用的是局域网共享式访问 Internet,不允许
外界主机直接进入校园网。但是往往校园网内部含有大量
资源,这使得我们离开之后也很希望能够使用里面的资源。
经典的做法是使用 VPN 服务器,可是我们对校园网的出口服
务器并没有控制能力,同时我们也没有资金能在公网上建立私
有的 VPN 服务器。因此我们需要一种可能的 user-space 的
解决方案。
首先我们通过下面的例子了解这些 tunnel 的用途:

我们可以借助一些公用的 Unix/Linux 服务器为我们建立 tunnel,
比如 Unix Center。这行命令的作用在于建立了一个 tunnel,使
得发往 unix-center.net:31415 的数据会被 forward 到 FucQ:22
端口,因此,你可能会认为从 Home Host 直接 ssh unix-center.net -p 31415
即可,但是问题在于 unix center 似乎使用的是虚拟机技术,通过
端口影射让我们访问了其 ssh,但是 31415 并未被影射,同时
即便可以访问,一般 sshd 也不会配置为允许将 31415 允许每个
网络设备使用,默认情况下都是保守的仅供 127.0.0.1 回环设备
使用,这意味着,我们需要第二个 tunnel,

我们通过从 home host 的 ssh 命令创建第二个 tunnel 和 tunnel A
对接,对接口就在 unix-center:net 的回环设备 31415 端口,这样
延伸了整个 tunnel 的长度,获得 tunnel AB,这时如果我们需要访
问 FucQ 的 ssh,就可以在 home host 上直接用下面的方式

亦即 ssh 127.0.0.1:22 等同于 ssh FucQ:22。
那么怎么利用这个 ssh tunnel 访问其他的 host 呢?考虑下面命令
的语义:
ssh 127.0.0.1 -L 21:10.8.8.8:21
似乎这样做我们可以利用 home host 的 21 端口作为连接 10.8.8.8
的 ftp 服务器的入口了,事实上的确也是这样。但是测试过发现可以
连接上 10.8.8.8,但是不能 list 也不能下载,这主要是因为不论使用
哪种方式连接 ftp(主动方式用 PORT 设置传输端口,或者被动方式
用 PASV 设置)都无法避免 ftp 需要多个 channel 的事实(连到 21
只作为控制使用)。这里我们实现最终的目标还有一步之遥,
ssh 127.0.0.1 -D 1080
这里 -D 选项是让 ssh 在 1080 处建立 SOCKS 代理,这样访问所有
的数据将通过本地 127.0.0.1:1080 端口通过 ssh 达到 FucQ,同时
也解决了 ftp over ssh 需要多个 tunnel 的问题(由 FucQ 的 sshd 建
立多个连接)。
这使得我们可以让某些容易设置 proxy 的程序享受到额外的网络资源。
是否可以进一步利用 ssh 的 tunnel 建立 VPN 的连接,从而使得 home
host 通过控制路由选择访问的网络呢?这个野心更大了...
实现 VPN 的软件很多,其中 OpenVPN 是我第一个比较明白其大概的
原理的 VPN,从它的配置(不像 IPSec VPN 要求那么苛刻和复杂)
大致了解这个 tunnel 时刻能穿透 proxy 类型的。但是很可能它和 ftp 一
样需要不仅仅一个端口。仔细阅读器文档后证实了这两个想法,我们不
可能仅仅做一个 port forwarding 实现 OpenVPN,仍然需要动态端口
的 forwarding。
剩下的是一些粗枝大叶的事情了,哈哈
为我们带来了穿透某些网络的可能。比较重要的命令是
ssh -R 和 ssh -L,前者在服务器端打开一个端口,并将
接收到的数据 forward 到客户端网络(通过客户端把数据发
出去,而从服务器端到客户端的数据传输使用 ssh 隧道);
后者在客户端打开一个端口,并将接收到的数据 forward
到服务器端网络。我们来看下面的例子:
在这个网络中,我们以校园网为例(见左侧),一般需要
一台我能控制的主机 My Host,还有一些我需要访问的主机。
由于校园网多数使用的是局域网共享式访问 Internet,不允许
外界主机直接进入校园网。但是往往校园网内部含有大量
资源,这使得我们离开之后也很希望能够使用里面的资源。
经典的做法是使用 VPN 服务器,可是我们对校园网的出口服
务器并没有控制能力,同时我们也没有资金能在公网上建立私
有的 VPN 服务器。因此我们需要一种可能的 user-space 的
解决方案。
首先我们通过下面的例子了解这些 tunnel 的用途:
我们可以借助一些公用的 Unix/Linux 服务器为我们建立 tunnel,
比如 Unix Center。这行命令的作用在于建立了一个 tunnel,使
得发往 unix-center.net:31415 的数据会被 forward 到 FucQ:22
端口,因此,你可能会认为从 Home Host 直接 ssh unix-center.net -p 31415
即可,但是问题在于 unix center 似乎使用的是虚拟机技术,通过
端口影射让我们访问了其 ssh,但是 31415 并未被影射,同时
即便可以访问,一般 sshd 也不会配置为允许将 31415 允许每个
网络设备使用,默认情况下都是保守的仅供 127.0.0.1 回环设备
使用,这意味着,我们需要第二个 tunnel,
我们通过从 home host 的 ssh 命令创建第二个 tunnel 和 tunnel A
对接,对接口就在 unix-center:net 的回环设备 31415 端口,这样
延伸了整个 tunnel 的长度,获得 tunnel AB,这时如果我们需要访
问 FucQ 的 ssh,就可以在 home host 上直接用下面的方式
亦即 ssh 127.0.0.1:22 等同于 ssh FucQ:22。
那么怎么利用这个 ssh tunnel 访问其他的 host 呢?考虑下面命令
的语义:
ssh 127.0.0.1 -L 21:10.8.8.8:21
似乎这样做我们可以利用 home host 的 21 端口作为连接 10.8.8.8
的 ftp 服务器的入口了,事实上的确也是这样。但是测试过发现可以
连接上 10.8.8.8,但是不能 list 也不能下载,这主要是因为不论使用
哪种方式连接 ftp(主动方式用 PORT 设置传输端口,或者被动方式
用 PASV 设置)都无法避免 ftp 需要多个 channel 的事实(连到 21
只作为控制使用)。这里我们实现最终的目标还有一步之遥,
ssh 127.0.0.1 -D 1080
这里 -D 选项是让 ssh 在 1080 处建立 SOCKS 代理,这样访问所有
的数据将通过本地 127.0.0.1:1080 端口通过 ssh 达到 FucQ,同时
也解决了 ftp over ssh 需要多个 tunnel 的问题(由 FucQ 的 sshd 建
立多个连接)。
这使得我们可以让某些容易设置 proxy 的程序享受到额外的网络资源。
是否可以进一步利用 ssh 的 tunnel 建立 VPN 的连接,从而使得 home
host 通过控制路由选择访问的网络呢?这个野心更大了...
实现 VPN 的软件很多,其中 OpenVPN 是我第一个比较明白其大概的
原理的 VPN,从它的配置(不像 IPSec VPN 要求那么苛刻和复杂)
大致了解这个 tunnel 时刻能穿透 proxy 类型的。但是很可能它和 ftp 一
样需要不仅仅一个端口。仔细阅读器文档后证实了这两个想法,我们不
可能仅仅做一个 port forwarding 实现 OpenVPN,仍然需要动态端口
的 forwarding。
剩下的是一些粗枝大叶的事情了,哈哈
曾经的这一天...
- » 2006年: Naive Bayesian classifier error
- » 2006年: 认识
相关日志:
收藏:
QQ书签
del.icio.us
订阅:
Google
抓虾
