新买的 VPS 就像一扇没上锁的门,全世界的脚本小子都在敲。这篇文章带你把门锁好。让你的小龙虾(openclaw)不会乱跑乱动。

0、写在前面

刚买了一台 VPS,兴冲冲地拿到 IP 和 root 密码,然后呢?

很多人的做法是:直接开始装软件、部署项目。

这是个危险的习惯。

你的 VPS 有一个公网 IP,意味着全世界任何人都可以尝试连接它。而默认配置下:

  • 端口是公开的 22
  • 用户名是众所周知的 root
  • 只剩一个密码在保护你

每天有无数自动化脚本在扫描 IP 段,尝试用常见密码暴力破解。你的服务器从上线那一刻起,就已经在被攻击了。

所以,拿到 VPS 后的第一件事,不是装软件,而是做安全初始化


1、期望目标

这篇文章的目标是:

  • ✅ 建立安全的远程访问:SSH 密钥登录 + 非默认端口
  • ✅ 创建普通用户:避免直接使用 root
  • ✅ 配置防火墙:只开放必要端口
  • ✅ 启用网络加速:BBR 让网络起飞
  • ✅ 防止暴力破解:fail2ban 自动封禁恶意 IP

做完这些,你的 VPS 就有了一个坚实的基础,可以安心部署各种服务了。


2、计划思考

为什么要做这些配置?

刚买的 VPS 就像一间刚交付的毛坯房:

默认状态 风险 我们的解决方案
root 用户直接登录 权限过大,误操作后果严重 创建普通用户 + sudo
密码登录 可被暴力破解 SSH 密钥登录
默认 22 端口 被扫描器重点照顾 改为非标准端口
防火墙关闭 所有端口对外暴露 UFW 只放行必要端口
原生网络 丢包率高、延迟大 BBR 拥塞控制算法

整体流程

VPS初始化流程

我们按照这个顺序来操作,每一步都会解释为什么这么做。

3、操作步骤

3.1 首次登录与系统更新

获取服务器 IP

购买 VPS 后,服务商会给你:

  • IP 地址:如 192.168.1.100
  • 端口:通常是 22(有些服务商会改成其他端口)
  • 用户名:通常是 root
  • 密码:随机生成的一串字符

VPS 服务商后台的登录信息页面

SSH 连接

Mac / Linux 用户:打开终端,直接输入:

1
2
ssh root@你的服务器IP
# 例如:ssh [email protected]

Windows 用户

  • Windows 10/11 自带 OpenSSH,可以直接在 PowerShell 或 CMD 中使用上面的命令
  • 或者使用 TermiusMobaXterm 等工具

首次连接会看到指纹确认提示:

1
2
3
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

这是在问你:「我不认识这台机器,你确定要连接吗?」

输入 yes 然后回车。接着输入密码(注意:输入时不会显示任何字符,这是正常的安全设计),回车。

首次 SSH 连接的完整过程,包含指纹确认

看到类似这样的提示,说明登录成功:

1
2
3
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.x.x-x-generic x86_64)
...
root@hostname:~#

💡 为什么要确认指纹?

这是为了防止"中间人攻击"。首次连接时记录服务器指纹,以后连接时如果指纹变了,说明可能有人在冒充你的服务器。

登录成功了

初识你的服务器

登录后,先了解一下这台机器的基本情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看系统版本
cat /etc/os-release

# 查看内核版本
uname -r

# 查看 CPU 核心数和型号
nproc
lscpu | grep "Model name"

# 查看内存
free -h

# 查看磁盘
df -h

服务器基本信息输出

记住这些信息,后续排查问题时会用到。

系统更新

了解完服务器信息,第一件正事是更新系统。新服务器的系统镜像可能是几个月前的,期间可能已经有安全补丁发布:

1
2
# 更新软件包列表 + 升级所有软件 + 清理
apt update && apt full-upgrade -y && apt autoremove -y && apt autoclean

参数解释:

  • apt update:更新软件包索引
  • apt full-upgrade:升级所有软件,包括内核
  • -y:自动确认,不用手动输入 yes
  • apt autoremove:删除不再需要的依赖
  • apt autoclean:清理下载的安装包缓存

apt update 和 apt upgrade 执行过程

⏱️ 这一步可能需要几分钟,取决于有多少更新。中间偶尔需要确认的,基本上按它的逻辑来就好了。

检查是否需要重启

内核更新后通常需要重启才能生效:

