我的运维笔记

《服务器运维》课程 · 孙祎辰 · 25 网络 A1 班

第 1~3 讲 学习记录
第 1 讲 服务器安全加固
把一台"裸奔"的服务器,加固成只认密钥、守得住、还会自动反击的服务器

一、做了什么

从"看见威胁"出发,沿着攻击者可能入侵的路径,逐一把门堵死:登录方式从密码换成密钥、禁用 root 远程登录、配置两层防火墙、用 fail2ban 自动封禁暴力破解。

二、关键命令

1. 查看暴力破解登录失败记录:

sudo journalctl -u sshd | grep -i "failed" | tail -30

2. 新建普通用户并加入 wheel 组(获得 sudo 权限):

sudo adduser study
sudo passwd study
sudo usermod -aG wheel study

3. 安装公钥到 authorized_keys,并设置正确权限:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys   # 粘贴公钥
chmod 600 ~/.ssh/authorized_keys

4. 加固 sshd 配置(改完先测试再生效):

sudo vi /etc/ssh/sshd_config
# PasswordAuthentication no   # 禁用密码登录
# PermitRootLogin no          # 禁止 root 远程登录
sudo sshd -t
sudo systemctl reload sshd

5. 配置主机防火墙 firewalld(必须加 --permanent 再 reload):

sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

6. 安装并配置 fail2ban(backend 必须用 systemd):

sudo dnf install -y epel-release
sudo dnf install -y fail2ban
sudo vi /etc/fail2ban/jail.d/sshd.local
[sshd]
enabled = true
backend = systemd
maxretry = 3
findtime = 600
bantime = 3600
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

三、遇到的问题与解决

问题:密钥登录总是要求输入密码。
解决:99% 是权限问题——~/.ssh 必须是 700、authorized_keys 必须是 600,且属主是本人。
铁律:先验证密钥能登录,再禁用密码登录,顺序反了会把自己锁在门外。
后路:VNC 不走 SSH,不受 sshd 配置影响,改崩了能用控制台 VNC 以系统密码登录自救。
第 2 讲 网站上线:域名解析与 Nginx 个人主页
让任何人输入域名,都能访问到自己发布的个人主页

一、做了什么

打通"网站能被访问"的三个环节:DNS 解析让域名指向服务器 IP、开放 80 端口、安装 Nginx 并发布带备案号的个人主页。

二、关键命令

1. 验证域名解析(看 Address 是否为服务器公网 IP):

nslookup sunyichen.bond
nslookup www.sunyichen.bond

2. 开放网页端口(安全组 + 防火墙两层都要开):

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
sudo firewall-cmd --list-services

3. 安装并启动 Nginx:

sudo dnf install -y nginx
sudo systemctl enable --now nginx
nginx -v

4. 准备网站目录并交给 study 用户:

sudo mkdir -p /var/www/mysite
sudo chown -R study:study /var/www/mysite
sudo chmod 755 /var/www/mysite

5. 编写站点配置(conf.d 下以 .conf 结尾才会被加载):

sudo vi /etc/nginx/conf.d/mysite.conf
server {
    listen 80;
    server_name sunyichen.bond www.sunyichen.bond;
    root /var/www/mysite;
    index index.html;
    access_log /var/log/nginx/mysite_access.log;
    error_log /var/log/nginx/mysite_error.log;
    location / {
        try_files $uri $uri/ =404;
    }
}
sudo nginx -t
sudo systemctl reload nginx

6. 上传主页(scp 走同一把密钥,不需要密码):

scp index.html study@服务器公网IP:/var/www/mysite/

三、遇到的问题与解决

问题:用 IP 访问看到的是默认页,用域名访问才是自己的主页。
原因:Nginx 靠请求头里的 Host 区分站点,用 IP 访问时 Host 匹配不上 server_name,就交给系统默认站点。
验证:curl -H "Host: 你的域名" http://127.0.0.1 返回主页;不带 Host 则返回默认页。
问题:访问出现 403 Forbidden。
原因:Nginx 工作进程以 nginx 用户运行,文件权限 600 时"其他人"读不了。
解决:文件 644、目录 755;先看错误日志 sudo tail -3 /var/log/nginx/mysite_error.log 里的 Permission denied。
合规要求:首页底部必须显示 ICP 备案号并链接到 beian.miit.gov.cn。
第 3 讲 HTTPS 与证书自动续期
给网站加上安全锁,并配置证书到期前自动续期

一、做了什么

为个人主页申请免费的 Let's Encrypt 证书,让网站从"不安全"变为带安全锁的加密网站;配置 Nginx 的 HTTPS,并设置证书自动续期。

二、关键命令

1. 抓包看 HTTP 明文传输的风险:

sudo dnf install -y tcpdump
sudo tcpdump -i any -A -nn 'tcp port 80' | grep -a -E "GET |Host:|User-Agent|"</code></pre>

  <p>2. 开放 443 端口(80 不能关,跳转和续期都要用):</p>
  <pre><code>sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload</code></pre>

  <p>3. 安装 certbot 并申请证书(先 dry-run 演练再正式申请):</p>
  <pre><code>sudo dnf install -y certbot
sudo certbot certonly --webroot -w /var/www/mysite \
  -d sunyichen.bond -d www.sunyichen.bond \
  -m 你的邮箱 --agree-tos --no-eff-email --dry-run
sudo certbot certonly --webroot -w /var/www/mysite \
  -d sunyichen.bond -d www.sunyichen.bond \
  -m 你的邮箱 --agree-tos --no-eff-email</code></pre>

  <p>4. 改写站点配置:80 负责跳转,443 提供内容:</p>
  <pre><code>sudo cp /etc/nginx/conf.d/mysite.conf /etc/nginx/conf.d/mysite.conf.bak
sudo vi /etc/nginx/conf.d/mysite.conf</code></pre>
  <pre><code>server {
    listen 80;
    server_name sunyichen.bond www.sunyichen.bond;
    location /.well-known/acme-challenge/ { root /var/www/mysite; }
    location / { return 301 https://$host$request_uri; }
}
server {
    listen 443 ssl;
    server_name sunyichen.bond www.sunyichen.bond;
    ssl_certificate     /etc/letsencrypt/live/sunyichen.bond/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/sunyichen.bond/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    root /var/www/mysite;
    index index.html;
    location / { try_files $uri $uri/ =404; }
}</code></pre>
  <pre><code>sudo nginx -t
sudo systemctl reload nginx</code></pre>

  <p>5. 配置自动续期(定时器 + deploy 钩子):</p>
  <pre><code>sudo systemctl enable --now certbot-renew.timer
sudo vi /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh</code></pre>
  <pre><code>#!/bin/bash
systemctl reload nginx</code></pre>
  <pre><code>sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-nginx.sh
sudo certbot renew --dry-run</code></pre>

  <h3>三、遇到的问题与解决</h3>
  <div class="note"><strong>问题:</strong>certbot 报 DNS problem / Timeout / unauthorized。<br><strong>解决:</strong>按"解析、80 端口、Nginx"三个方向排查:域名是否解析、80 端口是否开放、server_name 和 root 是否正确。</div>
  <div class="warn"><strong>要点:</strong>证书有效期仅 90 天且 CA 不再发提醒邮件,自动续期是必须项,不能靠人记。</div>
  <div class="tip"><strong>原理:</strong>HTTPS 加密的是传输内容,但域名本身在建立连接时仍明文可见——它隐藏的是"看了什么",不是"访问了哪个网站"。</div>
</section>

<footer>
  <a href="https://beian.miit.gov.cn/" target="_blank">浙ICP备2026082965号-1</a>
</footer>

</div>
</body>
</html>