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 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.

注意:

  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上执行以下命令:

[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协议转发,在这就不细说了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值