拿到一台云服务器后,我必做的 10 分钟初始化

新机器开出来默认是「能用但不安全」的状态:root 直接登录、密码认证、22 端口裸奔在公网上。放到公网上扫一圈,几小时内就会有一堆 SSH 暴力破解日志。这份清单是我每台机器开箱必做的,全程 10 分钟。

以下以 Debian 12 / Ubuntu 22.04+ 为例,CentOS 系把 apt 换成 dnfufw 换成 firewalld 即可。

1. 先更新系统

bash
apt update && apt upgrade -y
apt install -y curl wget git vim htop unzip
reboot   # 内核更新后重启一次,别拖

国内机器可以先换镜像源,速度差别很大:

bash
cp /etc/apt/sources.list /etc/apt/sources.list.bak
cat > /etc/apt/sources.list <<EOF
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security/ bookworm-security main contrib non-free
EOF
apt update

2. 建一个普通用户,别一直用 root

bash
adduser baize            # 按提示设密码
usermod -aG sudo baize   # 给 sudo 权限

# 把本地公钥拷过去(在本地终端执行,不是服务器上)
ssh-copy-id baize@服务器IP

没有 ssh-copy-id 就手动追加:把本地 ~/.ssh/id_ed25519.pub 的内容,粘到服务器的 ~/.ssh/authorized_keys,注意权限:

bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R baize:baize ~/.ssh

3. 加固 SSH(这一步一定留好后路)

务必:在禁用密码登录之前,先另开一个终端窗口用密钥登录验证成功,再关掉原来的 root 会话。否则配置写错,你就被锁在门外了。

bash
sudo vim /etc/ssh/sshd_config
nginx
Port 2222                    # 换非标准端口,日志里的爆破能少九成
PermitRootLogin no           # 禁止 root 直接登录
PasswordAuthentication no    # 只允许密钥登录
PubkeyAuthentication yes
PermitEmptyPasswords no
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers baize             # 白名单,只放行自己的账号
bash
sudo sshd -t          # 先检查语法,有错会直接报出来
sudo systemctl restart ssh

改端口后,本地 ~/.ssh/config 里记一条,以后不用记 IP 和端口:

nginx
Host baize
    HostName 1.2.3.4
    Port 2222
    User baize
    IdentityFile ~/.ssh/id_ed25519

之后直接 ssh baize 即可。

4. 防火墙只开需要的口子

bash
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 2222/tcp comment "ssh"
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

云服务器还有一层安全组(厂商控制台里),它是包在 ufw 外面的。两边都要放行,只改一边会表现为「明明开了端口还是连不上」。

5. 装 fail2ban,自动拉黑爆破 IP

bash
sudo apt install -y fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

写一份最小配置 /etc/fail2ban/jail.d/sshd.local

nginx
[sshd]
enabled  = true
port     = 2222
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 3
findtime = 600
bantime  = 86400
bash
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd     # 查看已封禁数量
sudo fail2ban-client set sshd unbanip 1.2.3.4   # 误封时解禁

6. 时区、hostname 和小内存机器的 swap

bash
sudo timedatectl set-timezone Asia/Shanghai
sudo hostnamectl set-hostname baize-node-1

# 1G~2G 内存的小鸡建议加 1G swap,编译时能救命
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile && sudo swapon /swapfile
echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstab
sudo sysctl -w vm.swappiness=10

7. 最后:打快照

全部调通之后,去控制台打一份系统盘快照。以后玩崩了(改坏 Nginx 配置、误删目录、装了个奇怪的东西)直接回滚,比从头再来快得多。

排错速查

现象最常见的原因
SSH 连不上安全组没放行 / sshd_config 语法错 / 改端口后忘了改本地配置
端口开了仍访问不了应用只监听 127.0.0.1,需要监听 0.0.0.0
磁盘满了/var/log 日志膨胀,用 journalctl --vacuum-size=200M 清理
内存吃满先看 htop,再看是不是 MySQL/Java 默认吃太多
bash
# 快速体检三件套
df -h
free -h
ss -lntp      # 看看到底哪些端口在监听

初始化做完,这台机器才算「可以放东西上去了」。