目录
SSH端口转发
实验1
远程转发:
实验2、
动态端口转发:
实验3
SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还能够将其他TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的 加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为 SSH 为 其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文 传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是 允许 SSH 的连接,也能够通过将 TC P 端口转发来使用 SSH 进行通讯
SSH 端口转发能够提供两大功能:
加密 SSH Client 端至 SSH Server 端之间的通讯数据
突破防火墙的限制完成一些之前无法建立的 TCP 连接
本地转发:
-L localport:remotehost:remotehostport sshserver
#本地client端口: 目的主机:目的主机端口 中间主机(ssh协议端口转发)
选项:
-f 后台启用
-N 不打开远程shell,处于等待状态
-g 启用网关功能
示例
ssh –L 9527:telnetsrv:23 -N sshsrv
telnet 127.0.0.1 9527
#telnet 127.0.0.1 9527 本机连接本机的端口9527,然后9527端转到中间主机
当访问本机的9527的端口时,被加密后转发到sshsrv的ssh服务,再解密被转发到 telnetsrv:23
data←→ localhost:9527←→ localhost:XXXXX←→sshsrv:22←→ sshsrv:YYYYY←→ telnetsrv:23
#数据→ 本机telnet:9527→ 本机ssh随机端口:XXXXX发送→中间主机ssh:22接收→ 中间主机解封ssh为telnet,发送:YYYYY→ telnetsrv:23
说明:企业内部有一个telnet-server服务器,企业外部员工想访问telnet-server,但telnet协议是明文传输的,不安全
解决方法,可以考虑用ssh协议封装telnet协议,由于ssh协议是安全的,在企业外部经过互联网直接连到企业内部的telnet-server服务器时,可以先经过企业内部的ssh-server。公司内部认为是安全的
防火墙上开启ssh22端口即可
ssh-server(192.168.31.6)和telnet(192.168.31.17)在一个局域网内。客户端client(192.168.31.7)外网
#telnet主机把客户端加入防火墙
[root@telnet-server:~]# iptables -A INPUT -s 192.168.31.7 -j REJECT
#客户端ping不通telnet
[root@client:~]# ping 192.168.31.17
PING 192.168.31.17 (192.168.31.17) 56(84) bytes of data.
From 192.168.31.17 icmp_seq=1 Destination Port Unreachable
From 192.168.31.17 icmp_seq=2 Destination Port Unreachable
[root@telnet-server:~]# yum install telnet-server
[root@telnet-server:~]# rpm -ql telnet-server
/usr/lib/systemd/system/telnet.socket
[root@telnet-server:~]# systemctl start telnet.socket
[root@telnet-server:~]# ss -ntl #23端口已开
--------
#只有一个主机连接了telnet-server,192.168.31.1为windows机器的虚拟网卡
[root@telnet-server:~]# ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 52 192.168.31.17:22 192.168.31.1:53440
-----------
[root@client:~]# telnet 192.168.31.17
Trying 192.168.31.17...
telnet: connect to address 192.168.31.17: Connection refused
[root@client:~]# ssh -L 9527:192.168.31.17:23 192.168.31.6
The authenticity of host '192.168.31.6 (192.168.31.6)' can't be established.
RSA key fingerprint is SHA256:ldwv9HEi63iQKlkKOjUKAOovAkQgmKhkm6UjK0JoV8k.
RSA key fingerprint is MD5:24:c8:d0:86:48:c0:3b:6d:2b:8d:95:3f:93:00:61:4d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.31.6' (RSA) to the list of known hosts.
[email protected]'s password:
Last login: Fri Jul 20 16:40:50 2018 from 192.168.31.7
[root@sshserver ~ ]# #登录到中间ssh服务主机上去了
--------------
[root@sshserver ~ ]#ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.31.6:22 192.168.31.1:53436
ESTAB 0 0 192.168.31.6:22 192.168.31.7:50018
#client和中间主机建立ssh协议隧道,等待传输数据
------------
客户端再开启一个终端窗口,演示client连接目的主机
[root@client:~]# ss -ntl
LISTEN 0 128 127.0.0.1:9527 *:*
[root@client:~]# telnet 127.0.0.1 9527
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Kernel 3.10.0-862.el7.x86_64 on an x86_64
telnet-server login: #此处centos7默认不允许telnet协议拿root登录,只能登录普通用户
----------
#当在client连接时,可以看到中间ssh-server主机和目的主机telnet建立了连接
[root@telnet-server:~]# ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 52 192.168.31.17:22 192.168.31.1:53440
ESTAB 0 0 ::ffff:192.168.31.17:23 ::ffff:192.168.31.6:58132
#中间主机充当一个中介人
[root@sshserver ~ ]#ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.31.6:22 192.168.31.1:53436
ESTAB 0 0 192.168.31.6:58134 192.168.31.17:23
ESTAB 0 0 192.168.31.6:22 192.168.31.7:50018
-------------------------------
[root@client:~]# ssh -L 9527:192.168.31.17:23 192.168.31.6
[email protected]'s password:
Last login: Fri Jul 20 16:40:50 2018 from 192.168.31.7
[root@sshserver ~ ]#exit
logout
Connection to 192.168.31.6 closed.
#-Nf选项可以后台执行,这样,就不会连接到中间主机上去了
[root@client:~]# ssh -L 9527:192.168.31.17:23 -Nf 192.168.31.6
[email protected]'s password:
[root@client:~]# ps aux
[root@client:~]# killall ssh
[root@client:~]# ssh -L 9527:192.168.31.17:23 -N 192.168.31.6
[email protected]'s password:
#前台执行,界面卡在这里,此时界面不能干其它事情,ctrl+c可结束,或者再开启一个终端
-R sshserverport:remotehost:remotehostport sshserver
ssh -R 9527:192.168.31.17:23 192.168.31.6 -Nf
示例:
ssh –R 9527:telnetsrv:23 –N sshsrv
让sshsrv侦听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到本机ssh客户端,再由本机解密后转发到telnetsrv:23
Data ←→ sshsrv:9527←→ sshsrv:22 ←→ localhost:XXXXX←→ localhost:YYYYY←→ telnetsrv:23
#数据telnet→ 外网主机开启一个9527端口的ssh→外网主机发送ssh:22协议 →内网本地收到ssh → 内网localhost telnet随机端口→目的主机telnet
实验1的中间主机改名,此时中间主机暂且称为本地主机,client主机改名为internet
[root@sshserver ~ ]#hostname lanserver #退出xshell终端,重新登录
[root@lanserver ~ ]#ssh -R 9527:192.168.31.17:23 192.168.31.7
The authenticity of host '192.168.31.7 (192.168.31.7)' can't be established.
RSA key fingerprint is 54:b0:da:1e:04:b6:d9:57:7a:88:cb:29:f0:7a:bc:6e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.31.7' (RSA) to the list of known hosts.
[email protected]'s password:
Last login: Fri Jul 20 15:59:41 2018 from 192.168.31.1
[root@internet:~]# #登录到internet主机上去了
-----------
[root@internet:~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.1:9527 *:*
-----
#内网的telnet只有windows机器连接的虚拟网卡
[root@telnet-server:~]# ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 52 192.168.31.17:22 192.168.31.1:53440
[root@internet:~]# telnet 127.0.0.1 9527
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Kernel 3.10.0-862.el7.x86_64 on an x86_64
telnet-server login:
--------
[root@telnet-server:~]# ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 52 192.168.31.17:22 192.168.31.1:53440
ESTAB 0 0 ::ffff:192.168.31.17:23 ::ffff:192.168.31.6:58138
当用firefox访问internet时,本机的1080端口做为代理服务器,firefox的访问 请求被转发到sshserver上,由sshserver替之访问internet
ssh -D 1080 root@sshserver
在本机firefox设置代理socket proxy:127.0.0.1:1080
curl --socks5 127.0.0.1:1080 http://www.qq.com
国外的网络访问不了,被防火墙屏蔽了,但只是屏蔽了一部分,可以买个国外的虚拟机或者香港的虚拟机,由虚拟机当代理,访问国外网络
[root@google:~]# rpm -q httpd #192.168.31.17
httpd-2.4.6-80.el7.centos.x86_64
[root@google:html]# rm -rf index.html/
[root@google:html]# echo www.google.com. > /var/www/html/index.html
[root@google ~ ]#
[root@google:~]# iptables -vnL
6 446 REJECT all -- * * 192.168.31.7 0.0.0.0/0 reject-
[root@internet:~]# ssh -D 1080 [email protected]
[email protected]'s password:
Last login: Fri Jul 20 18:04:03 2018 from 192.168.31.1
[root@proxy ~ ]# #连接到proxy上去了
[root@proxy ~ ]#ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.31.6:22 192.168.31.7:50034
ESTAB 0 0 192.168.31.6:22 192.168.31.1:54828
[root@internet:~]# ss -ntl
LISTEN 0 128 ::1:1080 :::*
[root@internet:~]# firefox #虚拟机本地输入命令
打开火狐浏览器: 如图1、图2、图3
图1
图2
图3
#刷新一个浏览器
[root@google:~]# ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 52 192.168.31.17:22 192.168.31.1:54790
ESTAB 0 0 ::ffff:192.168.31.17:80 ::ffff:192.168.31.6:39290
#代理服务器192.168.31.6在访问服务器192.168.31.17;而不是客户端192.168.31.7
-------
通过命令行方式访问
[root@internet:~]# curl 192.168.31.17
curl: (7) Failed connect to 192.168.31.17:80; Connection refused
[root@internet:~]# curl --socks5 127.0.0.1:1080 192.168.31.17
www.google.com.
[root@internet:~]#