SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还能够将其他 TCP 端口的网络数据通过SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为 SSH 为其他TCP 链接提供了一个安全的通道来进行传输而得名。
例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH的连接,也能够通过将 TCP 端口转发来使用 SSH 进行通讯
SSH 端口转发能够提供两大功能:
? 加密 SSH Client 端至 SSH Server 端之间的通讯数据
? 突破防火墙的限制完成一些之前无法建立的 TCP 连接
现在来模拟一场景来演示过程
DEMO公司在内部有一台公司WEB服务器C,因为上面的内容是公司内部相关的,因此,只允许通过内部的B机器(代理服务器)进行访问。如果员工A想访问这台WEB服务器,只能经过防火墙认证过滤后进入内网B进行访问。
在C机器上使用iptables进行策略部署
#iptables -A INPUT -s 192.168.4.101 -j ACCEPT
#iptables -A INPUT -s 192.168.4.100 -j REJECT
#iptables -vnL
Chain INPUT (policy ACCEPT 53 packets, 4347 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 192.168.4.101 0.0.0.0/0
0 0 REJECT all -- * * 192.168.4.100 0.0.0.0/0 reject-with icmp-port-unreachable
验证
在A上面直接访问C机器,无法连接
#curl http://192.168.4.113
curl: (7) couldn't connect to host
在B上面直接访问C机器,可以正常打开网页服务
#curl http://192.168.4.113
<h1>Apache 2 Test Page powered by CentOS</h1>
使用ssh隧道技术进行解决此问题
方案一
本地转发
语法格式:
-L localport:remotehost:remotehostport sshserver
-L 本地端口:远程主机地址:远程主机开放端口 中转主机地址
? 选项:
-f 后台启用
-N 不打开远程shell,处于等待状态
-g 表示ssh隧道对应的转发端口将监听在主机的所有IP中,不使用"-g选项"时,转发端口默认只监听在主机的本地回环地址中,"-g"表示开启网关模式,远程端口转发中,无法开启网关功能
- 在A上面设置本地端口转发
#ssh -L 1314:192.168.4.113:80 192.168.4.101 -Nf
当访问本机的1314的端口时,被加密后转发到192.168.4.101的ssh服务,再解密被转发到192.168.4.113:80
#ss -nl
LISTEN 0 128 127.0.0.1:1314
在B机器上可以看到连接了 *:*
#ss -nt
ESTAB 0 0 192.168.4.101:22 192.168.4.100:42678
2.在A上进行访问网站
#curl http://127.0.0.1:1314
<h1>Apache 2 Test Page powered by CentOS</h1>
成功返回网页内容
3.在C机器上面看到的是B的连接
#ss -nt
ESTAB 0 1 ::ffff:192.168.4.113:80 192.168.4.101:60500
在这个场景里,A是ssh客户端,B是ssh服务器端
方案二
远程转发
语法格式:
-R sshserverport:remotehost:remotehostport sshserver
-R 本地端口:远程主机地址:远程主机开放端口 中转主机地址
? 选项:
-f 后台启用
-N 不打开远程shell,处于等待状态
-g 表示ssh隧道对应的转发端口将监听在主机的所有IP中,不使用"-g选项"时,转发端口默认只监听在主机的本地回环地址中,"-g"表示开启网关模式,远程端口转发中,无法开启网关功能
1.在B上面设置远程端口转发
#ssl -R 1314:192.168.4.113:80 192.168.4.100 -Nf
-R让192.168.4.100侦听1314端口的访问,如有访问,就加密后通过ssh服务转发请求到本机192.168.4.101ssh客户端,再由本机解密后转发到192.168.4.113:80
在A上面能看到B访问A的22端口
#ss -nt
ESTAB 0 0 192.168.4.100:22 192.168.4.101:45830
2.在A上进行访问网站
#curl http://127.0.0.1:1314
<h1>Apache 2 Test Page powered by CentOS</h1>
成功返回网页内容
3.在C机器上面看到的是B的连接
#ss -nt
FIN-WAIT-1 0 1 ::ffff:192.168.4.113:80 ::ffff:192.168.4.101:50934
在这个场景里,B是ssh客户端,A是ssh服务器端
动态端口转发
作为一名技术人员,翻阅英文原版资料是必须的。有些情况确实是需要向外界查找一些学习资料。
语法:
ssh -D 1080 远程主机地址
当用浏览器访问internet时,本机的XXX端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internet
1.在A上面启用动态端口转发至B机器上
#ssh -D 1888 192.168.4.101 -Nf
2.在A机器上面指定使用socks5 访问
#curl --socks5 127.0.0.1:1888 http://192.168.4.113
<img src="./google.png"></img>
通过Firefox访问。如果是Windows机器,可以考虑安装一个openssh for windows 3.81p,2.5MB
https://sourceforge.net/projects/sshwindows
原文地址:http://blog.51cto.com/191226139/2061833