🔐 保护 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 连接
如果您被锁定在服务器之外:
-
使用您的备份会话(您保持打开的终端 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
安全配置顺利!🚀