Skip to content

一、基础环境标准化

1)设置时区为北京时间

  • 命令

    shell
    sudo timedatectl set-timezone Asia/Shanghai
  • 验证

    shell
    timedatectl

    image-20260728145548399

2)启动时间自动同步

  • 命令

    shell
    sudo systemctl enable systemd-timesyncd --now
  • 验证

    shell
    timedatectl

    image-20260728145811604

  • 特殊情况:如果报错:Failed to enable unit: Unit file systemd-timesyncd.service does not exist.说明系统中没有安装 systemd-timesyncd 服务,需要先安装一下再启用时间同步

    shell
    sudo apt update
    sudo apt install systemd-timesyncd
    sudo systemctl enable systemd-timesyncd --now

3)更新系统到最新(最新系统会确保修复已知漏洞)

  • 命令

    shell
    sudo apt update && sudo apt upgrade -y
  • 验证 sudo apt update(软件包列表更新)

    shell
    # 再次执行 sudo apt update,如果上次更新成功,这次会显示:All packages are up to date.
    sudo apt update

    image-20260728150953427

  • 验证 sudo apt upgrade -y(软件包升级)

    shell
    # 如果输出为空(或显示 Listing... Done 后没有内容),说明所有包都已升级到最新
    apt list --upgradable

    image-20260728150723682

4)安装最常用的基础工具

  • 命令

    shell
    sudo 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

    image-20260728151058437

二、安全加固

1)创建普通用户,禁用root直接登录

shell
# 创建你的日常操作账号(假设叫 zhanghl),除了密码外像Full Name啥的我都没填直接回车了
sudo adduser zhanghl
sudo usermod -aG sudo zhanghl

image-20260729085520775

image-20260728173915537

2)SSH密钥登录(告别密码登录)

  1. 确认 Windows 已安装 OpenSSH 客户端(Windows 10/11 默认都有)

    powershell
    # 管理员身份运行PowerShell,执行下面命令
    ssh -V

    image-20260728154421897

    • 如果未安装:设置 → 应用 → 可选功能 → 添加功能 → 找到“OpenSSH 客户端” → 安装
  2. 本地(Windows)生成密钥对

    shell
    ssh-keygen -t ed25519
    
    # Enter file in which to save the key (C:\Users\你的用户名\.ssh\id_ed25519): 直接回车,将密钥生成到默认路径
    
    # Enter passphrase (empty for no passphrase): 强烈建议输入一个密码,这样即使私钥泄露,别人没有密码也用不了。输入时屏幕不显示,输完按回车,再输一遍确认

    image-20260728154713381

    image-20260728154719112

  3. 查看生成的密钥文件

    tex
    C:\Users\你的用户名\.ssh\
    ├── id_ed25519      # 私钥(绝不能泄露!)
    └── id_ed25519.pub  # 公钥(可以公开,要上传到服务器)

    image-20260728154916026

  4. 创建存放该用户密钥的文件夹(.ssh,因为创建用户时无法自动创建该文件夹)

    shell
    # root或zhanghl登录服务器,不必担心.ssh的属主问题,因为最后一个命令就是解决这个的
    cd /home/zhanghl
    mkdir .ssh
    # .ssh 目录的属主问题
    sudo chown -R zhanghl:zhanghl /home/zhanghl/.ssh
  5. 将公钥传到新用户的.ssh文件夹下,上传完毕后,一定要看看服务器上的authorized_keys文件内容和本地.pub文件内容是否一致!!!,一定要确保内容一致,否则后续密钥登录会出问题!!!

    shell
    # zhanghl就是步骤1)创建的普通用户
    # 执行这条命令时,系统会要求输入 zhanghl 用户的密码(就是你之前给 zhanghl 设置的密码)。输入时屏幕不显示,输完按回车即可
    type C:\Users\你的用户名\.ssh\id_ed25519.pub | ssh zhanghl@你的服务器IP "cat >> ~/.ssh/authorized_keys"

    image-20260728164025336

  6. 授权家目录权限:SSH 还会检查 /home/zhanghl 本身的权限——如果 group 或 other 有写权限,密钥认证照样被拒

    shell
    sudo chmod go-w /home/zhanghl
  7. 授予.ssh文件夹700权限码,授予authorized_keys文件600状态码

    shell
    cd /home/zhanghl
    sudo chmod 700 .ssh
    sudo chmod 600 .ssh/authorized_keys
  8. 修改服务器的 SSH 配置

    shell
    sudo vim /etc/ssh/sshd_config
    shell
    # 修改以下三行,没有则添加
    PasswordAuthentication no   # 禁止密码登录
    PubkeyAuthentication yes    # 只允许密钥登录
    PermitRootLogin no          # 禁止 root 登录
    • 注意一个大坑!!!,解决方式是将 /etc/ssh/sshd_config.d/50-cloud-init.conf 文件中的 PasswordAuthentication 也设置成 no

      image-20260728180000550

      image-20260728182050412

      image-20260728182115464

      image-20260728182257875

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

      image-20260728190253368

    shell
    # 重启 SSH 服务
    sudo systemctl restart sshd
  9. 密钥登录测试

    • 在 PowerShell 中执行:如果没有提示输入密码或者提示输入passphrase密码(生成密钥对的时候指定的强密码),说明密钥配置好了!

      shell
      ssh zhanghl@你的服务器IP

      image-20260728185139096

    • 使用工具(我这里使用的是MobaXterm)

      image-20260728185731586

      image-20260728185914247

