SSH端口转发:
SSH会自动加密和解密所有SSH 客户端与服务端之间的网络数据。SSH还能够将其他TCP端口的网络数据通过SSH链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为SSH 为其他TCP链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些TCP应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许SSH的连接,也能够通过将TCP端口转发来使用SSH进行通讯。
SSH 端口转发能够提供两大功能:
(1)、加密 SSH Client 端至SSH Server端之间的通讯数据;
(2)、突破防火墙的限制完成一些之前无法建立的TCP连接;
角色定义:
A. 本地服务器,想通过中间服务器B间接访问目标服务器C;
B. 中间服务器,类似于代理,A以B的名义去访问C;
C. 目标服务器,C看到的都是中间服务器B在访问自己;
本地转发:
ssh -L localport:remotehost:remotehostportsshserver
选项:
-f:后台启用
-N:不打开远程shell,处于等待状态
-g:启用网关功能
示例:
在A主机上执行:ssh –L 156:telnetsrv:23-fN sshsrv:该命令表示,建立了一条由A主机随机开启的一个端口—>ssh服务器之间(B主机的22端口)的隧道。A主机上的ssh服务监听自己主机的156端口,当有数据访问自己(A主机)的156端口时,数据便会经过隧道,发送给ssh服务端。(注意:本例中的数据就是telnet服务)ssh服务端(B主机)代替telnet客户端(A主机)向telnet服务端(C主机)发送请求!-fN,表示隧道搭好之后,在后台运行。
在A主机上执行:telnet 127.0.0.1 156:访问本机的156端口。此时,该命令就类似于在ssh服务器端执行了“telnet telnetsrv:23”的命令(注意:ssh服务端(B主机)不必安装telnet。因为只需要ssh服务端提供转发的功能)。当访问本机的156的端口时,被加密后转发到sshsrv的ssh服务,再解密,然后数据被转发到telnetsrv:23;
注意:在本地转发中,A主机:ssh服务的客户端,telnet的客户端;B主机:ssh服务的服务端;C主机:telnet服务的服务端。
data --->localhost:156--->localhost:XXXXX--->sshsrv:22--->sshsrv:YYYYY--->telnetsrv:23
远程转发:
远程转发的环境和目的与本地端口转发是一样的,远程准发只是不在本地服务器A上执行命令,而是在中间服务器B上执行;为什么不直接在服务器A自己身上执行命令呢?这个场景有别于本地端口转发的地方在于:A不能主动连接B但反之可以。比如A在外网,B、C在内网;而A去访问的时候,同样都是通过自己的IP和端口,同样首先建立AB之间的SSH通道,以服务器B的名义来访问目标服务器C。
ssh -R sshserverport:remotehost:remotehostportsshserver
示例:
在中间服务器(B)执行:ssh –R 9527:telnetsrv:23 –N sshsrv:中间服务器B会随机开启一个端口访问A机器的22端口,建立一条以ssh加密的通道。当A主机访问自己主机的9527端口的时候,会将数据传送给A自己主机的22端口,经过加密的通道,传送到中间服务器上。中间服务器收到数据后,ssh服务会随机开启一个端口,将数据发送给telnet服务器(C)的23端口上。
在A主机上执行:telnet 127.0.0.1 9527:让sshsrv(A主机)侦听自己的9527端口,如有访问时,就加密后,通过ssh服务转发请求到B主机的ssh的客户端,再由B主机解密后转发到telnetsrv:23;
注意:在本地转发中,A主机:ssh服务的客户端,telnet的客户端;B主机:ssh服务的服务端;C主机:telnet服务的服务端。
Data--->sshsrv:9527--->sshsrv:22--->localhost:XXXXX--->localhost:YYYYY--->telnetsrv:23
动态端口转发:(可以实现翻墙)
ssh本地和远程端口转发都需要固定的应用服务器IP和端口,但是很多情况下,应用的端口繁多逐个转发效率不高,而且一些应用使用不固定的端口,经常跳着使用端口,一些网站还不支持IP直接访问,这导致ssh本地和远程端口转发在一些使用上不是很方便,使用ssh动态端口转发可以解决以上问题。
当用firefox访问internet时,本机的1080端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internet;
ssh -D 1080 root@sshserver
示例:
将A主机的firefox设置代理:socket proxy:127.0.0.1:1080
在A主机上执行:curl --socks5 127.0.0.1:1080 http://www.baidu.com
(https://www.chenyudong.com/archives/linux-ssh-port-dynamic-forward.html)这篇博客对于动态端口转发介绍的比较好
注意:要想理解ssh端口转发,需要理解,服务与端口其实是两个不同的概念(注意参考OSI网络模型)。
ssh命令,控制的只是ssh服务。
本地转发和远程转发本质是一样的,只不过是敲得命令不一样而已。