拿到一台云服务器后,我必做的 10 分钟初始化
新机器开出来默认是「能用但不安全」的状态:root 直接登录、密码认证、22 端口裸奔在公网上。放到公网上扫一圈,几小时内就会有一堆 SSH 暴力破解日志。这份清单是我每台机器开箱必做的,全程 10 分钟。
以下以 Debian 12 / Ubuntu 22.04+ 为例,CentOS 系把
apt换成dnf、ufw换成firewalld即可。
1. 先更新系统
apt update && apt upgrade -y
apt install -y curl wget git vim htop unzip
reboot # 内核更新后重启一次,别拖国内机器可以先换镜像源,速度差别很大:
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 update2. 建一个普通用户,别一直用 root
adduser baize # 按提示设密码
usermod -aG sudo baize # 给 sudo 权限
# 把本地公钥拷过去(在本地终端执行,不是服务器上)
ssh-copy-id baize@服务器IP没有 ssh-copy-id 就手动追加:把本地 ~/.ssh/id_ed25519.pub 的内容,粘到服务器的 ~/.ssh/authorized_keys,注意权限:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown -R baize:baize ~/.ssh3. 加固 SSH(这一步一定留好后路)
务必:在禁用密码登录之前,先另开一个终端窗口用密钥登录验证成功,再关掉原来的 root 会话。否则配置写错,你就被锁在门外了。
sudo vim /etc/ssh/sshd_configPort 2222 # 换非标准端口,日志里的爆破能少九成
PermitRootLogin no # 禁止 root 直接登录
PasswordAuthentication no # 只允许密钥登录
PubkeyAuthentication yes
PermitEmptyPasswords no
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers baize # 白名单,只放行自己的账号sudo sshd -t # 先检查语法,有错会直接报出来
sudo systemctl restart ssh改端口后,本地 ~/.ssh/config 里记一条,以后不用记 IP 和端口:
Host baize
HostName 1.2.3.4
Port 2222
User baize
IdentityFile ~/.ssh/id_ed25519之后直接 ssh baize 即可。
4. 防火墙只开需要的口子
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
sudo apt install -y fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local写一份最小配置 /etc/fail2ban/jail.d/sshd.local:
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
findtime = 600
bantime = 86400sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd # 查看已封禁数量
sudo fail2ban-client set sshd unbanip 1.2.3.4 # 误封时解禁6. 时区、hostname 和小内存机器的 swap
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=107. 最后:打快照
全部调通之后,去控制台打一份系统盘快照。以后玩崩了(改坏 Nginx 配置、误删目录、装了个奇怪的东西)直接回滚,比从头再来快得多。
排错速查
| 现象 | 最常见的原因 |
|---|---|
| SSH 连不上 | 安全组没放行 / sshd_config 语法错 / 改端口后忘了改本地配置 |
| 端口开了仍访问不了 | 应用只监听 127.0.0.1,需要监听 0.0.0.0 |
| 磁盘满了 | /var/log 日志膨胀,用 journalctl --vacuum-size=200M 清理 |
| 内存吃满 | 先看 htop,再看是不是 MySQL/Java 默认吃太多 |
# 快速体检三件套
df -h
free -h
ss -lntp # 看看到底哪些端口在监听初始化做完,这台机器才算「可以放东西上去了」。
