Loading... # 新到手的 Linux 服务器,我这样设置:SSH/Fail2ban/nftables 开荒 SOP 每次拿到一台新服务器,都要重装纯净系统、加固 SSH、配防火墙、调内存换内核……步骤又多又杂。这篇来自 NodeSeek 精华帖的**开荒 SOP**(作者 DejavuMoe,2026年1月31日更新)把整个过程串成了标准作业流程:重装系统 → 用户与 SSH 加固 → IPv6 路由 → 换 Cloud 内核 → 常用软件 → ZRAM/Swap → SSD Trim → NTP 同步 → nftables 防火墙 → Fail2ban。 原文很长但非常实用,这里完整保留所有命令与配置,作为速查手册。 > 说明:重装有风险,本文不为任何脚本的安全性背书,请自行衡量并承担后果。如条件允许,请尽可能使用自定义 ISO 镜像手动安装。 ## 一、重装操作系统 ### 使用一键 DD 脚本 对于不支持自定义 ISO 镜像的服务商,用一键 DD 脚本最方便。开始前务必花几分钟读作者说明文档,这比盲目粘贴命令重要。 以 Oracle ARM 机器安装 Debian 为例(`debi` 脚本): ```bash # 下载脚本 curl -fLO https://raw.githubusercontent.com/bohanyang/debi/master/debi.sh && chmod +x debi.sh # 重装配置 sudo ./debi.sh \ --version 13 \ --architecture arm64 \ --cloudflare \ --user viamoe \ --authorized-keys-url https://github.com/githubUserName.keys \ --ssh-port 22122 ``` 参数说明:`--version 13` 装 Debian Trixie;`--architecture arm64` 指定架构;`--cloudflare` 走 Cloudflare 网络;`--user` 指定用户名;`--authorized-keys-url` 直接拉取你的 GitHub 公钥;`--ssh-port 22122` 改 SSH 端口。 开始重装: ```bash sudo reboot ``` 重启后机器自动联网重装,期间可通过 VNC 观察进度,几分钟后新系统就绪。 ### 使用自定义 ISO 镜像 若服务商支持上传自定义 ISO 手动安装,这是最推荐的方式,能从源头掌控系统纯净度。重装完成后用预设凭据登录,开始后续配置。 ## 二、配置用户 ```bash # 切换到 root su # sudo 免密码(替换 dejavu 为实际用户名) echo "dejavu ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/dejavu chmod 440 /etc/sudoers.d/dejavu ``` ## 三、SSH 安全加固 ### 配置公钥登录 ```bash # 退出 root exit # 创建公钥目录 mkdir -p ~/.ssh # 粘贴 SSH 公钥 vim ~/.ssh/authorized_keys # 或者上传:ssh -i /path/to/ed25519_key username@<IP> -p <port> chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys ``` ### 优化 sshd 配置 编辑 `/etc/ssh/sshd_config`: ```bash # 修改默认 SSH 端口 Port 22122 # 登录宽限时间:超过 1 分钟不输入密码/密钥自动断开 LoginGraceTime 1m # 禁止 root 直接登录 PermitRootLogin no # 严格模式,检查主目录权限 StrictModes yes # 开启公钥登录 PubkeyAuthentication yes # 禁止密码登录 PasswordAuthentication no # 禁止空密码登录 PermitEmptyPasswords no # 禁用键盘交互式认证(防止通过 PAM 绕过密码限制) KbdInteractiveAuthentication no # Debian 默认需要 yes,否则可能影响部分会话功能 UsePAM yes # 关闭 X11 转发 X11Forwarding no # 保持会话:每 60 秒发一次心跳 ClientAliveInterval 60 # 客户端 5 次没回应才断开 ClientAliveCountMax 5 # 禁止 DNS 反向解析 UseDNS no ``` 保持当前终端会话,**新开一个 SSH 连接确认能登录**,再应用: ```bash sudo sshd -t sudo systemctl restart sshd ``` ## 四、IPv6 静态路由 Netcup 服务器提供 `/64` 的 IPv6,建议设置静态路由。编辑 `/etc/network/interfaces` 添加: ```bash iface ens3 inet6 static address <静态 IPv6 地址> netmask 64 gateway fe80::1 accept_ra 2 ``` 然后: ```bash sudo ip addr flush dev ens3 ``` ## 五、更换 Cloud 内核 推荐使用针对虚拟化优化、更轻量高效的 Cloud 内核: ```bash sudo apt install -y linux-image-cloud-amd64 sudo reboot uname -r # 输出示例:6.12.63+deb13-cloud-amd64 ``` 清理旧内核: ```bash sudo dpkg --list | grep linux-image # 移除常规内核元包及具体版本(按实际版本替换) sudo apt purge -y linux-image-amd64 linux-image-6.12.63+deb13-amd64 sudo update-grub sudo apt autoremove --purge -y ``` ## 六、安装常用软件 ### 基本工具包 ```bash sudo apt update && apt upgrade sudo apt install \ apt-transport-https \ build-essential \ git curl wget unzip tmux btop \ bind9-dnsutils tree vim ``` ### 安装 Docker 参考 Docker 官方文档(下列命令不保证时效性): ```bash sudo apt-get update sudo apt-get install 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 echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo systemctl status docker ``` ### 安装 Nginx 用 Nginx 官方源(带 GPG 验证与仓库锁 pin): ```bash sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \ | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null mkdir -m 700 ~/.gnupg gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \ http://nginx.org/packages/debian `lsb_release -cs` nginx" \ | sudo tee /etc/apt/sources.list.d/nginx.list echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \ | sudo tee /etc/apt/preferences.d/99nginx sudo apt update && sudo apt install nginx sudo systemctl start nginx ``` 用自签证书设置 Nginx 默认回退(Fallback)虚拟主机,拒绝所有未匹配域名: ```bash sudo mkdir -p /etc/nginx/cert sudo chmod 700 /etc/nginx/cert sudo openssl req -x509 -new -nodes -newkey rsa:2048 \ -sha256 -days 3650 \ -keyout /etc/nginx/cert/deny.key \ -out /etc/nginx/cert/deny.pem \ -subj "/C=XX/ST=Denied/L=Denied/O=Denied/CN=invalid.local" \ -addext "subjectAltName=DNS:invalid.local" sudo chmod 600 /etc/nginx/cert/deny.key sudo chmod 644 /etc/nginx/cert/deny.pem ``` 新建 `/etc/nginx/conf.d/00-default.conf`: ```nginx 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_certificate /etc/nginx/cert/deny.pem; ssl_certificate_key /etc/nginx/cert/deny.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers off; error_page 497 =444 /dev/null; return 444; } ``` ```bash sudo nginx -t sudo nginx -s reload ``` ## 七、ZRAM 和 Swap ZRAM 在内存中划分区域做压缩,速度远快于硬盘 Swap。装 zram-tools 并编辑 `/etc/default/zramswap`: ```bash sudo apt update && sudo apt install -y zram-tools ``` ```bash # 选择 zstd 算法,最佳平衡压缩比和速度 ALGO=zstd # 1GB RAM 建议 100%,2~4GB 建议 60%,8GB 以上建议 25% PERCENT=70 # 优先级 100,确保系统优先使用 ZRAM PRIORITY=100 ``` Swapfile 比 Swap 分区灵活: ```bash sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress sudo chmod 600 /swapfile sudo mkswap /swapfile # Swap 优先级低于 ZRAM sudo swapon --priority -2 /swapfile echo '/swapfile none swap sw,pri=-2 0 0' | sudo tee -a /etc/fstab sudo mount -a ``` 内核 swap 积极性(按 RAM 大小选择一行): ```bash # 1GB RAM(激进) echo "vm.swappiness=100" | sudo tee -a /etc/sysctl.conf # 2GB/4GB RAM(积极) echo "vm.swappiness=60" | sudo tee -a /etc/sysctl.conf # 8GB 以上(保守) echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf # 2GB 以下机器,更倾向释放文件缓存 echo "vm.vfs_cache_pressure=50" | sudo tee -a /etc/sysctl.conf sudo sysctl -p # 验证 sudo swapon --show sudo zramctl ``` ## 八、SSD Trim 优化 NVMe SSD 建议启用定时 Trim: ```bash sudo systemctl enable --now fstrim.timer ``` 先验证服务商是否支持 Trim(`DISC-MAX` 列不为 0): ```bash lsblk -D # 尝试手动触发 sudo fstrim -v / ``` ## 九、NTP 时区同步 无论服务器在哪,统一设置 UTC 时区,避免跨时区日志混乱: ```bash sudo timedatectl set-timezone UTC ``` 用精度更高的 Chrony 替代 systemd-timesyncd: ```bash sudo apt update && sudo apt install chrony sudo vim /etc/chrony/chrony.conf ``` 注释默认的 `pool` 及 `server` 行,添加: ```bash server time.cloudflare.com iburst ``` 启动: ```bash sudo systemctl mask systemd-timesyncd.service sudo systemctl enable --now chrony chronyc sources -v ``` ## 十、nftables 防火墙 Debian 13 中应该摒弃过时的 iptables 和 UFW,用原生高效的 nftables。 ```bash sudo apt update && sudo apt install nftables -y # 默认 inactive 是正常的 sudo systemctl status nftables # 若装过 UFW,卸载避免冲突 sudo ufw disable && sudo apt purge ufw -y ``` 只需掌握三个层级:**表(Table)**是顶级容器,**链(Chain)**绑定 INPUT/FORWARD/OUTPUT 钩子并定义默认策略,**规则(Rule)**是具体匹配与动作。 编辑 `/etc/nftables.conf`,以下配置是典型"安全"方案——仅允许 Cloudflare CDN 回源访问 80/443,除 SSH 外全切断: ```bash #!/usr/sbin/nft -f flush ruleset table inet filter { 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 input { type filter hook input priority filter; policy drop; ct state established, related accept ct state invalid drop iif "lo" accept ip6 nexthdr icmpv6 icmpv6 type { nd-neighbor-solicit, nd-neighbor-advert, nd-router-advert } accept ip protocol icmp limit rate 4/second accept ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate 4/second accept tcp dport 22122 accept ip saddr @cloudflare_v4 tcp dport { 80, 443 } accept ip6 saddr @cloudflare_v6 tcp dport { 80, 443 } accept } chain forward { type filter hook forward priority filter; policy drop; ct state established, related accept ct state invalid drop iifname "docker0" accept iifname "br-*" accept iifname "docker0" oifname "docker0" accept iifname "br-*" oifname "br-*" accept } chain output { type filter hook output priority filter; policy accept; } } ``` 应用规则: ```bash sudo nft -c -f /etc/nftables.conf sudo systemctl enable --now nftables # Docker 重启后会自动注入规则 sudo systemctl restart nftables && sudo systemctl restart docker # 测试 Docker 出站 sudo docker run --rm busybox ping -c 4 dejavu.moe ``` ## 十一、Fail2ban 防爆破 ```bash sudo apt update && sudo apt install fail2ban sudo vim /etc/fail2ban/jail.local ``` 最小 SSH 保护配置: ```bash [DEFAULT] # 本机地址自动忽略,防止误封自己 ignoreip = 127.0.0.1/8 ::1 # 封禁 1 天 bantime = 1d # 10 分钟内累计失败即触发 findtime = 10m # 触发封禁的失败次数阈值 maxretry = 3 # 自动 nftables 规则插入 banaction = nftables-multiport banaction_allports = nftables-allports [sshd] enabled = true # 务必匹配实际 SSH 端口 port = 22122 # systemd 日志后端 backend = systemd # 严格匹配失败日志 mode = aggressive ``` 启动并验证: ```bash sudo systemctl enable --now fail2ban sudo systemctl restart nftables && sudo systemctl restart fail2ban # 手动封一个"黑户"测试 sudo fail2ban-client set sshd banip 2400:6180:0:d2:0:2:9699:d000 sudo nft list ruleset | grep f2b # 巡查监狱 sudo fail2ban-client status sudo fail2ban-client status sshd ``` ## 小结 至此,一台纯净、安全的服务器就绪。整套 SOP 的核心思路:**DD/ISO 重装打底 → 公钥登录+关密码+换端口 → 防火墙默认拒绝+只放行白名单 → Fail2ban 兜底防爆破 → ZRAM/Swap 和 Cloud 内核榨干性能**。每步都给了完整命令,照做即可。 --- *本文改写自 NodeSeek 精华帖《新到手的 Linux 服务器,我这样设置》,原文链接:https://www.nodeseek.com/post-517494-1 ,作者原博:https://blog.dejavu.moe/posts/new-linux-server-setup-guide/* Last modification:August 12, 2026 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