新到手的 Linux 服务器,我这样设置

概要

本文记录我初始化 Linux 服务器的 标准作业程序(SOP),这并非通用指南,仅作为个人快速部署环境的速查手册。

关联阅读:

性能测试

我要「验牌」(法国音~)

新服务器在重装系统前,建议先进行硬件与网络性能基准测试,使用 root 用户执行 YABS (Yet Another Bench Script) 脚本:

curl -sL yabs.sh | bash -s -- -5

测试完成后,首先核对 CPU、内存、磁盘容量及网络带宽等基础硬件信息,确认与服务商承诺规格保持一致。

参考 Geekbench 5 单核跑分评估 CPU 性能区间:

  • 单核 ~400 分: 入门级性能。适合静态网页托管、轻量定时任务、机器人、轻量代理或个人博客,不适合处理高并发任务。
  • 单核 ~800 分: 主流性能。足以应对常规建站(如中等流量 WordPress)、基础 Docker 容器部署及小型数据库。
  • 单核 ~1200 分: 优秀性能。可承载高负载 Web 应用、中型关系型数据库(MySQL/PostgreSQL)、CI/CD 构建及多容器并行。
  • 单核 ~2000 分: 顶级性能。适合单核敏感型游戏服务端、视频转码、高并发后端及数据处理。

对于 KVM 虚拟化服务器,理想情况 是多核得分接近 核心数 × 单核得分。若多核比例严重偏低,表明宿主机存在严重的 CPU 超售或资源争抢,实际使用体验会受影响。

确认上述各项指标符合预期后,即可开始初始化配置系统。

重装操作系统

重装有风险,笔者不为任何脚本的安全性背书,请自行衡量并承担后果。如果条件允许,请尽可能使用自定义 ISO 镜像手动安装。

使用一键 DD 脚本

对于不支持自定义 ISO 镜像的服务商,使用一键 DD 脚本比较方便。开始前,务必花费几分钟读下作者的说明文档,这远比盲目粘贴命令重要。

  1. bin456789/reinstall 支持重装的系统类型更多
  2. bohanwood/debi 专注于纯净、精简的 Debian 系统环境

这里以使用第一个脚本重装 Debian 13 为例:

curl -fLO https://raw.githubusercontent.com/bin456789/reinstall/main/reinstall.sh
bash reinstall.sh debian 13 \
  --password '替换为强密码'

完成后 reboot 重启,耐心等待系统重装完成。

使用自定义 ISO 镜像

首选支持自定义 ISO 镜像的重装方式,以确保系统环境纯净。Netcup 服务器的具体操作请参考:Netcup 服务器安装自定义 ISO 镜像。

完成系统安装后,使用预设凭据登录并进入后续配置。

配置非特权用户

日常运维应使用非特权用户,启用免密 sudo 存在安全风险,仅建议在完全掌控系统安全的前提下配置。

创建用户

下面以新建非特权用户 dejavu 为例,使用 root 用户执行:

adduser dejavu

配置 sudo 免密

apt update \
  && apt install -y sudo

install -m 0440 /dev/null /etc/sudoers.d/90-dejavu

printf '%s\n' \
  'dejavu ALL=(ALL:ALL) NOPASSWD: ALL' \
  > /etc/sudoers.d/90-dejavu

检查 sudoers 配置:

visudo -cf /etc/sudoers.d/90-dejavu
visudo -c

OK 的话,切换到非特权用户:

sudo -iu dejavu

本文后续命令默认由该普通用户执行,需要管理员权限的命令使用 sudo。

更新系统并安装基础软件

更新操作系统

sudo apt update \
  && sudo apt full-upgrade -y

安装基础软件包

sudo apt install -y --no-install-recommends \
  ca-certificates \
  curl \
  git \
  gnupg \
  unzip \
  vim \
  wget \
  tree \
  file

设置默认编辑器

我个人习惯使用 Vim 作为默认编辑器:

sudo update-alternatives --set editor /usr/bin/vim.basic

安装常用运维工具(可选)

以下软件包通常不是必须的,可根据自己需要选择安装:

