SSH详解及优化

一、SSH介绍

   ssh:Secure Shell,是一种工作在应用层的网络协议,实现两台机器之间的安全登录以及安全的数据传送,保证数据安全的原理是非对称加密。传输协议使用的是可靠的tcp传输,默认端口号22.

   具体的软件实现:

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

        dropbear:另一个开源实现

   SSH协议版本:

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

         v2:双方主机协议选择安全的MAC方式,基于DH算法做密钥交换,基于RSA或DSA实现身份认证

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

         基于password

         基于key

    发起连接请求时公钥交换过程:

        客户端发起链接请求

        服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)

        客户端生成密钥对

        客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密

        客户端发送加密后的值到服务端,服务端用私钥解密,得到Res

        服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到

        客户端公钥)

        最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,

        之后的所有通讯都会被加密


二、 SSH登录验证方式

    基于用户和口令登录验证

        1、客户端发起ssh请求,服务器会把自己的公钥发送给用户

        2 、用户会根据服务器发来的公钥对密码进行加密

        3、加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功


    基于key(密钥)的登录验证

        1、首先在客户端生成一对密钥(ssh-keygen)

        2、并将客户端的公钥ssh-copy-id 拷贝到服务端

        3、当客户端再次发送一个连接请求,包括ip、用户名

        4、服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,abce

        5、服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端

        6、得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端

        7、服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录


(1)一台主机和多台主机间的验证

image.png

将公钥复制到远程主机,输入yes和密码之后,远程就可以不用输入密码了

 ssh-copy-id  -i .ssh/id_rsa.pub   192.168.12.6    #该地址为要连接的主机

image.png

ssh  192.168.12.6   #验证          如果第一次远程输入yes之后就可以直接登录了


key的密码也不可以设置,如果之前输入了key的密码,每次登录需要输入key的密码,启用代理输入口令之后不用

每次都输入 , 代理对应一个终端退出终端需要重新输入

image.png


(2)生产环境中有时需要多个主机彼此之间远程,多台主机批次之间的验证

删除之前操作的记录  rm -rf  /root/.ssh

ssh-keyegen

ssh-copy-id -i  /root/.ssh/id_rsa.pub 127.0.0.1       #将公钥复制到本主机下

scp -r /root/.ssh   192.168.12.6      #将整个存放私钥和公钥的文件夹复制到需要的主机上

就可以实现多个主机互相远程

image.png

三、SSH端口转发

端口转发就是在ssh client 和ssh server 之间建立一个隧道用来传输一些非加密的数据协议,比如telnet,

smtp,http

工作环境中防火墙限制了一些网络端口的使用,但是允许SSH 的连接,此时就能通过端口转发进行通讯。

端口转发分为s本地转发、远程转发、动态转发


实验前先关闭三台主机的防火墙和selinux 清空iptables 

H1:192.168.12.7

H2:192.168.12.6

H3 :  192.168.12.5

image.png

1、本地端口转发

    -L localport:remotehost:remotehostport sshserver

        选项:

        -f 后台启用

        -N 不打开远程shell,处于等待状态

        -g 启用网关功能


模拟防火墙拒绝H1

image.png


假设H1为防火墙外部主机,要通过telnet访问H3,在H1上找一个未被使用的端口10086作为监听端口,这个端口为

外部端口(1024-65535),当telent访问本机的10086端口,通过H2将请求转发给H3

ssh   -L  10086:H3:23   H2  -Nfg      #   23端口是远程主机H3的telnet端口

如果没有telnet需要安装

yum isntall telnet-server  -y   &&  systemctl start telnet.socket

image.png

ssh隧道建立

image.png  

从H3来看相当与H2访问它,H2作为跳板将数据转发。

image.png

杀掉进程,关闭隧道

image.png


2、远程端口转发

企业中防火墙大部分都是阻止数据进入内部的,和本地端口转发不同的是ssh server 为H2,由H2建立隧道后,H1通过127.0.0.1 10086将数据

发送给H2 ,H2再将数据转发给H3 

ssh -R sshserver_port:remote_host:remotehost_port sshserver

在H2建立隧道 :   ssh -R 10086:192.168.12.5:23     192.168.12.7     -Nf 

在H1 测试  :     telnet 127.0.0.1  10086


3、动态端口转发

我国有一个功能强大的防火墙,用来禁止谷歌等国外的部分网站进入,但是有时候需要查询一些资料,需要访问谷歌。

H1为国内主机,H2,H3为国外主机

yum install httpd -y

systemctl start httpd

echo "hello " > /var/www/html/index.html

iptables -A INPUT -s 192.168.12.7 -j REJECT     #   在H3上禁止H1访问         

image.png

 H1:curl --socks5 127.0.0.1  [email protected]  -Nfg    


image.png

    

如果其他主机,比如本地windows想要通过这个隧道访问可以将H1设置为代理

iptables -A INPUT -s 192.168.12.1 -p tcp --dport 80 -j REJECT

image.png


在浏览器中找到internet选项  连接-->局域网设置-->代理服务器高级

image.png

上述方法其他主机上网需要2个主机,代价比较大,可以将H1 ,H2合为一个,H2即是ssh clients也是ssh server

其他主机需要上网只需将H2设置为代理即可。

image.png


四、SSH服务配置优化

为了保障服务器安全可以修改一些ssh配置

Port 2222      端口号,必需修改的一项

ListenAddress 192.168.12.7    主机上可能有多个ip可以将监听ip修改为内网ip

PermitRootLogin no       一些重要的主机可以设置为禁止root登录

UseDNS no                      是否需要域名反解析,建议设置为no 这样可以提高链接速度。

PubkeyAuthentication      是否支持公钥验证方式,

PasswordAuthentication        是否支持密码验证方法如果做过基于key验证可以禁用该项

man sshd_config    打开有道词典,查看详细内容

猜你喜欢

转载自blog.51cto.com/14322729/2414539