3)防火墙设置

  • 防火墙只开必要端口(记得安全组也要添加对应的端口,确保端口能成功访问

    shell
    sudo ufw allow 22/tcp        # SSH(务必先放行!)
    sudo ufw allow 80/tcp        # HTTP
    sudo ufw allow 443/tcp       # HTTPS
    sudo ufw enable

4)额外防护

  • 安装Fail2Ban(推荐),自动封禁多次尝试登录但失败的IP

    • 命令

      shell
      sudo apt install fail2ban -y
      sudo systemctl enable fail2ban --now
    • 验证

      shell
      sudo systemctl status fail2ban

      image-20260728190429954

    • 查看封禁详情:Banned IP list 如果为空,说明暂时没人触发规则(也可能是没人扫你)

      shell
      sudo fail2ban-client status sshd

      image-20260728190651605

5)告警阈值

  • 设置系统告警阈值:在 /etc/profile 末尾添加登录提醒,这样每次SSH连上以后,一眼就能看到负载、磁盘和内存等信息

    shell
    # 每次登录时显示系统状态
    echo "=== System Status ==="
    uptime
    df -h /
    free -h

三、申请泛域名证书

简介

  • 只要你的泛域名证书(*.qnmdmyy.top)已经签发成功,那么任何一个你解析到该服务器IP的子域名(例如 blog.qnmdmyy.topshop.qnmdmyy.topapi.qnmdmyy.top 等),在备案成功后都能立即通过 https:// 访问,无需再为每个子域名单独申请证书

环境

  • 域名是阿里云的,服务器是腾讯云的

前置条件

  • 在阿里云域名解析中添加一条A记录,指向服务器ip,这对后续申请证书时TXT验证非常重要!!!不添加很大可能会导致申请证书失败

image-20260728203007531

申请步骤(一劳永逸,配置一次后自动续期)

  1. 安装 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
  2. 获取阿里云API密钥

    1. 登录阿里云控制台 → 点击右上角头像 → AccessKey 管理

      image-20260728200912536

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

      image-20260728200947191

    3. 复制 AccessKey ID 和 AccessKey Secret(Secret 只显示一次,务必保存好)

  3. 创建凭证文件并写入

    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
  4. 申请证书

    shell
    sudo ~/.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

    image-20260728202244447

  5. 自动续期:证书会自动续期,但需要让续期后自动重载 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

    image-20260728202606258

  6. 最终验证是否申请成功

    shell
    sudo ~/.local/bin/certbot certificates

    image-20260728203252806

    image-20260728203318851

四、配置Nginx反向代理

前提条件

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

目标效果

MIT版权,未经许可禁止任何形式的转载