当前位置 主页 > 服务器问题 > win服务器问题汇总 >

    SSH远程登录和端口转发详解

    栏目:win服务器问题汇总 时间:2019-10-10 14:28

    介绍

    SSH 是创建在应用层和传输层基础上的安全协议,为计算机上的 Shell(壳层)提供安全的传输和使用环境。

    SSH 只是协议,有多种实现方式,本文基于其开源实现 OpenSSH

    远程登录

    SSH主要用于远程登录:

    $ ssh user@host

    当本地用户名和远程用户名一致时,可省略用户名:

    $ ssh host

    SSH 协议默认端口是22,指定端口可使用 -p 参数

    $ ssh -p 2222 user@host

    MITM

    SSH 采用公钥加密的方式来保证传输安全。过程如下:

    客户端发起登录请求,远程主机将自己的公钥发个用户; 客户端使用该公钥将登录密码加密后发送给远程主机; 远程主机使用私钥解密登录密码,如密码正确则允许客户端登录。

    However!

    由于 SSH 协议的公钥是自己签发的,并不像HTTPS 的SSL证书是有CA机构颁发的。如果有人插在用户与远程主机之间,截获登录请求,然后冒充远程主机,将伪造的公钥发给客户端,那么用户则很难辨别真伪。 这样就可以获取用户登录密码,用来登录远程主机。这就是MITM,(Man-in-the-middle attack,中间人攻击)

    密码登录

    第一次登录远程主机,会有如下提示:

    $ ssh 10.0.0.12
    The authenticity of host '10.0.0.12 (10.0.0.12)' can't be established.
    RSA key fingerprint is 3a:45:30:52:b5:ea:2a:55:e7:23:41:ef:16:76:0b:8d.
    Are you sure you want to continue connecting (yes/no)?

    意思是:无法确认远程主机真实性,指知道它的公钥指纹,是否继续连接?

    公钥指纹(fingerprint):公钥采用RSA算法,长度较长难以比对,所以对其进行MD5计算,得到128位的指纹,即上例中的3a:45:30:52:b5:ea:2a:55:e7:23:41:ef:16:76:0b:8d

    其实并没有什么有效便捷的方式确认公钥指纹的真实性,确认接受远程主机公钥:

    Are you sure you want to continue connecting (yes/no)? yes

    系统提示远程主机已加入到受信主机列表:

    Warning: Permanently added '10.0.0.12' (RSA) to the list of known hosts.

    然后提示输入密码:

    root@10.0.0.11's password:

    输入密码正确,就可以正常登陆了。

    当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统会发现它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

    公钥登陆

    除了密码登录,SSH 还支持公钥登录。

    “公钥登录”原理是:用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求输入密码。

    公钥登录需要用户提供自己的公钥,一般保存在 $HOME/.ssh/ 目录下,id_rsa是私钥,id_rsa.pub是公钥。如果没有可以通过ssh-keygen生成。

    $ ls -1 ~/.ssh
    id_rsa
    id_rsa.pub
    known_hosts

    需要把公钥发送到远程主机:

    # ssh-copy-id [-i [identity_file]] [user@]machine
    $ ssh-copy-id root@10.0.0.12

    此后再登录就不需要输入密码了。

    如果还是无法使用公钥登录,可以检查一下远程主机SSH配置/etc/ssh/sshd_config,打开如下注释并重启SSH服务[我发现CentOS release 6.8 (Final)默认SSH配置中注释掉以下内容也是可以使用公钥登录的]: