netcup VPS 生产级基础安全加固完全指南(Debian 12避坑/SSH密钥/Docker绕过UFW隐患)

要点速记
  • SSH端口坑:Debian 12 采用 ssh.socket 监听机制,改端口需确保新旧服务生效且不可在验证前退出当前窗口
  • 密钥推荐:弃用老旧 RSA 密钥,强制采用基于椭圆曲线的高安全算法 ed25519
  • Docker安全陷阱:Docker 默认直接操作 iptables PREROUTING 链,会完全绕过 UFW 将端口暴露给公网
  • fail2ban适配:Debian 12 默认无 /var/log/auth.log,必须在 jail.local 中指定 backend = systemd
  • 救命保底:SCP 面板的 Screen(VNC)是公网端口封死后的物理级控制台,可直接登录修复配置
本页目录15 节

任何一台刚开通并拥有公网 IP 的 Linux 服务器,通常在开机 15 分钟内就会遭遇全球僵尸网络的自动化端口扫描与暴力破解。

默认的 22 端口每天会承受成千上万次以 root、admin、test 为用户名的密码撞库攻击。如果继续保留服务商下发的初始密码或者放任弱口令“裸奔”,机器沦为黑客挖矿肉鸡或发垃圾邮件跳板只是时间问题。

本文为你详解一套经过生产环境验证的系统级安全加固全流程,并重点指出 Debian 12 现代系统特有的配置陷阱与 Docker 绕过防火墙的严重漏洞。


零、操作前铁律:如何防范“把自己锁在门外”?#

在修改任何 SSH 配置与防火墙规则时,请务必执行以下纪律:

  1. 绝对不要关闭当前的活动终端窗口!在配置完成并通过另一个全新终端窗口成功连入新端口前,当前窗口是你唯一的救命通道;
  2. 确认掌握应急救援路径:如果真的不小心把 SSH 配置写错被断联,立刻登录 netcup 的 SCP 面板,点击 Screen(HTML5 VNC 控制台),直接进入物理级终端回滚错误配置。

一、升级系统并创建普通提权用户#

以官方下发的初始 root 密码登录后,首先更新系统并创建专门的运维普通用户:

# 1. 更新软件包源并升级到最新补丁
apt update && apt upgrade -y

# 2. 安装 sudo 与常用运维依赖包
apt install -y sudo curl wget ufw fail2ban

# 3. 创建普通用户(例如 deploy),并加入 sudo 提权组
adduser deploy
usermod -aG sudo deploy

# 4. 验证新用户是否拥有免密/密码 sudo 权限
su - deploy
sudo whoami   # 必须成功输出 root
exit

二、部署 ed25519 现代 SSH 密钥(弃用老旧密码认证)#

弃用容易被破解的老旧 RSA 2048 密钥,全面转向基于椭圆曲线的高强度、小体积的 ed25519 算法。

1. 在你本地电脑(Mac / Windows PowerShell)生成密钥对#

# 生成高安全密钥对(提示输入密码短语请妥善保管)
ssh-keygen -t ed25519 -C "[email protected]"

此时本地会生成两个文件:id_ed25519(私钥,严禁泄露给任何人)和 id_ed25519.pub(公钥)。

2. 将公钥一键注入服务器普通用户#

# 在你本地终端执行(自动将公钥写入服务器 ~/.ssh/authorized_keys)
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@你的服务器IP

三、加固 SSH 服务并修改端口(Debian 12 避坑实操)#

在 Debian 12 系统中,SSH 服务默认引入了 systemd 的 ssh.socket 监听机制。直接修改传统的 /etc/ssh/sshd_config 有时可能发生端口未完全生效的情况。

标准且优雅的加固姿势:#

在 /etc/ssh/sshd_config.d/ 目录下创建独立的自定义覆盖配置文件:

cat << 'EOF' > /etc/ssh/sshd_config.d/99-security.conf
# 1. 修改默认端口(避免脚本小子全网扫描 22 端口,建议选用 10000~65535 之间的高位端口)
Port 22222

# 2. 禁用 root 用户通过公网直接登录
PermitRootLogin no

