当前位置 博文首页 > 上善若水~小辉:SSH服务连接

    上善若水~小辉:SSH服务连接

    作者:上善若水~小辉 时间:2021-02-10 00:29

    SSH基本概述

    SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输。确保了数据传输安全。

    SSH服务

    ssh: secure shell, protocol, 22/tcp, 安全的远程登录

    具体的软件实现:

    OpenSSH: ssh协议的开源实现,CentOS默认安装

    SSH协议版本

    v1: 基于CRC-32做MAC,不安全;man-in-middle

    v2:双方主机协议选择安全的MAC方式

    基于DH算法做密钥交换,基于RSA或DSA实现身份认证

    两种方式的用户登录认证:

    基于password

    基于key

    ssh选项:

    -A:开启认证代理连接转发功能;
    -a:关闭认证代理连接转发功能;
    -b:使用本机指定地址作为对应连接的源ip地址;
    -C:请求压缩所有数据;
    -F:指定ssh指令的配置文件;
    -f:后台执行ssh指令;
    -g:允许远程主机连接主机的转发端口;
    -i:指定身份文件;
    -l:指定连接远程服务器登录用户名;
    -N:不执行远程指令;
    -o:指定配置选项;
    -p:指定远程服务器上的端口;
    -q:静默模式;
    -X:开启X11转发功能;
    -x:关闭X11转发功能;
    -y:开启信任X11转发功能。
    

    SSH服务主要功能:

    1. 提供远程连接服务器的服务

    2. 对传输的数据进行加密

    SSHTelnet的区别:

    • ssh服务对传输数据进行加密,监听在本地22/tcp端口, ssh服务默认支持root用户登录

    • telnet服务不对数据进行加密,监听在本地23/tcp端口,,Telnet默认不支持root用户登录

    • 服务连接方式服务数据传输服务监听端口服务登陆用户
      ssh 加密 22/tcp 默认支持root用户登陆
      telnet 明文 23/tcp 不支持root用户登陆
    • 企业面试题

      下列服务,分别使用的那个端口?

       ftp     21/tcp
       dns     53/udp
       ssh     22/tcp
       telnet  23/tcp
       mysql   3306/tcp
       http    80/tcp
       https   443/tcp 443/udp

      使用wireshark验证telnet明文传输与ssh加密传输

      1. 安装telnet服务并运行

       [root@m01 ~]# yum -y install telnet-server
       [root@m01 ~]# systemctl start telnet.socket
      1. 使用wireshark检测vmnet8网卡上telnet的流量

      2.  

        3. telnet无法使用root用户登录Linux系统,需要创建普通用户       

      3. [root@nfs ~]# useradd admin
        [root@nfs ~]# echo "123"| passwd --stdin admin
        

          使用普通用户进行telnet登录

      4.  

         搜索wireshark包含telnet相关的流量

      5.  

         

        6.使用wireshark分析ssh流量

      6.  

         

         

        SSH相关命令

        SSH有客户端与服务端,我们将这种模式称为C/S架构,ssh客户端支持Windows、Linux、Mac等平台。 在ssh客户端中包含 ssh|slogin远程登陆、scp远程拷贝、sftp远程数据传输、ssh-copy-id秘钥分发等应用程序。 

      7. SSH有客户端与服务端,我们将这种模式称为C/S架构,ssh客户端支持Windows、Linux、Mac等平台。 在ssh客户端中包含 ssh|slogin远程登陆、scp远程拷贝、sftp远程数据传输、ssh-copy-id秘钥分发等应用程序。
      8. ssh远程登录服务器命令示例

         ssh [-p port] [user@]hostname [command]
         # -p指定连接远程主机端口,默认22端口可省略
         # "@"前面为用户名,如果用当前用户连接,可以不指定用户
         # "@"后面为要连接的服务器的IP
         [root@m01 ~]# ssh -p22 root@10.0.0.41  # 远程登录服务器
         [root@m01 ~]# ssh root@172.16.1.41 "hostname -i" # 远程在指定服务器执行命令
         172.16.1.41

        scp远程拷贝(全量复制)至远程主机命令示例

      9. scp [-pr] [-P port] [-l limit] [[user@]host1:]file1 ... [[user@]host2:]file2
        # -P 指定端口,默认22端口可不写
        # -r 表示递归拷贝目录
        # -p 表示在拷贝文件前后保持文件或目录属性不变
        # -l 限制传输使用带宽(默认kb)

      10. # 推:将本地/tmp/oldboy推送至远端服务器10.0.0.61的/tmp目录,使用对端的root用户

        [root@m01 ~]# scp -P22 -rp /tmp/oldboy oldboy@10.0.0.61:/tmp
      11. # 拉:将远程10.0.0.61服务器/tmp/oldboy文件拉取到本地/opt/目录下

        [root@m01 ~]# scp -P22 -rp root@10.0.0.61:/tmp/oldboy /opt/
      12. # 限速

        [root@m01 ~]# scp /opt/1.txt root@172.16.1.31:/tmp
        root@172.16.1.31 password: 
        test 100% 656MB '83.9MB/s' 00:07 
        # 限速为8096kb,换算为MB,要除以 8096/8=1024KB=1MB
        [root@m01 ~]# scp -rp -l 8096 /opt/1.txt root@172.16.1.31:/tmp
        root@172.16.1.31s password: 
        test 7% 48MB '1.0MB/s' 09:45
      13. 结论:

        1. scp通过ssh协议加密方式进行文件或目录拷贝。

        2. scp使用连接时指定的用户作为为拷贝文件或目录的权限。

        3. scp支持数据推送和拉取,每次都是全量拷贝,效率较低。

      14. sftp远程数据传输命令

         # 默认可以通过sftp命令连接sftp服务
         sftp root@10.0.0.61
         sftp -oPort=22222 root@10.0.0.61  # -o 使用ssh的选项
         # sftp使用get下载文件至于本地服务器
         sftp> get conf.txt /tmp/
         # sftp使用put上传本地服务器文件~至远程服务器
         sftp> put /root/t1.txt /root/

        ssh加密通讯

      15. 基于用户和口令登录验证 1 客户端发起ssh请求,服务器会把自己的公钥发送给用户 2 用户会根据服务器发来的公钥对密码进行加密 3 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则 用户登录成功

        示例:ssh 192.168.34.100 默认以root身份连接对方的主机

        当我们第一次连接对方的时候,会出现是否想去连接对方的提示信息,如果选择yes,并输入对方的口令后,就会将对方的公钥文件存到自己/root/.ssh 目录下,此目录下有一个文件名叫konwn_hosts

      16. SSH验证方式

        基于账户密码远程登录

        知道服务器的IP端口,账号密码,即可通过ssh客户端命令登陆远程主机。

        ~ ssh -p22 root@10.0.0.61
         root@10.0.0.61 password:
         [root@m01 ~]#

        基于秘钥远程登录

        默认情况下,通过ssh客户端命令登陆远程服务器,需要提供远程系统上的帐号与密码,但为了降低密码泄露的机率和提高登陆的方便性,建议使用密钥验证方式。

         

         

         

        1. 在服务器上生成非对称密钥,使用-t指定要创建的密钥类型, 使用-C提供新注释

         [root@m01 ~]# ssh-keygen -t rsa -C 593528156@qq.com
         # 默认一路回车即可
        1. 将A服务器上的公钥推送至B服务器

         ssh-copy-id [-i [identity_file]] [user@]hostname
         -i        # 指定下发的公钥文件的路径
         [user@]   # 指定分发公钥的用户身份,默认以当前系统用户身份
         hostname  # 下发公钥至那台服务器, 填写远程主机IP地址
         # 分发公钥,[将A服务器的公钥写入B服务器的~/.ssh/authorized_keys文件中]
         [root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
        1. 如果A服务器连接B服务器无需密码则表示秘钥已配置成功

         [root@m01 ~]# ssh root@172.16.1.41
         [root@nfs ~]#

        SSH应用场景

        用户通过Windows/MAC/Linux客户端连接跳板机免密码登录,跳板机连接后端无外网的Linux主机实现免密登录,架构图如下。 实践多用户登陆一台服务器无密码 实践单用户登陆多台服务器免密码

      17.  

        1. windows客户端使用Xshell生成秘钥对,并下发公钥至跳板机

                     1) Xshell-->选择工具-->新建用户密钥生成向导

      18.  

         

         

         2) 选择创建密钥类型和密钥长度,默认即可,选择下一步

      19.  

        3) 生成公钥对,选择下一步 

      20.  

         4) 填写秘钥名称。秘钥加密密码不建议配置

      21.  

         5) Windows会提示密码为空,选是即可

      22.  

        6) 生成秘钥后,点击Xshell-->工具-->用户秘钥管理者 

      23.  

        7) 选择对应秘钥的属性 

      24.  

         8) 选择对应秘钥的公钥,将其复制或者保存为文件

      25. 9) 将从WIndows下复制好的公钥粘贴至跳板机~/.ssh/authorized_keys中,然后测试

         [root@m01 ~]# cd ; umask 077; mkdir -p .ssh ;cd .ssh
         [root@m01 .ssh]# vim authorized_keys  # 添加windows公钥
        1. 跳板机下发公钥至后端主机

        1) 在跳板机上生成秘钥对

         [root@m01 ~]# ssh-keygen -t rsa -C manager@qq.com

        2) 拷贝跳板机上的密钥至后端主机,如果SSH不是使用默认22端口, 使用-p指定对应端口

         [root@m01 ~]# ssh-copy-id  -i /root/.ssh/id_rsa.pub -p22 root@172.16.1.31
         [root@m01 ~]# ssh-copy-id  -i /root/.ssh/id_rsa.pub -p22 root@172.16.1.41

        3) 在m01管理机上测试是否成功登陆两台服务器

      26. [root@m01 ~]# ssh root@172.16.1.41
        [root@nfs01 ~]# exit
        [root@m01 ~]# ssh root@1172.16.1.31
        [root@backup ~]# exit
      27. 通过跳板机能实现scp拷贝文件免密码
      28. [root@m01 ~]# scp zls.txt root@172.16.1.31:/tmp
        zls.txt 100% 0 0.0KB/s 00:00 
        [root@m01 ~]# scp zls.txt root@172.16.1.41:/tmp
        zls.txt 100% 0 0.0KB/s 00:00
      29. 通过跳板机获取所有机器的load,CPU,Memory等信息(思考:如果服务器数量多,如何并发查看和分发数据)
      30. [root@m01 ~]# cat all.sh 
        #!/usr/bin/bash
        [ $# -ne 1 ] && echo "请输入执行的命令" && exit 1
        
        for i in 31 41
        do
        echo "172.16.1.$i"
        ssh root@172.16.1.$i "$1"
        done
      31. #!/bin/bash
        #jumpserver
        lb01=10.0.0.5
        lb02=10.0.0.6
        web01=10.0.0.7
        web02=10.0.0.8
        web03=10.0.0.9
        nfs=10.0.0.31
        backup=10.0.0.41
        db01=10.0.0.51
        m01=10.0.0.61
        zabbix=10.0.0.71
        
        menu(){
        cat <<-EOF
        +-------------------------+
        | 1) lb01 |
        | 2) lb02 |
        | 3) web01 |
        | 4) web02 |
        | 5) web03 |
        | 6) nfs |
        | 7) backup |
        | 8) db01 |
        | 9) m01 |
        | 10) zabbix |
        | h) help |
        +-------------------------+
        EOF
        }
        #菜单函数
        menu
        
        #连接函数
        connect(){
        ping -c 1 -w 1 $1 &>/dev/null
        if [ $? -eq 0 ];then
        ssh root@$1
        else
        echo -e "\033[5;4;40;31m 别连了,我的哥,$2:$1机器都没开!!!\033[0m"
        fi
        }
        
        #控制不让输入ctrl+c,z
        trap "" HUP INT TSTP
        while true
        do
        read -p "请输入要连接的主机编号:" num
        case $num in
        1|lb01)
        connect $lb01 lb01
        ;;
        2|lb02)
        connect $lb02 lb02
        ;;
        3|web01)
        connect $web01 web01
        ;;
        4|web02)
        connect $web02 web02
        ;;
        5|web03)
        connect $web03 web03
        ;;
        6|nfs)
        connect $nfs nfs
        ;;
        7|backup)
        connect $backup backup
        ;;
        8|db01)
        connect $db01 db01
        ;;
        9|m01)
        connect $m01 m01
        ;;
        10|zabbix)
        connect $zabbix zabbix
        ;;
        h|help)
        clear
        menu
        ;;
        close)
        break
        ;;
        esac
        done
      32. 脚本实现(图形化跳板机)
      33. #!/bin/bash
        
        lb01=10.0.0.5
        lb02=10.0.0.6
        web01=10.0.0.7
        web02=10.0.0.8
        web03=10.0.0.9
        nfs=10.0.0.31
        backup=10.0.0.41
        db01=10.0.0.51
        db02=10.0.0.52
        m01=10.0.0.61
        zabbix=10.0.0.71
        
        title="欢迎进入lnb跳板机-$m01"
        
        #跳板机函数
        JUMP(){
        OPTION=$(whiptail --title "$title" --menu "请选择你要连接的服务器:" 25 60 11 \
        "1" "连接 lb01" \
        "2" "连接 lb02" \
        "3" "连接 web01" \
        "4" "连接 web02" \
        "5" "连接 web03" \
        "6" "连接 nfs" \
        "7" "连接 backup" \
        "8" "连接 db01" \
        "9" "连接 db02" \
        "10" "连接 m01" \
        "11" "连接 zabbix" 3>&1 1>&2 2>&3)
        
        exitstatus=$?
        if [ $exitstatus = 0 ]; then
        case $OPTION in
        1)
        connect $lb01
        ;;
        2)
        connect $lb02
        ;;
        3)
        connect $web01
        ;;
        4)
        connect $web02
        ;;
        5)
        connect $web03
        ;;
        6)
        connect $nfs
        ;;
        7)
        connect $backup
        ;;
        8)
        connect $db01
        ;;
        9)
        connect $db02
        ;;
        10)
        connect $m01
        ;;
        11)
        connect $zabbix
        ;;
        12)
        connect $te
        ;;
        13)
        connect $te_web
        ;;
        esac
        fi
        }
        
        #主机函数
        HOST_INFO (){
        HOST=$(whiptail --title "$title" --checklist \
        "请选择要发送的主机名:" 25 60 11 \
        "$lb01" "发送给lb01" OFF \
        "$lb02" "发送给lb01" OFF \
        "$web01" "发送给web01" OFF \
        "$web02" "发送给web02" OFF \
        "$web03" "发送给web03" OFF \
        "$nfs" "发送给nfs" OFF \
        "$backup" "发送给backup" OFF \
        "$db01" "发送给db01" OFF \
        "$db02" "发送给db02" OFF \
        "$m01" "发送给m01" OFF \
        "$zabbix" "发送给zabbix" OFF 3>&1 1>&2 2>&3)
        }
        
        SER_INFO(){
        SER=$(whiptail --title "$title" --checklist \
        "请选择要检查的服务:" 25 60 10 \
        "nginx" "检查nginx" OFF \
        "mysqld" "检查mysqld" OFF \
        "php" "检查php" OFF \
        "tomcat" "检查tomcat" OFF \
        "sshd" "检查sshd" OFF \
        "httpd" "检查httpd" OFF \
        "vsftpd" "检查vsftpd" OFF \
        "docker" "检查docker" OFF \
        "saltstack" "检查saltstack" OFF \
        "rsyncd" "检查rsyncd" OFF 3>&1 1>&2 2>&3)
        }
        
        #连接函数
        connect(){
        whiptail --title "$title" --yesno "你确定要连接这台机器么?想好了啊!!!" 10 60
        if [ $? -eq 0 ];then
        {
        ping -c 1 -w 1 $1 >/tmp/ping.txt 2>/dev/null
        if [ $? -ne 0 ];then
        for ((i = 0 ; i <= 100 ; i+=30)); do
        sleep 1
        echo $i
        done
        fi
        } | whiptail --gauge "emmmm...我正在连接$1,检测网络中,等我一哈子..." 6 60 0
        grep 'ttl' /tmp/ping.txt &>/dev/null
        if [ $? -eq 0 ];then
        ssh root@$1
        else
        whiptail --title "$title" --msgbox "网络检测失败,别连了,我的哥,$1机器都没开" 10 60
        fi
        
        fi
        }
        
        #推送文件函数
        SCP (){
        HOST_INFO
        
        PA=$(whiptail --title "$title" --inputbox "请输入需要推送的文件本地路径:" 10 60 /etc/passwd 3>&1 1>&2 2>&3)
        DEST=$(whiptail --title "$title" --inputbox "请输入需要分发到主机的哪个目录:" 10 60 /tmp 3>&1 1>&2 2>&3)
        {
        for H in ${HOST};do
        echo "scp $PA ${H}:${DEST}"|bash &>/dev/null
        for ((i = 0 ; i <= 100 ; i+=50));do
        sleep 1
        echo $i
        done
        done
        } | whiptail --gauge "别着急,正在传送中..." 6 60 0
        }
        
        #检查磁盘函数
        CHECK_DISK (){
        HOST_INFO
        
        for H in ${HOST};do
        echo "ssh $H 'df -h' "|bash > /tmp/disk
        whiptail --title "$(date +%F-%T) | $H 磁盘信息" --msgbox "$(cat /tmp/disk)" 10 60
        done
        }
        
        #检查内存函数
        CHECK_MEM (){
        HOST_INFO
        
        for H in ${HOST};do
        echo "ssh $H 'free -m' "|bash > /tmp/meminfo
        whiptail --title "$(date +%F-%T) | $H 内存信息" --msgbox "$(cat /tmp/meminfo)" 30 80
        done
        }
        
        #查看服务状态
        CHECK_SER (){
        HOST_INFO
        SER_INFO
        
        for H in ${HOST};do
        for S in ${SER};do
        HO=`echo "$H"|awk -F \" '{print $2}'`
        PROC=`ssh $HO "ps -ef|grep $S|wc -l"`
        NUM=$( expr $PROC - 3 )
        if [[ $PROC > 3 ]];then
        whiptail --title "$(date +%F-%T) | $H 服务信息" --msgbox "${S} 存活 | 进程数:$NUM" 10 60
        else
        whiptail --title "$(date +%F-%T) | $H 服务信息" --msgbox "${S} 没有存活| 进程数:$NUM" 10 60
        fi
        done
        done
        }
        
        #批量之心命令函数
        EXEC_CMD(){
        HOST_INFO
        
        CMD=$(whiptail --title "$title" --inputbox "请输入要执行的命令:" 10 60 ifconfig 3>&1 1>&2 2>&3)
        for H in ${HOST};do
        HO=`echo "$H"|awk -F \" '{print $2}'`
        RES=`ssh $HO "$CMD"`
        whiptail --title "$(date +%F-%T) | $H 命令执行结果" --msgbox "$RES" 40 80
        done
        
        
        }
        
        
        #退出函数
        EXIT(){
        pass=$(whiptail --title "$title" --passwordbox "请输入你的退出密码" 10 60 3>&1 1>&2 2>&3)
        if [ $pass == '123456' ];then
        exit
        else
        whiptail --title "$title" --msgbox "密码错误,你不是运维,小样的~~~" 10 60
        continue
        fi
        }
        
        whiptail --title "$title" --msgbox "lnb跳板机,给你全新不一样的feel,进去了,就不想出来" 10 60
        
        #抓取键盘信号
        trap "" HUP INT TSTP
        while true;do
        OPTION=$(whiptail --title "$title" --menu "请选择你的动作(轻点...)" 15 60 8 \
        "1" "SSH远程连接" \
        "2" "推送文件" \
        "3" "查看磁盘空间" \
        "4" "查看内存空间" \
        "5" "查看服务状态" \
        "6" "批量执行命令" \
        "7" "轻松一下(game)" \
        "8" "退出" 3>&1 1>&2 2>&3)
        
        exitstatus=$?
        if [ $exitstatus = 0 ]; then
        case $OPTION in
        1)
        JUMP
        ;;
        2)
        SCP
        ;;
        3)
        CHECK_DISK
        ;;
        4)
        CHECK_MEM
        ;;
        5)
        CHECK_SER
        ;;
        6)
        EXEC_CMD
        ;;
        7)
        sh /root/eluosi.sh
        ;;
        8)
        EXIT
        ;;
        esac
        fi
        done
      34. vim ip.sh 书写脚本文件
        #!/bin/bash
        user=wang
        password=centos
        ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
        
        while read ip ;do
        expect <<EOF
        set timeout 10
        spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $user@$ip
        expect {
        "yes/no" { send "yes\n";exp_continue }
        "password" { send "$password\n" }
        }
        expect eof
        EOF
        done < ip list.txt
        
        SSH安全优化
        SSH作为远程连接服务,通常我们需要考虑到该服务的安全,所以需要对该服务进行安全方面的配置。
        
        更改远程连接登陆的端口
        
        禁止ROOT管理员直接登录
        
        密码认证方式改为密钥认证
        
        重要服务不使用公网IP地址
        
        使用防火墙限制来源IP地址
        
        SSH服务登录防护需进行如下配置调整,先对如下参数进行了解
        Port 6666 # 变更SSH服务远程连接端口
        PermitRootLogin no # 禁止root用户直接远程登录
        PasswordAuthentication no # 禁止使用密码直接远程登录
        UseDNS no # 禁止ssh进行dns反向解析,影响ssh连接效率参数
        GSSAPIAuthentication no # 禁止GSS认证,减少连接时产生的延迟
        
        #END#
        免交互expect[扩展]
        安装expect
        
         [root@m01 ~]# yum install  expect  -y
        编写expect脚本
        
         #!/usr/bin/expect
         set ip 10.0.0.51
         set pass 123456
         set timeout 30
         spawn ssh root@$ip
         expect {
                 "(yes/no)" {send "yes\r"; exp_continue}
                 "password:" {send "$pass\r"}
         }
         expect "root@"  {send "df -h\r"}
         expect "root@"  {send "exit\r"}
         expect eof
        免交互sshpass[扩展]
        安装sshpass
        
         [root@m01 ~]# yum install sshpass  -y
        使用sshpass命令
        
         [root@m01 ~]# sshpass -p 123456 ssh root@10.0.0.51
         ?
         [option]
         -p:指定密码
         -f:从文件中取密码
         -e:从环境变量中取密码
         -P:设置密码提示
        使用用户名密码验证方式
        
        ssh远程连接的方式:
        
        172.16.1.41连接172.16.1.31
        
         1 直接连接
         ssh  10.0.0.31
         2 指定用户连接
         ssh root@10.0.0.31    linux
         ssh root@10.0.0.31     windows
         3 指定用户加端口方式
         ssh  -p22   root@10.0.0.31   linux
         ssh root@10.0.0.31   22
        1. 实验一:

          安装telnet软件:进行跳板机实验(SSH端口本地转发功能)

          centos6 打开telnet功能:

          yum install telnet-server 安装telnet
          
          chkconfig telnet on 打开telnet功能
          
          service xinetd start 打开xinetd功能

          centos7:打开telnet功能

          yum instlal telnet-server
          
          systemctl start telnet.socket

          模拟情况:

          C:模拟telnet服务端

          B:模拟ssh服务端

          A:模拟客户端

          telnet服务端拒绝客户端的访问:C拒绝A访问

          流程解释:

          数据一旦被telnet打开以后,数据会发送到本机9527端口,再在本机开一个随机端口,充当ssh客户端,再把数据流量发送到22端口的ssh服务端,收到数据以后,解密数据,临时开一个随机端口充当客户端,再把流量发送到23端口telnet服务端

        2.  

           

          1)在telnet服务端执行防火墙阻挡功能,阻挡客户端访问:C拒绝A

          iptables -A INPUT -s 192.168.34.101 -j REJECT

          2)我们要查看自己和服务端哪些端口未被占用,在A主机找一个未用的端口进行绑定,此时,9527端口未被使用:

        3. 第一种连接方式:

          [root@centos7~]#ssh -L 9527:192.168.34.100:23 -Nf 192.168.34.200 在A执行此命令,打开B主机上未被占用的端口9527,然后A通过此9527端口连接B服务器最后再到telnet端。-f 是后台执行,不加-f就会前台执行。
          
          [root@centos7~]#telnet 127.0.0.1 9527 在A上执行telnet连接操作,并输入指定的9527端口号
          Trying 127.0.0.1...
          Connected to 127.0.0.1.
          Escape character is '^]'.
          CentOS release 6.10 (Final)
          Kernel 2.6.32-754.el6.x86_64 on an x86_64
          centos6.10.localdomain login: 用户名
          Password: 密码
          Last login: Thu Oct 24 20:56:12 from 192.168.34.200 #以显示连接到C服务器的机器是B,但实际是从A主机将9527端口转发连接到C服务器
          [liu@centos6~]$
        4.  第二种连接方式:

        5.  ssh -L 9527:192.168.34.100:23 -fNg 192.168.34.200 在A机器上打开B机器的9527端口,在B机器搭上隧道。
          telnet 192.168.34.101 9527 在A机器上通过端口9527,连接C机器
        6. 在C机器上查看当前连接的信息:
        7. [root@centos6~]#ss -nt
          State Recv-Q Send-Q Local Address:Port Peer Address:Port
          ESTAB 0 52 192.168.34.100:22 192.168.34.1:49369
          ESTAB 0 0 192.168.34.100:23 192.168.34.200:53668 (其中100:23位telnet服务器端IP和23端口,200:53668为ssh服务端的IP和随机端口)
        8. 结论:当客户端打开9527端口,请求到ssh协议封装将数据报文发送给ssh服务器端,然后在ssh服务器端上解封装,开启随机端口将数据报文传给telnet服务器,telnet服务器最终得到数据,实现客户端连接telnet服务器端。

          注意:虽然能通过跳板机连接到telnet服务器,但是外部机器连接内部机器时,一般防火墙不会打开22端口,客户端无法到达服务端,最终无法连接telnet端的服务。

           远程转发: -R sshserverport:remotehost:remotehostport sshserver

        9. 示例: ssh -R 9527:telnetsrv:23 -Nf sshsrv 让sshsrv侦听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到本 机ssh客户端,再由本机解密后转发到telnetsrv:23

        10. Data<--> sshsrv:9527 <--> sshsrv:22 <--> localhost:XXXXX <--> localhost:YYYYY<-->telnetsrv:23

          一般防火墙从外部到内部会阻止访问,但从内部到外部不会阻止访问:

          远程转发实验:

          三台机器:C:服务器,B:跳板机(ssh服务器),A:客户端

          C服务器只允许telnet连接(23端口)访问,不允许外部客户端直接访问,B跳板机是一个ssh服务器;有一个用户需要从外部连接到企业内部的C服务器。

          模拟:C 不允许A访问:

          当前模拟telnet服务端阻挡服务端访问:

          在C执行防火墙阻挡A:

          iptables -A INPUT -s 192.168.34.101 -j REJECT
          [root@b~]#ssh -R 9527:192.168.34.100:23 -Nf 192.168.34.101 #在B机器上后台打开A主机的9527端口
          root@192.168.34.101's password: #输入本机密码验证
          [root@b~]#
          [root@centos7~]#telnet 127.0.0.1 9527 #在A机器上用telnet连接本地IP地址和9527端口,可以远程访问到内部C服务器
          Trying 127.0.0.1...
          Connected to 127.0.0.1.
          Escape character is '^]'.
          CentOS release 6.10 (Final)
          Kernel 2.6.32-754.el6.x86_64 on an x86_64
          centos6.10.localdomain login: wang
          Password:
          Last login: Sun Oct 27 11:42:33 from 192.168.34.200 #此时已经连接到C主机,并显示连接C主机是从跳板机B连接的。
          [wang@centos6~]$
        11. 总结:客户端打开9527端口走ssh协议将数据报文封装,发送到跳板机,跳板机解封装报文得到数据,跳板机开启一个随机端口,发送数据报文到telnet服务端,实现外部的客户机通过内部跳板机连接到telnet服务器。

          注意:防火墙只会阻挡从外部到内部的端口连接,不会阻挡从内部到外部的端口,现实生产中比较实用,省去了重新设置防火墙的时间。

        12. 另一种远程端口转发情况:外部有一个客户端(A)连接外部的服务端(B),然后再通过服务端连接内部的跳板机(ssh服务器C),最后到达telnet服务端(D),此处可以将外部客户端和服务端作为

          一个堡垒机,内部的ssh服务器和telnet服务器可以看做是一个堡垒机,具体连接情况如下:

          1)需要将外部客户端(A)的ssh配置文件打开:

          vim /etc/ssh/sshd_config
          修改里边的文件gateway no 改为yes,然后重启ssh服务,systemctl restart sshd
          2)ssh -R 9527:192.168.34.100:23 -fNg 192.168.34.101 ssh服务器端(C)输入当前的命令,将A客户端的9527端口打开,开启后台隧道。
          3)telnet 192.168.34.101 9527 在外部客户端(A)输入自己的本地IP也可以连接到telnet服务端(D)。

          SSH动态端口转发:(合理上国外网站)

          客户端---->代理服务器----->国外网站

          模拟:

          A: 本地机器

          B: 代理客户端

          C: 外国网络

          当用firefox访问internet时,本机的9527端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internet

        13.  

           

          以下为搭建A访问C的过程:

          实现Linux主机通过代理进行访问国外网站:

           iptables -A  INPUT -s 192.168.34.101 -j REJECT   设置C阻挡A模拟。
            echo www.google.com > /var/www/html/index.html  在C建立google网站,访问此google网站实验
            service httpd start  启动C的httpd服务
            ssh -D 9528 192.168.34.200 -fN   在A机器搭建代理客户端的后台隧道
           curl --socks5 127.0.0.1:9528 192.168.34.100   在A上输入此命令,访问外国网站即可  www.google.com

          通过代理可以访问windows版国外网站搭建:

        14. [root@b.ssh]#iptables -A INPUT -s 192.168.34.1 -j REJECT C主机进行防火墙控制windows窗口连接
          [root@centos7~]#ssh -D 9528 192.168.34.200 -fNg -g选项自己能通过网关访问windows网站,别人也可以访问自己
          [root@centos7~]#curl --socks5 127.0.0.1:9528 192.168.34.100 也可以通过输入命令访问windows国外网站
          www.google.com
        15. 在windows网页上高级设置也可以在客户端上访问外国网络:
        16.  

           

           

           

           服务器端:sshd, 配置文件: /etc/ssh/sshd_config 常用参数:

        17. Port 端口号
          ListenAddress ip 监听IP地址
          LoginGraceTime 2m 等待时间是2分钟
          PermitRootLogin yes 禁止ROOT用户模式进行ssh连接
          StrictModes yes 检查.ssh/文件的所有者,权限等
          MaxAuthTries 6 错误的连接最大次数,默认是3次
          MaxSessions 10 同一个连接最大会话
          PubkeyAuthentication yes 支持公钥验证
          PermitEmptyPasswords no 禁止空口令登陆
          PasswordAuthentication yes 支持口令验证
          GSSAPIAuthentication yes 默认是yes,建议改为no影响连接速度。
          UsePAM yes # 使用PAM模块
          ClientAliveInterval 2 检查客户端是否活跃,每两秒检查一次,客户端10s时间不动就会断开
          ClientAliveCountMax 3 连续检查3次客户端活跃情况。
          GatewayPorts no 网关接口默认值是no
          ClientAliveInterval 单位:秒
          ClientAliveCountMax 默认3
          UseDNS yes # 反向解析SSH,需要将此改为no,SSH连接与数据传输就会变快。
          GSSAPIAuthentication yes 提高速度可改为no
          MaxStartups 未认证连接最大值,默认值10, 连接并发连接数,当到达20,开始拒绝部分人。
          Banner /path/file 登陆提示文件
          
          下一篇:没有了