20.2ssh高级应用

目录

SSH端口转发

实验1

远程转发:

实验2、

 动态端口转发:

实验3  


SSH端口转发

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

实验1

说明:企业内部有一个telnet-server服务器,企业外部员工想访问telnet-server,但telnet协议是明文传输的,不安全   
解决方法,可以考虑用ssh协议封装telnet协议,由于ssh协议是安全的,在企业外部经过互联网直接连到企业内部的telnet-server服务器时,可以先经过企业内部的ssh-server。公司内部认为是安全的
    20.2ssh高级应用_第1张图片
    防火墙上开启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  

实验2、

      20.2ssh高级应用_第2张图片

    实验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

实验3  

 国外的网络访问不了,被防火墙屏蔽了,但只是屏蔽了一部分,可以买个国外的虚拟机或者香港的虚拟机,由虚拟机当代理,访问国外网络

    [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
        20.2ssh高级应用_第3张图片
                                               图1
        20.2ssh高级应用_第4张图片
                                            图2
         20.2ssh高级应用_第5张图片

                                              图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:~]#





 

你可能感兴趣的:(linux)