曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 11081|回复: 0
打印 上一主题 下一主题

详解搭建 SSH 隧道及 SOCK5 代理服务器

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2012-11-4 00:27:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么需要用隧道?
当你处于内网时,你可能正被一面防火墙所阻隔,虽然使你更加安全,但同时也让你无法自由的访问外面的世界,如下图所示:



但是,如果利用防火墙的某条现有的通行规则,那么绕一下弯路,那么自由穿行就变成了可能,这种行为就相当于我们利用该条通行线路另建了自己的一条隧道,如下图所示:


在上图中,有两种隧道。一种是“跳板隧道“,另一种是”穿透隧道“。

建立”跳板隧道“的前提是,内网主机被允许访问外网的一台 SSH 服务器(位于上图的左上角),而该服务器又能自由访问互联网,当然它也就能轻松访问位于上图中左下角的”某台服务器“。这样一来,SSH 服务器相当于一个跳板,原本内网主机无法访问的网站,可以通过该 SSH 服务器来实现。这个例子,就是 FQ 者们常用的手段之一,即 SSH 代理,在 Windows 上通常会有一个 plink.exe 的工具帮你轻松完成。

建立”穿透隧道“,实际上是由内网主机发起,它在可以正向访问 SSH 服务器的基础上增加了可以让 SSH 服务器可以访问自身的能力,于是穿透内网成为了现实。关于穿透内网的实例,可以参考我写的另一篇文章《
图解 lcx 端口转发穿透内网实例》,该例子使用了 Windows 上的一个名为 lcx.exe 端口转发工具而实现(将工具稍微修改,也有 Linux 版本)。实际上,这个例子与下面即将演示的情况有相似及相同之处。
实验环境所需器材

1. 通过路由器拨号 ADSL 上网的 Linux 主机一台,其 IP 是 192.168.1.104 ,该主机躲在路由器之后,是一台内网主机,不具有公网 IP。

2. 外网 SSH 服务器一台,IP 假设为 118.118.118.118 (任何一个 Linux 系统都可以),而该台服务器可以有自由浏览绝大部分互联网资源的能力。


3. 两台 Linux 主机上均已装有 SSH 服务。这个不用担心,几乎任何发行版的 Linux 都会预装这个服务。你同时拥有这两台主机的 root 权限,因为建立隧道及端口转发等功能需要 root 权限。

4. 一台 Windows 机器,供上网连接测试用。

5. 使用《密码 ssh 连接》这篇文章里的设置方法,使能安全的无密码登录 SSH 服务器。

下面演示几种情况:

1. 建立跳板隧道
假设我现在想访问 www.twitter.com 这个网站,采用这个网站作为测试例子的原因是显而易见的,它可以更真实的满足测试的需要。现在,在内网的 Linux 主机上运行下面的命令:
ssh -N -L 192.168.1.104:2012:www.twitter.com:80 118.118.118.118
然后,在 Windows 主机上打开浏览器,输入地址:http://192.168.1.104:2012/ 后可以看到打开如下网站页面:


由此可见,我们的跳板隧道搭建成功了。当然了,从上面的命令我们也知道,我们访问 http://192.168.1.104:2012 时,仅能访问的是 www.twitter.com 网站的首页,而不能在随后的页面上点击进入别的链接,这只是为了做一个演示。如果该命令用在如 FTP 这样的单连接上效果是非常好的。下面说明命令中的选项参数:

-N 选项表示连接到主机后不会执行一个远程命令。该特性对于如上的端口转发正是需要的。

-L 选项后接的参数格式是:[bind_address:]port:host:hostport 。该格式中,由冒号隔开 3 组内容。第 1 组 bind_address 是可选项,表示绑定地址。如果省略,那么绑定的是本机,此时就不能像上面那样在另一台 Windows 上通过 192.168.1.104 这个地址来访问,它只能在本地测试,因此如果你如果希望提供给内网里的其它计算机使用时,应该明确的绑定一个地址。
第 2 组 port 是指出一个端口,这样会创建一个 socket 在该端口上监听,它用来接受相关的连接请求。第  3 组 host 表示当连接请求过来后,将该请求转发到的哪个主机上,该项可以使用 IP 也可以使用域名。第 4 组 hostport 表示的是 host 上的端口,也就是将请求发往 host 上的哪个端口。

另外,如果希望连接在后台进行,那么就再使用一个 -f 选项。

