内容纲要

工作中经常会遇到一些服务器访问受限的问题:某些服务器只有私网 ip 地址,仅能通过内网 ip 连接,或如 mysql 服务器或登录其它机器的 ssh。

这些问题当然许多解决办法,本文就使用’xshell’通过 ssh 开启代理的方式来解决这个问题,恻重介绍其内置的三种方式:
Local(Outgoing)
Remote(Incoming)
Dynamic(SOCKS4/5)

如何打开代理设置面板
点击:view -> Tunneling Pane,在弹出的窗口选择 Forwarding Rules。
Alt+p:’Connection->SSH->Tunneling’。

从’Add…’按钮或右键菜单即可添加。

一、Local
把远程服务器到本机的端口映射。多于访问那些侦听的回环地址的服务,或位于防火墙后面,或没有公网 ip 的服务。
Type 选择 “Local(Outgoing)”,’Source Host’使用默认的’localhost’,’Listen Port’添上 mysql 的端口 3306;

‘Destination Host’使用默认的 localhost,’Destination Port’添上 3306;

Descripting 根据自己需要进行描述,可以留空。配置完成后点击’OK’会弹出一个对话框,点击是的话会对当前会话进行保存,以后每次连接此 ssh 会话,开启此端口转发,可自行决定是否保存。

添加完成后在’Forwarding Rules’对话框可以看到框中有一行转发配置,确保 Status 的状态是’Open’,如果显示的是’Failed’可能是 3306 这个本地端口已经被占用了,可以尝试将’Listen Port’修改为其它端口进行重新设置。

至此,xshell 已经将服务器的 3306 端口映射到本地 3306 端口,可以通过工具进行测试。只需要连接’localhost’或’127.0.0.1′(或本机的其它 ip) 的 3306 端口即可连上 mysql,默认能访问到本机的所有 ip 的机器 (同一局域网) 及端口 (本机防火墙已关闭的情况下) 就能访问远程的 mysql 服务器;如果仅让本机可连,可将’Accept local connections only’这样的选项勾上,这样更安全一些 (这种仅能从本机连接的方式同样适用于其它两种模式,下面不做多述)。

在 Type 选择 “Local(Outgoing)” 的时候,’Source Host’表示使用的本地 ip 地址,可以是 localhost 也可以是本地内网 ip 或者公网 ip,使用相应的 ip 便可以被本地网络的用户访问到,比如上例中,如果需要同 ip 段的同事访问 3306 的端口管理服务器,便可以设置成他可以访问到的那个 ip 地址。

‘Destination Host’表示服务器端的 ip 地址,可以是服务器本地的地址 localhost 或者是服务器可以访问到的一个 ip 地址,例如服务器同机房的某个 ip,或者服务器可以连接公网的话,可以是公网上某台服务器的 ip 地址。

二、Remote
‘Local’用于把服务器上的服务映射到本机的某端口上,’Remote’则相反,它将本地的端口映射到服务器的某一端口上,在服务器上访问该端口,实际是访问本机的服务。与此类似的是:防火墙的端口映射模式,与之不同的是:前者是在公司防火墙上开了一个洞,是合法的操作;后者是凿了一个洞,是非法操作,无须经过网管人员。后者可能为公司企业带来泄密的风险,尤其是做了到 ssh 端口映射,就可从外部服务器上就可访问公司整个内部网络!

‘Source Host’为远程服务器的地址,默认为’localhost’,当然也可以那台主机上的其它 ip 地址,为了安全起见,ssh 仅会侦听回环 (127.0.0.1) 地址,即使填写的是公网地址也是如此。’Listen Port’为指定在公网服上侦听的端口,注意不要与其它已经在用的端口相冲突。’Destination Host’这个为公司内网地址,这个地址的端口上运行着你想访问的服务,当然也可以只映射到本机上的某一端口。

因此这种方式也叫做 “反向代理”。

示例:让公网上的服务器访问局域网里的某台机器的的服务

访问另外一台机器 (192.168.18.100) 上的 web 服务

通过 ssh 登录内部一台机器的 ssh,这样远程的机器就能控制内部这台机器了,如果能登录成功的话,还可以从它跳转登录到局域网其它机器。

