配置SSH远程连接主机

配置SSH远程连接主机

参考:

公钥私钥

公钥和私钥成对出现,公开的密钥叫公钥,只要自己知道的叫私钥。

  • 用公钥加密的数据只有对应的私钥能够解密

  • 用私钥加密的数据只有对应的公钥能够解密

  • 假如能够用公钥解密,则必定是对应的私钥加的密

  • 假如能够用私钥解密,则必定是对应的公钥加的密

总结

  • 用公钥加密数据,用私钥来解密数据

  • 用私钥加密数据(数字签名),用公钥来验证数字签名

SSH远程连接过程

  1. 客户机向远程主机发送登录请求,并且把自己的公钥发送给远程主机。
  2. 远程主机收到用户的登录请求,首先判断对应的用户主目录下是否存在.ssh/authorized_keys并且这个文件中是否有客户机的公钥
    • 如果条件不成立,就会使用账户口令登录登录的方式,同时向客户机返回自己的公钥
    • 如果条件成立,则会使用公私钥登录的方式,同时向客户机返回自己的公钥和客户机公钥加密过的一些验证信息

账户口令登录登录的方式:(每次都需要输入密码,不能免密钥登录)
(3)用户使用这个公钥,将登录密码加密后,发送回来。
(4)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

基于公私钥登录的方式:(可以实现 免密钥登录)
能用到这种方式的前提是,用户已经将自己的公钥储存在远程主机上,这个是重点,也就是所谓的“公密钥分发”。
(3)用户用自己的私钥解密“随机信息”后,接着用“私钥”加密签名该“随机信息”,最后再用远程主机的公钥加密发送给远程主机。
(4)远程主机先用自己的私钥解密,然后在用事先储存的客户机公钥进行解密认证,得出“随机信息”,如果“随机信息”正确,就证明用户是可信的,直接允许登录shell,不再要求密码。

配置局域网SSH远程连接

无密钥方式

1.安装ssh

sudo apt-get install openssh-server

2.开启ssh服务

sudo systemctl status sshd # 先查看ssh服务是否开启,如果开启则无需再次开启
# 开启ssh服务
sudo service ssh start
或者
sudo service ssh restart

3.服务端修改ssh配置文件

修改ssh的配置文件sshd_config,路径默认为/etc/ssh/sshd_config:

sudo vim /etc/ssh/sshd_config

找到“port“,“ListenAddress”,“PermitRootLogin”,“RSAAuthentication“去掉注释,改为:(没有就手动添加对应的语句)

RSAAuthentication yes 
PubkeyAuthentication yes 
AuthorizedKeysFile .ssh/authorized_keys

在这里插入图片描述

在这里插入图片描述

表示监听22号端口,监听所有地址,允许远程登陆。

问题:出现"Failed to start sshd.service: Unit sshd.service not found."的解决方法
  1. 检查ssh协议的22号端口是否正常开启:
ss -ntl # 查询22端口是否开启,此处可以看到结果中没有22端口
State   Recv-Q    Send-Q        Local Address:Port         Peer Address:Port 

如果没有22号端口,则回到上一步添加加入PermitRootLogin yes。之后再次检查应该就能看到22号端口打开了:

ss -ntl
State    Recv-Q    Send-Q        Local Address:Port        Peer Address:Port    
LISTEN   0         128                 0.0.0.0:22               0.0.0.0:*       
LISTEN   0         128                    [::]:22                  [::]:*  
  1. 重启ssh服务
sudo service sshd restart # 重启,发现还是不行
Failed to restart sshd.service: Unit sshd.service not found.
sudo systemctl enable ssh.service # 启用ssh服务
Synchronizing state of ssh.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable ssh
Created symlink /etc/systemd/system/sshd.service → /lib/systemd/system/ssh.service.

至此问题解决。

问题:验证文件失效的情况

此情况有时是同一个远程IP被两个不同的机器先后使用了(比如VSCODE中更改了配置远程服务器的IP),或者是之前连接的机器重装了,会出现:

image

解决方法已经提示得很清楚了,直接执行:

ssh-keygen -f "/home/用户名/.ssh/known_hosts" -R "远程机器IP"

image

4.查看本机(作为server)的IP地址

ip addr

5.客户机连接服务主机

ssh 要登录的用户@服务器的IP地址

有密钥方式(免密登录)

原理:如果主机a要登录主机b,那么需要让主机b认得主机a。因此公钥是在主机a上生成并拷贝到主机b的authorized_keys文件中,这样主机b就认识主机a了,以后主机a可以免密登录主机b。同理在主机b上生成秘钥,传到主机a上,这样主机b也可以免密登录主机a。

如果客户端和服务器都是Linux系统,则:

cd ~/.ssh/                     # 若没有该目录,请先执行一次ssh localhost
ssh-keygen -t rsa              # 会有提示,都按回车就可以
cat ./id_rsa.pub >> ./authorized_keys  # 加入授权(记得用追加,不要覆盖)

# 1分发自己的公钥到目标主机2和3
scp ./authorized_keys hadoop@192.168.161.133:/home/hadoop/.ssh/authorized_keys
scp ./authorized_keys hadoop@192.168.161.134:/home/hadoop/.ssh/authorized_keys

以下以客户端为Windows10,服务器为Linux为例:

参考:win10自带SSH免密登录Linux - 知乎 (zhihu.com)

1.生成密钥对(Win10)

打开cmd,输入以下指令:

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa

执行完上述命令后会在根目录生成隐藏目录.ssh。里面有2个文件:id_rsa是私钥,id_rsa.pub是公钥。

image

注意:公钥是公开的,不需要保密,而私钥是自己持有,需要保密。

2.将Client端的公钥添加到用于认证的Server端的公钥文件中(Win10上传公钥文件到Linux)

方法一:使用scp命令

在命令提示符上输入以下命令,即可把公钥文件上传到linux服务器对应的路径下。

scp C:\Users\Lenovo/.ssh/id_rsa.pub 要登录的用户@Server端的IP地址:~/.ssh/authorized_keys
方法二:使用ssh-copy-id脚本

ssh-copy-id脚本的作用:将你的公共密钥填充到一个远程机器上的authorized_keys文件中。

ssh-copy-id -i ~/.ssh/id_rsa.pub 要登录的用户@Server端的IP地址
# 可简写为:
ssh-copy-id <hostname>
# 其中<hostname>在 /etc/hosts中 配置,用户默认为本机运行用户
ssh-copy-id  用户名字@192.168.x.xxx

注意:在Windows中的powershell无法使用ssh-copy-id脚本,解决方案如下:

方案1:可以手动实现这个脚本的功能:

# 复制下面这段脚本,粘贴到Windows终端,按回车运行,之后就可以成功使用ssh-copy-id了
function ssh-copy-id([string]$userAtMachine, $args){   
    $publicKey = "$ENV:USERPROFILE" + "/.ssh/id_rsa.pub"
    if (!(Test-Path "$publicKey")){
        Write-Error "ERROR: failed to open ID file '$publicKey': No such file"            
    }
    else {
        & cat "$publicKey" | ssh $args $userAtMachine "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1"      
    }
}

方案2:用gitbash工具中的ssh-copy-id脚本,直接启动gitbash,在gitbash中操作即可

image

方法三:手动拷贝

复制id_rsa.pub的内容,然后在服务器的~/.ssh/目录(没有这个目录就手动创建一个)创建authorized_keys文件,将复制的内容粘贴进去即可

3.服务端重启ssh服务

sudo service ssh restart
posted @ 2023-03-31 00:02  3的4次方  阅读(47)  评论(0编辑  收藏  举报