简介
上一篇博客我们讲过linux的端口转发(http://blog.csdn.net/yanggd1987/article/details/49470573),主要是通过iptables和Rinetd,其实还有一种转发方式,就是ssh。我们大家都知道ssh是一种安全传输协议,大多数情况下用在连接服务器上;但是它还有一种功能就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程有时也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果您工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,那么也是能够通过将 TCP 端口转发来使用 SSH 进行通讯。
基础命令
ssh -C -f -N -g -L listen_port:DST_Host:DST_port user@Tunnel_Host
ssh -C -f -N -g -R listen_port:DST_Host:DST_port user@Tunnel_Host
ssh -C -f -N -g -D listen_port user@Tunnel_Host
参数解释:
-f Fork into background after authentication.
后台认证用户/密码,通常和-N连用,不用登录到远程主机。
-L port:host:hostport
将本地机(客户机)的某个端口转发到远端指定机器的指定端口. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-R port:host:hostport
将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口. 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-D port
指定一个本地机器 “动态的’’ 应用程序端口转发. 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 根据应用程序的协议可以判断出远程主机将和哪里连接. 目前支持 SOCKS4 协议, 将充当 SOCKS4 服务器. 只有 root 才能转发特权端口. 可以在配置文件中指定动态端口的转发.
-C Enable compression.
压缩数据传输。
-N Do not execute a shell or command.
不执行脚本或命令,通常与-f连用。
-g Allow remote hosts to connect to forwarded ports.
在-L/-R/-D参数中,允许远程主机连接到建立的转发的端口,如果不加这个参数,只允许本地主机建立连接。注:这个参数我在远程端口转发中没作用。
应用
本地转发
实例:
10.10.10.59可以通过ssh的22端口访问10.10.10.8,但是无法访问10.10.10.8上的其他端口,现在我需要访问10.10.10.59上的8000端口,通过ssh的端口转发来达到访问10.10.10.8上的80端口。
操作:
在10.10.10.59上执行以下命令:
[root@test1 root]# ssh -g -f -N -L 8000:10.10.10.8:80 test2@10.10.10.8
test2@10.10.10.8's password:
[root@test1 root]# lsof -i:8000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 17676 root 4u IPv4 232390 0t0 TCP *:irdmi (LISTEN)
ssh 17676 root 5u IPv6 232391 0t0 TCP *:irdmi (LISTEN)
[root@test1 root]# curl 10.10.10.59:8000
hello,this is 10.10.10.8
执行完命令后,我们在本机发现8000端口已经启动,我们在本机访问8000端口竟然显示10.10.10.8上的80端口内容了。当然由于我们增加了-f -N 参数使得执行完命令后不会进行ssh登录,增加-g参数则允许我们在另一台服务器远程访问10.10.10.59:8000.
注意:
- 我们只能在建立 SSH 连接的同时创建端口转发,而不能给一个已经存在的 SSH 连接增加端口转发。
- SSH 端口转发是通过 SSH 连接建立起来的,我们必须保持这个 SSH 连接以使端口转发保持生效。一旦关闭了此连接,相应的端口转发也会随之关闭.
远程转发
实例:
在某些情况下10.10.10.59无法ssh到10.10.10.8,但是10.10.10.8可以shh到10.10.10.59上。如果我们需要访问10.10.10.8:80应该怎么办?这就需要用到远程转发了。
操作:
在10.10.10.8上执行以下命令:
[root@test2 root]# ssh -g -f -N -R 8000:10.10.10.8:80 yanggd@10.10.10.59
这时会在10.10.10.59上启动8000端口用来监听:
[root@test1 root]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 10.10.10.59:22 0.0.0.0:* LISTEN 1040/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1125/master
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN 18202/sshd
tcp 0 0 ::1:25 :::* LISTEN 1125/master
tcp 0 0 ::1:8000 :::* LISTEN 18202/sshd
tcp 0 0 :::5666 :::* LISTEN 1049/xinetd
注意此时8000端口绑定在127.0.0.1上,因此我们只能走10.10.10.59上可以访问,无法在其他机器上访问,即使加上了-g参数。
多主机转发
实例:
有10.10.10.58,10.10.10.59,10.10.10.33,10.10.10.8 3台主机,59可以通过ssh登录33,但是不能够ssh到8;33可以ssh到8。我们在58上访问8的80端口,需要通过59和33的ssh端口转发。
操作:
在10.10.10.59上操作:
ssh -g -f -N -L 8000:10.10.10.8:80 yanggd@10.10.10.33
这样我们通过59和33之间的端口转发就可以在58上访问10.10.10.8:80了。
除了以上几种端口转发,ssh还支持动态端口转发及X协议转发,在这就不细说了。