一、什么是 SSH 服务?
SSH(Secure Shell)服务是 Linux 系统中提供 远程安全登录 和 加密通信 的网络服务,默认运行在 22号端口,由 sshd 守护进程负责处理请求。
SSH 解决了传统 Telnet、FTP 等协议明文传输密码和数据的严重安全问题,是现代服务器远程运维的标准工具。
二、SSH 服务的主要用途
| 用途 | 描述 |
|---|---|
| ✅ 远程终端登录 | 登录远程 Linux 主机并控制它 |
| ✅ 安全文件传输 | 使用 scp 或 sftp 实现加密文件传输 |
| ✅ 命令远程执行 | 在远程机器上执行脚本、命令 |
| ✅ 隧道和端口转发 | 安全传输 HTTP、VNC 等不安全流量 |
| ✅ Git 拉取/推送 | Git 服务常用 SSH 认证进行安全通信 |
三、SSH 的工作原理
-
客户端发起连接到 SSH 服务器(如
ssh user@ip) -
服务器返回公钥等信息,建立加密会话
-
客户端进行身份认证(密码或密钥)
-
验证成功后进入加密会话,用户获得远程终端
关键特点:
-
使用了 非对称加密 + 对称加密 + 哈希算法。
-
通信全程加密,防止监听、篡改。
四、SSH 服务组件
| 组件 | 说明 |
|---|---|
sshd | SSH 服务器守护进程,监听 22 端口 |
ssh | SSH 客户端命令行程序 |
scp | 使用 SSH 协议传输文件 |
sftp | 类 FTP 的 SSH 安全文件传输工具 |
~/.ssh/authorized_keys | 服务器端保存客户端公钥的文件 |
五、配置 SSH 服务(服务端)
配置文件路径:/etc/ssh/sshd_config
常见配置项说明:
| 配置项 | 描述 |
|---|---|
Port 22 | 设置监听端口(可自定义为非默认端口) |
PermitRootLogin no | 禁止 root 用户远程登录 |
PasswordAuthentication yes/no | 是否允许密码登录 |
PubkeyAuthentication yes | 是否允许公钥登录 |
AllowUsers user1 user2 | 只允许指定用户登录 |
重启服务使配置生效:
sudo systemctl restart sshd
六、SSH 身份验证方式
1. 密码验证(默认)
优点:简单
缺点:容易被暴力破解
2. 公钥/私钥对认证(推荐)
流程:
-
客户端生成密钥对(
ssh-keygen) -
把公钥传到服务器(
~/.ssh/authorized_keys) -
客户端用私钥自动验证,无需密码
更安全、适合自动化脚本、Git 操作等。
七、常见操作命令
# 启动 SSH 服务
systemctl start sshd
# 查看状态
systemctl status sshd
# 设置开机启动
systemctl enable sshd
# 客户端登录远程主机
ssh 用户名@远程IP地址
# 使用指定私钥连接
ssh -i ~/.ssh/id_rsa 用户名@IP
八、安全建议
| 安全措施 | 描述 |
|---|---|
| 修改默认端口 | 避免被扫描 |
| 禁用 root 登录 | 提高安全性 |
| 使用密钥登录 | 防止密码泄露或爆破 |
| 限制登录用户 | 使用 AllowUsers 或 AllowGroups |
| 配置 Fail2Ban | 阻止暴力破解尝试 |
| 配合防火墙 | 限制 IP 或端口访问 |
九、排查连接问题
-
端口被防火墙阻止:
firewall-cmd检查规则 -
SELinux 阻止 SSH 登录:
getsebool -a | grep ssh -
公钥权限不当:
.ssh/authorized_keys权限必须为 600
十、关于ssh服务我想说的话。
1.服务器的配置文件在/etc/ssh/sshd_config 这个文件里定义了一些关键信息,例如是否允许root用户远程登陆,设定特定用户登录。
- 远程主机登录服务器时,应是登录服务器上的某个用户的,使用密钥登录的话,就要把客户端的公钥放到服务器某个用户的
~/.ssh/authorized_keys文件中,这个文件每一行代表一个公钥。这是密钥登录的必要条件。同样的,如果某个用户想通过密钥的方式登录远程的客户端,不仅要将公钥放到~/.ssh/authorized_keys,而且还要将私钥放到~/.ssh/目录中。 - 权限问题。在服务端配置用户本身的ssh文件时,要注意他们的权限,
~/.ssh/目录的的权限应该是007。以及SELinux的上下文配置。 ~/ssh/目录下的文件介绍:
authorized_keys文件存储了ssh服务客户端的公钥,用于客户端连接本主机的 该文件所属用户 使用的。
id_rsa里面存储了文件所属用户的密钥对的私钥,用于解析其公钥加密的信息。
id_rsa.pub存储了文件所属用户的密钥对的公钥,用于向服务器建立ssh连接。
know_hosts存储了服务器上的/etc/ssh/目录下的公钥,用于下次登录时识别主机身份。
know_hosts.pub是know_hosts的一个备份文件,防止know_hosts文件的备胎- openssh安装包的命令
ssh_keygen生成一个ssh密钥对。
ssh_copy_id将客户端的公钥传输到服务端哪里,用于接下来的密钥登陆。
例子
ssh_copy_id root@192.168.197.133这个命令的意思是连接到主机192.168.197.133的root命令。
十一、案例:如何利用Xshell实现windows到Linux的密钥对登录。
步骤一:在Windows中生成密钥对
法一:利用Xshel提供的工具
步骤一,利用Xshell提供的工具创建密钥对
以远程登录
root用户为例:






步骤二:将公钥传到Linux中的/root/.ssh/authorized_keys文件


让后将保存在windows中的公钥传到Linux里面,使用cat命令将文件追加到/root/authorized_keys文件中.
假如公钥被传输到了
/root目录中。
cat ./id_rsa_2084 >> ./.ssh/authorized_keys
#重启sshd服务
systemctl restart sshd
到这里就可以检测是否可以利用Xshell进行密钥登录了。
步骤三:验证是否可以登录
在Xshell中输入下面的内容并回车
[C:\~]$ ssh root@192.168.197.101

点击确定如果可以直接登录成功而不需要输入密码,那案例就成功了。
法二:直接在windows的Powershell工具,
步骤一:打开Powershell并生成公钥
PS D:\axwang\document> ssh-keygen
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\28050/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\28050/.ssh/id_ed25519
Your public key has been saved in C:\Users\28050/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:N9MOplTkve+R8WK3SQyW7oXMyhdfvcePvrgLQUeQyso 28050@xwang
The key's randomart image is:
+--[ED25519 256]--+
| oo. |
| o.o |
| . .+ o |
| oo o .. |
| . .S B o+. .|
| E. + *=o++o|
| . . .=O==|
| ..o=oB=|
| o===++|
+----[SHA256]-----+
注意密钥对生成的路径在哪里(C:\Users\28050/.ssh/id_ed25519)
步骤二:使用scp命令将公钥传输到Linux上。
PS D:\axwang\document> scp C:\Users\28050\.ssh\id_ed25519 root@192.168.197.101:/root
root@192.168.197.101's password:
id_ed25519 100% 399 48.7KB/s 00:00
步骤三:在Linux中将公钥导入到/root/.ssh/authorized_keys中
root@101 ~]# cat id_ed25519.pub >> .ssh/authorized_keys
[root@101 ~]# cat .ssh/authorized_keys -n
1 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDJQvaGula+N6SipJXFs2ZDT/W1XIsvWKQSMX59ukrcrW/eyY6Xs4zFIAaRao90VdpYwfSul0eY4HawbyqsXrGEkSMDnketjQcaCQxU9VGnqXED1Uss9RYKFC0lJB0PDj1Ak3vqCeG9ZWMpEwjDsm409op7Sjsb3Pvof/5T6E+STmCECD7hDCbBQWGnfY6srhKrkZl+Q4A1QnvxWDoeQPfwYhkzhtAhnvdgDWCwF63XBsElFhbQkd1cFKe25iO2klFUv+b8jcBjQ33XkMHo3+OfGeVYHeHSn2SFTLQMMuLqj/X+fKVoXvG+UQAKo9j/xt6NvKy8WZx8003qutENLxR5n183V8alEDIVw3sZ8SFFewJ5EWKlSkuhQ9vHO/N1mt/vavBaCeYJBVUX4wPWlzCBFjr2yc4q1k8+Yt2cENFhwlGkv8MaNSmTFF4vI4EiGjoDyklcXti6HGSg4Y98wkv1IJFM5JF55yFbI9drXyNIS5yqP6y4k4AAIUMsmMLgGPE= root@133
2 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJUi/04giBUqkunsE08Wgv0IgREqSCtb9amRYcXAE8+8 28050@xwang
步骤四:在Powershell中使用ssh登录Linux主机
PS D:\axwang\document> ssh root@192.168.197.101
Activate the web console with: systemctl enable --now cockpit.socket
Register this system with Red Hat Insights: insights-client --register
Create an account or view all your systems at https://red.ht/insights-dashboard
Last login: Wed Jun 4 20:20:25 2025 from 192.168.197.1
[root@101 ~]#
没有跳出让人输入密码,说明密钥登录成功。
总结
其实
ssh远程密钥登录的核心在于密钥对,不管在哪里登录只要能提供一组密钥对,并把这些密钥对方到该放到的位置,就可以实现密钥登陆。不管这对密钥对是在哪里产生的。
1534

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