1
2
# 检查是否需要重启
cat /var/run/reboot-required 2>/dev/null && echo ">>> 需要重启" || echo ">>> 无需重启"

是否需要重启

如果提示需要重启:

1
reboot

重启后需要重新 SSH 连接。

安装常用工具

1
apt install -y sudo curl wget git vim htop tree unzip net-tools ufw fail2ban neofetch

这些工具是干嘛的:

工具 用途
sudo 让普通用户执行管理员命令
curl / wget 下载文件
git 版本控制
vim 文本编辑器
htop 更好看的进程监控
tree 树形显示目录结构
net-tools 网络工具(ifconfig、netstat 等)
ufw 简单好用的防火墙
fail2ban 防暴力破解
neofetch 漂亮地显示系统信息
neofetch 显示的系统信息

3.2 创建非root用户

为什么不直接用 root?

root 用户权限太大了,一个手滑 rm -rf / 就全没了。日常操作应该用普通用户,需要管理员权限时再用 sudo

龙虾(openclaw)可是怪兽呀,咋敢把 root 给它用呢?

创建用户

1
2
# 创建用户(把 ittinker 换成你想要的用户名)
adduser ittinker

系统会提示你设置密码和一些信息:

1
2
3
4
5
6
7
8
New password:              # 输入密码(不会显示)
Retype new password: # 再输入一次
Full Name []: # 可以直接回车跳过
Room Number []: # 回车跳过
Work Phone []: # 回车跳过
Home Phone []: # 回车跳过
Other []: # 回车跳过
Is the information correct? [Y/n] # 输入 Y 确认

adduser 创建用户的完整交互过程

授予 sudo 权限

1
2
# 把用户加入 sudo 组, ittinker 换成你自己上面创建的那个用户
usermod -aG sudo ittinker

验证一下:

1
2
3
4
5
# 切换到新用户 ittinker 换成你自己上面创建的那个用户
su - ittinker

# 测试 sudo 是否生效
sudo whoami

如果输出 root,说明 sudo 配置成功。
测试sudo

💡 小技巧

输入 exit 可以退回 root 用户。后面的操作我们继续用 root 来配置,配置完成后再切换到普通用户。


3.3 配置SSH密钥登录

密钥认证 vs 密码认证

SSH密钥认证原理

密钥认证比密码安全得多:

  • 密码可以被暴力破解,密钥几乎不可能
  • 不用每次输密码,更方便
  • 即使密码泄露,没有私钥也登不上

步骤一:本地生成密钥对

你的电脑(不是服务器)上执行:

1
2
# 生成 ED25519 密钥(推荐,更安全更快)
ssh-keygen -t ed25519 -C "[email protected]"

会提示:

1
Enter file in which to save the key (/Users/你/.ssh/id_ed25519):

直接回车使用默认路径。我们这里用了 ./ittinker ,就是表示存在当前路径下,文件名叫 ittinker

1
Enter passphrase (empty for no passphrase):

可以设置密钥密码(多一层保护),也可以直接回车留空。

本地生成 SSH 密钥的过程

生成完成后,你会在 ~/.ssh/ 目录下看到两个文件(下面是默认文件名,如果前面回车就会这样):

  • id_ed25519私钥,绝对不能泄露!
  • id_ed25519.pub公钥,要上传到服务器

💡 ed25519 vs RSA

ed25519 是目前推荐的算法,比传统的 RSA 更安全、密钥更短。如果你的系统太旧不支持,可以用 ssh-keygen -t rsa -b 4096

一个小细节,ed 25519 生成的 key 是比较小的,rsa 的文件很大,问了 AI 才知道,大小没关系,和算法有关系。

步骤二:上传公钥到服务器

方法 A:使用 ssh-copy-id(推荐)

1
2
# 在你的电脑上执行
ssh-copy-id -i ~/.ssh/id_ed25519.pub yourname@你的服务器IP

输入密码后,公钥会自动复制到服务器。

ssh-copy-id 执行成功

方法 B:手动复制

如果 ssh-copy-id 不可用,可以手动操作:

1
2
# 1. 在你的电脑上,查看公钥内容
cat ~/.ssh/id_ed25519.pub

复制输出的内容(一长串以 ssh-ed25519 开头的文本)。

1
2
3
4
5
6
7
8
9
10
11
# 2. 在服务器上,为新用户创建 .ssh 目录, ittinker 换成你刚刚创建的用户名
mkdir -p /home/ittinker/.ssh
chmod 700 /home/ittinker/.ssh

