通过上一节的学习我们知道,SSH会自动加密和解密所有SSH客户端与服务端之间的网络数据。但是,SSH还能够将其他TCP端口的网络数据通SSH链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做”隧道”(tunneling),这是因为SSH为其他TCP链接提供了一个安全的通道来进行传输而得名。例如,Telnet ,SMTP ,LDAP这些TCP应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境许中的防火墙限制了一些网络端口的使用,但是允许SSH的连接,也能够将通过将TCP用端口转发来使用SSH进行通讯。
当外网用户想要临时访问公司内部的不安全TCP协议服务器时,由于防火墙限制无法直接访问,
但可利用先SSH连接至公司内网的SSH服务器在转发至不安全的TCP协议服务器。
由于作为转发的SSH服务器与要访问的不安全TCP协议服务器在同一网络环境内,
故这种连接就叫本地转发。
ssh -L localprot:remotehost:remotehostport sshserver
localprot:指定本机端口
remotehost:指定远程不安全协议的服务器地址
remotehostport:远程不安全协议的服务器地址端口
sshserver:SSH服务器地址
options:
-f 后台启用
-N 不打开远程shell,处于等待状态
-g 启用网关功能
ssh -L 9527:telnetsrv:23 -N sshsrv
telnet 127.0.0.1 9527
当访问本机的9527端口时,被加密后转发到sshsrv的ssh服务,再解密被转发到telnetsrv:23
Data <–> localhost:9527 <–>localhost:xxxxx <–> sshsrv:22 <–>sshsrv:yyyyy <–> telnetsrv:23
与本地端口转发相比,我们将SSH服务器与Client访问端的位置对调,将与不安全TCP协议服务器
同一内网的主机作为Client,将外部网络主机作为SSH服务器做为端口转发。
由于作为转发的SSH服务器处在外部网络环境中,故这种连接就叫远程转发。
ssh -R sshserverport:remotehost:remotehostport sshserver
sshserverport:指定SSH服务器端口
remotehost:指定远程不安全协议的服务器地址
remotehost:remotehostport:指定远程不安全协议的服务器端口
sshserver:SSH服务器地址
ssh -R 9527:telnetsrv:23 -N sshsrv
让sshsrv侦听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到本机ssh客户端,
再由本机解密后转发到telnetsrv:23
Data <–> sshsrv:9527 <–> sshsrv:22 <–> localhost:xxxxx <–> localhost:yyyyy <–> telnetsrv:23
ssh本地和远程端口转发都需要固定的应用服务器IP和端口,但是很多情况下,应用的端口繁多逐个转发
效率不高,而且一些应用使用不固定的端口,经常跳着使用端口,一些网站还不支持IP直接访问,
这导致ssh本地和远程端口转发在一些使用上不是很方便,使用ssh动态端口转发可以解决以上问题。
ssh -D
# 当用firefox访问Internet时,本机的1080端口作为代理服务器,firefox的访问请求被转发到
sshserver上,由sshserver替代访问Internet
ssh -D 1080 root@sshserver
# 在本机firefox设置socketproxy:127.0.0.1:1080
curl –socks5 127.0.0.1:1080 http://www.qq.com
我们日常工作当中,可能会经常会远程登录到 Linux/Unix/Solaris/HP 等机器上去做一些开发或者维护,也经常需要以 GUI 方式运行一些程序,比如要求图形化界面来安装 DB2/WebSphere 等等。这时候通常有两种选择来实现:VNC 或者 X 窗口,让我们来看看后者。
使用 X 窗口通常需要分别安装:X Client 和 X Server 。在本例中我们的 X Client 就是所访问的远程 Linux/Unix/Solaris/HP,而我们的 X Server 则是发起访问的本地机器。把 X Client 端的 X 窗口显示在 X Server 端需要先行在 X Client 端指定 X Server 的位置
export DISPLAY=:.
export DISPLAY=myDesktop:1.0
然后直接运行 X 应用即可,X 窗口就会自动在我们的本地端打开。
应用场景:当外部客户端想要访问公司内网的Telnet服务器时,由于防火墙限制无法直接访问,可使用
SSH本地端口转发实现:
以三台CentOS模拟机作为服务器及主机,主机名网络配置如下:
客户端:192.168.2.5
telnet服务器:192.168.2.6
SSH服务器:192.168.2.7
yum -y install telnet
为了防止之前防火墙策略干扰,最好先清空下防火墙策略,再禁止远程登录:
iptables -F
iptables -X
iptables -Z
禁止IP地址为192.168.2.5的远程登录
iptables -A INPUT -s 192.168.2.5 -j REJECT
此时作为Clinet的192.168.2.5已经ping不通作为telnet服务器的192.168.2.6
CentOS6:
service xinted start 开启xinted进程
chkconfig telnet on 开启telnet服务
service xinted restart 重启xinted服务
CentOS7:
systemctl start telnet-scoket
ssh -L 9527:192.168.30.17:23 [-Nf] 192.168.30.6
加-Nf选项将后台执行,关闭时只能通过kill关闭进程
telnet 127.0.0.1 9527
提示输入用户名,密码;默认不让root账户使用SSH端口转发登录
应用场景:当外部有工程师想要临时访问内部telnet服务器时,作为系统管理员,我们可以将对方主机作
为SSH服务器进行端口转发,让其临时可访问公司的telnet服务器。
以三台CentOS模拟机作为服务器及主机,主机名及网络配置如下:
Internet:192.168.2.5
lanserver:192.168.2.7
telnet服务器:192.168..2.6
ssh -R 9527:192.168.30.17:23 [-Nf] 192.168.30.7
ps aux | grep 9527
加-Nf选项将后台执行,关闭时只能通过kill关闭进程
telnet 127.0.0.1 9527
应用场景:在某些场景中,用浏览器浏览网页,是没有固定端口的,这时就需要利用到动态的端口转发。
下面我们模拟用一台虚拟机模拟google网站,用Internet主机通过代理服务器proxy访问google模拟机
以三台CentOS模拟机作为服务器及主机,主机名及网络配置如下:
Internet:192.168.2.5
proxy:192.168.2.7
google:192.168.2.6
开启http服务,模拟网页内容:
CentOS6:
service httpd start
echo www.google.com > /var/www/html/index.html
CentOS7:
systemctl start httpd
使用proxy的1080端口作为动态转发:
ssh -D 1080 [email protected]
接下来我们可以通过图形界面或者字符界面来尝试访问:
打开firefox浏览器,按以下顺序操作:
–>preferences–>advanced–>network–setting–manual proxy configuration
–>SOCKS Host:127.0.0.1
现在再次尝试访问192.168..2.6的google模拟服务器,发现可以正常访问了!
访问成功
在字符界面我们可执行下面的命令来进行访问:
curl -socks5 127.0.0.1:1080 192.168.30.17