安装、配置和启动 ssh 服务,实现远程连接服务器
演示环境
- 本地计算机系统:Windows 11
- 远程服务器系统:Ubuntu 22.04
什么是 SSH
-
SSH(Secure Shell)是一种加密的网络协议,主要用于安全地远程登录和管理服务器或其他网络设备。
-
它通过加密通信通道保护数据传输,防止中间人攻击和数据泄露,是替代不安全的 Telnet、FTP 等协议的常用方案。
工具说明
-
服务器端(被连接端,例如本例中的 Ubuntu):需要安装并运行 SSH 服务(如 OpenSSH Server)
-
客户端(连接端,例如本例中的 Windows):只需安装 SSH 客户端工具即可(如 FinalShell 等)
-
由于 Win10 及以上版本内置 OpenSSH 客户端,所以,你可以选择下载 FinalShell 等 OpenSSH 客户端工具与服务器连接;也可以直接使用 Windows 内置的 OpenSSH 客户端工具与服务器连接(在 PowerShell 窗口执行 ssh 命令)
安装与启动 ssh
接下来,我们将在 Ubuntu 22.04 上安装 SSH 服务。本例中采用的是 OpenSSH
- 首先,我们先更新软件包,确保是最新状态:
sudo apt update
- 接着,我们安装 SSH 服务器:
sudo apt install openssh-server
- 安装完成后,SSH 服务器会自动启动,我们使用以下命令可以检查它的启动状态:
sudo systemctl status ssh
- 如果 SSH 服务器没有启动,我们就启动它:
sudo systemctl start ssh
- 现在,我们再来看看 SSH 服务器是否成功启动:
sudo systemctl status ssh
- 在启动 SSH 服务器后,我们要确保系统重启了,SSH 服务也能自动启动:
sudo systemctl enable ssh
配置 SSH 服务器
如果你想让连接更安全,你可能需要进行以下配置,当然它是可选的,你不操作也没关系
- 在修改配置文件前,最好先备份它:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
- 接着,我们通过 Vim 工具,去编辑这个配置文件:
sudo vim /etc/ssh/sshd_config
填写下面内容,或者删除 “#” 这个注释符号,就是在编写配置了
- 修改默认端口
Port 6660 # 自定义端口,避免暴力破解
- 多端口监听
Port 22 # 保留默认端口(谨慎!)
Port 6660 # 新增端口
Port 6670 # 新增端口
- 禁止 root 直接登录(强烈推荐!)
PermitRootLogin no # 改为 no,强制用普通用户登录后 sudo
- 禁止通过密码认证(需要配合"密钥认证"一起使用)
PasswordAuthentication no # 注意!请先确保密钥认证可用,再关闭此项,不然可能无法连接服务器!
- 启用公钥认证(默认已开启)
PubkeyAuthentication yes
- 指定公钥文件路径(默认即可,如需自定义可以修改)
AuthorizedKeysFile .ssh/authorized_keys # 支持多路径,如 .ssh/keys/*.pub
- 限制登录失败尝试次数(推荐,可以防止暴力破解)
MaxAuthTries 3 # 失败三次后断开连接
- 限制空闲超时(防止会话劫持)
ClientAliveInterval 600 # 每 600 秒(10 分钟)检测客户端存活
ClientAliveCountMax 3 # 三次无响应后断开
- 添加白名单,允许特定用户登录(多个用户请用空格进行分隔)
AllowUsers user1 user2 # 仅 user1、user2 可登录
- 允许特定 IP 段访问(比如,仅允许 192.168.1.0/24 网段)
AllowGroups ssh-users
# 配合用户组(需先创建组并添加用户)
# 或直接指定 IP(需安装 ufw 并配置,见防火墙部分)
- 禁用空密码(默认已禁用)
PermitEmptyPasswords no
12.禁止密码和密钥混用(可选,强制密钥认证)
AuthenticationMethods publickey # 仅允许密钥认证
让配置生效
如果你没有进行配置,可以跳到下一步
- 在你配置完成后,你需要重新启动 SSH 服务器
sudo systemctl restart sshd
- 如果你修改了端口,还需要同步防火墙,详情见"配置防火墙"
配置防火墙
不论你是否进行了 SSH 服务器的配置,我都建议你看看你的防火墙,进行防火墙的配置;在 Ubuntu 中,防火墙通常是 ufw,即:Uncomplicated Firewall,简单防火墙
-
防火墙能够阻挡连接,如果 SSH 被阻挡了,我们就无法连接,因此我们要告诉防火墙,让 SSH 通过。
-
对于没有进行 SSH 配置的,请执行:
sudo ufw allow ssh# 等价于:sudo ufw allow 22/tcp
- 而对于修改过 SSH “端口” 的配置(比如修改端口为6660),需要执行:
sudo ufw allow 6660/tcp
- 如果想验证规则是否生效,可以执行:
sudo ufw status numbered# 显示带编号的规则列表(IPv4 和 IPv6 分开)
- 如果你想删除某些防火墙规则,比如,22端口,你可以:
sudo ufw delete allow 22/tcp
- 当然,按编号删除规则,是最精准的,推荐这种方法:
sudo ufw delete 1 # 删除编号 1 的规则
- 批量删除规则(如编号 1 和 2),执行:
sudo ufw delete 1 2 # 空格分隔多个编号
- 允许 SSH 通过防火墙后,请查看系统上的防火墙是否已启用:
sudo ufw status
- 如果防火墙尚未启用,您会看到输出 Status: inactive,表明防火墙当前处于禁用状态;这时,请你启用防火墙(注意!这将会与服务器断开连接,请一定要确保你的 SSH 连接可用)
sudo ufw enable
- 其他防火墙配置,可以自行选择
- 允许局域网 IP 访问(示例:192.168.1.0/24 网段)
sudo ufw allow from 192.168.1.0/24 to any port 22 # 默认端口
# 或自定义端口:
sudo ufw allow from 192.168.1.0/24 to any port 6660/tcp
- 限制单 IP 访问(如办公电脑 IP)
sudo ufw allow from 192.168.1.100 to any port 6660/tcp
- 组合规则(允许 IP 且限速防暴力破解)
sudo ufw limit from 192.168.1.0/24 to any port 5090/tcp
# "limit" 会自动添加速率限制(默认每分钟 60 次)
- 封禁单个 IP 地址(如,192.168.1.101)
sudo ufw deny from 192.168.1.101
- 封禁 IP 地址段(如 192.168.1.0/24)
sudo ufw deny from 192.168.1.0/24
直接连接
- 对于没有进行 SSH 服务器配置的朋友,可以打开 PowerShell 命令窗口,输入
ssh xiaoming@192.168.25.26
# 上面的信息要换成你自己的,格式如下:
# ssh 以什么身份登录服务器@服务器IP地址
-
然后输入密码即可
-
或者你也可以使用其他的 SSH 客户端工具,比如 Finalshell、PuTTY等,网上教程很多,这里就不作过多介绍了。
密钥连接
-
对于已经更改 SSH 服务器端口(比如改为了6660端口),同时又禁用了密码登录改为密钥连接的,可以参考下面教程。
-
通过 PowerShell 内置的 SSH 客户端生成密钥
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_4096 -N ""
- 获取密钥内容,通过 PowerShell 执行命令后(注意不是cmd),复制其输出的内容
cat ~/.ssh/id_rsa_4096.pub
-
将复制的内容,上传到服务器的 “你要登录的用户的主目录下的 .ssh/authorized_keys文件中”(如果你修改了默认路径,就设置为你的路径)
-
检查该用户主目录下是否存在 .ssh 目录,若不存在则创建
mkdir -p ~/.ssh
- 创建 authorized_keys 文件
vim authorized_keys
-
把复制的内容,放进去即可(自己想办法)
-
为保证安全性,需设置 .ssh 目录的权限为 700,设置 authorized_keys 文件的权限为 600
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
- 打开 PowerShell 命令窗口,连接到 SSH 6660端口(注意:-i 参数接收的是id_rsa_4096私钥,而不是公钥)
ssh -i "~\.ssh\id_rsa_4096" -p 6660 xiaoming@192.168.24.25# ssg -i "本地私钥文件的地址" -p 端口号 服务器用户名@服务器地址
- 使用类似 FinalShell 等 SSH 客户端工具,原理也是和用 PowerShell 内置的 SSH 客户端工具差不多,这里就不赘述了。
连接失败
- 如果你是修改了端口,又连接失败,可以看看这篇文章:https://blog.csdn.net/code_stream/article/details/142560124