> 技术文档 > SSH服务:安全远程登录的终极指南

SSH服务:安全远程登录的终极指南


一、什么是 SSH 服务?

SSH(Secure Shell)服务是 Linux 系统中提供 远程安全登录加密通信 的网络服务,默认运行在 22号端口,由 sshd 守护进程负责处理请求。

SSH 解决了传统 Telnet、FTP 等协议明文传输密码和数据的严重安全问题,是现代服务器远程运维的标准工具。


二、SSH 服务的主要用途

用途 描述 ✅ 远程终端登录 登录远程 Linux 主机并控制它 ✅ 安全文件传输 使用 scpsftp 实现加密文件传输 ✅ 命令远程执行 在远程机器上执行脚本、命令 ✅ 隧道和端口转发 安全传输 HTTP、VNC 等不安全流量 ✅ Git 拉取/推送 Git 服务常用 SSH 认证进行安全通信

三、SSH 的工作原理

  1. 客户端发起连接到 SSH 服务器(如 ssh user@ip

  2. 服务器返回公钥等信息,建立加密会话

  3. 客户端进行身份认证(密码或密钥

  4. 验证成功后进入加密会话,用户获得远程终端

关键特点:

  • 使用了 非对称加密 + 对称加密 + 哈希算法

  • 通信全程加密,防止监听、篡改。


四、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 登录 提高安全性 使用密钥登录 防止密码泄露或爆破 限制登录用户 使用 AllowUsersAllowGroups 配置 Fail2Ban 阻止暴力破解尝试 配合防火墙 限制 IP 或端口访问

九、排查连接问题

  • 端口被防火墙阻止:firewall-cmd 检查规则

  • SELinux 阻止 SSH 登录:getsebool -a | grep ssh

  • 公钥权限不当:.ssh/authorized_keys 权限必须为 600


十、关于ssh服务我想说的话。

1.服务器的配置文件/etc/ssh/sshd_config 这个文件里定义了一些关键信息,例如是否允许root用户远程登陆,设定特定用户登录。

  1. 远程主机登录服务器时,应是登录服务器上的某个用户的,使用密钥登录的话,就要把客户端的公钥放到服务器某个用户的~/.ssh/authorized_keys文件中,这个文件每一行代表一个公钥。这是密钥登录的必要条件。同样的,如果某个用户想通过密钥的方式登录远程的客户端,不仅要将公钥放到~/.ssh/authorized_keys,而且还要将私钥放到~/.ssh/目录中。
  2. 权限问题。在服务端配置用户本身的ssh文件时,要注意他们的权限,~/.ssh/目录的的权限应该是007。以及SELinux的上下文配置
  3. ~/ssh/ 目录下的文件介绍:
    authorized_keys 文件存储了ssh服务客户端的公钥,用于客户端连接本主机的 该文件所属用户 使用的。
    id_rsa 里面存储了文件所属用户的密钥对的私钥,用于解析其公钥加密的信息。
    id_rsa.pub 存储了文件所属用户的密钥对的公钥,用于向服务器建立ssh连接。
    know_hosts 存储了服务器上的/etc/ssh/目录下的公钥,用于下次登录时识别主机身份。
    know_hosts.pubknow_hosts的一个备份文件,防止know_hosts文件的备胎
  4. openssh安装包的命令
    ssh_keygen 生成一个 ssh 密钥对。
    ssh_copy_id 将客户端的公钥传输到服务端哪里,用于接下来的密钥登陆。
    例子
    ssh_copy_id root@192.168.197.133 这个命令的意思是连接到主机192.168.197.133root 命令。

十一、案例:如何利用Xshell实现windows到Linux的密钥对登录。

步骤一:在Windows中生成密钥对

法一:利用Xshel提供的工具
步骤一,利用Xshell提供的工具创建密钥对

以远程登录root用户为例:

打开Xshell的工具
点击用户密钥对管理者
点击生成
密钥长度越大,越不容易被破解
不设置密码继续下一步保存公钥到windows中

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

启用xftp服务
设置属性
让后将保存在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

使用公钥登录
点击确定如果可以直接登录成功而不需要输入密码,那案例就成功了。

法二:直接在windowsPowershell工具,

步骤一:打开Powershell并生成公钥
PS D:\\axwang\\document> ssh-keygenGenerating 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_ed25519Your public key has been saved in C:\\Users\\28050/.ssh/id_ed25519.pubThe key fingerprint is:SHA256:N9MOplTkve+R8WK3SQyW7oXMyhdfvcePvrgLQUeQyso 28050@xwangThe 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:/rootroot@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 1ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDJQvaGula+N6SipJXFs2ZDT/W1XIsvWKQSMX59ukrcrW/eyY6Xs4zFIAaRao90VdpYwfSul0eY4HawbyqsXrGEkSMDnketjQcaCQxU9VGnqXED1Uss9RYKFC0lJB0PDj1Ak3vqCeG9ZWMpEwjDsm409op7Sjsb3Pvof/5T6E+STmCECD7hDCbBQWGnfY6srhKrkZl+Q4A1QnvxWDoeQPfwYhkzhtAhnvdgDWCwF63XBsElFhbQkd1cFKe25iO2klFUv+b8jcBjQ33XkMHo3+OfGeVYHeHSn2SFTLQMMuLqj/X+fKVoXvG+UQAKo9j/xt6NvKy8WZx8003qutENLxR5n183V8alEDIVw3sZ8SFFewJ5EWKlSkuhQ9vHO/N1mt/vavBaCeYJBVUX4wPWlzCBFjr2yc4q1k8+Yt2cENFhwlGkv8MaNSmTFF4vI4EiGjoDyklcXti6HGSg4Y98wkv1IJFM5JF55yFbI9drXyNIS5yqP6y4k4AAIUMsmMLgGPE= root@133 2ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJUi/04giBUqkunsE08Wgv0IgREqSCtb9amRYcXAE8+8 28050@xwang

步骤四:在Powershell中使用ssh登录Linux主机
PS D:\\axwang\\document> ssh root@192.168.197.101Activate the web console with: systemctl enable --now cockpit.socketRegister this system with Red Hat Insights: insights-client --registerCreate an account or view all your systems at https://red.ht/insights-dashboardLast login: Wed Jun 4 20:20:25 2025 from 192.168.197.1[root@101 ~]#

没有跳出让人输入密码,说明密钥登录成功。

总结

其实ssh远程密钥登录的核心在于密钥对,不管在哪里登录只要能提供一组密钥对,并把这些密钥对方到该放到的位置,就可以实现密钥登陆。不管这对密钥对是在哪里产生的。