科学上网·自建篇(一):VPS 服务器环境搭建与安全加固
很多人拿到VPS后的第一反应是“赶紧把代理装上”,但这一篇想强调一个更重要的前置步骤:先把服务器本身加固好,再谈部署。一台配置不当的服务器,本身就是一个安全隐患,无论上面跑的是什么协议。
- 本文是《科学上网完全指南》系列第16篇。查看完整专题目录。
一、操作系统选择
| 系统 | 特点 | 建议 |
|---|---|---|
| Debian(长期支持版本) | 稳定性高,更新相对保守,社区资料丰富 | 追求长期稳定运行的首选之一 |
| Ubuntu(LTS长期支持版本) | 在Debian基础上,软件包相对新一些,新手资料同样丰富 | 兼顾稳定性和易用性的常见选择 |
| CentOS系(如Rocky Linux、AlmaLinux等替代发行版) | CentOS官方版本已终止维护,目前社区更多转向这些兼容替代发行版 | 如果有企业级Red Hat生态使用习惯,可以考虑,但对新手不是首选 |
建议:如果没有特殊的生态依赖,直接选择Debian或Ubuntu的长期支持(LTS)版本即可,两者社区资料最丰富,遇到问题也最容易找到解决方案。
二、实操步骤
在保留“用户名 + 密码”登录习惯的前提下,尽可能提升服务器的安全性——本文将手把手带你完成一套系统化的 VPS 安全加固方案。无论你使用的是 Debian 12 还是 Ubuntu(如 22.04 / 24.04),都可以无缝对照执行。
SSH密钥认证比密码认证更安全:传统的密码登录方式,本质上是“你知道一个字符串,服务器验证这个字符串是否正确”,这种方式天然存在被暴力破解(不断尝试各种密码组合)的风险。SSH密钥认证采用非对称加密原理:你在本地生成一对密钥(公钥和私钥),公钥放在服务器上,私钥留在你自己的设备上,登录时通过密码学方式验证你确实持有对应的私钥,私钥本身从始至终不需要在网络上传输,这从原理上就杜绝了暴力破解密码的攻击方式。但为了保留大部分新手的操作习惯,以及我们搭建节点的VPS本身不会存储敏感重要的内容,本文不讲解SSH密钥认证,保留“用户名 + 密码”登录方式。
通过SSH登录VPS
打开 Finalshell ,通过 SSH 链接 VPS 。
双击刚添加的VPS,登录SSH。
在弹出的安全警告提示框内点击 接受并保存。
登录完成。
第一步:更新系统软件包
- 做什么:把系统自带的所有底层软件和安全补丁升级到最新状态。
- 为什么:刚装好的系统可能包含一些已知的漏洞,更新它们可以封堵潜在的安全隐患。
- 命令(Debian / Ubuntu 通用):
sudo apt update && sudo apt upgrade -y
命令解释:
sudo:以最高管理员权限临时执行命令。apt update:刷新软件源列表,告诉系统哪里可以下载最新的软件。&&:连接符,代表前面命令成功后接着执行后面的命令。apt upgrade -y:开始升级所有可以升级的软件。-y的意思是中途如果问你“是否继续”,自动回答“是”。
第二步:创建一个普通用户并赋予管理员权限
- 做什么:新建一个专属于你自己的普通账号(例如叫
myuser),并把它加入管理员组。 - 为什么:Linux 系统默认最高权限账户叫
root。黑客攻击 VPS 的首要目标就是猜 root 的密码。如果我们平时用普通用户登录,即使密码不小心泄露了,对方也无法直接拿到整台服务器的最高控制权。 - 命令(请把
myuser换成你想用的英文用户名):
sudo adduser myuser
执行后会依次要求你输入两次密码(输入时屏幕上不会显示密码字符,属正常现象,输完直接回车即可),随后还会询问 Full Name、Room Number、Work Phone 等一系列个人信息,这些信息与账号安全无关,全部直接回车跳过即可,最后系统会让你确认信息无误,输入 Y 并回车即可完成用户创建。
接着,把这个新用户加入管理员组。Ubuntu 默认已预装 sudo 命令及对应的 sudo 用户组,可以直接执行下一步;但部分 Debian 精简安装(如 netinst 版本)可能没有预装 sudo,需要先手动安装:
sudo apt install sudo -y # 若系统已自带 sudo,此命令不会造成任何影响,可放心执行
确认 sudo 可用后,将新用户加入 sudo 组(Debian 和 Ubuntu 在这一步完全相同):
sudo usermod -aG sudo myuser
第三步:修改 SSH 登录配置(核心防线)
- 做什么:修改远程连接配置文件,关闭最高权限用户(root)直接登录,并把默认的 22 端口改成一个冷门端口。
- 为什么:
PermitRootLogin no:彻底切断黑客直接暴力破解 root 账户的通道。- 修改端口(比如改成
50022):互联网上 99% 的自动化攻击脚本只会死盯着 22 端口撞库。换掉端口后,这些脚本直接就找不到大门了。
打开 SSH 配置文件:
sudo nano /etc/ssh/sshd_config
在打开的文件中,找到以下几行(如果前面有 # 号,代表被注释了,记得把 # 号删掉):
Port 22 # 改成你想用的端口,例如:Port 50022 PermitRootLogin no # 确保这里是 no(禁止 root 远程登录) PasswordAuthentication yes # 保留 yes(允许你使用密码登录)
修改方法:修改好后,按下键盘上的 Ctrl + O 保存,然后按 Enter 确认,再按 Ctrl + X 退出。
修改完成后,重启 SSH 服务让配置生效:
sudo systemctl restart ssh
⚠️ 极度重要提醒:在断开当前连接前,请务必新开一个终端窗口,用你刚创建的新用户和新端口,测试一下能不能连上。确认无误后再关掉旧窗口!若重启后新配置似乎没有生效,可检查 /etc/ssh/sshd_config.d/ 目录下是否存在其他配置文件覆盖了同一项设置。
第四步:配置 UFW 防火墙(最小权限原则)
- 做什么:开启系统的 UFW 防火墙,默认拒绝所有外来的不速之客,只放行我们需要用的端口。
- 为什么:这就好比给房子装上防盗门,只留一扇小窗户(SSH 端口)和几个业务通风口(如 3x-ui 面板端口),其余所有端口全部上锁。
- 命令(Debian / Ubuntu 通用):
Ubuntu 通常已预装 UFW,Debian 则大多需要手动安装;不确定的话直接执行以下命令即可,若已安装不会有任何副作用:
sudo apt install ufw -y
设置默认规则(拒绝所有进来的,允许所有出去的):
sudo ufw default deny incoming sudo ufw default allow outgoing
放行你刚才修改的 SSH 端口(假设你改成了 50022):
sudo ufw allow 50022/tcp
放行你未来准备安装的 3x-ui 面板端口(假设是 2053)以及你的节点传输端口(假设是 443):
sudo ufw allow 2053/tcp sudo ufw allow 443/tcp
基本原则是:只开放你确实需要用到的端口,其余一律保持关闭状态。
启动防火墙:(会提示你可能会断开连接,输入 y 回车即可)
sudo ufw enable
查看防火墙状态:
sudo ufw status
第五步:安装并配置 Fail2ban(防密码暴力破解)
- 做什么:安装一个智能安全卫士(Fail2ban)。它会自动盯着你的 SSH 登录日志,如果有人连续输错密码超过指定次数,它会立刻出手,直接在防火墙里把对方的 IP 地址封掉。
- 为什么:因为我们保留了
PasswordAuthentication yes(密码登录),黑客可能会尝试用程序暴力猜密码。有了 Fail2ban,对方只要连续输错 3 次,就会被关进“小黑屋”一整天。 - 命令(Debian / Ubuntu 通用):
sudo apt install fail2ban -y
复制一份默认配置文件作为本地自定义配置:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
打开配置文件:
sudo nano /etc/fail2ban/jail.local
在文件中找到 [sshd] 这一段,修改或核对以下参数:
[sshd] enabled = true port = 50022 # 填入你在第三步修改的 SSH 端口! maxretry = 3 # 允许最大输错密码次数 bantime = 86400 # 封禁时间(秒,86400秒 = 24小时)
保存并退出(Ctrl + O → Enter → Ctrl + X)。
启动并设置开机自启:
sudo systemctl enable --now fail2ban
第六步:校准时区与时间同步(建议,但非必要)
- 做什么:把服务器的时区修改为中国上海时间(CST),并开启自动时间校准。
- 为什么:
- 新 VPS 默认是 UTC 时间,查看日志时和国内有 8 小时时差。
- 科学上网协议(尤其是 VLESS-Reality、Hysteria 2 等现代加密协议)对时间精度要求很高。如果服务器时间漂移过大,会导致客户端与服务端时间对不上,直接导致节点连不上。
- 命令(Debian / Ubuntu 通用):
sudo timedatectl set-timezone Asia/Shanghai
检查时区和时间同步状态:
timedatectl
检查标准:
- 看到
Time zone: Asia/Shanghai (CST, +0800)说明时区正确。 - 看到
System clock synchronized: yes说明系统正在自动联网校准时间。
完成以上配置之后,你的服务器已经具备了基本的安全底线,可以放心进入下一步的协议部署环节。
三、下一步
服务器环境准备好之后,接下来是根据第06篇选定的协议进行实际部署,详见第17篇《代理协议部署逻辑详解》。