Ubuntu & CentOS 安装配置SSH完整教程

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 端口(两系统通用)

  1. 编辑 /etc/ssh/sshd_config
ini 复制代码
Port 2222      # 自定义高端口(1024-65535)
# 建议先保留 Port 22 作为回退,测试成功后再删除
  1. 防火墙放行新端口:
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
  1. 重启 SSH 服务,另开窗口用新端口测试连接:ssh -p 2222 admin@服务器IP
  2. 测试成功后,再移除配置中的 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 即可一键安全加固。