SSH 建立连接
SSH 全称 Secure Shell;是基于应用层,为远程登录会话和其他网络服务提供安全性的协议。
准备两台虚拟机进行演示:
可使用hostnamectl set-hostname server/client.[用户名].cloud命令持久化更改主机名加以区分;server代表服务提供端,client代表访问服务端。
[root@server ~]# hostnamectl set-hostname server.root.cloud
#IP:10.1.8.10 端口22
[root@server ~]# hostname -I
10.1.8.10 192.168.122.1
[root@client ~]# hostnamectl set-hostname client.root.cloud
#IP:10.1.8.11 端口22
[root@client ~]# hostname -I
10.1.8.11 192.168.122.1
IP地址可以通过hostname -I命令进行查询,或使用更加详细的ip addr show命令。
已经连接或连接过服务器时可以通过以下命令了解IP地址相关信息:
- curl ifconfig.me:查询已连接服务器的公网出口IP;
- who:查看当前登录用户及来源IP;
- last:查看历史登录IP记录;
现在使用ssh命令就可以使两台虚拟机进行连接。(首次连接会出现提示信息,在提示信息最后输入 yes 即可)
语法:ssh -p [端口号] [用户名]@[主机/IP地址]
[root@client ~]# ssh -p 22 root@server
root@server's password:
Last login: Mon Nov 3 17:48:46 2025 from 10.1.8.11
[root@client ~]# ssh -p 22 root@10.1.8.10
root@10.1.8.10's password:
Last login: Mon Nov 3 18:06:57 2025 from 10.1.8.11
该语法中的用户名是远程服务器上的用户账户,不是本地的用户名。
远程服务器可能有多个用户账户,每个账户有不同的权限和文件访问权;指定用户名确保了SSH知道要登录到哪个账户,从而进行身份验证和授权。
如果省略 [用户名]@,SSH会默认使用本地当前用户名,但这可能无法匹配远程账户,导致登录失败。
此外,还可以省略 -p [端口号],ssh默认连接22号端口;这是 SSH 协议的行业标准默认端口。
另外,还可以在命令结尾追加 [远程命令];即ssh -p [端口号] [用户名]@[主机/IP地址] [远程命令]。这样就不会登录服务器,而是在服务器中执行远程命令后立即返回。
[root@client ~]# ssh root@10.1.8.10 'hostname -I'
root@10.1.8.10's password:
10.1.8.10 192.168.122.1
成功连接服务器后,运行ls ~/.ssh会出现known_hosts文件,否则 ~/.ssh目录为空;known_hosts是公钥指纹存储文件,每一行代表一个服务器的公钥。
每当首次通过 SSH 连接远程服务器时(即首次连接时确认的提示信息),客户端会收到服务器的公钥指纹,known_hosts自动记录此信息。后续连接同一服务器时,系统会对比本地存储的公钥和服务器返回的公钥是否匹配;若公钥不匹配将触发警告。
/etc/ssh/ssh_config是ssh服务的全局配置文件,影响所有用户;用户还可以自主创建的配置文件~/.ssh/config,优先级高于全局配置。需注意 ~/.ssh/config文件的权限不能高于640,即rw- r-- —。
如果~/.ssh/config的权限更高(如 644 或 666),SSH会输出警告并忽略该配置文件。(觉得麻烦可以不要创建用户配置)
/etc/ssh/ssh_config常用配置:
- Host *:匹配所有主机连接;
- HostName:指定远程主机的实际地址;
- User:指定登录用户名;
- IdentityFile:指定私钥文件路径;
- StrictHostKeyChecking no:禁用严格主机密钥检查;
- Compression yes:启用数据压缩,在慢速网络中提升传输效率;
- ServerAliveInterval 60:客户端心跳检测间隔(秒);
- ForwardAgent yes:启用SSH代理转发,在跳板机场景中传递密钥凭据;
SSH 加密
SSH建立链接包含以下阶段:
- TCP连接建立:客户端向服务器的22端口发起TCP连接;
- SSH协议版本协商阶段:双方交换支持的SSH协议版本,协商使用哪个版本(SSH目前包括SSH1和SSH2两个大版本,如SSH-1.99表示支持SSH2.0);
- 密钥和算法协商阶段:服务器将它的主机公钥发送给客户端,客户端验证此服务器公钥(检查~/.ssh/known_hosts文件,首次连接时会提示用户确认);然后双方使用Diffie-Hellman算法,在不安全的通道上安全地共同生成一个唯一的、共享的对称会话密钥,最后协商后续通信将使用的加密算法、消息认证码算法等;
- 认证阶段:客户端向服务器证明自己的身份;
- 会话请求阶段:认证成功后,客户端请求开启一个交互式会话(如启动一个Shell);
- 交互会话阶段:此阶段的所有通信都使用在步骤3中生成的对称会话密钥进行加密和解密,确保通信的机密性和完整性。非对称加密主要用于最初的密钥交换和身份验证,因为其计算开销较大;
SSH协议是基于非对称加密方法的,即服务器和客户端都会生成自己的公钥和私钥。
公钥用来加密数据;私钥用来解密数据。
双向加密过程:
- 服务器创建密钥对:服务器端持有一对长期的主机密钥(包括公钥和私钥);当客户端首次连接时,服务器会将自己的公钥(也称为主机公钥)发送给客户端,这个公钥用于客户端验证服务器身份,并建立一个临时的安全通道;
- 客户端记录服务器公钥并计算自己的公私钥:客户端收到服务器公钥后,保存在本地,用于后续连接时验证服务器身份;同时为了本次会话,客户端也会在内存中临时生成一对会话密钥对(非对称密钥对);
- 客户端使用服务器的公钥加密自己的公钥并发送给服务器:客户端会使用收到的服务器公钥对自己刚生成的会话公钥进行加密,然后将这个加密后的结果发送给服务器;由于只有拥有对应私钥的服务器才能解密此信息,这就确保了会话公钥的安全传递;
- 双向加解密:服务器收到加密数据后,用自己的主机私钥解密,得到客户端的会话公钥;此时,双方都拥有了对方的公钥;
使用ssh-keygen命令可以生成密钥对;执行命令时系统的三次询问依次为:确认私钥保存位置,私钥是否加密,最终确认。
不想确认这些问题可以使用ssh-keygen -t rsa -f - -N ‘’ 使系统以默认设置直接输出私钥。
之后在~/.ssh中可以查看私钥(id_rsa)和公钥(id_rsa.pub);
使用ssh-copy-id命令可以将本地主机的公钥自动添加到远程服务器的 ~/.ssh/authorized_keys 文件中,实现 SSH 免密码登录。
首次配置免密码登录前依然需要进行密码连接,可以通过sshpass命令将密码传递给目标服务器;
语法:sshpass [选项] [属性]
| sshpass选项 | 作用 |
|---|---|
| -f | 从文件中读取密码 |
| -p | 直接在命令行中指定密码 |
| -d | 从文件描述符中读取密码 |
| -e | 从环境变量 SSHPASS 中读取密码 |
[root@client ~]# ls .ssh
id_rsa id_rsa.pub known_hosts
[root@client ~]# sshpass -p 123 ssh-copy-id root@10.1.8.10
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.1.8.10's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@10.1.8.10'"
and check to make sure that only the key(s) you wanted were added.
[root@client ~]# ssh root@10.1.8.10
Last login: Mon Nov 3 20:48:26 2025 from 10.1.8.11
如果配置密钥后,远程登录仍要需要输入密码验证,可能是远程服务器文件目录的权限问题;SSH服务出于安全考虑,对用户家目录及其内部文件有严格的权限要求。
如果目标服务器的权限过于宽松,ssh会拒绝访问服务器。以下为SSH密钥认证权限对照表:
| 文件/目录 | 权限 |
|---|---|
| 用户家目录 | 700 |
| ~/.ssh | 700 |
| ~/.ssh/authorized_keys | 600 |
| 私钥文件 (id_rsa) | 600 |
| 公钥文件 (id_rsa.pub) | 无严格限制 |
| ~/.ssh/config | 无严格限制 |
| ~/.ssh/known_hosts | 无严格限制 |
SSH 自定义配置
可在/etc/ssh/sshd_config中自定义ssh服务配置;
注意/etc/ssh/sshd_config是SSH服务器(sshd守护进程)的配置文件,与SSH客户端(ssh命令)的配置文件/etc/ssh/ssh_config不同。
- /etc/ssh/sshd_config:定义服务器端的设置;例如监听的端口、认证方式、日志级别等;文件影响所有连接到该服务器的客户端;
- /etc/ssh/ssh_config:定义客户端在连接到任何SSH服务器时的默认行为;如默认用户名、连接超时等;适用于所有用户;
/etc/ssh/sshd_config常用配置:
- PermitRootLogin no:禁止 root 用户登录;
- root用户权限不受限制。
- root用户存在每个Linux系统,只需要猜密码就可以。
- 从审计角度来看,很难跟踪哪个授权用户以root身份登录并进行了更改。 如果用户必须以普通用户身份登录并切换到root帐户,则会生成一个日志事件,可用于帮助提供问责制。
- PermitRootLogin prohibit-password:禁止 root 用户通过密码登录;
- PasswordAuthentication no:禁止用户使用密码登录。
- AllowUsers exampleuser:允许特定用户登录,该用户可以提权为root;
- UseDNS no:客户端连接服务器的时候,服务器不需要反向解析服务端IP地址,提高连接速度;
- Port 22:监听端口;即能够连接至该服务器的端口号;
773

被折叠的 条评论
为什么被折叠?



