-N告诉SSH客户端,这个连接不需要执行任何命令,也就是说不需要打开远程,仅仅做端口转发;
-T不为这个连接分配TTY。其中-N,-T两个参数可以放在一起用,代表这个SSH连接只用来传数据,不执行远程操作;
-f告诉SSH客户端在后台运行,要关闭这个后台连接,就只有用kill命令去杀掉进程;
-L做本地映射端口,需要注意被冒号分割的三个部分含义,下面做详细介绍;
-C压缩数据传输;
-g()默认只转发本地发送的数据,如果要转发其它服务器的客户端请求,则需要添加该参数。
注意,使用时需要修改服务端的如下配置。
接下来,看看具体的使用场景,以及配置方式。
本地转发
其中,通过本地转发时,命令参数如下。
-----本地转发方式的参数设置$ssh-N-f-L[]:[]:[][user@]
其中-参数的含义是:将IP为Y的机器的Z端口通过中间服务器(部署了sshd的服务器)映射到本地机器的X端口。
需要注意的是,此是只有ssh客户端与服务器之间的数据是加密的,而实际上中间服务器到Y服务器的数据没有加密。
转发到本地服务
为了防止被攻击,通常在进行防火墙配置时,会尽可能减小打开的端口,例如只开启服务端口,因此如果需要访问mysql(3306)服务只能从本地访问,此时可以使用该功能。
可以执行如下命令,然后访问本地的端口7000即可。
-----本地执行如下命令,然后访问localhost:7000即可$ssh-N-f-L7000:localhost:3306mysql_server_ip-----访问远程的MySQL服务$mysql-P7000-hlocalhost
注意,非管理员只能使用1024~65535的端口,在此选择7000端口。
数据在传输时将会通过如下的四步:A)将数据发送到本地的7000端口;B)本地的SSHClient将7000收到的数据加密后发送到mysql_server_ip;C)SSHD端收到数据后解密,并发送给本地的3306端口;D)从MySQLServer上返回的数据按照原路返回。
转发到其它服务器
另外一种场景如下,A尝试访问C提供的FTP服务,但是由于防火墙导致不能直接访问,也就是说ABC链路不通。但是ABD链路是通的,而且D上运行着ssh-server,此时就可以利用隧道技术建立ABDC链路。
也就是说,中间服务器D部署着sshd服务,用于建立ssh连接;C的21端口提供FTP服务,然后就可以通过如下方式建立隧道。
-----本地执行如下命令,然后访问localhost:2121即可$ssh-N-f-L2121:234.234.234.234:21123.123.123.123-----访问234.234.234.234服务器上的ftp服务$ftplocalhost:2121
远程转发
对于上述的第二个场景,A通常时一个内网,也就是说D-B-A是无法建立链接的,如上所述,而A-B-D是可以通过ssh建立链接的,为了可以建立D-B-A的连接,那么就需要远程转发了。
也就是说,我们利用一条已经连接好的A-B-D方向的连接来完成D-B-A方向的访问。
$ssh-R[localport]:[remotehost]:[remoteport][SSHhostname]-----在123.123.123.123上执行如下命令,建立22(ssh服务)的远程转发$ssh-N-f-R2222:127.0.0.1:22123.123.123.123-----反向登陆到D上$ssh-p2222localhost
此是的操作为让SSHhostname监听自己的localport端口;将所有的数据经由123.123.123.123服务器,转发到remotehost:remotepost服务器。
对于D来说,A是一台远程主机,所以这种情况就被称为“远程端口绑定”。
两者比较容易混淆,可以通过如下的方法区分。如果服务器(ssh和应用)都在同一端,则是本地转发;否则是远程转发。
另外,需要注意,”远程端口转发”的前提条件是,D和A两台主机都有sshd和ssh客户端。
另外示例
也可以理解为,A提供了一个服务,D想要访问这个服务,但是A没有公网IP,导致D无法直接访问。
此时就需要建立一个A-D的隧道,然后D通过这个隧道访问即可。
ASVR(ssh-CLI)172.16.0.163DCLI(ssh-SVR)192.168.9.15ssh-N-f-R3967:127.0.0.1:3967root@192.168.9.15
动态转发
也就是通过ssh在本地建立一个socks代理服务,所有的本地网络访问都会通过该端口,然后转发到服务器,而应用程序决定使用那个端口。
可以用作隧道代理,其大致的工作如下:
整个流程如下: