SSH端口转发

通过本文的介绍,读者可以从中了解到如何应用 SSH 端口转发机制来解决日常工作 / 生活中的一些问题。学会在非安全环境下使用端口转发来加密网络应用,保护个人隐私以及重要商业信息。同时也能够用此技术解决工作中一些常见问题,例如解决防火墙及网络应用本身带来的一些限制。

0x01 端口转发概述

SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还同时提供了一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程有时也被叫做隧道(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。

例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果您工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,那么也是能够通过将 TCP 端口转发来使用 SSH 进行通讯。

总的来说 SSH 端口转发能够提供两大功能:

  1. 加密 SSH Client 端至 SSH Server 端之间的通讯数据。
  2. 突破防火墙的限制完成一些之前无法建立的 TCP 连接。

0x02 本地转发

本地转发

如图,我们对B机器没有操作权限,C机器欲访问B机器,但由于B机器无外网ip,所以无法访问,但A机器可以和B,C两台机器通信(有外网ip和内网ip),此时使用SSH在A机器上做SSH端口本地转发,来实现外网访问内网B机器

如果转发后监听的ip地址为0.0.0.0,则需要更改跳板机的sshd配置文件vim /etc/ssh/sshd_config更改GatewayPorts no > GatewayPorts yes

在A机器执行:

1
2
3
ssh -CfNgL 0.0.0.0:80:172.16.1.2:80 [email protected]
| | | | |
A B C D E

这里我们来分段讲解命令的构成:

A: 这里是本机转发后要监听的ip段,0.0.0.0允许所有ip访问,本机ip允许内网ip访问,127.0.0.1允许本机访问
B:远程主机端口转发到本机后的端口
C:要转发的远程主机ip,这里的ip地址是相对跳板机而言的
D:要转发的端口
E:需要执行转发的机器,即跳板机

1
2
3
4
5
6
7
-C 压缩传输数据
-f 建立SSH连接后放置后台,静默模式
-N 不要执行远程命令。 这对于仅转发端口很有用(仅限协议版本2)
-g 允许远程主机连接本地端口转发
-L 指定本地(客户端)主机上的给定端口要转发到远程端的给定主机和端口。这通过分配一个套接字侦听本地端口,
可选绑定到指定的bind_address工作。每当与此端口建立连接时,都会通过安全通道转发连接,
并从远程机器连接到主机端口主机端口 # 记住本地转发时候用L选项就可以了

访问流程如下:

1
Client(C) 访问TCP> A:80 通过SSH隧道> SSH(A) TCP> B:80

这里做的是在A主机本地的端口转发,如果想把B机器80端口转发到在C机器的80端口

在C机器执行:

1
2
3
4
5
#ssh -CfNgL 0.0.0.0:80:172.16.1.2:80 [email protected]
ssh -CfNgL 0.0.0.0:80:172.16.1.2:80 [email protected]
只需要把此ip,更换成A机器外网ip即可
#ssh登陆A主机,告诉A主机,转发B主机(172.16.1.2)80端口,本机SSH与A主机建立SSH隧道转发到本机80端口
#此时在A主机执行netstat -anp|grep ssh会多出来一条SSH隧道进程,这个隧道就是与C主机建立的

访问流程如下:

1
Client(C) TCP> C:80 通过SSH隧道> SSH(A) TCP> B:80

建议亲手操作去试试找下感觉!

0x03 远程转发

远程转发

如图,同样我们对C机器没有操作权限,D机器想访问C机器80端口,但是和C同一网段的机器都没有外网ip,只有A机器有外网但和C又不是一个局域网,上节我们用的本地端口转发在这里就不能使用了,此时远程端口转发出来了: )

在B机器执行:

1
2
3
4
5
需要转发主机的ip(C)
|
ssh -CNfgR 0.0.0.0:80:172.16.1.2:80 [email protected]
| | | |
远程主机监听网段 远程主机监听端口 转发端口 远程主机(A)

执行如上操作,此时D访问A主机80端口就可以转发到C主机80端口B主机扮演跳板机角色

访问流程如下:

1
2
Client(D) TCP> A:80 SSH隧道> B TCP> C:80
#有种卖队友的感觉:)

0x04 动态端口转发

此方法多用于翻墙,所有端口经过SSH隧道,建立socks连接,一条命令自己体会

1
ssh -qTfnN -D 7070 [email protected] -p sshport