新买的 VPS,就像一间毛坯房:门锁是默认的、窗户没关、邻居还全是陌生人。如果直接拎包入住,既不安全也不舒适。我们得先换一把只有自己知道的锁、关上不必要的窗户、再装上基本家具。这篇指南,就是你的 VPS”入住装修清单“——只需跟着走一遍,就能把空荡荡的 root 权限,调教成一座安安稳稳的数字小窝。
零、准备工作
首先,我们以root用户身份登录到服务器。root是Linux系统中的超级管理员,拥有最高权限。
ssh root@你的服务器IP地址
连接过程中,系统可能会询问你是否信任该主机的指纹,输入yes并回车。接着,输入你的初始密码。成功登录后,你将看到服务器的命令行欢迎信息。
一、首次登录与更新系统
登录后的首要任务是更新系统。 这可以确保所有已安装的软件包都打上了最新的安全补丁。
# 更新软件包列表信息
sudo apt update
# 升级所有已安装的软件包
sudo apt upgrade -y
这里的 -y 参数会自动确认所有升级提示,节省时间。
二、创建新用户并授予管理员权限
一直使用root用户操作服务器是一个非常危险的习惯。任何误操作都可能对系统造成毁灭性打击,并且它也是黑客们最喜欢攻击的目标。因此,我们需要创建一个新的日常使用账户,并赋予它sudo权限(即在需要时临时获取管理员权限)。
1、创建一个新用户
adduser your_username
# 将 your_username 替换为你想要的用户名
2、授予sudo权限
usermod -aG sudo your_username
# 这条命令将新创建的用户添加到了sudo用户组,使其能够执行管理员命令
3、验证新用户
现在,退出root登录,然后用你的新用户名重新登录:
ssh your_username@你的服务器IP地址
登录后,尝试执行一个需要sudo的命令来验证权限是否生效,比如更新软件包列表:
sudo apt update
系统会要求你输入你自己的密码(而不是root密码)。如果命令成功执行,说明权限配置正确。
三、加固SSH服务,提升安全性
SSH是我们远程管理服务器的唯一入口,保护好它至关重要。
1、禁用root用户远程登录
既然我们已经有了sudo用户,就应该禁止root直接通过SSH登录。 用你喜欢的文本编辑(如 nano 或 vim)打开SSH配置文件。nano对新手更友好。
sudo nano /etc/ssh/sshd_config
在文件中找到 PermitRootLogin 这一行,修改为 no:
PermitRootLogin no
# 如果这一行前面有 #,请将 # 删除。
2、(强烈推荐) 更改默认SSH端口
SSH默认使用22端口,这使得它成为自动化扫描和攻击的首要目标。
通过更改端口,可以有效避开大部分的自动攻击。 在同一个配置文件 (/etc/ssh/sshd_config) 中,找到 #Port 22 这一行。
首先去掉 #,然后将 22 改成一个不常用的端口号(范围建议在 1024-65535 之间,例如 2584)。
Port 2584
重要提示: 在修改端口后,请务必先配置好防火墙(如果有的话)并允许新端口通过,否则你可能会将自己锁在服务器外面!
3、应用更改
保存文件并退出 (nano中按 Ctrl+X, 然后按 Y, 最后按回车)。接着,重启SSH服务让配置生效。
sudo systemctl restart sshd
不要立即关闭当前的SSH连接! 打开一个新的终端窗口,尝试用新的端口和新的用户名登录,确保一切正常。
ssh -p 新端口号 your_username@你的服务器IP地址
# 示例: ssh -p 2255 your_username@192.0.2.1
确认新连接成功后,再关闭旧的连接。
四、配置基础防火墙
防火墙是服务器的第一道防线。UFW (Uncomplicated Firewall) 是一个非常易于使用的防火墙管理工具,使用系统底层的iptables进行设置。
1、安装UFW
sudo apt install ufw
2、设置默认规则
先禁止所有传入连接,允许所有传出连接。这是一个安全的基准。
sudo ufw default deny incoming
sudo ufw default allow outgoing
3、允许必要的连接
我们需要允许SSH、HTTP和HTTPS的流量进入。
首先是SSH端口:
sudo ufw allow 2584/tcp
如果你计划部署网站,也需要允许HTTP和HTTPS:
sudo ufw allow http # 80端口
sudo ufw allow https # 443端口
4、启用防火墙
sudo ufw enable
系统会警告你这可能会中断现有连接,输入y确认。因为我们已经允许了SSH端口,所以连接不会中断。
5、检查防火墙状态
sudo ufw status verbose
这将显示所有规则和防火墙的当前状态。
五、安装Fail2ban防御工具
1、创建自定义配置
复制默认配置文件:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
2、编辑配置文件
sudo nano /etc/fail2ban/jail.local
常见配置参数:
[DEFAULT]
ignoreip = 127.0.0.1/8 # 白名单IP
bantime = 3600 # 封禁时长(秒)
findtime = 600 # 检测时间段(秒)
maxretry = 5 # 最大尝试次数
[sshd] # SSH服务配置
enabled = true # 启用监控
3、重启服务
sudo systemctl restart fail2ban
sudo systemctl enable fail2ban # 开机自启
查看一下状态:
sudo fail2ban-client status
检查封禁列表:
sudo fail2ban-client status sshd
六、设置系统时间
将系统时间设置为北京时间,推荐使用 timedatectl 命令。
北京时间的正确时区标识符是 Asia/Shanghai。您看到的错误消息是因为该工具要求使用较旧、不太常见的 POSIX 格式,但现代系统使用 Area/Location 格式。
这是大多数现代 Linux 发行版(如 Ubuntu、Debian、CentOS 和 Fedora)的标准系统范围方法。
1、设置时区
在您的终端中运行以下命令。您可能需要 sudo 权限。
sudo timedatectl set-timezone Asia/Shanghai
2、验证更改
您可以通过运行以下任一命令来检查更改是否成功:
timedatectl
这将向您显示本地时间、世界标准时间 (UTC) 和当前设置的时区。
或者简单地:
date
输出现在应该显示 CST(中国标准时间)和正确的时间。
七、使用SSH密钥登录(可选)
远程管理服务器的标准做法,它比密码登录更安全、更便捷。下面是一份详尽的指南,将带你完成从生成密钥到实现免密登录的全过程。
这个过程分为两个主要步骤:
- 在你的本地电脑(客户端)上生成密钥对。
- 将公钥上传到你的服务器(服务端)。
1、在你的本地电脑上生成SSH密钥对
你需要先在自己的电脑(而不是服务器)上操作。密钥对由一个私钥和一个公钥组成:
- 私钥 (
id_ed25519): 必须严格保密,留存在你的本地电脑上,相当于你的“身份证明”。 - 公钥 (
id_ed25519.pub): 可以安全地分享,需要被放置在你想登录的服务器上,相当于一把“锁”。
A、打开终端
- macOS / Linux: 打开“终端” (Terminal) 应用。
- Windows: 打开 Windows Terminal, PowerShell, 或 Git Bash。
B、运行密钥生成命令
我们使用 ssh-keygen 命令来生成密钥。推荐使用现代且安全的 Ed25519 算法。
Bash
ssh-keygen -t ed25519 -C "your_email@example.com"
-t ed25519: 指定密钥类型为 Ed25519。如果你的系统很老不支持,可以换成rsa -b 4096。-C "your_email@example.com": 添加一段注释,通常用邮箱来标识这个密钥是谁的、用在哪台电脑上,方便管理。
C、根据提示操作
运行命令后,系统会问你几个问题:
- Enter file in which to save the key (…):提示你保存密钥的位置。直接按回车即可,它会使用默认路径(通常是 ~/.ssh/id_ed25519)。
- Enter passphrase (empty for no passphrase)::提示你为私钥设置一个密码(Passphrase)。这是一个非常重要的安全层!
- 强烈建议设置密码: 即使你的电脑被盗,私钥文件泄露,没有这个密码,别人也无法使用它。
- 不设置密码: 直接按回车。登录时会更方便,但安全性稍低。
- Enter same passphrase again::再次输入你设置的密码进行确认。
2、将你的公钥复制到服务器
要实现免密登录,你需要把刚刚生成的公钥 (id_ed25519.pub) 的内容,添加到服务器上你希望登录的那个用户的 ~/.ssh/authorized_keys 文件中。
以下介绍两种方法,强烈推荐使用方法A。
方法 1:使用 ssh-copy-id (最简单、最推荐)
这个命令会自动完成所有操作,包括在服务器上创建目录、设置文件和修正权限,能有效避免手动操作的失误。
A、执行命令
将 your_username 替换成你在服务器上的用户名,server_ip 替换成服务器的IP地址。
Bash
ssh-copy-id your_username@server_ip
- 如果你修改过SSH端口,可以使用
-p参数:ssh-copy-id -p 端口号 your_username@server_ip - 如果你的密钥不在默认路径,可以使用
-i参数:ssh-copy-id -i ~/.ssh/my_other_key.pub your_username@server_ip
B、输入服务器密码
系统会提示你输入 your_username 这个用户在服务器上的密码。这是你最后一次需要用密码登录。
输入密码后,命令会自动将你的公钥内容追加到服务器的 ~/.ssh/authorized_keys 文件中。
方法 2:手动复制粘贴 (当没有ssh-copy-id时)
如果你的本地电脑(比如某些Windows环境)没有 ssh-copy-id 命令,就需要手动操作。
A、在本地电脑上,显示并复制公钥内容
cat ~/.ssh/id_ed25519.pub
终端会显示一长串以 ssh-ed25519 ... 开头的文本。完整地复制这一整行。
B、用密码登录到你的服务器
ssh your_username@server_ip
C、在服务器上,将公钥写入 authorized_keys 文件
登录服务器后,执行以下命令:
# 确保 .ssh 目录存在
mkdir -p ~/.ssh
# 将你复制的公钥内容粘贴到这里,然后回车
echo "在这里粘贴你的公钥内容" >> ~/.ssh/authorized_keys
# 修正关键的目录和文件权限,这一步至关重要!
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
注意: 如果权限不正确(例如过于开放),SSH为了安全会拒绝使用密钥登录。700意味着只有你自己能读、写、执行该目录,600意味着只有你自己能读、写该文件。
还可以使用一些SSH客户端(如XShell、MobaXterm)能直接在客户端里面生成本地的密钥对,生成后能直接一键导入到服务器中,也是非常方便。 像 Termius 这样能够云端同步的SSH客户端能够让你在不同设备上使用同一套密钥对,每次换不同设备,都不再需要重新生成密钥并添加到服务器里,有着极大的便利性还能集中管理多个和VPS和密钥信息。不过如果你的账号验证信息被泄露,那么你的全部密钥都遭殃,VPS也都能被访问。
3、测试与收尾
A、测试免密登录
退出服务器 ,然后再次尝试登录:
ssh your_username@server_ip
如果一切顺利,系统会直接让你登录,而不会再询问密码。如果你设置了密钥的密码(Passphrase),此时会提示你输入该密码。
B、(重要) 禁用密码登录
确认密钥登录成功后,为了达到最高的安全性,应该在服务器上禁用密码登录,只允许密钥登录。
a、在服务器上编辑SSH配置文件:
sudo nano /etc/ssh/sshd_config
b、找到 PasswordAuthentication 这一行,去掉前面的 #,并把值改为 no。
PasswordAuthentication no
c、同时,可以确认 PubkeyAuthentication 是 yes (通常默认就是)。
d、保存文件 (Ctrl+X, Y, Enter) 并重启SSH服务。
sudo systemctl restart sshd
警告:在执行这一步之前,务必确保你的密钥登录已经测试成功。否则,一旦禁用密码登录,你将无法再登入你的服务器!
现在,你的服务器就配置好了高度安全的密钥登录方式。





