一、基础环境标准化
1)设置时区为北京时间
命令
shellsudo timedatectl set-timezone Asia/Shanghai验证
shelltimedatectl
2)启动时间自动同步
命令
shellsudo systemctl enable systemd-timesyncd --now验证
shelltimedatectl
特殊情况:如果报错:Failed to enable unit: Unit file systemd-timesyncd.service does not exist.说明系统中没有安装 systemd-timesyncd 服务,需要先安装一下再启用时间同步
shellsudo apt update sudo apt install systemd-timesyncd sudo systemctl enable systemd-timesyncd --now
3)更新系统到最新(最新系统会确保修复已知漏洞)
命令
shellsudo apt update && sudo apt upgrade -y验证 sudo apt update(软件包列表更新)
shell# 再次执行 sudo apt update,如果上次更新成功,这次会显示:All packages are up to date. sudo apt update
验证 sudo apt upgrade -y(软件包升级)
shell# 如果输出为空(或显示 Listing... Done 后没有内容),说明所有包都已升级到最新 apt list --upgradable
4)安装最常用的基础工具
命令
shellsudo apt install -y vim curl wget git net-tools htop验证
shell# 输出版本 vim --version | head -1 curl --version | head -1 wget --version | head -1 git --version htop --version
二、安全加固
1)创建普通用户,禁用root直接登录
# 创建你的日常操作账号(假设叫 zhanghl),除了密码外像Full Name啥的我都没填直接回车了
sudo adduser zhanghl
sudo usermod -aG sudo zhanghl

2)SSH密钥登录(告别密码登录)
确认 Windows 已安装 OpenSSH 客户端(Windows 10/11 默认都有)
powershell# 管理员身份运行PowerShell,执行下面命令 ssh -V
- 如果未安装:设置 → 应用 → 可选功能 → 添加功能 → 找到“OpenSSH 客户端” → 安装
本地(Windows)生成密钥对
shellssh-keygen -t ed25519 # Enter file in which to save the key (C:\Users\你的用户名\.ssh\id_ed25519): 直接回车,将密钥生成到默认路径 # Enter passphrase (empty for no passphrase): 强烈建议输入一个密码,这样即使私钥泄露,别人没有密码也用不了。输入时屏幕不显示,输完按回车,再输一遍确认

查看生成的密钥文件
texC:\Users\你的用户名\.ssh\ ├── id_ed25519 # 私钥(绝不能泄露!) └── id_ed25519.pub # 公钥(可以公开,要上传到服务器)
创建存放该用户密钥的文件夹(.ssh,因为创建用户时无法自动创建该文件夹)
shell# root或zhanghl登录服务器,不必担心.ssh的属主问题,因为最后一个命令就是解决这个的 cd /home/zhanghl mkdir .ssh # .ssh 目录的属主问题 sudo chown -R zhanghl:zhanghl /home/zhanghl/.ssh将公钥传到新用户的.ssh文件夹下,上传完毕后,一定要看看服务器上的authorized_keys文件内容和本地.pub文件内容是否一致!!!,一定要确保内容一致,否则后续密钥登录会出问题!!!
shell# zhanghl就是步骤1)创建的普通用户 # 执行这条命令时,系统会要求输入 zhanghl 用户的密码(就是你之前给 zhanghl 设置的密码)。输入时屏幕不显示,输完按回车即可 type C:\Users\你的用户名\.ssh\id_ed25519.pub | ssh zhanghl@你的服务器IP "cat >> ~/.ssh/authorized_keys"
授权家目录权限:SSH 还会检查
/home/zhanghl本身的权限——如果 group 或 other 有写权限,密钥认证照样被拒shellsudo chmod go-w /home/zhanghl授予.ssh文件夹700权限码,授予authorized_keys文件600状态码
shellcd /home/zhanghl sudo chmod 700 .ssh sudo chmod 600 .ssh/authorized_keys修改服务器的 SSH 配置
shellsudo vim /etc/ssh/sshd_configshell# 修改以下三行,没有则添加 PasswordAuthentication no # 禁止密码登录 PubkeyAuthentication yes # 只允许密钥登录 PermitRootLogin no # 禁止 root 登录注意一个大坑!!!,解决方式是将 /etc/ssh/sshd_config.d/50-cloud-init.conf 文件中的 PasswordAuthentication 也设置成 no




PasswordAuthentication 和 PermitRootLogin这两个参数对root登录的效果限制如下,所以设置PasswordAuthentication为no后,一般也会将PermitRootLogin设置成no

