SSH端口转发分为两种,一种是本地端口转发,又称为本地SSH隧道。一直是远程端口转发。SSH端口转发,还必须指定数据传送的目标主机,从而形成点对点的端口转发。

本地端口转发

    假定有三台主机ABC。由于种种原因(无论是防火墙还是路由原因)AC两台主机之间无法连通。但是B却可以和AC连通。这时候就可以用本地端口转发来实现AC通过B来连通。

    A  192.168.7.27

    B  192.168.6.19

    C  192.168.30.68


6网段和7网段、30网段都相通,但是7网段和30网段不通,现在需要从7网段访问30网段的一个web服务,可以通过本地端口转发来实现。首先确保ABssh服务都开启了允许转发:GatewayPorts yesAllowTcpForwarding yes

 

A上面执行下面的命令:

ssh -l test -L 192.168.7.27:59000:192.168.30.68:80 192.168.6.19

    参数-L后面总共有四个用冒号分割的值,分别是'本地地址:本地端口:目标主机:目标主机端口'。这条命令的意思,就是指定SSH绑定本地192.168.7.2759000端口,然后指定 192.168.6.19将所有的数据,转发到目标主机192.168.30.6880端口。


如此,我们只要在A上连接A本地地址的59000端口,就等于连上了192.168.30.6880端口。



curl http://192.168.7.27:59000/


 

    这种本地端口转发适合于A是企业局域网机器,BC均为广域网上的有独立公网IP的机器,但是企业的防火墙阻止了AC直接的通讯,但是却允许AB通讯,这样A就可以通过BC进行通讯。

远程端口转发


     假定有三台主机ABCA是企业内部局域网的机器,B是企业内部一台具即有私网IP又有公网IP的服务器(类似网关)CInternet上具有公网IP的服务器,A可以直接连接到CB可以直接连接A(内网),也可以直接连接C(公网),但是由于A在内网,所以C不能直接连接A,但是C可以通过B连接A

          A  10.1.6.234 

     B  114.80.130.88/10.1.10.1 

     C  119.75.218.77 

B上执行以下命令:

ssh -l taomee -p 58000 -R 10.1.10.1:59000:10.1.6.234:80 119.75.218.77

C上执行以下命令:

curl http://10.1.6.234



=======================================================

转载源地址:http://my.oschina.net/guol/blog/115235

=======================================================

我的情况是有A和B之间有专线/***,可以互相访问内网IP,C是亚马逊RDS,B和C之间有***,可以以内网IP访问,但A不能访问C,现在A要访问C,以B做为代理做本地端口转发

最后自用的命令:(在代理机器上跑)

ssh -l root -fNL 0.0.0.0:3306:MYSQL:3306 10.3.211.226

root是登录代理机器B的用户名

0.0.0.0:3306访问代理机器的3306端口会转发到C

MYSQL是访问不到的数据库C

10.3.211.226是代理机器B的IP

-fN是后台运行