2. 建立穿透隧道
穿透隧道可以让外部的计算机通过隧道连接到内网主机,该行为有点像反弹木马类型。即内网主动发一个连接到外网服务器,连上后,在服务器上建立一个本地监听,那么一个隧道就同时产生,因此外网服务器就可以通过该隧道进入到内网主机。需要注意的是,通过该隧道,外网服务器不但能够访问发起 SSH 连接的内网主机本身,甚至也能通过它访问到别的内网主机所提供的内容。

在内网的 Linux 主机上运行下面的命令:
ssh -N -R 2012:127.0.0.1:22 118.118.118.118

然后从 118.118.118.118 上做如下访问:
# ssh -p 2012 localhost
Password:       #输入内网 Linux 主机的 SSH 密码
Last failed login: Sat Nov  3 18:10:34 CST 2012 from localhost on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Sat Nov  3 11:31:56 2012 from localhost
Have a lot of fun...
beyes:~ #
由上可见,外网服务器通过连接本地的 2012 这个端口从而进到了内网的主机。

再看一个测试实例(假设内网主机已经开启 HTTP 服务),在内网主机上运行下面命令:
ssh -N -R 2012:127.0.0.1:80  118.118.118.118
然后在外网服务器运行下面命令:
# curl -G "http://127.0.0.1:2012" -o out.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0    44    0    44    0     0     72      0 --:--:-- --:--:-- --:--:--     0

# cat out.html <html><body><h1>It works!</h1></body></html>
由上面这个例子可以看到,通过指定不同的端口,我们可以访问到内网发起 SSH 连接主机上的相应服务。

如果发起 SSH 连接的这台主机可以访问内网的其它机器上的服务内容,那么当穿透发生时,外网主机也能访问内网其它主机上的内容。比如内网有一台计算机上假设有 HTTP 服务:


现在在内网的 Linux 主机上运行下面命令:
# curl -G "http://127.0.0.1:2012" -o out.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2208  100  2208    0     0   3406      0 --:--:-- --:--:-- --:--:--     0

# less out.html <html><head><title>127.0.0.1 - /</title></head><body><H1>127.0.0.1 - /</H1><hr>
<A HREF="/[SGER][SGT][Stargate.SG-1][%E7%AC%AC%E4%B8%80%E5%AD%A3]/">[SGER][SGT][Stargate.SG-1][第一季]</A><br>  2012/7/5   
... ...
由上可见,我们通过隧道获取了内网里其它主机上的服务。

下面说明一下 -R 选项,它的格式为:-R [bind_address:]port:host:hostport 。这里的 bind_address 可以省略。默认情况下,它绑定的是 localhost 。如果留空或为 '*' 那么它就绑定在任何一个可能的接口。不知道是不是 SSH 版本过低还是在哪里设置有误,我没法将地址绑定在公网 IP 上 -- 如果可以,那么别的计算机也可以通过这台外网服务器连接内网主机了。port 部分让你指定一个监听在服务器上的一个端口。host:hostport 中的 host 是内网主机地址或者内网其它的主机地址,hostport 是相应的端口号。

整理一下上面命令的工作流程:
内网主机向外网 SSH 服务器发出连接,在连接成功后,让 SSH 服务器在本地监听一个由 port 指定的端口。当连接该端口时,SSHD 服务会将连接请求转发到由 host:hostport 所指定的主机的相应端口上。

3. 架设 SOCK5 代理服务器
架设 SOCK5 代理服务器,是一件令人稍觉得点兴奋的事情。在客户端使用如下命令:
ssh -N -D 192.168.1.104:1080 188.188.188.188
实际上,通过上面的命令,我们就已经假设好了 SOCK5 代理服务器。那么如何使用呢?以遨游3浏览器为例。先点开左上角的用户头像图标,然后点开”代理“一项,接着点开”设置“:


按上图,点选”自定义添加“:


将上面内网那台主机的内网 IP 地址填上,端口号是 1080(也可以是别的,但要和命令中的对应),用户名和密码不用填写,然后确定。现在可以使用代理服务器了,看下效果:



通过上面的隧道及代理服务器的搭建,我们用上了 SSH 命令中不太常用的几个选项,但这几个选项所具有的转发映射功能却可以在某些情况下带给我们极大的便利。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-19 19:39 , Processed in 0.079462 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表