首先先贴些一些关于ssh在端口转发方面的三个比较重要的命令的基本资料:
首先,认识下这三个很是强大的命令:php
1 ssh -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host 2 ssh -C -f -N -g -R listen_port:DST_Host:DST_port user@Tunnel_Host 3 ssh -C -f -N -g -D listen_port user@Tunnel_Host
相关参数的解释:
-f Fork into background after authentication.
后台认证用户/密码,一般和-N连用,不用登陆到远程主机。html
-L port:host:hostport
将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工做原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了链接, 该链接就通过安全通道转发出去, 同时远程主机和 host 的 hostport 端口创建链接. 能够在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另外一种格式说明: port/host/hostportlinux
-R port:host:hostport
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工做原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了链接, 该链接就通过安全通道转向出去, 同时本地主机和 host 的 hostport 端口创建链接. 能够在配置文件中指定端口的转发. 只有用 root 登陆远程主机才能转发特权端口. IPv6 地址用另外一种格式说明: port/host/hostport
-D port
指定一个本地机器 “动态的’’ 应用程序端口转发. 工做原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了链接, 该链接就通过安全通道转发出去, 根据应用程序的协议能够判断出远程主机将和哪里链接. 目前支持 SOCKS4 协议, 将充当 SOCKS4 服务器. 只有 root 才能转发特权端口. 能够在配置文件中指定动态端口的转发.shell
-C Enable compression.
压缩数据传输。windows
-N Do not execute a shell or command.
不执行脚本或命令,一般与-f连用。安全
-g Allow remote hosts to connect to forwarded ports.
在-L/-R/-D参数中,容许远程主机链接到创建的转发的端口,若是不加这个参数,只容许本地主机创建链接。注:这个参数我在实践中彷佛始终不起做用。服务器
实例说明:
一台服务器提供ftp服务(其实任何服务均可以),由于ftp传输是明文密码,若是不作ssh端口以前,咱们能够经过tcpdump命令很容易的捕捉到明文信息。因此咱们要对21端口进行转发:ssh
(注:我这里要使用的功能是鉴于这个理由,好比有三台电脑主机,A、B和C,它们有这样的访问规则:A<------>B<------>C-----x-----A。因此若是想从C登陆到A,必须先登陆到B在登陆到A上,若是上传下载文件的话,也是很是麻烦,这使咱们想到用ssh转发,使A的22端口转发到B的8822,而后再把B的8822端口转发到B自己的9944端口,端口号只要不被占用大于1024便可。这样,咱们直接链接B的9944端口实际上就至关于链接A的22端口,就像是能够直接互联同样。这是咱们要进行端口转发的出发点)socket
(注:不用root也能够,只是一般状况下,非root用户限定端口不能使用1024如下的,可是以上的能够,因此,对于上面我所要求的状况。首先咱们用传统的方式登陆到A服务器上,而后可使用以下命令:
ssh -CNfg -R 8822:localhost:22 usernameinB@ipB
而后会让你输入密码,输入完以后就消失到后台了
PS:这里的localhost其实指的A服务器自己
)
而后登陆到100.0.0.50机器,咱们能够经过netstat -an|grep :2121查看端口已经侦听tcp
(这里咱们登陆到ipB的机器,而后就能够直接使用下面的命令:
ssh -l usernameinA localhost -p 8822
而后就能够登陆到A服务器上了。
PS:这里的localhost其实指的是B机器,原理就是在B上连本身的8822,其实就是连A上的22端口,这都是因为上面第一步的转发造成的。注意与第一步的比较)
就能够登陆到ftp-server了,并且tcpdump没法捕获到有效的信息。
2121端口任意选择,只要是机器上没有占用的端口就行
来一个稍微复杂一点的,作网关的例子:
(注:它这里所说的复制的离子,其实就是咱们要达到的目的,从C直接联到A,固然是经过B。)
假如内网有一台提供ftp(linux,port is 2121,称为A机器)的机器,经过网关服务器(linux,port is 8888,称为B机器)进去,如今外网有一台C机器须要访问网关服务器的某个端口(port is 21)来访问内网的ftp服务器。你们能够看到,其实这就像是一个基于ssh的防火墙程序,好,下面咱们来具体操做:
一、login A 机器
(注:同上,执行命令
ssh -CNfg -R 8822:localhost:22 usernameinB@B机器IP
)
这样咱们就在B机器上开了一个8888->2121的端口转换,可是因为8888端口只能侦听在localhost主机上,所以,虽然咱们已经能够在B机器上使用
(注:上面其实咱们也解释了:这样咱们就在B机器上开了一个B机器上的8822端口->A机器的22端口转换,可是因为8822端口只能侦听在localhost主机上,所以,虽然咱们已经能够在B机器上使用
ssh -l usernameinA localhost -p 8822 来访问A机器,但仍然没法提供给外网的机器访问,下面正要解决直接C--->BPS:第一步其实就是上面实例时的那种状况)
来访问真正的ftp服务器,但仍然没法提供给外网的机器访问
二、login B机器
(注:登上B)
(注:执行命令:
ssh -CNfg -L 9944:localhost:8822 usernameinB@localhost
在这里插播一个状况就是可能在登陆的过程当中会出现一个这样的问题:
ssh_exchange_identification: Connection closed by remote host
出现这种错误的缘由是/etc/hosts.allow和/etc/hosts.deny阻止了你的登陆,你要检查下。没有出现这个问题固然是最好。作完以后就在B机器上完成了9944--->8822的端口转换,能够侦听在任何地址上的请求。)这样作,是作本地机器上的21->8888端口转换,能够侦听在任何地址上的请求。
2(1)
若是C机器也是一台linux机器,那也能够这样设置:
(注:在咱们这里就是执行 ssh -CNfg -R 9944:localhost:8822 usernameinC@C机器IP)
3。使用C机器,
能够是linux下的ftp命令,也能够是windows下的客户端软件均可以访问B机器的21端口来链接后台真正的ftp服务器(真正的端口是2121)
(注:对于咱们的状况,访问的就是B机器的9944端口,使用C机器上的账户)
若是是按照2(1)中的设置,则访问的地址为本机IP。
(注:对于2(1)的状况,可使用
ssh -l usernameinC localhost -p 9944
这里使用的localhost,实际上对应的C机器)
至此,一般状况下用端口转发就能够实现。
再补充一点,其实对于2(1)的状况,有些软件也能够实现,好比putty,这方面的设置能够参考:我这里就不赘述了(http://www.lupaworld.com/batch.download.php?aid=1199)
简单介绍一个在linux下使用的设置ssh端口转换的程序
http://gstm.sourceforge.net/?page_id=5
[p_w_upload=1197]
在windows机器下使用putty也能够创建端口转发
假设从windows机器上将本地的8888端口转发到B的21端口,能够作以下设置
Connection->SSH-Tunnels中能够设置putty的端口转发,Source port为listen_port,填8888,Destionation为DST_Host:DST_port,填写B机器IP:21,设置完了点Add.
注意是local仍是remote?
[p_w_upload=1198]
设置好后,咱们能够在dos下用netstat命令看一下是否开启了本地的转发端口
[p_w_upload=1199]
接下来咱们访问localhost的8888端口来访问ftp服务器了