SSH也就是Secure Shell的意思,通过它能在用户和主机之间建立一条安全的通道,所以就很有用。隧道只是其中一种。如果你有一台机器的SSH账号,而这台机器相对方便些,就可以用SSH从本机挖条隧道到这台机器,然后再通过这台机器访问其他机器。

假设网络环境:

image

A:192.168.50.80
B:192.168.209.128
C:192.168.209.253

1.防火墙限制C与A之间的通讯
2.A-B和C-B能使用ssh远程访问.

需求:C能使用ssh远程访问A

从环境上看A-B和C-B能正常通讯,那么可以通过ssh隧道,把B做为中间人建立一条通道C-B-A来绕过防火墙的限制达到C与A的通讯。

在C机器上操作:
[root@slave ~]# ssh -N -f -L 222:192.168.50.80:22 192.168.209.128
root@192.168.209.128's password:             #输入访问的Assh密码

将A的IP192.168.50.80端口22映射到本机222端口监听,当访问本地222端口时使用192.168.209.128建立隧道连接

查看222端口监听
[root@slave ~]# netstat -ant | grep 222
tcp        0      0 127.0.0.1:222               0.0.0.0:*                   LISTEN     
tcp        0      0 ::1:222                     :::*                        LISTEN 

测试

首先直接从C上ssh连接A
[root@slave ~]# ssh 192.168.50.80
ssh: connect to host 192.168.50.80 port 22: Connection refused

连接失败

通过隧道连接
[root@slave ~]# ssh -p222 127.0.0.1
root@127.0.0.1's password:
Last login: Thu Apr 19 19:14:37 2012 from 192.168.10.21
[root@localhost ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:DB:A3:42 
          inet addr:192.168.50.80  Bcast:255.255.255.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fedb:a342/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:551644 errors:0 dropped:0 overruns:0 frame:0
          TX packets:50648 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:70954130 (67.6 MiB)  TX bytes:17081147 (16.2 MiB)

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:400 (400.0 b)  TX bytes:400 (400.0 b)

C能正常连接到A上。

参数:ssh -N -f -L 222:192.168.50.80:22 192.168.209.128
-N 不执行命令,仅做端口转发
-f  告诉客户端后台运行
-L  本地映射端口,格式为:port1:host:port rhost
port1开启本地监听端口
host 需要访问的目标机器IP地址
port 需要访问的目标机器端口
rhost 建立隧道的中间机器的IP地址