# 3. 创建 authorized_keys 文件并粘贴公钥
vim /home/ittinker/.ssh/authorized_keys
# 按 i 进入编辑模式,粘贴公钥,按 Esc,输入 :wq 保存退出

# 4. 设置正确的权限
chmod 600 /home/ittinker/.ssh/authorized_keys
chown -R ittinker:ittinker /home/ittinker/.ssh

⚠️ 权限很重要!

SSH 对文件权限有严格要求:

  • .ssh 目录:700(只有用户自己能访问)
  • authorized_keys 文件:600(只有用户自己能读写)

权限不对的话,SSH 会拒绝使用密钥登录。

步骤三:测试密钥登录

新开一个终端窗口(保持原窗口不要关,万一配置错了还能补救),测试密钥登录:

1
ssh ittinker@你的服务器IP

如果不需要输入密码就能登录,说明密钥配置成功!🎉

(如果你给私钥设置了 passphrase,会提示输入私钥密码,这是正常的)
使用密钥成功登录(无需服务器密码)

这里我们加了一个 -i 参数,是因为这个 key,我们不是默认路径,而是放在当前路径下,如果不指定,系统会使用默认 key。


3.4 SSH安全加固

现在密钥登录已经可以用了,我们来加固 SSH:

  1. 修改默认端口(避免被扫描)
  2. 禁用密码登录
  3. 禁止 root 直接登录

编辑 SSH 配置文件

1
2
3
4
5
# 备份原配置
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 编辑配置
nano /etc/ssh/sshd_config

修改前

找到并修改以下配置(有些可能被注释了,去掉前面的 #):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 修改端口(选一个 1024-65535 之间的数字)
Port 22000

# 禁止 root 登录
PermitRootLogin no

# 允许密钥登录
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

# 禁止密码登录(确保密钥登录测试成功后再改!)
PasswordAuthentication no

# 使用更安全的 SSH2 协议
Protocol 2

# 最大认证尝试次数
MaxAuthTries 3

# 客户端超时设置
ClientAliveInterval 300
ClientAliveCountMax 2

修改后的 sshd_config 关键配置

保存并退出(ctrl + o)。

Nano 保存是 ctrl + o,它会给文件名,直接回车,退出就是 ctrl + x

重启 SSH 服务

1
systemctl restart sshd.service

⚠️ 重要提醒!

不要关闭当前终端! 先在新窗口测试新配置能否正常登录:

1
ssh -p 22000 yourname@你的服务器IP

如果能登录,再关闭旧窗口。如果登不上,还可以在旧窗口里修复配置。

如果你买的是轻量服务器,大概率这个端口改不了,传统的 ECS 是可以修改的,要注意。


3.5 配置UFW防火墙

UFW防火墙规则

UFW(Uncomplicated Firewall)是 Ubuntu 默认的防火墙工具,配置简单但功能强大。

基本配置

1
2
3
4
5
6
7
8
9
10
11
# 设置默认策略:拒绝所有入站,允许所有出站
ufw default deny incoming
ufw default allow outgoing

# 允许 SSH(使用你设置的端口)
ufw allow 22000/tcp comment 'SSH'
ufw allow 22/tcp comment 'SSH' # 如果是轻量服务器,还是开22端口

# 允许 HTTP 和 HTTPS
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'

启用防火墙

1
ufw enable

会提示:

1
Command may disrupt existing ssh connections. Proceed with operation (y|n)?

输入 y 确认。

检查状态

1
ufw status verbose

ufw status 的输出结果

23022 是我敲错了,大家按自己的实际情况来就好了

输出类似:

1
2
3
4
5
6
7
8
9
10
11
12
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)

To Action From
-- ------ ----
22000/tcp (SSH) ALLOW IN Anywhere
80/tcp (HTTP) ALLOW IN Anywhere
443/tcp (HTTPS) ALLOW IN Anywhere
22000/tcp (SSH (v6)) ALLOW IN Anywhere (v6)
80/tcp (HTTP (v6)) ALLOW IN Anywhere (v6)
443/tcp (HTTPS (v6)) ALLOW IN Anywhere (v6)

常用命令速查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看状态
ufw status

# 添加规则
ufw allow 8080/tcp

# 删除规则
ufw delete allow 8080/tcp

# 允许特定 IP 访问所有端口
ufw allow from 192.168.1.100

# 禁用防火墙(不推荐)
ufw disable

# 重置所有规则
ufw reset

3.6 开启BBR加速

BBR(Bottleneck Bandwidth and Round-trip propagation time)是 Google 开发的 TCP 拥塞控制算法,可以显著提升网络性能。