shell# 重启 SSH 服务 sudo systemctl restart sshd密钥登录测试
在 PowerShell 中执行:如果没有提示输入密码或者提示输入passphrase密码(生成密钥对的时候指定的强密码),说明密钥配置好了!
shellssh zhanghl@你的服务器IP
使用工具(我这里使用的是MobaXterm)


3)防火墙设置
防火墙只开必要端口(记得安全组也要添加对应的端口,确保端口能成功访问)
shellsudo ufw allow 22/tcp # SSH(务必先放行!) sudo ufw allow 80/tcp # HTTP sudo ufw allow 443/tcp # HTTPS sudo ufw enable
4)额外防护
安装Fail2Ban(推荐),自动封禁多次尝试登录但失败的IP
命令
shellsudo apt install fail2ban -y sudo systemctl enable fail2ban --now验证
shellsudo systemctl status fail2ban
查看封禁详情:
Banned IP list如果为空,说明暂时没人触发规则(也可能是没人扫你)shellsudo fail2ban-client status sshd
5)告警阈值
设置系统告警阈值:在 /etc/profile 末尾添加登录提醒,这样每次SSH连上以后,一眼就能看到负载、磁盘和内存等信息
shell# 每次登录时显示系统状态 echo "=== System Status ===" uptime df -h / free -h
三、申请泛域名证书
简介
- 只要你的泛域名证书(
*.qnmdmyy.top)已经签发成功,那么任何一个你解析到该服务器IP的子域名(例如blog.qnmdmyy.top、shop.qnmdmyy.top、api.qnmdmyy.top等),在备案成功后都能立即通过https://访问,无需再为每个子域名单独申请证书
环境
- 域名是阿里云的,服务器是腾讯云的
前置条件
- 在阿里云域名解析中添加一条A记录,指向服务器ip,这对后续申请证书时TXT验证非常重要!!!不添加很大可能会导致申请证书失败

申请步骤(一劳永逸,配置一次后自动续期)
安装 Certbot 和阿里云插件
shell# 卸载系统 certbot 及其相关包 sudo apt remove certbot python3-certbot* -y # 清理可能残留的配置(可选) sudo apt autoremove -y # 安装 pipx sudo apt update sudo apt install pipx -y # 将 pipx 添加到 PATH pipx ensurepath # 重新加载终端配置 source ~/.bashrc # 安装 certbot 主程序 pipx install certbot # 将阿里云 DNS 插件注入到 certbot pipx inject certbot certbot-dns-aliyun # 确认 certbot 来源(必须显示 /home/zhanghl/.local/bin/certbot) which certbot # 查看插件列表(必须能看到 dns-aliyun) certbot plugins获取阿里云API密钥
登录阿里云控制台 → 点击右上角头像 → AccessKey 管理

点击 创建 AccessKey(会弹出安全验证),建议使用 RAM 子账号 并只授权 DNS 管理权限,更安全。如果是自己用,直接用主账号也 OK

复制 AccessKey ID 和 AccessKey Secret(Secret 只显示一次,务必保存好)
创建凭证文件并写入
shell# 创建文件 sudo mkdir -p /root/.secrets sudo nano /root/.secrets/aliyun.ini # 写入文件 dns_aliyun_access_key = 你的AccessKeyID dns_aliyun_access_key_secret = 你的AccessKeySecret # 保存退出:Ctrl+O → Enter → Ctrl+X # 保存后设置权限 sudo chmod 600 /root/.secrets/aliyun.ini申请证书
shellsudo ~/.local/bin/certbot certonly \ --authenticator dns-aliyun \ --dns-aliyun-credentials /root/.secrets/aliyun.ini \ -d *.你的域名.com \ -d 你的域名.com \ --server https://acme-v02.api.letsencrypt.org/directory
自动续期:证书会自动续期,但需要让续期后自动重载 Nginx
shell# 编辑续期配置文件 sudo nano /etc/letsencrypt/renewal/你的域名.com.conf # 我的域名是qnmdmyy.top,上面的命令就应该是 sudo nano /etc/letsencrypt/renewal/qnmdmyy.top.conf # 确保最后一行是重载nginx renew_hook = systemctl reload nginx # 保存退出:Ctrl+O → Enter → Ctrl+X
最终验证是否申请成功
shellsudo ~/.local/bin/certbot certificates

四、配置Nginx反向代理
前提条件
- 服务器完成ICP备案,工信部明确规定,所有在中国大陆提供服务的云厂商,都必须落实未备案域名不得解析到国内服务器的规定,检测过程为:用户请求的域名是
www.qnmdmyy.top,端口是 80/443,该域名 (qnmdmyy.top) 在服务器厂商内部的备案系统中是否有记录,无记录则返回一个拦截页面