保护 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 配置
Bash# 编辑 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:验证语法
Bash# 验证配置是否有效 sudo sshd -t
如果此命令不返回任何错误,则您的配置是正确的。
步骤 6:在 UFW 中允许新端口
Bash1# 允许新的 SSH 端口(将 2222 替换为您的端口) 2sudo ufw allow 2222/tcp 3 4# 可选:如果不再使用旧端口 22,则删除它 5sudo ufw delete allow 22/tcp 6 7# 重新加载 UFW 8sudo ufw reload 9 10# 验证规则是否激活 11sudo ufw status | grep 2222
步骤 7:重启 SSH 服务
Bash1# 使用新配置重启 SSH 2sudo systemctl restart sshd 3 4# 验证 SSH 是否仍在工作 5sudo systemctl status sshd
步骤 8:测试新连接
在 新终端 中,使用新端口测试连接:
Bash# 将 2222 替换为您的端口,将 user@your-ip 替换为您的凭据 ssh -p 2222 user@your-ip
如果连接有效,您可以关闭端口 22 上的旧会话。
🔒 其他安全选项
禁用 root 登录
Bash1# 编辑 SSH 配置 2sudo nano /etc/ssh/sshd_config 3 4# 找到并修改此行 5PermitRootLogin no 6 7# 保存并重启 8sudo sshd -t 9sudo systemctl restart sshd
限制连接尝试
Bash1sudo nano /etc/ssh/sshd_config 2 3# 添加或修改这些行 4MaxAuthTries 3 # 最多 3 次连接尝试 5LoginGraceTime 30 # 30 秒连接超时
禁用密码身份验证(仅使用 SSH 密钥)
Bash1sudo nano /etc/ssh/sshd_config 2 3# 修改此行 4PasswordAuthentication no 5PubkeyAuthentication yes
仅使用 SSH 协议版本 2
Bashsudo nano /etc/ssh/sshd_config # 添加此行(如果不存在) Protocol 2
禁用 X11 隧道(如果您不需要)
Bashsudo 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
每次修改后,不要忘记:
Bash1# 验证语法 2sudo sshd -t 3 4# 重启 SSH 5sudo systemctl restart sshd
🔄 创建具有 sudo 的用户(如果需要)
如果您已禁用 root 登录,请确保您有一个具有 sudo 权限的用户:
Bash1# 创建新用户 2sudo adduser myuser 3 4# 将用户添加到 sudo 组 5sudo usermod -aG sudo myuser 6 7# 测试用户是否可以使用 sudo 8su - myuser 9sudo whoami 10# 应该显示 "root"
✅ 最终验证
验证 SSH 是否工作
Bash1# 检查服务状态 2sudo systemctl status sshd 3 4# 验证 SSH 是否在正确的端口上监听 5sudo netstat -tlnp | grep ssh 6# 或 7sudo ss -tlnp | grep ssh 8 9# 验证配置 10sudo sshd -T | grep port
验证 SSH 日志
Bash1# 查看连接尝试 2sudo tail -f /var/log/auth.log 3 4# 查看成功连接 5sudo grep "Accepted" /var/log/auth.log 6 7# 查看失败尝试 8sudo grep "Failed" /var/log/auth.log
🛡️ 使用 fail2ban 提供额外保护
fail2ban 是一个自动阻止尝试暴力破解攻击的 IP 的工具。
安装 fail2ban
Bashsudo apt update sudo apt install fail2ban -y
基本配置
Bash1# 复制配置文件 2sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local 3 4# 编辑配置 5sudo nano /etc/fail2ban/jail.local
SSH 的推荐配置:
INI1[sshd] 2enabled = true 3port = 2222 # 您的新 SSH 端口 4maxretry = 3 # 封禁前的尝试次数 5bantime = 3600 # 封禁时间(秒)(1 小时) 6findtime = 600 # 计算尝试的时间窗口(10 分钟)
启用 fail2ban
Bash1# 启动 fail2ban 2sudo systemctl start fail2ban 3 4# 开机自启 5sudo systemctl enable fail2ban 6 7# 检查状态 8sudo systemctl status fail2ban 9 10# 查看被封禁的 IP 11sudo fail2ban-client status sshd
🆘 故障排除
无法再通过 SSH 连接
如果您被锁定在服务器之外:
-
使用您的备份会话(您保持打开的终端 2)
-
如果您没有备份会话:
- 使用您的凭据联系 Infrawire 支持
- 从控制面板使用 VNC/KVM 控制台
- 直接连接并恢复旧配置:
Bash
sudo nano /etc/ssh/sshd_config # 将 Port 22 放回 sudo systemctl restart sshd
SSH 端口无响应
Bash1# 验证 SSH 是否在端口上监听 2sudo netstat -tlnp | grep ssh 3 4# 验证端口是否在 UFW 中打开 5sudo ufw status | grep 2222 6 7# 检查 SSH 日志 8sudo journalctl -u sshd -n 50
需要临时使用旧端口连接
如果您需要在删除旧端口 (22) 之前连接到它:
Bash1# 临时允许端口 22 2sudo ufw allow 22/tcp 3 4# 连接 5ssh -p 22 user@your-ip 6 7# 连接后,删除规则 8sudo ufw delete allow 22/tcp
📚 其他资源
❓ 常见问题
问:我应该为 SSH 选择什么端口?
答:选择一个介于 1024 和 65535 之间的端口。避免常用端口(80, 443, 3306 等)。端口如 2222, 2200 或 1022 是不错的选择。
问:我可以为多个服务使用同一个端口吗?
答:不可以,每个服务必须有自己的唯一端口。
问:我真的需要更改 SSH 端口吗?
答:强烈推荐。这大大减少了自动化暴力破解攻击。
问:如果我更改了端口,fail2ban 是否必要?
答:不是,但这是一个推荐的额外安全层。
问:如何从 SSH 客户端使用新端口连接?
答:使用 -p 选项:ssh -p 2222 user@your-ip
安全配置顺利!🚀