# 3. 强制关闭密码认证(杜绝任何暴力穷举)
PasswordAuthentication no

# 4. 仅允许公钥认证
PubkeyAuthentication yes

# 5. 空闲连接超时保活设置(10分钟无响应自动断开)
ClientAliveInterval 300
ClientAliveCountMax 2

# 6. 仅允许指定的普通用户登录
AllowUsers deploy
EOF

重新加载 SSH 服务:#

# 重启 SSH 服务与对应套接字
systemctl daemon-reload
systemctl restart ssh

# 检查当前监听端口(确认新端口 22222 已处于 LISTEN 状态)
ss -tulpn | grep ssh

验证检查点:
在本地电脑打开一个全新的终端窗口,运行:
ssh -p 22222 deploy@你的服务器IP
确认无需密码即可凭借本地私钥秒级登录成功后,方可进行下一步!


四、配置 UFW 防火墙与警惕“Docker 绕过 UFW”常见坑点#

1. 基础防火墙策略配置#

# 默认拒绝所有未经允许的入站流量
ufw default deny incoming
# 默认允许所有出站流量
ufw default allow outgoing

# 放行你的自定义 SSH 端口(关键步骤,切勿遗漏)
ufw allow 22222/tcp comment 'Custom SSH Port'

# 放行常规 Web 服务端口
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'

# 开启防火墙并设为开机自启
ufw enable

# 查看当前已生效的防火墙规则
ufw status verbose

2. 警惕常见坑点:Docker 默认绕过 UFW 防火墙!#

这是让不少运维人员踩坑的常见网络问题:

当你在 Linux 上安装 Docker 后,Docker 引擎默认会自动修改底层内核的 iptables 规则(创建 DOCKER 链)。
由于其规则链处于网络数据包处理的最顶端(PREROUTING),它会无视 UFW 的屏蔽规则,直接将容器端口向公网开放。

你以为你在 UFW 里封死了 3306 端口,外部连不上;但在你的 docker-compose.yml 里写了:

  ports:
    - "3306:3306"   # 错误:这会默认监听在 0.0.0.0:3306 暴露给公网
  

扫描器可以直接扫描你服务器的 3306 端口,越过 UFW 直连你的 MySQL 数据库。

正确的安全绑定规范:

所有内部数据库、Redis、私有管理端(如 Portainer),在 Docker 端口映射时必须显式绑定到本机环回地址 127.0.0.1:

ports:
  - "127.0.0.1:3306:3306"   # 安全:仅允许宿主机内部应用访问,公网无法直连

只有面向公共访客的 Nginx/Caddy(80 和 443 端口),才允许直接公开映射。


五、部署 Fail2ban 防御暴力试探(Debian 12 适配)#

在 Debian 12 默认最小化安装中,系统不再默认将认证日志写入传统的 /var/log/auth.log,而是完全由 systemd-journald 接管。

如果直接使用默认配置启动 fail2ban,它会因为找不到日志文件而启动失败。

修复并配置 fail2ban:#

cat << 'EOF' > /etc/fail2ban/jail.local
[DEFAULT]
# 封禁时长 1 小时
bantime = 3600
# 统计时间窗口 10 分钟
findtime = 600
# 允许失败尝试次数(超过直接封禁 IP)
maxretry = 3
# 关键适配:指定从 systemd 日志读取
backend = systemd

[sshd]
enabled = true
port = 22222
EOF

# 重启并激活服务
systemctl restart fail2ban
systemctl enable fail2ban

# 查看当前针对 SSH 的封禁状态与封禁 IP 列表
fail2ban-client status sshd

六、开启无人值守自动安全补丁(Unattended-Upgrades)#

对于长期运行的自用生产服务器,开启自动化安全更新能确保当 OpenSSL 或 Linux 内核曝出零日漏洞时,系统在第一时间自动拉取官方安全补丁:

apt install -y unattended-upgrades
# 激活自动更新配置
dpkg-reconfigure -plow unattended-upgrades   # 在弹出的交互界面选择“是/Yes”

七、终极安全检查核对表#

在你的业务正式上线对外提供服务前,请逐条核对:

安全加固SSH密钥UFW防火墙Docker安全fail2ban