sudo apt install -y --no-install-recommends \
  dnsutils \
  ethtool \
  git \
  jq \
  lsof \
  mtr-tiny \
  ncdu \
  rsync \
  tcpdump \
  tmux \
  jq

设置时区自动同步

统一时区

对于不同区域的 Linux 服务器,建议统一设置为 UTC 时区:

sudo timedatectl set-timezone UTC

注意,KVM 的 kvm-clock 只提供虚拟化时钟源,并不能保证外部 UTC 一致性,仍需依靠 NTP 服务同步。

使用 systemd-timesyncd

适用于绝大多数使用场景:

sudo systemctl disable --now chrony 2>/dev/null || true
sudo apt install -y systemd-timesyncd
sudo systemctl enable --now \
  systemd-timesyncd.service
sudo timedatectl status
sudo timedatectl timesync-status

使用 Chrony

仅当机器需要极度苛刻的时间同步收敛速度和质量时,才换用 Chrony 服务:

sudo apt install -y chrony
sudo systemctl disable --now systemd-timesyncd
sudo systemctl enable --now chrony
chronyc tracking
chronyc sources -v

安装 KVM Guest Agent(可选)

仅在信任服务商且宿主机已暴露 virtio-serial 通道时,安装 KVM Guest Agent 才有意义。

检查 QEMU Guest Agent 通道:

if [ -e /dev/virtio-ports/org.qemu.guest_agent.0 ]; then
    echo "QEMU Guest Agent 通道可用!"
else
    echo "QEMU Guest Agent 通道不存在!"
fi

通道可用时:

sudo apt install -y qemu-guest-agent
sudo systemctl enable --now qemu-guest-agent
sudo systemctl status qemu-guest-agent --no-pager

通道不存在时跳过安装。

配置自动安全更新

AI 时代各种软件、云服务和基础设置面临的安全风险比以前要大得多,建议启用 Debian 的自动更新安全补丁。

每日自动更新

sudo apt install -y unattended-upgrades \
  needrestart
# 每日更新策略
cat << 'EOF' | sudo tee /etc/apt/apt.conf.d/20auto-upgrades > /dev/null
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
EOF

禁止自动重启

即使启用自动更新,生产服务器也不应当自动重启,配置:

cat << 'EOF' | sudo tee /etc/apt/apt.conf.d/52unattended-upgrades-local > /dev/null
Unattended-Upgrade::Automatic-Reboot "false";
EOF

启用定时任务

sudo systemctl enable --now \
  apt-daily.timer \
  apt-daily-upgrade.timer

检查配置

sudo unattended-upgrade --dry-run
apt-config dump | grep -iE 'Periodic|Unattended'
systemctl list-timers 'apt-*' --all
sudo unattended-upgrade --dry-run --debug
sudo needrestart -r l

检查自动更新日志

# unattended-upgrades 日志
sudo tail -n 100 \
  /var/log/unattended-upgrades/unattended-upgrades.log
# dpkg 输出
sudo tail -n 100 \
  /var/log/unattended-upgrades/unattended-upgrades-dpkg.log
# systemd 执行记录
sudo journalctl \
  -u apt-daily-upgrade.service \
  --since '7 days ago'

SSH 安全加固

确认当前登录的是目标非特权用户,例如 dejavu。

写入 SSH 公钥

直接写入你的 SSH 公钥内容:

install -d -m 0700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys
# 写入 SSH 公钥
PUBKEY='ssh-ed25519 ...<实际公钥内容>...'
grep -qxF "$PUBKEY" ~/.ssh/authorized_keys \
  || printf '%s\n' "$PUBKEY" >> ~/.ssh/authorized_keys

或者也可以在本地计算机进行拷贝:

ssh-copy-id \
  -i ~/.ssh/id_ed25519.pub \
  -p <端口> \
  <用户名>@服务器IP

只启用 ssh.service 服务

Debian 13 的 ssh.socket 固定监听 TCP 22。关闭它,SSH 监听端口统一由 ssh.service 和 sshd_config 管理。

sudo systemctl disable --now ssh.socket
sudo systemctl enable --now ssh.service

写入 SSH 加固配置