在 linux 下,可以借助于’autossh‘这款工具来实现。

三、Dynamic
即 socket 代理,用于给本地开启代理端口,只要程序支持 Socket 连接方式,如浏览器通过本端口代理上网。

在弹出的’Forwarding Rule’,按照如图所示进行配置,Type 选择 “Dynamic(SOCK54/5″;’Listen Port’默认使用 1080,这里也可以按照自己需求进进行端口设置;Descripting 根据自己需要进行描述,可以留空,配置后点击 OK 会弹出一个对话框,点击是的话会对当前会话进行保存,以后每次连接此 ssh 会话,本地 socket 代理会自动打开。

添加完成后在’Forwarding Rules’对话框可以看到的一行转发配置,确保 Status 的状态是 “Open”,如果显示的是 “Failed” 可能是 1080 这个本地端口已经被占用了,可以尝试修改代理端口为其它端口进行重新设置。

至此,代理服务器设置已经完成了,下面将进行浏览器客户端的配置。

打开 Internet 选项,点击 “连接” 选项卡,在这个页面点击 “局域网设置”,弹出 “局域网 (LAN) 设置”。

在代理服务器下面勾选 “为 LAN 使用代理服务器”,地址和端口全部留空,点击 “高级”,进入 “代理服务器设置” 端口。在套接字一行,代理服务器地址写 “localhost”,端口写 “1080”,然后依次点击确定,回到浏览器页面就可以通过代理进行上网了。可以访问 http://www.ip138.com/ 来看一下出来的 ip 地址是否有变化。

如果想给本地其它电脑做代理,可以给其它电脑做类似设置,但是地址需要写和对方进行通信的内网 ip 地址而不是 socket 了。这个方法主要针对那些你不能打开的网页,比如公司在出口路由上对影响工作的网站或应用进行了屏避,或逃过公司做你上网记录的收集 (交换机端口镜像),这个方法就非常好用了,其实我经常用后者来对我的隐私做最大的保护。

除了为本地的机器开启上网浏览服务外,还可以用来解决文章前面所提及的直接登录外部机房里只有私有 ip 的机器,这样你就不用先登录有公网 ip 的机器,然后在那台机器里用 ssh 再登录内网机器了。操作方法如下:
host_a:你在公司的 pc,装有 xshell
host_b:外网服务器,其上有公网 ip 和私网 ip
host_c:外网服务器,其上仅有私网 ip

这里要知道:host_b 与 host_c 它们是位于机房中的局域网内,它们之间的通信只能通过私网进行,数据包不会出公网。且 host_a 与’host_b,host_c’的私网是完全独立的,没有任何关系。

现在从 host_a 使用 xshell 连接 host_b,并开启 Socket 代理,端口为’1080’,建立好连接后,打开’cmd’容器,使用指令’netstat -na|more’看下应该有’1080’端口处于侦听 (LISTENING) 状态。同是不要断开连接,因为 host_a 发住 host_c 的数据信息都要从这个端口到 host_b,然后再由 host_b 转发至 host_c。

建立到 host_c 的 ssh 连接,写好 host_c 的私网 ip 地址 (不是 host_b 的),用户名及密码,做好后先不要连接 (实际也连接不上),在设置好其代理后才可继续连接。

在’Connection’->’Proxy Server’页中,如果没有添加 host_b 的代理名称及信息话,点击’Browse…’按纽。

添加一个已经建立起连接的名称,这里为’nhk3’,’host’一般为’127.0.0.1’的地址 (如果有公司内有专用的代理机的话,则填入那台机器的 ip 地址),端口为刚才使用的端口。

选择适用的’Proxy Server’为’nhk3’,确定后即可开始连接。要终端窗口里会打印出通过’Proxy’连接的信息:
Connecting to proxy server(127.0.0.1:1080)…
Connection established.
To escape to local shell, press ‘Ctrl+Alt+]’.

Last login: Fri Apr 19 15:41:06 2013 from 192.168.x.x

这里的’192.168.x.x’即是’host_b’的私网 ip。

发表评论

电子邮件地址不会被公开。 必填项已用*标注