一键开启

1
2
3
4
5
6
# 添加 BBR 配置
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

# 使配置生效
sysctl -p

验证是否开启

1
2
# 查看当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control

输出应该是:

1
net.ipv4.tcp_congestion_control = bbr
1
2
# 确认 BBR 模块已加载
lsmod | grep bbr

输出类似:

1
tcp_bbr    20480  3

💡 BBR 的效果

开启 BBR 后,特别是在网络不稳定或高延迟的环境下,你会明显感觉到:

  • 下载速度更快
  • SSH 操作更流畅
  • 网页加载更快

bbr 开启


3.7 配置fail2ban防暴力破解

fail2ban 会监控日志,发现多次登录失败的 IP 后自动封禁。

基本配置

1
2
3
4
5
# 复制默认配置(不要直接修改 jail.conf)
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

# 编辑配置
vim /etc/fail2ban/jail.local

找到 [sshd] 部分,确保以下配置:

1
2
3
4
5
6
7
8
[sshd]
enabled = true
port = 22000 # 改成你的 SSH 端口
filter = sshd
logpath = /var/log/auth.log
maxretry = 3 # 最大尝试次数
bantime = 3600 # 封禁时间(秒),这里是 1 小时
findtime = 600 # 在这个时间窗口内

fail2ban

启动服务

1
2
3
4
5
# 重启 fail2ban
systemctl restart fail2ban

# 设置开机自启
systemctl enable fail2ban

查看状态

1
2
3
4
5
# 查看 fail2ban 状态
fail2ban-client status

# 查看 SSH 监控状态
fail2ban-client status sshd

fail2ban-client status sshd 的输出

输出类似:

1
2
3
4
5
6
7
8
9
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:

常用命令

1
2
3
4
5
6
7
8
# 手动封禁 IP
fail2ban-client set sshd banip 1.2.3.4

# 手动解封 IP
fail2ban-client set sshd unbanip 1.2.3.4

# 查看被封禁的 IP
fail2ban-client status sshd

3.8 [可选] SSH Config 多服务器管理

如果你有多台服务器,每次输入 ssh -p 22000 user@ip 很麻烦。可以用 SSH Config 来简化。

配置文件

你的本地电脑上编辑 ~/.ssh/config

1
vim ~/.ssh/config

添加配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 第一台服务器
Host vps1
HostName 192.168.1.100
User yourname
Port 22000
IdentityFile ~/.ssh/id_ed25519

# 第二台服务器
Host vps2
HostName 192.168.1.101
User admin
Port 22222
IdentityFile ~/.ssh/id_ed25519

# 通用设置(应用于所有连接)
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes

使用方法

现在可以直接用别名连接:

1
2
3
4
5
# 连接第一台服务器
ssh vps1

# 连接第二台服务器
ssh vps2

省去了记 IP、端口、用户名的麻烦!


3.9 [可选] 仅允许Cloudflare访问

如果你的网站完全在 Cloudflare 后面,可以设置只允许 Cloudflare 的 IP 访问 80/443 端口,增加安全性。

⚠️ 注意:这个配置需要你的域名已经接入 Cloudflare CDN。

自动配置脚本

1
2
3
4
5
6
7
8
# 下载脚本
wget -O ~/.cloudflare-ufw.sh https://gist.githubusercontent.com/Xm798/12560579ce11f62027ea8da1fae37456/raw/b07ac8cfe09badf02fc70e2d8bc2da68cabbda50/cloudflare-ufw.sh

# 添加执行权限
chmod +x ~/.cloudflare-ufw.sh

# 执行脚本
~/.cloudflare-ufw.sh

这个脚本会:

  1. 从 Cloudflare 官方获取最新的 IP 段
  2. 添加 UFW 规则,只允许这些 IP 访问 80/443
  3. 重新加载 UFW

设置定时更新

Cloudflare 的 IP 段可能会变化,设置每周自动更新:

1
2
# 添加 cron 任务(每周一凌晨执行)
(crontab -l 2>/dev/null; echo "0 0 * * 1 /root/.cloudflare-ufw.sh > /dev/null 2>&1") | crontab -

3.10 设置时区

默认时区可能是 UTC,改成你所在的时区方便看日志:

1
2
3
4
5
6
7
8
# 查看当前时区
timedatectl

# 设置为上海时区(中国用户)
sudo timedatectl set-timezone Asia/Shanghai

# 验证
date

设置时区