cat << 'EOF' | sudo tee /etc/ssh/sshd_config.d/00-custom.conf > /dev/null
# 注意修改实际的 SSH 端口
Port 822
# 未完成认证的连接最多保留 1 分钟
LoginGraceTime 1m
# 禁止 root 用户直接登录
PermitRootLogin no
# 检查用户目录和密钥文件权限
StrictModes yes
# 开启 SSH 公钥认证
PubkeyAuthentication yes
# 禁止密码认证
PasswordAuthentication no
# 禁止空密码登录
PermitEmptyPasswords no
# 禁止键盘交互式认证
KbdInteractiveAuthentication no
# 保留 PAM 的账户检查和会话管理功能
UsePAM yes
# 禁止 X11 转发
X11Forwarding no
# 服务器每 60 秒检测一次客户端连接
ClientAliveInterval 60
# 客户端连续 5 次未响应后断开
ClientAliveCountMax 5
# 禁止登录前进行反向 DNS 查询
UseDNS no
EOF

检查配置并重启 SSH 服务

sudo sshd -t && sudo systemctl restart ssh.service

不要关闭当前终端会话,新建 SSH 连接测试登录,确认无误后再退出,否则回到原会话中自查配置。

更改主机名

将 myvps 替换为实际的主机名:

sudo hostnamectl set-hostname <myvps>
sudo vim /etc/hosts

一般情况,像下面这样编辑 /etc/hosts 即可。

127.0.0.1       localhost
127.0.1.1       <myvps>
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

对于真实 FQDN 和固定公网 IP 的邮件服务器,则应该这样:

127.0.0.1       localhost
# 替换为实际的域名
<公网 IPv4 地址>  myvps.example.com <myvps>
<公网 IPv6 地址>  myvps.example.com <myvps>
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

IPv6 静态路由

以 Netcup 服务器为例,它们提供 /64 的 IPv6,建议设置静态 IPv6 路由(不同服务商配置有所区别)。

sudo vim /etc/network/interfaces

添加:

iface <网卡名称> inet6 static
    address <静态 IPv6 地址>/64
    gateway fe80::1

重启后生效。

Debian Cloud 内核精简了物理硬件驱动,面向云平台进行了虚拟化优化,更适合大多数 KVM 虚拟机。

安装 Cloud 内核:

ARCH="$(dpkg --print-architecture)"
sudo apt install -y "linux-image-cloud-${ARCH}"

重启系统:

sudo reboot

重新登录后执行检查,预期输出包含 cloud-amd64 或 cloud-arm64。

uname -r

卸载标准内核(仅在成功运行 Cloud 内核后执行):

ARCH="$(dpkg --print-architecture)"
case "$ARCH" in
  amd64)
    sudo apt purge -y --ignore-missing linux-image-amd64
    ;;
  arm64)
    sudo apt purge -y --ignore-missing linux-image-arm64
    ;;
esac

sudo apt autoremove --purge -y
sudo update-grub

启用 SSD/NVMe TRIM(可选)

检查虚拟磁盘是否支持 discard:

lsblk -D

DISC-MAX 非零,服务商支持 TRIM,启用定时任务:

sudo systemctl enable --now fstrim.timer
systemctl list-timers fstrim.timer

配置 ZRAM 和 Swap

配置 ZRAM

sudo apt install -y systemd-zram-generator
cat << 'EOF' | sudo tee /etc/systemd/zram-generator.conf > /dev/null
[zram0]
# 根据实际配置
# 物理内存的一半,最大 4GB (4096)
zram-size = min(ram / 2, 4096)
swap-priority = 100
EOF

立即启用 ZRAM:

sudo systemctl daemon-reload
sudo systemctl start systemd-zram-setup@zram0.service

检查 ZRAM 和 Swap 状态:

sudo zramctl
sudo swapon --show
free -h

创建 Swap 文件

以 2GB Swapfile 为例:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
# 自动挂载
grep -qE '^[[:space:]]*/swapfile[[:space:]]' /etc/fstab \
  || echo '/swapfile none swap defaults 0 0' \
     | sudo tee -a /etc/fstab > /dev/null

启用 Swapfile:

sudo swapon /swapfile

检查 Swap 状态:

