天天看点

linux下的ssh端口转发

简介

  上一篇博客我们讲过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 [email protected]_Host
ssh -C -f -N -g -R listen_port:DST_Host:DST_port u[email protected]_Host
ssh -C -f -N -g -D listen_port [email protected]_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上执行以下命令:

[[email protected] root]# ssh -g -f -N -L 8000:10.10.10.8:80 [email protected] 
test2@'s password: 
[[email protected] root]# lsof -i:8000
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ssh      root    u  IPv4       t0  TCP *:irdmi (LISTEN)
ssh      root    u  IPv6       t0  TCP *:irdmi (LISTEN)
[[email protected] root]# curl 10.10.10.59:8000
hello,this is 
           

执行完命令后,我们在本机发现8000端口已经启动,我们在本机访问8000端口竟然显示10.10.10.8上的80端口内容了。当然由于我们增加了-f -N 参数使得执行完命令后不会进行ssh登录,增加-g参数则允许我们在另一台服务器远程访问10.10.10.59:8000.

注意:

  1. 我们只能在建立 SSH 连接的同时创建端口转发,而不能给一个已经存在的 SSH 连接增加端口转发。
  2. 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上执行以下命令:

这时会在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               .:              ...:*                   LISTEN      /sshd           
tcp               ..:                ...:*                   LISTEN      /master         
tcp               ..:              ...:*                   LISTEN      /sshd          
tcp               :::                      :::*                        LISTEN      /master         
tcp               :::                    :::*                        LISTEN      /sshd          
tcp               :::                     :::*                        LISTEN      /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 :: yanggd@
           

这样我们通过59和33之间的端口转发就可以在58上访问10.10.10.8:80了。

除了以上几种端口转发,ssh还支持动态端口转发及X协议转发,在这就不细说了。

继续阅读