老调重弹: SSH与隧道和端口转发

老调重弹: SSH与隧道和端口转发

11月 01, 2017     liumwei

SSH是Secure Shell的缩写,意即:安全壳协议,是应用层和传输层基础上的安全协议。它将所有传输数据进行压缩和加密,防止远程管理过程中的信息泄露以及防止DNS和IP欺骗。

基于SSH,可为Telnet、FTP、POP,乃至PPP提供替代方案和安全通道。SSH提供密码验证和密钥验证两种安全机制。前者通过账号、密碼实现远程主机登录,后者则提供主从计算机上的密钥对,实现配对验证(也就是,主机和客户端通过预先制作的配对密钥,实现握手验证)。至于如何生成SSH密钥,可参看该页面。

要是用SSH,需主机服务器上事先安装OpenSSH相关服务,而客户机则需要使用Putty或者基于Linux终端来连接。

1.主机服务器上安装OpenSSH-Server(基于Debian/Ubuntu),命令如下:

sudo apt-get install openssh-server openssh-sftp-server openssh-client

2.客户端计算机登录操作(采用Putty或者ssh命令)

ssh username@www.xxx.com

  Windows下可采用Putty或者利用Powershell安装Git for Windows后基于ssh来登陆

 

 

3.SSH隧道与端口转发

通过上面的命令,现在实现从客户端计算机到主机服务器的ssh隧道连接。而这个连接,其实也可以通过命令,实现主机服务器主动接受客户端计算机相应的数据请求。这种主动过程,称之为端口转发。它的用处往往用于突破外网计算机无法访问内网计算机的限制。当然,它也可以用于网络封锁下的信息交流。下面是几条用于端口转发的命令:

ssh -C -f -N  -L localhost_port:remote_host:remote_host_port username@remote_host_domain #可基于客户机,实现客户机到远程主机(不能被直接访问)特定服务的直接访问
ssh -C -f -N -R localhost_listen_port:remote_host:remote_host_port username@remote_host_domain #可基于远程主机服务器(提供公网访问服务),实现客户机的公网访问
ssh -C -f -N -D localhost_listen_port username@remote_host_domain #可基于远程主机网络(可访问被屏蔽网络),实现所谓的翻墙)

相关参数说明:

-C 表示信息压缩传输;
-f 表示后台认证用户/密码(通常和-N连用),而不登录到远程主机(也就是后台运行);
N 表示不执行脚本,仅做端口转发,与-f常常连用;
-L 表示将远程主机服务器指定端口映射到客户机某端口;
-D 表示客户机 “动态’’转发;
-R 表示将远程主机服务器端口转发到客户端计算机指定端口

4.SSH翻墙应用:ssh -C -f -N -D localhost_listen_port username@remote_host_domain

通过这个命令,可将客户机应用程序访问网络的通道,借由服务器主机进行(代理访问)。而且,这个SSH命令建立的是基于SOCK5的隧道连接方式。例如,只要执行这个命令,现在就可以通过远程服务器、浏览器(如Firefox)、代理插件(如FoxyProxy Standard for chome)实现翻墙了(如下):

ssh -N -D 127.0.0.1:8090 username@www.xxx.org #命令登录到远程服务器www.xxx.org,并将其SSH访问端口21与本地计算机端口8090进行转发绑定


在Firefox中安装插件FoxProxy,随后打开FoxProxy设置。添加一个代理规则:server or IP Adress: 127.0.0.1,port: 8090,SOCKS proxy & SOCKS V5。然后,将这个规则进行应用。此时,使用浏览器Firefox已经能访问相关封闭站点了。

5.SSH内网穿透:ssh -C -f -N -R localhost_listen_port:remote_host:remote_host_port username@remote_host_domain

通过这个命令,可实现本地化网络应用开发,比如微信开发过程中的接口通讯调试过程。需要注意的是,微信接口通讯调试过程中,最好在远程服务器上建立相应的可以访问的HTTP服务,然后将这个HTTP服务转发到客户机(本地)相应的HTTP服务端口上。

6.SSH虚拟专用网络(VPN):ssh -C -f -N  -L localhost_port:remote_host:remote_host_port username@remote_host_domain

上面的命令其实还可以变通为:ssh -N -f -L 2020:Destination_host:21 username@Middle_host

在这个例子中,中间服务器可以无障碍访问目标服务器,但是客户端不能直接访问目标服务器。现在通过中间服务器,直接将目标服务器映射到客户机本地的2020端口上。

7. 使用ssh-pass保存ssh密码(以便自动登录)

sudo apt-get install sshpass

上面的命令相应变为:

sshpass -p 'password' ssh -C -t -N -D 127.0.0.1:8090 username@xxx.xxx.org

8. 使用Shell命令,来自动执行

#!/bin/bash

sshpass -p 'password' ssh -C -t -N -D 127.0.0.1:8090 username@xxx.xxx.org

 将上面的代码,保存为ssh-tunnel.sh,并将其在置为可执行状态(chmod +x ssh-tunnel.sh),以后就可以直接调入该脚本到终端中执行就可以了。

 

附件:ssh-tunnel_1.0_all.deb (4.1 KB),可下载安装后,进入/opt/ssh-tunnel修改相应的脚本。

 

 

参考

SSH隧道与端口转发及内网穿透,http://blog.creke.net/722.html
终端走代理的方法:原文
让终端走代理的几种方法:https://blog.fazero.me/2015/09/15/让终端走代理的几种方法