sudo swapon --show

启用 BBR 拥塞控制算法

从 Linux 4.20 起,BBR 在 qdisc 未提供时会自动启用 TCP 内部 pacing,因而不再强制依赖 fq。此外,Debian 13 官方内核已将 BBR 编译为模块,且系统默认 qdisc 为 fq_codel。

写入配置:

cat << 'EOF' | sudo tee /etc/sysctl.d/90-bbr.conf > /dev/null
net.ipv4.tcp_congestion_control = bbr
EOF

立即应用:

sudo sysctl --load=/etc/sysctl.d/90-bbr.conf

检查当前采用算法:

sudo sysctl net.ipv4.tcp_congestion_control

安装 Docker CE(可选)

清除旧版软件包

全新的操作系统可跳过此步:

sudo apt update
sudo apt remove -y $(
  dpkg --get-selections \
    docker.io docker-compose docker-doc docker-buildx \
    podman-docker containerd runc \
    2>/dev/null | cut -f1
)

添加 Docker 软件源

sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL \
  https://download.docker.com/linux/debian/gpg \
  -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
cat <<EOF | sudo tee /etc/apt/sources.list.d/docker.sources >/dev/null
Types: deb
URIs: https://download.docker.com/linux/debian
Suites: $(. /etc/os-release && echo "$VERSION_CODENAME")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

安装 Docker

sudo apt update \
  && sudo apt install -y \
    docker-ce \
    docker-ce-cli \
    containerd.io \
    docker-buildx-plugin \
    docker-compose-plugin \
    && sudo systemctl enable --now docker

写入 Docker 配置

cat <<'EOF' | sudo tee /etc/docker/daemon.json >/dev/null
{
  "log-driver": "local",
  "log-opts": {
    "max-size": "20m",
    "max-file": "5"
  },
  "live-restore": true
}
EOF
sudo systemctl restart docker

验证安装

sudo docker version
sudo docker compose version

安装和配置 Nginx

建议使用 Nginx 官方软件源安装,而非 Debian 默认软件源。

环境准备

sudo apt install -y \
  curl \
  gnupg2 \
  ca-certificates \
  lsb-release \
  debian-archive-keyring

导入 Nginx 官方 GPG Key:

curl -fsSL https://nginx.org/keys/nginx_signing.key \
  | gpg --dearmor \
  | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg \
  > /dev/null
# 注意和官方 Key 对比验证
install -d -m 700 ~/.gnupg
gpg \
  --dry-run \
  --quiet \
  --no-keyring \
  --import \
  --import-options import-show \
  /usr/share/keyrings/nginx-archive-keyring.gpg

添加 Nginx 软件源

echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
https://nginx.org/packages/debian $(lsb_release -cs) nginx" \
  | sudo tee /etc/apt/sources.list.d/nginx.list \
  > /dev/null
# 设置优先级
cat << 'EOF' | sudo tee /etc/apt/preferences.d/99nginx > /dev/null
Package: *
Pin: origin nginx.org
Pin: release o=nginx
Pin-Priority: 900
EOF

安装 Nginx

sudo apt update
apt-cache policy nginx
sudo apt install -y nginx

删除默认站点

sudo rm -f /etc/nginx/conf.d/default.conf

使用 Cloudflare CDN(推荐)

创建默认回退 (Fallback) 主机

从 Nginx 1.19.4 开始,无需自签 TLS 证书即可阻断 SNI 探测:

cat << 'EOF' | sudo tee /etc/nginx/conf.d/00-default.conf > /dev/null
server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    server_name _;
    ssl_reject_handshake on;
}
EOF

透传客户端真实 IP 地址

cat << 'EOF' | sudo tee /etc/nginx/conf.d/10-cloudflare-realip.conf > /dev/null
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;

set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;

real_ip_header CF-Connecting-IP;
EOF

使用 Cloudflare 源服务器证书

使用 Cloudflare 源服务器证书,免于日常维护 SSL/TLS 证书。在 Cloudflare 后台创建 Origin CA,然后安装:

# 准备证书目录
sudo install \
  -d \
  -o root \
  -g root \
  -m 0700 \
  /etc/nginx/tls
