跳到主要内容

架构、安全边界与基础命令

两台机器,两种责任

[LOCAL: WSL2] [REMOTE: VPS]
发起 SSH 运行 sshd
保存用户私钥 保存 authorized_keys
测试公网与 Tailscale 地址 配置系统、UFW、Docker
不能误改成服务器 不能依赖本地隐含状态

最简单的防错方式,是在操作记录中给命令块写清标签。看到 hostnamewhoami 和 IP 后再相信提示符,不要仅凭窗口标题猜测。

一次连接经过哪些关卡

从 WSL2 执行 ssh user@host 时,至少要依次通过:

  1. 本机能够把数据包路由到目标地址;
  2. 目标防火墙允许到达 TCP 22;
  3. sshd 正在监听并响应;
  4. SSH 主机密钥与本地预期一致;
  5. 服务器接受用户公钥,而客户端能用对应私钥签名;
  6. 该 Linux 用户有权启动 shell。

因此,ping 成功只证明一部分网络路径可用,不证明 SSH 一定可用;旧 SSH 会话还活着,也不证明防火墙允许建立新连接。

只读身份检查

[LOCAL: WSL2]
whoami
hostname
uname -a
command -v ssh
ssh -V
ssh-keygen -lf "$LOCAL_SSH_PUBLIC_KEY"
[REMOTE: VPS]
whoami
id
hostnamectl
cat /etc/os-release
uname -a
nproc
free -h
df -h /
ip -brief addr
ip route
systemctl --failed --no-pager

这些命令回答“我是谁、在哪里、系统是什么、资源是否相符、网络接口有哪些、服务是否已经失败”。只有规格与供应商控制台一致时才继续。

变更前的思考顺序

  1. 检查现状:工具、文件、规则或用户可能已经存在。
  2. 定义目标状态:例如“只有 tailscale0 能访问 22”,而不是“执行某条命令”。
  3. 设计验证:变更成功要观察到什么?失败时保留哪条路径?
  4. 小步应用:先添加替代路径,再移除旧路径。
  5. 新会话复测:不要让连接跟踪和缓存制造假成功。

可重复执行而不会产生重复配置的操作称为幂等mkdir -p、检查后再添加规则、使用单独的配置片段,都比盲目覆盖整个文件更容易维护。

主机名、时区和软件包

[REMOTE: VPS]
sudo hostnamectl set-hostname infra-01
sudo timedatectl set-timezone America/Toronto
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt full-upgrade -y
sudo apt install -y git curl ca-certificates jq ufw
  • apt update只刷新“有哪些版本”的索引,不安装升级。
  • apt full-upgrade允许为完成升级而调整依赖,执行前应阅读安装/移除摘要。
  • DEBIAN_FRONTEND=noninteractive适合受控自动化,不代表可以跳过变更审查。
  • /var/run/reboot-required存在时,说明新内核或核心组件需要重启才能完全生效。

Ubuntu 的 phased updates 会分批向机器推送普通更新。被分阶段延后的包不是安装失败;安全更新不会采用这种分阶段方式。先理解原因,不要为了追求“零行输出”强制绕过发布策略。

什么时候必须停

  • 机器规格、系统版本或 IP 与预期明显不符;
  • 需要打印私钥、密码或令牌才能继续;
  • 包管理器准备移除关键系统包;
  • SSH 新连接验证失败;
  • 防火墙规则含义不确定;
  • 磁盘或现有基础设施与预期冲突。

停止不是失败,而是保护仍可恢复的状态。远程机器最昂贵的错误,通常不是命令报错,而是命令“成功”后再也连不上。