Ubuntu & CentOS 安装配置SSH完整教程
摘要:本文提供了一份面向生产环境的 Linux SSH 终极部署指南,深度兼容 CentOS 7/8/9 与 Ubuntu 20.04+ 系统。教程不仅清晰对比了双系统在 systemd 服务名、防火墙及 SELinux 配置上的核心差异,还规范了基于 ed25519 算法的密钥登录与安全加固流程。特别新增 Fail2Ban 自动防御配置,有效拦截 SSH 暴力破解。文末附带一键自动化初始化脚本,帮助运维人员快速实现 SSH 服务的标准化安装与全方位安全加固。本文提供了一份面向生产环境的 Linux SSH 终极部署指南,深度兼容 CentOS 7/8/9 与 Ubuntu 20.04+ 系统。教程不仅清晰对比了双系统在 systemd 服务名、防火墙及 SELinux 配置上的核心差异,还规范了基于 ed25519 算法的密钥登录与安全加固流程。特别新增 Fail2Ban 自动防御配置,有效拦截 SSH 暴力破解。文末附带一键自动化初始化脚本,帮助运维人员快速实现 SSH 服务的标准化安装与全方位安全加固。
前置说明与版本提醒
- 服务端组件 :CentOS 7+/Ubuntu 18.04+ 默认仅预装客户端,缺少的是服务端
openssh-server。 - 核心差异:两系统配置文件路径一致,但防火墙工具、systemd 服务名及包管理器命令存在显著区别。
- 安全铁律 :安全加固的执行顺序至关重要------必须先配置并测试密钥登录成功,最后再禁用密码登录,否则极易将自己锁在服务器之外。
- 版本提醒:CentOS 7 已于 2024 年 6 月 30 日停止维护(EOL),生产环境强烈建议迁移至 Rocky Linux、AlmaLinux 或 CentOS Stream。
一、CentOS 7/8/9 安装配置SSH
1. 安装 openssh 服务端
bash
# CentOS 7
yum install openssh-server -y
# CentOS 8/9/Rocky/AlmaLinux 等
dnf install openssh-server -y
2. 启动 & 开机自启
bash
systemctl start sshd
systemctl enable sshd
systemctl status sshd
提示 :也可用一条命令完成启动并设为开机自启:
systemctl enable --now sshd
3. firewalld 防火墙放行 22 端口
bash
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --reload
firewall-cmd --list-ports # 验证规则
4. SELinux 注意事项(CentOS 特有)
- 使用默认 22 端口无需任何操作。
- 若修改端口(如改为 2222),需安装必要工具并放行:
bash
# 安装 semanage 工具(注意区分系统版本)
yum install policycoreutils-python -y # CentOS 7
dnf install policycoreutils-python-utils -y # CentOS 8/9/RHEL 8+
# 放行新端口
semanage port -a -t ssh_port_t -p tcp 2222
5. 配置文件
路径:/etc/ssh/sshd_config。修改后需重载服务:systemctl restart sshd。
二、Ubuntu 20.04/22.04/24.04 安装配置SSH
1. 安装 openssh 服务端
bash
sudo apt update
sudo apt install openssh-server -y
2. 启动 & 开机自启
注意:Ubuntu 的服务名是 ssh,不是 sshd
bash
sudo systemctl start ssh
sudo systemctl enable ssh
sudo systemctl status ssh
# 一条命令启动+自启
sudo systemctl enable --now ssh
3. UFW 防火墙放行 22 端口
bash
sudo ufw enable # 若防火墙未启用
sudo ufw allow 22/tcp
sudo ufw status verbose # 验证规则
4. 配置文件
路径:/etc/ssh/sshd_config(与 CentOS 完全一致)。重载服务:sudo systemctl restart ssh。
三、SSH密钥登录与禁用密码详细步骤(通用)
以下步骤在 客户端 执行。
1. 生成密钥对(推荐 ed25519)
bash
# 使用更安全、更快的 ed25519 算法
ssh-keygen -t ed25519
预期交互过程:
bash
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/youruser/.ssh/id_ed25519): ← 直接回车
Enter passphrase (empty for no passphrase): ← 设密码或回车留空
Enter same passphrase again: ← 确认
生成的文件:
- 私钥(自己保留,严禁泄露):
~/.ssh/id_ed25519 - 公钥(上传服务器):
~/.ssh/id_ed25519.pub
兼容性说明 :极少数旧系统不支持 ed25519,此时可改用
ssh-keygen -t rsa -b 4096。
2. 将公钥上传到远程服务器
使用 ssh-copy-id 自动完成:
bash
# 格式:ssh-copy-id 用户名@服务器IP
ssh-copy-id admin@192.168.1.100
首次连接会提示确认指纹,输入 yes,然后输入远程用户的密码 。公钥将被自动追加到服务器的 ~/.ssh/authorized_keys 文件中。
3. 测试密钥登录
bash
ssh admin@192.168.1.100
若无需输入密码即进入服务器,则密钥配置成功。
排错提示 :若仍需密码,执行
ssh -v admin@192.168.1.100查看详细日志;检查服务器端~/.ssh目录权限为 700,authorized_keys为 600。
4. 禁用密码登录(服务器端操作)
务必确认上一步测试成功后再执行!
编辑服务器 /etc/ssh/sshd_config:
bash
sudo vi /etc/ssh/sshd_config
修改或添加以下两项(注意 Ubuntu 22.04+ 的新参数):
ini
PasswordAuthentication no
# Ubuntu 22.04+ (OpenSSH 8.7+) 使用新参数替代 ChallengeResponseAuthentication
KbdInteractiveAuthentication no
# 旧版 Ubuntu/CentOS 保留兼容
ChallengeResponseAuthentication no
保存后检查配置语法:
bash
# CentOS / Ubuntu 通用检查命令(需 root 权限)
sudo sshd -t
若无输出表示语法正确。然后重启服务(CentOS: systemctl restart sshd;Ubuntu: sudo systemctl restart ssh)。
保持当前窗口不要断开,另开新终端尝试密钥登录,确认正常后再关闭原会话。
四、修改 SSH 默认 22 端口(两系统通用)
- 编辑
/etc/ssh/sshd_config:
ini
Port 2222 # 自定义高端口(1024-65535)
# 建议先保留 Port 22 作为回退,测试成功后再删除
- 防火墙放行新端口:
bash
# CentOS
firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --reload
# 若使用 SELinux 且非默认端口
semanage port -a -t ssh_port_t -p tcp 2222
# Ubuntu
sudo ufw allow 2222/tcp
- 重启 SSH 服务,另开窗口用新端口测试连接:
ssh -p 2222 admin@服务器IP。 - 测试成功后,再移除配置中的
Port 22,并删除防火墙 22 端口规则。
五、安装配置 Fail2Ban 防暴力破解(通用)
Fail2Ban 通过监控系统日志,自动识别并封禁多次尝试登录失败的恶意 IP,是 SSH 安全的最后一道防线。
1. 安装 Fail2Ban
bash
# CentOS 7/8/9 (需要先安装 EPEL 源)
yum install epel-release -y # CentOS 7
dnf install epel-release -y # CentOS 8/9
yum install fail2ban -y # 或 dnf install fail2ban -y
# Ubuntu 20.04+
sudo apt install fail2ban -y
2. 创建并编辑本地配置文件
注意 :永远不要直接修改 jail.conf,应创建 jail.local 以避免系统升级时被覆盖。
bash
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vi /etc/fail2ban/jail.local
3. 配置 SSH 防护规则
在 jail.local 中找到 [sshd] 段落,修改或添加以下参数:
ini
[sshd]
enabled = true
# 如果修改了 SSH 端口,此处需改为新端口(如 port = 2222)
port = ssh
filter = sshd
# CentOS 日志路径为 /var/log/secure,Ubuntu 为 /var/log/auth.log
logpath = /var/log/secure
maxretry = 3 # 10分钟内允许失败3次
findtime = 600 # 检测时间窗口(秒,即10分钟)
bantime = 3600 # 封禁时长(秒,即1小时。生产环境可设为 86400 即24小时)
注意 :CentOS 的 SSH 日志路径是
/var/log/secure,Ubuntu 是/var/log/auth.log,请务必根据系统修改logpath。
4. 启动并验证 Fail2Ban
bash
# 启动并设置开机自启
sudo systemctl enable --now fail2ban
# 查看 Fail2Ban 运行状态及已封禁的 IP
sudo fail2ban-client status sshd
# 查看 Fail2Ban 实时日志
sudo tail -f /var/log/fail2ban.log
如果看到 Banned IP list 下有 IP 地址,说明防护已生效。若需手动解封误封的 IP,可使用:sudo fail2ban-client set sshd unbanip <IP地址>。
六、CentOS vs Ubuntu 核心区别速查
| 操作项 | CentOS 7/8/9 | Ubuntu 20.04+ |
|---|---|---|
| systemd 服务名 | sshd |
ssh |
| 启动命令 | systemctl start sshd |
sudo systemctl start ssh |
| 开机自启 | systemctl enable sshd |
sudo systemctl enable ssh |
| 防火墙 | firewalld | ufw |
| 放行 22 端口 | firewall-cmd --add-port=22/tcp |
sudo ufw allow 22/tcp |
| SELinux | 开启,改端口需 semanage | 无 |
| 默认 root 登录 | 允许 | 禁止 |
| 软件安装 | yum/dnf install |
sudo apt install |
| 配置文件路径 | /etc/ssh/sshd_config |
/etc/ssh/sshd_config(一致) |
| SSH 日志路径 | /var/log/secure |
/var/log/auth.log |
七、常见排错命令(双系统通用)
bash
# 查看 ssh 监听端口
ss -tuln | grep ssh
# 测试配置文件是否正确(至关重要)
sudo sshd -t
# 查看登录日志
tail -f /var/log/secure # CentOS
tail -f /var/log/auth.log # Ubuntu
# 客户端详细调试
ssh -v admin@IP
# 查看 Fail2Ban 封禁状态
sudo fail2ban-client status sshd
八、一键初始化脚本(自动判断系统 + 基础加固)
将以下脚本保存为 ssh-setup.sh,赋予执行权限后以 root 身份运行(Ubuntu 用 sudo bash ssh-setup.sh)。脚本会自动安装服务、放行防火墙,并交互询问是否执行安全加固。
bash
#!/bin/bash
# SSH 一键安装与基础加固脚本(适用于 CentOS 7/8/9 和 Ubuntu 20.04+)
# 运行方式:sudo bash ssh-setup.sh
set -e
# 前置检查:确保以 root 权限运行
if [[ $EUID -ne 0 ]]; then
echo "此脚本需要 root 权限运行,请使用 sudo bash ssh-setup.sh"
exit 1
fi
# 检测操作系统
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$ID
else
echo "无法识别操作系统,退出。"
exit 1
fi
echo "检测到系统:$OS"
# 安装 openssh-server
install_ssh() {
if [[ "$OS" == "centos" || "$OS" == "rhel" || "$OS" == "rocky" || "$OS" == "almalinux" ]]; then
if command -v dnf &> /dev/null; then
dnf install -y openssh-server
else
yum install -y openssh-server
fi
elif [[ "$OS" == "ubuntu" || "$OS" == "debian" ]]; then
apt update
apt install -y openssh-server
else
echo "不支持的系统: $OS"
exit 1
fi
}
# 启动并设置开机自启
start_service() {
if [[ "$OS" == "centos" || "$OS" == "rhel" || "$OS" == "rocky" || "$OS" == "almalinux" ]]; then
systemctl enable --now sshd
echo "sshd 服务已启动并设为开机自启。"
elif [[ "$OS" == "ubuntu" || "$OS" == "debian" ]]; then
systemctl enable --now ssh
echo "ssh 服务已启动并设为开机自启。"
fi
}
# 配置防火墙放行 22 端口
config_firewall() {
if [[ "$OS" == "centos" || "$OS" == "rhel" || "$OS" == "rocky" || "$OS" == "almalinux" ]]; then
if systemctl is-active --quiet firewalld; then
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --reload
echo "firewalld 已放行 22/tcp"
else
echo "firewalld 未运行,跳过防火墙配置。"
fi
elif [[ "$OS" == "ubuntu" || "$OS" == "debian" ]]; then
if command -v ufw > /dev/null; then
ufw allow 22/tcp
echo "ufw 已放行 22/tcp"
else
echo "ufw 未安装,跳过防火墙配置。"
fi
fi
}
# 基础安全加固(需用户确认)
apply_hardening() {
echo ""
echo ">>> 基础安全加固选项 <<<"
echo "以下操作将:"
echo " 1. 禁止 root 直接通过 SSH 登录"
echo " 2. 禁止密码登录(仅允许密钥)"
echo " 3. 设置客户端空闲 5 分钟后自动断开"
echo "重要:请确保你已创建了普通用户,并将公钥上传至该用户的 authorized_keys。"
read -p "是否现在应用这些加固?(y/N): " confirm
if [[ "$confirm" != "y" && "$confirm" != "Y" ]]; then
echo "已跳过安全加固。"
return
fi
SSHD_CONFIG="/etc/ssh/sshd_config"
cp "$SSHD_CONFIG" "${SSHD_CONFIG}.bak.$(date +%s)"
echo "已备份原配置。"
# 修改配置
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin no/' "$SSHD_CONFIG"
sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' "$SSHD_CONFIG"
sed -i 's/^#\?ChallengeResponseAuthentication.*/ChallengeResponseAuthentication no/' "$SSHD_CONFIG"
# 兼容 Ubuntu 22.04+ 新参数
sed -i 's/^#\?KbdInteractiveAuthentication.*/KbdInteractiveAuthentication no/' "$SSHD_CONFIG"
# 空闲超时
grep -q "^ClientAliveInterval" "$SSHD_CONFIG" && \
sed -i 's/^ClientAliveInterval.*/ClientAliveInterval 300/' "$SSHD_CONFIG" || \
echo "ClientAliveInterval 300" >> "$SSHD_CONFIG"
grep -q "^ClientAliveCountMax" "$SSHD_CONFIG" && \
sed -i 's/^ClientAliveCountMax.*/ClientAliveCountMax 2/' "$SSHD_CONFIG" || \
echo "ClientAliveCountMax 2" >> "$SSHD_CONFIG"
# 检查语法并重启服务
sshd -t
if [[ "$OS" == "centos" || "$OS" == "rhel" || "$OS" == "rocky" || "$OS" == "almalinux" ]]; then
systemctl restart sshd
else
systemctl restart ssh
fi
echo "安全加固已应用,服务已重启。"
echo "请保持当前窗口不要断开,新开终端验证密钥登录是否正常。"
}
# 主流程
install_ssh
start_service
config_firewall
apply_hardening
echo ""
echo " SSH 初始化完成。"
使用方法:
bash
sudo bash ssh-setup.sh
脚本会自动识别 CentOS/Ubuntu 并完成安装与防火墙配置,最后询问是否加固,回答 y 即可一键安全加固。