# 安装证书公钥(替换实际域名和文件)
sudo install \
  -o root \
  -g root \
  -m 0644 \
  ~/example.com-origin.pem \
  /etc/nginx/tls/example.com-origin.pem
# 安装证书私钥(替换实际域名和文件)
sudo install \
  -o root \
  -g root \
  -m 0600 \
  ~/example.com-origin.key \
  /etc/nginx/tls/example.com-origin.key

后续虚拟主机配置直接引用即可:

ssl_certificate     /etc/nginx/tls/example.com-origin.pem;
ssl_certificate_key /etc/nginx/tls/example.com-origin.key;

启用 Authenticated Origin Pulls (AOP)

用上了 Cloudflare Origin CA,笔者还建议启用 Authenticated Origin Pulls (AOP)。一般情况下,使用 Global AOP 证书即可。

sudo curl -fsSL \
https://developers.cloudflare.com/ssl/static/authenticated_origin_pull_ca.pem \
  -o /etc/nginx/tls/cloudflare-origin-pull-ca.pem
sudo chown root:root \
  /etc/nginx/tls/cloudflare-origin-pull-ca.pem
sudo chmod 0644 \
  /etc/nginx/tls/cloudflare-origin-pull-ca.pem

然后,在 Cloudflare 后台为域名开启 AOP,Nginx 虚拟主机增加一条配置:

ssl_verify_client on;

建议先使用 optional 验证,再切换为强制验证,详见 Cloudflare Docs。

不使用 Cloudflare CDN 的情况

创建默认回退 (Fallback) 主机

cat << 'EOF' | sudo tee /etc/nginx/conf.d/00-default.conf > /dev/null
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;
    return 444;
}

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    server_name _;
    ssl_reject_handshake on;
}
EOF

启动 Nginx 服务

sudo nginx -t
sudo systemctl enable --now nginx
sudo systemctl reload nginx

配置 nftables 流量防火墙

现在,我们应该摒弃过时的 iptables 和 UFW,拥抱原生高效的 nftables。针对三种典型的 Web 服务器使用场景:

  1. 使用且仅限 Cloudflare CDN 访问

    开放且仅允许 Cloudflare CDN 的 IP 段回源访问 443/TCP,无需开放 80/TCP、80/UDP 或 443/UDP。

  2. 不使用 CDN 的公网 Nginx

    开放 80/TCP 和 443/TCP。

  3. 不使用 CDN 的公网 Caddy

    开放 80/TCP、443/TCP,Caddy 原生支持 HTTP/3 QUIC 还应当开放 443/UDP。

本文使用两个 nftables 配置表:nftables.conf 用于通用配置,web_server.nft 用于 Web 服务器场景配置。

我们约定:

  • 默认表名 default_filter
  • 主机出站默认允许
  • Docker 自行维护转发和 NAT,容器端口绑定 127.0.0.1

安装 nftables

从 Debian 10 开始,nftables 是默认安装的,但通常处于未启用状态。

sudo apt update \
  && sudo apt install -y nftables \
  && sudo systemctl status nftables

当前的 inactive 状态是预期行为。

写入 nftables 主配置

注意替换 SSH 端口为实际端口:

cat << 'EOF' | sudo tee /etc/nftables.conf > /dev/null
#!/usr/sbin/nft -f

# 只重建本 SOP 管理的表。
destroy table inet default_filter

# 修改为实际 SSH 端口。
define SSH_PORT = 822

table inet default_filter {
    # Web 访问策略。
    include "/etc/nftables.d/web_server.nft"

    chain input {
        type filter hook input priority filter;
        policy drop;

        # 本机回环。
        iifname "lo" accept

        # 丢弃无效连接,放行已建立连接及其关联流量。
        ct state invalid drop
        ct state { established, related } accept

        # 兼容使用 DHCP / DHCPv6 获取地址的 VPS。
        udp sport 67 udp dport 68 accept
        udp sport 547 udp dport 546 accept

        # ICMP、PMTU 和 IPv6 邻居发现。
        meta l4proto icmp accept
        meta l4proto ipv6-icmp accept

        # 公网 SSH。
        tcp dport $SSH_PORT accept

        # 当前选择的 Web 策略。
        jump web_input
    }

    chain output {
        type filter hook output priority filter;
        policy accept;
    }
}
EOF

