🔐 保护 SSH 连接

通过更改端口和配置其他安全选项以防止暴力破解攻击来保护 SSH 连接的完整指南。

🔐 保护 SSH 连接以防止暴力破解攻击

默认的 SSH 端口 (22) 经常成为自动化暴力破解攻击的目标。本指南将教您如何更改 SSH 端口并配置其他安全选项以保护您的服务器。

📋 先决条件

  • 具有 root 或 sudo 访问权限的 VPS 服务器
  • 活动的 SSH 连接
  • 已安装并配置 UFW(请参阅教程 安装 UFW

⚠️ 重要:保持 SSH 会话打开

并行打开 两个 SSH 终端

  • 终端 1:工作会话(用于进行修改)
  • 终端 2:备份会话(以防万一)

🔧 更改 SSH 端口

步骤 1:选择新端口

选择一个介于 1024 和 65535 之间的端口。要避免的常用端口:

  • 22(默认 SSH 端口,经常被攻击)
  • 80, 443 (HTTP/HTTPS)
  • 3306, 5432 (数据库)

安全端口示例:2222, 2200, 1022, 5000

步骤 2:修改 SSH 配置

# 编辑 SSH 配置文件 sudo nano /etc/ssh/sshd_config

步骤 3:更改端口

找到 #Port 22 行并修改:

# 之前
#Port 22

# 之后(将 2222 替换为您选择的端口)
Port 2222

提示: 在 nano 中使用 Ctrl + W 搜索 "Port 22"

步骤 4:保存并退出

在 nano 中:

  • Ctrl + X 退出
  • Y 确认
  • Enter 保存

步骤 5:验证语法

# 验证配置是否有效 sudo sshd -t

如果此命令不返回任何错误,则您的配置是正确的。

步骤 6:在 UFW 中允许新端口

# 允许新的 SSH 端口(将 2222 替换为您的端口) sudo ufw allow 2222/tcp # 可选:如果不再使用旧端口 22,则删除它 sudo ufw delete allow 22/tcp # 重新加载 UFW sudo ufw reload # 验证规则是否激活 sudo ufw status | grep 2222

步骤 7:重启 SSH 服务

# 使用新配置重启 SSH sudo systemctl restart sshd # 验证 SSH 是否仍在工作 sudo systemctl status sshd

步骤 8:测试新连接

新终端 中,使用新端口测试连接:

# 将 2222 替换为您的端口,将 user@your-ip 替换为您的凭据 ssh -p 2222 user@your-ip

如果连接有效,您可以关闭端口 22 上的旧会话。

🔒 其他安全选项

禁用 root 登录

# 编辑 SSH 配置 sudo nano /etc/ssh/sshd_config # 找到并修改此行 PermitRootLogin no # 保存并重启 sudo sshd -t sudo systemctl restart sshd

限制连接尝试

sudo nano /etc/ssh/sshd_config # 添加或修改这些行 MaxAuthTries 3 # 最多 3 次连接尝试 LoginGraceTime 30 # 30 秒连接超时

禁用密码身份验证(仅使用 SSH 密钥)

sudo nano /etc/ssh/sshd_config # 修改此行 PasswordAuthentication no PubkeyAuthentication yes

仅使用 SSH 协议版本 2

sudo nano /etc/ssh/sshd_config # 添加此行(如果不存在) Protocol 2

禁用 X11 隧道(如果您不需要)

sudo nano /etc/ssh/sshd_config # 修改此行 X11Forwarding no

推荐的完整配置

以下是在 /etc/ssh/sshd_config 中添加的完整安全 SSH 配置:

# 自定义 SSH 端口
Port 2222

# 禁用 root 登录
PermitRootLogin no

# 连接限制
MaxAuthTries 3
LoginGraceTime 30

# 禁用密码身份验证(如果您使用 SSH 密钥)
# PasswordAuthentication no
# PubkeyAuthentication yes

# 仅 SSH 协议版本 2
Protocol 2

# 禁用 X11 转发
X11Forwarding no

# 禁用 TCP 隧道
AllowTcpForwarding no

# 断开连接前的非活动超时
ClientAliveInterval 300
ClientAliveCountMax 2

每次修改后,不要忘记:

# 验证语法 sudo sshd -t # 重启 SSH sudo systemctl restart sshd

🔄 创建具有 sudo 的用户(如果需要)

如果您已禁用 root 登录,请确保您有一个具有 sudo 权限的用户:

# 创建新用户 sudo adduser myuser # 将用户添加到 sudo 组 sudo usermod -aG sudo myuser # 测试用户是否可以使用 sudo su - myuser sudo whoami # 应该显示 "root"

✅ 最终验证

验证 SSH 是否工作

# 检查服务状态 sudo systemctl status sshd # 验证 SSH 是否在正确的端口上监听 sudo netstat -tlnp | grep ssh # 或 sudo ss -tlnp | grep ssh # 验证配置 sudo sshd -T | grep port

验证 SSH 日志

# 查看连接尝试 sudo tail -f /var/log/auth.log # 查看成功连接 sudo grep "Accepted" /var/log/auth.log # 查看失败尝试 sudo grep "Failed" /var/log/auth.log

🛡️ 使用 fail2ban 提供额外保护

fail2ban 是一个自动阻止尝试暴力破解攻击的 IP 的工具。

安装 fail2ban

sudo apt update sudo apt install fail2ban -y

基本配置

# 复制配置文件 sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # 编辑配置 sudo nano /etc/fail2ban/jail.local

SSH 的推荐配置:

[sshd] enabled = true port = 2222 # 您的新 SSH 端口 maxretry = 3 # 封禁前的尝试次数 bantime = 3600 # 封禁时间(秒)(1 小时) findtime = 600 # 计算尝试的时间窗口(10 分钟)

启用 fail2ban

# 启动 fail2ban sudo systemctl start fail2ban # 开机自启 sudo systemctl enable fail2ban # 检查状态 sudo systemctl status fail2ban # 查看被封禁的 IP sudo fail2ban-client status sshd

🆘 故障排除

无法再通过 SSH 连接

如果您被锁定在服务器之外:

  1. 使用您的备份会话(您保持打开的终端 2)

  2. 如果您没有备份会话

    • 使用您的凭据联系 Infrawire 支持
    • 从控制面板使用 VNC/KVM 控制台
    • 直接连接并恢复旧配置:
      sudo nano /etc/ssh/sshd_config # 将 Port 22 放回 sudo systemctl restart sshd

SSH 端口无响应

# 验证 SSH 是否在端口上监听 sudo netstat -tlnp | grep ssh # 验证端口是否在 UFW 中打开 sudo ufw status | grep 2222 # 检查 SSH 日志 sudo journalctl -u sshd -n 50

需要临时使用旧端口连接

如果您需要在删除旧端口 (22) 之前连接到它:

# 临时允许端口 22 sudo ufw allow 22/tcp # 连接 ssh -p 22 user@your-ip # 连接后,删除规则 sudo ufw delete allow 22/tcp

📚 其他资源

❓ 常见问题

问:我应该为 SSH 选择什么端口?
答:选择一个介于 1024 和 65535 之间的端口。避免常用端口(80, 443, 3306 等)。端口如 2222, 2200 或 1022 是不错的选择。

问:我可以为多个服务使用同一个端口吗?
答:不可以,每个服务必须有自己的唯一端口。

问:我真的需要更改 SSH 端口吗?
答:强烈推荐。这大大减少了自动化暴力破解攻击。

问:如果我更改了端口,fail2ban 是否必要?
答:不是,但这是一个推荐的额外安全层。

问:如何从 SSH 客户端使用新端口连接?
答:使用 -p 选项:ssh -p 2222 user@your-ip


安全配置顺利!🚀