3.11 [可选] 配置自动安全更新

让系统自动安装安全补丁,省得每次手动操作:

1
2
3
4
5
# 安装自动更新工具
sudo apt install -y unattended-upgrades

# 配置
sudo dpkg-reconfigure --priority=low unattended-upgrades

选择「Yes」启用自动更新。

💡 这个功能会自动安装安全更新,不会自动升级到新的大版本,相对安全。


4、总结

初始化检查清单

完成以上配置后,用这个清单检查一遍:

检查项 命令 预期结果
系统已更新 apt update && apt list --upgradable 没有可升级的包
普通用户可 sudo sudo whoami 输出 root
密钥登录正常 ssh yourname@ip -p port 无需密码登录
密码登录已禁用 grep PasswordAuth /etc/ssh/sshd_config PasswordAuthentication no
SSH 端口已修改 grep Port /etc/ssh/sshd_config 你设置的端口
防火墙已启用 ufw status Status: active
BBR 已开启 sysctl net.ipv4.tcp_congestion_control = bbr
fail2ban 运行中 systemctl status fail2ban active (running)
时区已设置 timedatectl Asia/Shanghai 或你的时区
本地 SSH Config cat ~/.ssh/config 已配置服务器别名

关键文件位置

1
2
3
4
/etc/ssh/sshd_config        # SSH 服务端配置
~/.ssh/authorized_keys # 允许登录的公钥
~/.ssh/config # 本地 SSH 客户端配置(在你电脑上)
/etc/fail2ban/jail.local # fail2ban 配置

安全最佳实践

  1. 定期更新系统apt update && apt upgrade
  2. 定期检查登录日志lastb(失败登录)、last(成功登录)
  3. 及时关注 fail2ban 封禁情况
  4. 重要配置文件修改前先备份

5、异常记录

Q1:密钥登录失败,还是要输密码?

可能原因:

  1. 权限问题(最常见)

    1
    2
    3
    # 检查并修复权限
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
  2. 公钥没有正确复制

    1
    2
    3
    # 检查 authorized_keys 内容
    cat ~/.ssh/authorized_keys
    # 应该是一行完整的公钥,以 ssh-ed25519 或 ssh-rsa 开头
  3. SELinux 干扰(CentOS/RHEL 系统)

    1
    restorecon -Rv ~/.ssh

Q2:改端口后连不上了?

排查步骤:

  1. 确认新端口在防火墙中已开放:

    1
    ufw status | grep 你的端口
  2. 确认 SSH 配置正确:

    1
    grep Port /etc/ssh/sshd_config
  3. 确认 SSH 服务正在运行:

    1
    systemctl status sshd
  4. 如果完全连不上,用服务商的 VNC/控制台 登录修复。

Q2.5:修改端口根本不生效?(云厂商轻量服务器)

现象:改了 /etc/ssh/sshd_config,重启服务后 22 端口还在,新端口没生效。

诊断方法

bash

1
2
# 查看是谁在监听 22 端口
netstat -lntp | grep :22

如果输出类似:

1
tcp  0  0.0.0.0:22  0.0.0.0:*  LISTEN  1/init

说明 22 端口是由 init(PID 1)监听的,而不是 sshd 进程。

原因:部分云厂商的「轻量应用服务器」或「容器实例」的 SSH 是由平台层代理的,你服务器内部的 sshd 配置不起作用。

解决方案

实例类型 SSH 端口修改方式
传统 ECS 修改 sshd_config ✅
轻量服务器 可能需要在云控制台修改,或根本不支持
容器实例 通常不支持修改

如果你的实例不支持改端口,其他安全措施更重要

  • ✅ 创建普通用户 + 禁用 root 登录
  • ✅ SSH 密钥登录 + 禁用密码登录
  • ✅ fail2ban 防暴力破解

这些措施做到位,安全性依然很高。

Q3:fail2ban 把我自己封了?

1
2
3
4
5
# 用 VNC 登录后解封
fail2ban-client set sshd unbanip 你的IP

# 把你的 IP 加入白名单,编辑 jail.local
ignoreip = 127.0.0.1/8 ::1 你的IP

Q4:UFW 启用后网站访问不了?

1
2
3
4
5
6
# 检查 80/443 是否开放
ufw status

# 如果没有,添加规则
ufw allow 80/tcp
ufw allow 443/tcp

Q5:执行命令提示找不到 sudo?

Debian 最小化安装可能没有 sudo,用 root 安装:

1
2
apt install sudo
usermod -aG sudo ittinker