配置 Web 访问场景表(三选一)

仅限 Cloudflare CDN HTTPS 回源

sudo install -d -o root -g root -m 0755 /etc/nftables.d
cat << 'EOF' | sudo tee /etc/nftables.d/web_server.nft > /dev/null
set cloudflare_v4 {
    type ipv4_addr;
    flags interval;

    elements = {
        173.245.48.0/20,
        103.21.244.0/22,
        103.22.200.0/22,
        103.31.4.0/22,
        141.101.64.0/18,
        108.162.192.0/18,
        190.93.240.0/20,
        188.114.96.0/20,
        197.234.240.0/22,
        198.41.128.0/17,
        162.158.0.0/15,
        104.16.0.0/13,
        104.24.0.0/14,
        172.64.0.0/13,
        131.0.72.0/22
    };
}

set cloudflare_v6 {
    type ipv6_addr;
    flags interval;

    elements = {
        2400:cb00::/32,
        2606:4700::/32,
        2803:f800::/32,
        2405:b500::/32,
        2405:8100::/32,
        2a06:98c0::/29,
        2c0f:f248::/32
    };
}

chain web_input {
    ip saddr @cloudflare_v4 tcp dport 443 accept
    ip6 saddr @cloudflare_v6 tcp dport 443 accept
}
EOF

不使用 CDN 的公网 Nginx

cat << 'EOF' | sudo tee /etc/nftables.d/web_server.nft > /dev/null
chain web_input {
    tcp dport { 80, 443 } accept
}
EOF

不使用 CDN 的公网 Caddy

cat << 'EOF' | sudo tee /etc/nftables.d/web_server.nft > /dev/null
chain web_input {
    tcp dport { 80, 443 } accept
    udp dport 443 accept
}
EOF

修正 Debian 默认行为

Debian 13 自带的 nftables.service 在停止时默认执行:

nft flush ruleset

这会删除 Docker、Fail2ban 等服务动态插入的防火墙表。将其修改为仅清空我们的 default_filter 表:

sudo install \
  -d \
  -o root \
  -g root \
  -m 0755 \
  /etc/systemd/system/nftables.service.d
cat << 'EOF' | sudo tee \
  /etc/systemd/system/nftables.service.d/override.conf \
  > /dev/null
[Service]
ExecStop=
ExecStop=/usr/sbin/nft destroy table inet default_filter
EOF

检查并应用配置

保持当前 SSH 会话,检查完整配置(含引用的 Web 策略表):

sudo nft -c -f /etc/nftables.conf

确认无误,重载配置启动服务:

sudo systemctl daemon-reload
sudo systemctl enable --now nftables

新建 SSH 会话测试连接,若连接失败,请在原会话中自查端口配置。

安装配置 Fail2ban

安装 Fail2ban

sudo apt update \
  && sudo apt install -y fail2ban

确认当前实际的 SSH 端口:

sudo sshd -T | awk '$1 == "port" {print $2}'

以下以端口 822 为例,实际执行时,请替换为您的实际 SSH 端口。

创建 SSH 监狱规则

sudo install -d -m 0755 /etc/fail2ban/jail.d

cat <<'EOF' | sudo tee /etc/fail2ban/jail.d/sshd.local >/dev/null
[sshd]
enabled = true
# 注意替换实际 SSH 端口
port = 822

backend = systemd
mode = aggressive
banaction = nftables

findtime = 10m
maxretry = 3
bantime = 1d

usedns = no
ignoreip = 127.0.0.0/8 ::1/128
EOF

对于仅限 SSH 密钥登录的服务器来说,这套配置比较严格,但是应该可以大幅度减少公网扫描噪声。

检查 Fail2ban 配置

sudo fail2ban-client -t

预期显示:OK: configuration test is successful

启动 Fail2ban 服务

sudo systemctl enable --now fail2ban

检查服务状态:

sudo systemctl is-active fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd

至此,一台纯净、安全的服务器已经准备就绪。Happy Hosting!

参考资料