Debian 系新机开荒手册

适用于 Debian、Ubuntu Server 和常见 VPS,主要面向第一次接触服务器新手。按顺序执行,带“可选”的部分按实际需求处理。

修改 SSH、网络、防火墙和磁盘挂载时,保留当前 SSH 会话,并确保可以通过云控制台或物理终端救援。不要把密码、Token 和私钥写进本文。

本文命令默认在 root shell 中执行。普通用户先运行:

sudo -i

看到提示符变为 # 后再执行后续命令,完成后使用 exit 退出 root shell。

文中包含多条命令的代码块可以整块复制。cat > 文件 <<'EOF' 会覆盖目标文件,结尾的 EOF 必须单独占一行且不能缩进;本文优先覆盖专用的 drop-in 文件,避免破坏系统主配置。

1. 先确认服务器配置

本文主要面向第一次接触 VPS 的新手。拿到服务器后先不要急着修改 SSH 或安装软件,第一步是确认自己买了什么,以及商家实际交付了什么。

1.1 查看商家提供的配置

先从购买页面或商家控制台记录:

  • 商家、套餐名称和机房地区;
  • CPU 核心数;
  • 内存和磁盘大小;
  • 带宽与流量限制;
  • 操作系统版本;
  • 是否提供 IPv4 和 IPv6。

例如:

某 VPS 商家,新加坡机房,2 核 CPU、2 GB 内存、40 GB SSD,每月 1 TB 流量,安装 Debian 12。

现阶段不需要研究 CPU 型号和虚拟化架构。知道“几核、几 GB 内存、多少磁盘、服务器在哪里”就足够继续操作。

1.2 运行服务器测试

记录商家配置后,可以使用 NodeQuality 对服务器进行一次简单“验机”:

bash <(curl -sL https://run.NodeQuality.com)

NodeQuality图示

建议选择 v+ y+ y+ y

测试完后会给出此次测评结果的访问网址 示例: NodeQuality - 我的Zouter HK BGP Global - Lite

NodeQuality 会生成包含硬件、IP 质量、网络质量和回程路由的报告。1

这条命令会以 root 身份下载并运行第三方脚本。执行前应确认域名和开源项目地址没有被替换。测速会消耗一定流量,生成的报告或图片还可能上传到临时网页;分享给别人前注意隐藏公网 IP。

1.3 报告重点看什么

第一次看到报告时不需要理解每个指标,只看下面四类结果。

如何查看报告(详细版)

1.3.1 基本信息

重点看 CPU 核心数、内存、Swap、磁盘、操作系统和 IP 地区是否与购买页面基本一致。例如购买的是“2 核 2 GB”,报告中也应看到大约 2 个 CPU 核心和 2 GB 内存。

1.3.2 IP 质量

重点看 IP 类型、风险、黑名单,以及常用流媒体和 AI 服务是否可用。准备搭建代理节点时,这部分比 CPU 型号更值得关注。

1.3.3 网络质量

它反映服务器连接不同地区和运营商时的延迟、速度与稳定性。简单理解:服务器配置决定“能运行多少东西”,网络质量决定代理节点“快不快、稳不稳”。

1.3.4 回程路由

回程路由表示服务器向你的网络返回数据时经过的线路,可能影响延迟、晚高峰表现和不同运营商下的体验。新手暂时不需要看懂每个路由节点。

1.4 保存报告并用于后续配置

保存商家套餐信息和第一次测试报告,它们相当于服务器刚到手时的“体检记录”。以后遇到 IP 更换、线路变化或网络变慢时,可以重新测试并进行比较。

报告中的 CPU、内存、Swap 和磁盘 I/O 信息,也可以直接用于后文的 Swap 与 zswap 选择。向 AI 提问时不必手动描述所有硬件,只需附上套餐信息、NodeQuality 的基本信息部分和服务器用途即可。

2. 主机名、时区和时间同步

SETUP_HOSTNAME='sg-server-01'

hostnamectl set-hostname "$SETUP_HOSTNAME"

timedatectl set-timezone Asia/Singapore

timedatectl
  • hostnamectl set-hostname:设置主机名,将 sg-server-01 改成实际名称。
  • timedatectl set-timezone:设置系统时区;本文使用新加坡时区(和北京时区一样),也可以统一使用 UTC
  • timedatectl:显示时区、系统时间和时间同步状态。

检查时间同步:

timedatectl timesync-status 2>/dev/null || timedatectl status

如果时间未同步,应检查 NTP 服务和网络。时间错误会影响日志、证书和定时任务。

3. 更新系统

3.1 检查软件源

grep -RhsE '^(deb |Types:|URIs:|Suites:|Components:)' \
  /etc/apt/sources.list /etc/apt/sources.list.d 2>/dev/null

该命令列出当前启用的软件源。确认发行版代号正确,并避免混用 Debian stable、testing、Ubuntu PPA 或来源不明的第三方仓库。

3.2 获取并安装更新

apt update && apt list --upgradable && apt upgrade -y

该命令依次刷新索引、显示可升级的软件包并安装更新。-y 表示自动确认,适合尚未承载业务的新机;已有业务的服务器建议去掉 -y,先审阅变更。

test -f /var/run/reboot-required && cat /var/run/reboot-required

3.3 清理旧依赖

先模拟清理,查看将被删除的软件包:

apt -s autoremove

确认列表中没有业务依赖后再执行:

apt autoremove -y

autoremove 用于删除已不再被其他软件包依赖的包。它不是每次更新都必须执行,拿不准时可以跳过。

4. 安装常用工具

apt install -y ca-certificates curl wget git vim tmux htop unzip

对于学习 Linux、编写代码和搭建代理节点,这些工具已经能够覆盖大多数日常操作:

  • ca-certificates:让系统能够验证 HTTPS 网站的证书。
  • curlwget:下载文件或访问网络接口。
  • git:拉取代码和进行版本管理。
  • vim:编辑配置文件。
  • tmux:保持远程任务运行,SSH 断开后可以重新连接。
  • htop:查看 CPU、内存、Swap 和进程状态。
  • unzip:解压常见的 ZIP 文件。

4.1 使用 htop 查看机器状态

htop

htop图示

进入后主要看:

  • CPU:各核心当前使用率;
  • Mem:物理内存使用情况;
  • Swp:Swap 使用情况;
  • Load average:最近 1、5、15 分钟的系统负载;
  • 下方进程列表:哪些程序占用了较多 CPU 或内存。

F6 可以选择排序方式,按 qF10 退出。不要因为某个进程占用较高就直接结束它,应先确认进程用途。

5. 服务器安全加固:避免主机沦为肉鸡

公网服务器会持续收到端口扫描、弱密码尝试和自动化攻击。新机至少应完成下面三项安全配置:

  • SSH 使用公钥登录并禁用密码认证;
  • UFW 只开放真正需要的端口;
  • Fail2ban 自动封禁反复尝试登录的来源。

这三项不能保证服务器绝对安全,但可以显著减少最常见的入侵风险,避免主机因为弱密码或无关端口暴露而沦为“肉鸡”。

5.1 配置 SSH 公钥登录

以下操作均以 root 身份执行。将示例公钥替换为真实公钥后,写入 root 的公钥文件:

install -d -m 700 /root/.ssh

cat > /root/.ssh/authorized_keys <<'EOF'
ssh-ed25519 AAAA请替换为真实公钥
EOF

chown root:root /root/.ssh/authorized_keys

chmod 600 /root/.ssh/authorized_keys

这些命令创建 /root/.ssh、写入客户端公钥,并设置 OpenSSH 要求的属主和权限。

先保留当前会话,并从新终端确认可以使用公钥登录 root:

ssh root@服务器IP

公钥登录成功后,使用 Vim 编辑 SSH 配置:

install -d /etc/ssh/sshd_config.d
vim /etc/ssh/sshd_config.d/00-local-hardening.conf

写入:

PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password

PermitRootLogin prohibit-password 允许 root 使用公钥登录,但禁止 root 使用密码登录。保存后检查并重载:

sshd -t
systemctl reload ssh
sshd -T | grep -Ei 'passwordauthentication|permitrootlogin|pubkeyauthentication'

这组配置启用公钥认证,同时禁用密码和键盘交互认证。只有在 root 公钥登录成功后才能执行。

  • sshd -t:检查配置语法,无输出通常表示正常。
  • reload ssh:不中断现有连接地重新加载配置。
  • sshd -T:查看最终生效的配置,避免被其他配置文件覆盖。

不要退出原 SSH 会话,先确认新会话仍能连接。

5.2 配置 UFW 防火墙

安装 UFW,默认拒绝入站连接,并开放 SSH 的 22/TCP 端口:

apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw --force enable
ufw status verbose
  • 默认拒绝所有未明确允许的入站连接,同时允许正常出站访问。
  • ufw allow 22/tcp 允许外部访问 SSH。
  • ufw status verbose 用于确认最终规则和默认策略。

其他服务按照实际端口开放,例如:

ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 51820/udp
ufw status verbose

分别对应 HTTP、HTTPS 和示例 UDP 服务。没有使用的端口不要开放。

5.3 配置 Fail2ban

公网 SSH 可按需启用:

apt install -y fail2ban && systemctl enable --now fail2ban && fail2ban-client status

这条命令安装并启动 Fail2ban,然后显示已启用的 jail。需要查看 SSH 的封禁状态时,可执行 fail2ban-client status sshd

自定义配置放在 /etc/fail2ban/jail.d/*.local,不要直接修改 jail.conf

6. 限制系统日志大小

查看当前日志占用:

journalctl --disk-usage

该命令显示 journald 当前占用的磁盘空间。

一键创建配置并重启 journald:

install -d /etc/systemd/journald.conf.d

cat > /etc/systemd/journald.conf.d/10-size-limit.conf <<'EOF'
[Journal]
Storage=persistent
SystemMaxUse=500M
RuntimeMaxUse=100M
MaxRetentionSec=30day
EOF

systemctl restart systemd-journald

journalctl --disk-usage
  • Storage=persistent:重启后保留日志。
  • SystemMaxUseRuntimeMaxUse:限制持久日志和临时日志的最大空间。
  • MaxRetentionSec:日志最多保留 30 天。

重启 journald 使配置生效,再查看实际占用。小磁盘主机可适当降低上限。

7. 根据配置选择 Swap 与 zswap

Swap 没有适合所有服务器的固定大小。NodeQuality 报告已经包含内存、当前 Swap、磁盘和部分 I/O 信息,因此不需要新手自己判断一大串底层参数。

先记住三个概念:

  • Swap 是磁盘上的应急内存,可以降低内存耗尽时直接触发 OOM 的概率,但速度远慢于真实内存。
  • zswap 是 Swap 前面的内存压缩缓存,可以减少部分磁盘读写,但它仍然需要后端 Swap。2
  • 如果服务器长期大量使用 Swap,应该减少程序占用或升级内存,而不是不断扩大 Swap。

可以把下面内容交给 AI:

  1. 商家套餐信息;
  2. NodeQuality 报告中的“基本信息”和磁盘测试部分;
  3. 服务器用途,例如“只运行一个代理节点”或“还要部署网站”;
  4. 自己是否更在意稳定性、磁盘写入还是响应速度。

复制下面的提问模板,并把括号中的内容替换掉:

我有一台 Debian/Ubuntu VPS,主要用途是【代理节点/学习 Linux/部署网站】。

商家套餐:
【粘贴商家、地区、CPU、内存、磁盘和流量信息】

NodeQuality 基本信息与磁盘测试结果:
【粘贴对应内容】

请根据这些信息判断:

1. 是否需要 Swap;
2. Swap 建议设置为多大;
3. 是否适合启用 zswap;
4. 是否需要修改 vm.swappiness;
5. 给出适用于当前系统的完整配置命令;
6. 给出验证和回滚命令。

不要假设磁盘设备名,不要覆盖已有 Swap 或启动参数。修改前先检查当前状态。

给 AI 结果前可以参考以下常见起点,但不要当成硬性标准:

服务器情况 可参考的起点
1 GB 内存,只运行轻量代理节点 1 GB Swap 通常可作为应急空间
1 GB 内存,磁盘 I/O 良好且希望留更多余量 可评估 2 GB Swap
1 GB 内存,磁盘较慢但 CPU 尚可 可评估 1 GB Swap 配合 zswap
2~4 GB 内存,运行轻量服务 可从 1 GB Swap 开始评估
经常用满内存并持续读写 Swap 优先限制程序占用或升级内存

AI 给出的命令不是最终答案。执行前检查它是否识别了正确的系统版本、现有 Swap 和引导方式,并确认同时提供了验证与回滚步骤。

8. 启用 BBR(可选)

先确认内核支持:

modprobe tcp_bbr
sysctl net.ipv4.tcp_available_congestion_control

第一条命令加载 BBR 内核模块,第二条列出当前内核可用的 TCP 拥塞控制算法。

如果输出包含 bbr,一键写入并加载配置:

cat > /etc/sysctl.d/90-bbr.conf <<'EOF'
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
EOF
sysctl --system
sysctl net.core.default_qdisc net.ipv4.tcp_congestion_control

fq 是与 BBR 常用的队列调度器,sysctl --system 加载配置,最后一条命令确认设置已经生效。

BBR 不保证所有网络环境都更快,修改前后应使用相同方法测速。

8.1 第三方 BBR 脚本(方便但不推荐新手使用)

wget http://sh.xdmb.xyz/tcp.sh && bash tcp.sh

BBR图示 如果使用建议选择11最稳妥

该命令通过未加密的 HTTP 下载脚本并以 root 身份执行,内容可能在传输途中被替换。本文保留它仅用于辨认已有命令,不建议新手执行;优先使用上一节可阅读、可回滚的系统配置。

9. 最终检查与重启

hostnamectl
timedatectl
ip -brief address
ip route
getent hosts deb.debian.org
systemctl --failed
ss -lntup
ufw status verbose
swapon --show
journalctl -b -p warning

这组命令重新检查主机身份、时间、网络、DNS、失败服务、开放端口、防火墙、Swap 和本次启动的警告日志,结果应与前面各节的预期一致。

确认以下项目:

  • 主机名、时区、DNS 和时间同步正常。
  • 系统已更新,APT 没有报错。
  • root SSH 公钥登录正常。
  • root 密码登录已禁用。
  • 防火墙与实际监听端口符合预期。
  • 磁盘剩余空间、Swap 和日志空间正常。
  • 备份、监控和必要服务正常。

最后重启:

reboot

重启后再次检查:

uname -r
systemctl --failed
swapon --show
ss -lntup
journalctl -b -p warning

确认机器已使用预期内核启动,所有挂载和服务自动恢复,并且没有新的启动错误。SSH、防火墙和业务端口还应从另一台机器进行实际连接测试。

附录:Vim 常用技巧

使用 Vim 打开普通文件:

vim 文件名

在本文的 root shell 中编辑系统配置文件:

vim /etc/配置文件

Vim 启动后默认处于普通模式。按 i 进入插入模式开始编辑,完成后按 Esc 返回普通模式。

保存与退出

按键 作用
:w 保存文件
:q 退出 Vim
:wq 保存并退出
:q! 放弃修改并退出
ZZ 保存并退出

输入以 : 开头的命令后,需要按回车执行。

移动与查找

按键 作用
gg 跳到文件开头
G 跳到文件末尾
数字G 跳到指定行,例如 20G
/关键词 向下搜索关键词
n / N 下一个/上一个搜索结果
:set number 显示行号

编辑与撤销

按键 作用
i 在光标前插入
a 在光标后插入
o 在下一行插入
dd 删除当前行
yy 复制当前行
p 在光标后粘贴
u 撤销上一步
Ctrl+r 重做

粘贴大段配置前可执行 :set paste,粘贴完成后执行 :set nopaste,避免自动缩进破坏格式。

交互式全文替换:

:%s/旧内容/新内容/gc

其中 g 表示替换每行中的全部匹配,c 表示每次替换前确认。