6、一键初始化脚本(熟练后使用)

如果你已经熟悉了上面的步骤,可以用这个脚本快速初始化。

⚠️ 注意:运行脚本前,先确保你已经准备好了 SSH 公钥。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/bash
# VPS 初始化脚本
# 使用方法:以 root 身份运行

set -e

# === 配置区域(根据你的需求修改)===
NEW_USER="ittinker" # 新用户名
NEW_SSH_PORT="22000" # 新 SSH 端口
TIMEZONE="Asia/Shanghai" # 时区
# =====================================

echo "=== VPS 初始化脚本 ==="
echo ""

# 1. 更新系统
echo "[1/8] 更新系统..."
apt update && apt upgrade -y

# 2. 安装基础工具
echo "[2/8] 安装基础工具..."
apt install -y sudo curl wget git vim htop tree unzip net-tools ufw fail2ban neofetch

# 3. 创建新用户
echo "[3/8] 创建用户 $NEW_USER..."
if id "$NEW_USER" &>/dev/null; then
echo "用户已存在,跳过创建"
else
adduser --gecos "" $NEW_USER
usermod -aG sudo $NEW_USER
fi

# 4. 配置 SSH 目录
echo "[4/8] 配置 SSH 目录..."
mkdir -p /home/$NEW_USER/.ssh
chmod 700 /home/$NEW_USER/.ssh
touch /home/$NEW_USER/.ssh/authorized_keys
chmod 600 /home/$NEW_USER/.ssh/authorized_keys
chown -R $NEW_USER:$NEW_USER /home/$NEW_USER/.ssh

echo ""
echo ">>> 请将你的公钥粘贴到下面(粘贴后按 Ctrl+D 结束):"
cat >> /home/$NEW_USER/.ssh/authorized_keys
echo ""

# 5. 修改 SSH 配置
echo "[5/8] 修改 SSH 配置..."
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sed -i "s/^#*Port .*/Port $NEW_SSH_PORT/" /etc/ssh/sshd_config
sed -i "s/^#*PermitRootLogin .*/PermitRootLogin no/" /etc/ssh/sshd_config
sed -i "s/^#*PasswordAuthentication .*/PasswordAuthentication no/" /etc/ssh/sshd_config
sed -i "s/^#*PermitEmptyPasswords .*/PermitEmptyPasswords no/" /etc/ssh/sshd_config

# 6. 配置防火墙
echo "[6/8] 配置防火墙..."
ufw default deny incoming
ufw default allow outgoing
ufw allow $NEW_SSH_PORT/tcp
ufw allow 80/tcp
ufw allow 443/tcp
echo "y" | ufw enable

# 7. 开启 BBR
echo "[7/8] 开启 BBR..."
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p

# 8. 设置时区
echo "[8/8] 设置时区..."
timedatectl set-timezone $TIMEZONE

# 重启 SSH
systemctl restart sshd

echo ""
echo "=========================================="
echo " ✅ 初始化完成!"
echo "=========================================="
echo ""
echo " 新 SSH 端口: $NEW_SSH_PORT"
echo " 新用户: $NEW_USER"
echo " 时区: $TIMEZONE"
echo ""
echo " 请使用以下命令登录:"
echo " ssh -p $NEW_SSH_PORT $NEW_USER@$(curl -s ifconfig.me 2>/dev/null || echo '你的IP')"
echo ""
echo " ⚠️ 重要:请先测试新配置能否登录,再关闭当前终端!"
echo ""

7、做完这些,安全性提升了多少?

步骤 做了什么 为什么重要
更新系统 安装最新补丁 修复已知漏洞
创建新用户 不再直接用 root 减少误操作风险
SSH 密钥 用密钥替代密码 无法被暴力破解
修改端口 躲开默认的 22 减少被扫描到的概率
禁用密码 只允许密钥登录 彻底杜绝密码攻击
禁用 root root 不能直接登录 增加攻击难度
UFW 防火墙 只开放必要端口 减少攻击面
BBR 加速 优化网络性能 提升访问速度
fail2ban 自动封禁恶意 IP 防止持续攻击

做完这些,你的服务器安全性已经超过了 90% 的 VPS。


下一篇预告

下一篇我们来讲 SSH密钥登录配置速查,会更详细地介绍:

  • 不同系统生成密钥的方法
  • 多密钥管理
  • SSH Agent 配置
  • 常见 SSH 客户端设置

本文最后更新:2026年1月

独立开发者工具箱系列,欢迎关注!