对xshell三种端口转发的认识
2013-04-19 18:12:12

工作中经常会遇到一些服务器访问受限的问题:某些服务器只有私网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。