<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Smaritron</title><description>技术分享与实践</description><link>https://www.smaritron.com/</link><language>zh_CN</language><item><title>从零自建密码管理器：Vaultwarden</title><link>https://www.smaritron.com/posts/vaultwarden-self-hosting-guide/</link><guid isPermaLink="true">https://www.smaritron.com/posts/vaultwarden-self-hosting-guide/</guid><pubDate>Tue, 12 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Vaultwarden 是什么&lt;/h2&gt;
&lt;p&gt;在这个账号密码满天飞的时代，记忆密码真的是一件非常痛苦的事情。虽然市面上有 1Password 之类的密码管理软件，但是它要钱啊！而且作为一个爱折腾网络技术的人，肯定会想把数据掌握在自己手里，那么自托管的密码管理器就是最好的选择了。Vaultwarden 是一个轻量级的密码管理器，资源占用低、部署简单，很适合个人的密码管理和多端同步。开整！&lt;/p&gt;
&lt;h2&gt;准备工作&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;拥有一台安装了 Linux（如 Ubuntu/Debian）的 VPS。&lt;/li&gt;
&lt;li&gt;拥有一个域名并已正确解析到该 VPS 的 IP。&lt;/li&gt;
&lt;li&gt;VPS 开放了 80 和 443 端口。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装步骤&lt;/h2&gt;
&lt;h3&gt;安装 Docker&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;获取并运行 Docker 安装脚本：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;启动并设置 Docker 开机自启：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable docker
sudo systemctl start docker
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;验证 Docker 安装成功：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;docker -v
docker compose version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;能看到版本号说明安装成功。&lt;/p&gt;
&lt;h3&gt;安装 Nginx 及 Certbot&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;安装 Nginx：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install nginx -y
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;启动并设置 Nginx 开机自启：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl start nginx
sudo systemctl enable nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;安装 Certbot：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install certbot
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;生成 ADMIN_TOKEN&lt;/h3&gt;
&lt;p&gt;在创建主配置文件之前，需要先把管理密码转换成极难破解的 Argon2 哈希值，不直接把密码明文写在配置文件中，保证安全性。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;拉取镜像并运行 Argon2 工具：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;docker run --rm -it vaultwarden/server /vaultwarden hash --argon2
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;终端会提示 &lt;code&gt;Password:&lt;/code&gt;，输入一个高强度的密码（不会显示在屏幕上），回车，然后再输入一次确认。&lt;/li&gt;
&lt;li&gt;屏幕会输出一串类似下面的内容，将其完整保存在记事本中备用：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;$argon2id$v=19$m=65540,t=3,p=4$P0i/jEJJ+Yp...
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置 Docker Compose&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;创建工作目录：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /root/vaultwarden
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;进入工作目录：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cd /root/vaultwarden
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;创建 docker-compose.yml 文件：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;填入以下配置（需注意 &lt;code&gt;$$&lt;/code&gt; 转译）：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      - TZ=Asia/Shanghai
      - SIGNUPS_ALLOWED=true
      - ADMIN_TOKEN=$$argon2id$$v=19$$m=65540,t=3,p=4$$P0i/jEJJ+Yp...
    volumes:
      - ./vw-data:/data
    ports:
      - &quot;127.0.0.1:8000:80&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::important
在 docker-compose 中，需要把 &lt;code&gt;ADMIN_TOKEN&lt;/code&gt; 中所有的单个 &lt;code&gt;$&lt;/code&gt; 符号写成双 &lt;code&gt;$$&lt;/code&gt; 符号进行转义，否则会报错！
例如原始是 &lt;code&gt;$argon2id$v=19$m=65540,t=3,p=4$P0i/jEJJ+Yp...&lt;/code&gt; 这里就要写成 &lt;code&gt;$$argon2id$$v=19$$m=65540,t=3,p=4$$P0i/jEJJ+Yp...&lt;/code&gt;
:::
5. 填写完成后，按 Ctrl+O 保存，回车确认，Ctrl+X 退出。&lt;/p&gt;
&lt;h3&gt;启动服务&lt;/h3&gt;
&lt;p&gt;现在让 Vaultwarden 在后台跑起来：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以通过 &lt;code&gt;docker ps&lt;/code&gt; 查看容器是否正常运行。&lt;/p&gt;
&lt;h3&gt;配置 Nginx 反向代理&lt;/h3&gt;
&lt;p&gt;若你是 Nginx 高手，可以自行配置反向代理及 SSL 证书。若你是刚刚安装 Nginx，可以跟着以下步骤来。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;创建证书验证目录：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /var/www/letsencrypt
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;创建 Nginx 配置文件：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;nano /etc/nginx/conf.d/vaultwarden.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;填入以下配置：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 80;
    server_name yourdomain.com; # 改为你解析的域名

    location ^~ /.well-known/acme-challenge/ {
        root /var/www/letsencrypt;
        allow all;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;重启 Nginx 使配置生效：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo nginx -t &amp;amp;&amp;amp; sudo systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;申请 SSL 证书（注意修改域名）：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo certbot certonly --webroot -w /var/www/letsencrypt -d yourdomain.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若第一次申请会提示输入邮箱，按说明操作即可。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;编辑刚才的 Nginx 配置文件，在文件底部添加：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 443 ssl http2;
    server_name yourdomain.com; # 改为你解析的域名
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; # 注意修改证书路径
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # 注意修改证书路径

    location / {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;重启 Nginx 使反代生效：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo nginx -t &amp;amp;&amp;amp; sudo systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;初始化与安全加固&lt;/h2&gt;
&lt;p&gt;至此，Vaultwarden 的前后端已经打通。
&lt;img src=&quot;vaultwarden-server-login-page.webp&quot; alt=&quot;Vaultwarden 登录界面&quot; /&gt;
接下来要进行账号初始化与安全加固。&lt;/p&gt;
&lt;h3&gt;注册账号&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;在浏览器中访问 &lt;code&gt;https://你的域名/&lt;/code&gt;，点击创建账户，输入你的邮箱和一个复杂的主密码。&lt;strong&gt;这个主密码是访问你的密码库的唯一方法，务必设置得复杂一些，并且千万千万不能忘记&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;使用刚刚创建的账号登录，确认密码库可以正常存取记录。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;测试管理后台&lt;/h3&gt;
&lt;p&gt;访问 &lt;code&gt;https://你的域名/admin&lt;/code&gt;，在输入框中填入你设置的 ADMIN_TOKEN 原始密码，验证是否能顺利进入管理控制台。&lt;/p&gt;
&lt;h3&gt;关闭注册权限&lt;/h3&gt;
&lt;p&gt;在账号注册完毕后，若你的密码管理器只想个人使用，必须立刻关闭系统的开放注册权限。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;回到服务器终端，修改 docker-compose.yml 配置文件：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cd /root/vaultwarden
nano docker-compose.yml
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;将 &lt;code&gt;SIGNUPS_ALLOWED=true&lt;/code&gt; 修改为 &lt;code&gt;SIGNUPS_ALLOWED=false&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;重新加载容器：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至此，你的 Vaultwarden 已经部署完毕。普通用户无法再通过主页注册，所有数据被 AES-256 加密保存在 &lt;code&gt;/root/vaultwarden/vw-data&lt;/code&gt; 目录中，且管理后台由 Argon2 强力保护。&lt;/p&gt;
&lt;h2&gt;如何使用&lt;/h2&gt;
&lt;h3&gt;Bitwarden 客户端&lt;/h3&gt;
&lt;p&gt;Vaultwarden 完全兼容 Bitwarden 的官方协议，直接下载 Bitwarden 的客户端即可使用。关键在于你需要告诉客户端，不要去连 Bitwarden 的官方云服务器，而是连接你自己的服务器。
&lt;img src=&quot;bitwarden-self-hosted-setup-guide.webp&quot; alt=&quot;Bitwarden 客户端配置自托管&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 Bitwarden 客户端，点击底部 &lt;code&gt;正在访问:&lt;/code&gt; 旁边的网址，选择自托管；&lt;/li&gt;
&lt;li&gt;在服务器 URL 中输入 &lt;code&gt;https://你的域名/&lt;/code&gt;，点击保存；&lt;/li&gt;
&lt;li&gt;输入你的邮箱和主密码进行登录。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;使用建议&lt;/h3&gt;
&lt;p&gt;安装浏览器扩展：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自动填充：安装登录后可以直接在网页上填充密码，非常方便；&lt;/li&gt;
&lt;li&gt;生物识别：使用 FaceID 或指纹解锁，这样就无需每次都输入主密码。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;移动端 App：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自动填充：这是移动端最重要的功能。在手机系统设置里，将密码自动填充服务改为 Bitwarden；&lt;/li&gt;
&lt;li&gt;生物识别： 开启 FaceID 或指纹解锁；&lt;/li&gt;
&lt;li&gt;二步验证： 如果你的 Vaultwarden 开启了二步验证，可以使用手机 App 查看验证码。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;数据备份与恢复&lt;/h2&gt;
&lt;p&gt;Vaultwarden 的核心数据都在 &lt;code&gt;/root/vaultwarden/vw-data/&lt;/code&gt; 里，其中 &lt;code&gt;db.sqlite3&lt;/code&gt; 是最重要的数据库文件，存储了所有账号、密码、文件夹和设置。建议定期备份整个数据文件夹。&lt;/p&gt;
&lt;h3&gt;数据备份&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;创建备份目录：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p /opt/backup
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;停止容器：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;docker stop vaultwarden
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;打包数据目录：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;tar -czvf /opt/backup/vw-backup-$(date +%F).tar.gz -C /root/vaultwarden/vw-data .
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;重启容器：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;docker start vaultwarden
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;强烈建议把备份的文件存到不同的设备或网盘内，以防丢失！&lt;/p&gt;
&lt;h3&gt;数据恢复&lt;/h3&gt;
&lt;p&gt;按上面的操作把 Vaultwarden 部署到你的 VPS，然后把备份文件完整解压到 &lt;code&gt;/vw-data&lt;/code&gt; 数据目录，确保容器的路径映射正确，启动新的容器。打开网页端登录，你会发现所有的密码都在，仿佛什么都没发生过～&lt;/p&gt;
</content:encoded></item><item><title>Let’s Encrypt 申请 IP 证书</title><link>https://www.smaritron.com/posts/lets-encrypt-ip-certificates/</link><guid isPermaLink="true">https://www.smaritron.com/posts/lets-encrypt-ip-certificates/</guid><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;前言&lt;/h3&gt;
&lt;p&gt;最近把一台阿里云的服务器从默认的宝塔 Linux 面板重置为了 Ubuntu 系统，需要重新安装一些应用。原先在这台服务器搭建的 OpenList 是使用宝塔面板申请的 IP 证书，现在没有宝塔了就想研究并记录一下如何通过别的方式申请 IP 证书。&lt;/p&gt;
&lt;p&gt;Let’s Encrypt 从 2025 年开始支持申请 IP 证书，一开始想的是通过 Certbot 直接申请 IP 证书，但是没想到这个官方推荐的工具还不支持：&lt;code&gt;Requested name 1.2.3.4 is an IP address. The Let&apos;s Encrypt certificate authority will not issue certificates for a bare IP address.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;查阅资料后发现 acme.sh 已经支持申请 IP 证书了，开始折腾！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在开始之前，请确保你已经：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VPS 开放了 80 端口。&lt;/li&gt;
&lt;li&gt;VPS 安装了 Nginx。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;安装 acme.sh&lt;/h3&gt;
&lt;p&gt;安装命令为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl https://get.acme.sh | sh -s email=my@example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
email 需要改成你自己的邮箱，用于向 CA 注册使用。
:::
安装完成后会自动将 acme.sh 添加为一个 alias，无需指定完整路径运行，只需要重新登录 ssh 即可。&lt;/p&gt;
&lt;h3&gt;配置 acme.sh 使用 Let’s Encrypt&lt;/h3&gt;
&lt;p&gt;因为 acme.sh 收了 ZeroSSL 的钱，因此现在默认使用的是 ZeroSSL。如果要使用 Let’s Encrypt 需要进行配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;acme.sh --set-default-ca --server letsencrypt
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;申请 IP 证书&lt;/h3&gt;
&lt;p&gt;使用以下命令申请证书：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;acme.sh --issue -d &amp;lt;IP 地址&amp;gt; -w &amp;lt;网站根目录&amp;gt; --certificate-profile shortlived --days 84
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
&lt;code&gt;网站根目录&lt;/code&gt; 为你当前 80 端口部署的服务的根目录。如果你的 Nginx 是作为反向代理使用的，没有实际的网页文件，请务必在 Nginx 的 80 端口配置中加入以下代码，否则 CA 无法读取到验证文件。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    location ~ ^/.well-known/(acme-challenge|pki-validation)/ {
        add_header Content-Type text/plain;
        root /var/www/html;;
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::
签发之后 acme.sh 会自动添加一个 cronjob，无需手动配置自动续签。
生成的证书默认存储在 &lt;code&gt;/root/.acme.sh/1.2.3.4_ecc/&lt;/code&gt; 目录：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;fullchain.cer&lt;/code&gt;：完整证书链&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1.2.3.4.key&lt;/code&gt;：私钥文件&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;部署证书&lt;/h3&gt;
&lt;p&gt;在证书签发下来后，直接在 Nginx 里引用 &lt;code&gt;root&lt;/code&gt; 目录的证书文件可能会有权限隐患，因此需要把证书部署到一个专门的生产路径。
创建存放证书的目录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo mkdir -p /etc/nginx/ssl/1.2.3.4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用以下命令将证书部署到该生产路径：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;acme.sh --install-cert -d 1.2.3.4 --ecc \
--key-file       /etc/nginx/ssl/1.2.3.4/key.pem  \
--fullchain-file /etc/nginx/ssl/1.2.3.4/cert.pem \
--reloadcmd     &quot;systemctl force-reload nginx&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
后续每次续签完成后，acme 会自动把证书更新到生产路径，并重启 Nginx。
:::&lt;/p&gt;
&lt;h3&gt;配置证书&lt;/h3&gt;
&lt;p&gt;在 Nginx 中配置证书：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;    server_name 1.2.3.4; # 改为你的 IP
    ssl_certificate /etc/nginx/ssl/1.2.3.4/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/1.2.3.4/key.pem;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;检查配置文件并重启 Nginx。打开我的 Openlist，可以看到证书已经配置好了：
&lt;img src=&quot;lets-encrypt-ip-certificates.webp&quot; alt=&quot;lets-encrypt-ip-certificates&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;参考来源&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.onmyodev.com/2026/02/lets-encrypt-%E7%AD%BE%E5%8F%91-ip-%E8%AF%81%E4%B9%A6/&quot;&gt;Let’s Encrypt 签发 IP 证书&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ultrasev.com/tech/lets-encrypt-ip-certificate-guide&quot;&gt;Let&apos;s Encrypt 公网 IP 证书签发实操指南&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>VPS：部署 OpenList 并接入 Cloudflare CDN</title><link>https://www.smaritron.com/posts/openlist-vps-cloudflare-guide/</link><guid isPermaLink="true">https://www.smaritron.com/posts/openlist-vps-cloudflare-guide/</guid><pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;OpenList&lt;/strong&gt; 是一款轻量且美观的开源文件列表程序，支持多种云盘（如阿里云盘、夸克网盘等）的整合展示。通过 VPS 部署 OpenList，用户可以实现对个人数据的自主掌控。配合 Cloudflare CDN，不仅能有效隐藏 VPS 的真实 IP，提高安全性，还能利用其全球边缘节点加速海外访问&amp;lt;spoiler&amp;gt;&lt;s&gt;其实是 VPS 直连速度太慢&lt;/s&gt;&amp;lt;/spoiler&amp;gt;，并提供便捷的 SSL 证书管理方案。&lt;/p&gt;
&lt;h2&gt;环境准备&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;在开始之前，请确保你已经：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拥有一台安装了 Linux（如 Ubuntu/Debian）的 VPS。&lt;/li&gt;
&lt;li&gt;拥有一个域名并且已托管至 Cloudflare。&lt;/li&gt;
&lt;li&gt;VPS 开放了 80 和 443 端口。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;搭建步骤&lt;/h2&gt;
&lt;h3&gt;1. 脚本安装&lt;/h3&gt;
&lt;p&gt;登录 VPS，运行 OpenList 的一键安装脚本（ &lt;a href=&quot;https://doc.oplist.org/guide/installation/script#%E5%AE%89%E8%A3%85&quot;&gt;官方文档最新脚本地址&lt;/a&gt; ）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -fsSL https://res.oplist.org/script/v4.sh &amp;gt; install-openlist-v4.sh &amp;amp;&amp;amp; sudo bash install-openlist-v4.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根据页面提示，输入 &lt;code&gt;1&lt;/code&gt; 进行安装。&lt;/p&gt;
&lt;p&gt;安装完成后，终端会输出以下关键信息：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;OpenList 安装成功！

版本信息：v4.1.10

访问地址：
  局域网：http://局域网IP:5244/
  公网：  http://公网IP:5244/
配置文件：/opt/openlist/data/config.json

账号信息：
默认账号：admin
初始密码：********
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::important
请务必记录好账号密码。
:::&lt;/p&gt;
&lt;h3&gt;2. Cloudflare 解析&lt;/h3&gt;
&lt;p&gt;登录 Cloudflare 控制台，进入域名的 DNS 设置。添加一条 A 记录指向 VPS 的真实 IP：
&lt;img src=&quot;cloudflare-dns-a-record-setup.webp&quot; alt=&quot;添加 A 记录并关闭小黄云&quot; /&gt;
:::tip[关键操作]
需要将“代理状态（Proxy Status）”设置为：仅 DNS（灰色小云朵）。
:::
注：关闭代理是为了让后续的 Certbot 能够直接通过 80 端口完成 HTTP-01 验证。&lt;/p&gt;
&lt;h3&gt;3. 配置 Nginx&lt;/h3&gt;
&lt;p&gt;安装 Nginx 并创建一个新的配置文件，具体可以查看 &lt;a href=&quot;/posts/certbot-ssl-certificate-tutorial/&quot;&gt;这篇文章&lt;/a&gt; 。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/nginx/conf.d/openlist.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在配置文件写入以下内容并保存：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 80;
    server_name yourdomain.com;  # 改为你解析的域名

    location / {
        proxy_pass http://127.0.0.1:5244;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $http_cf_connecting_ip;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_request_buffering off;
        proxy_set_header Connection &quot;&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 申请 SSL 证书&lt;/h3&gt;
&lt;p&gt;因为我们要接入 Cloudflare CDN，建议配置 SSL 证书保证全程加密，支持以下两种方案：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用 Certbot 申请免费证书，并实现自动续签；&lt;/li&gt;
&lt;li&gt;申请 Cloudflare 有效期 15 年的源证书。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;Certbot SSL 证书&lt;/h4&gt;
&lt;p&gt;Certbot 是申请 Let’s Encrypt 免费证书的常用工具。它支持自动化操作，能够自动完成证书的申请、验证与后续续签。详细教程可以查看 &lt;a href=&quot;/posts/certbot-ssl-certificate-tutorial/&quot;&gt;这篇文章&lt;/a&gt; 。
使用下面的命令安装 Certbot：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install certbot
sudo apt install python3-certbot-nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;使用下面的命令申请证书：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo certbot --nginx -d yourdomain.com  # 改为你的域名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
Certbot 会自动识别 &lt;code&gt;server_name&lt;/code&gt; 申请证书并修改配置文件。
:::
输入下面的命令重载 Nginx：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nginx -t &amp;amp;&amp;amp; sudo nginx -s reload
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Cloudflare 源证书&lt;/h4&gt;
&lt;p&gt;Cloudflare 可提供有效期长达 15 年的源证书，但仅对 Cloudflare 与源服务器之间的加密有效。如果你的服务要长期接入 Cloudflare CDN，申请此证书可以简化配置流程；并且该证书是泛域名证书，可同时支持多个子域名，实现一次部署、长期有效。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录 Cloudflare 控制台，进入域名的 SSL/TLS 设置，点击源服务器，点击创建证书：
&lt;img src=&quot;cloudflare-origin-cert-entry.webp&quot; alt=&quot;Cloudflare SSL/TLS 源服务器入口&quot; /&gt;&lt;/li&gt;
&lt;li&gt;在源证书安装页面，保持默认即可，点击创建：
&lt;img src=&quot;cloudflare-origin-cert-config.webp&quot; alt=&quot;配置 15 年有效期源证书参数&quot; /&gt;&lt;/li&gt;
&lt;li&gt;打开文本编辑器，将生成的源证书复制保存为 &lt;code&gt;cf.pem&lt;/code&gt;，将生成的私钥复制保存为 &lt;code&gt;cf.key&lt;/code&gt;：
&lt;img src=&quot;cloudflare-copy-origin-cert-key.webp&quot; alt=&quot;复制并保存生成的源证书与私钥&quot; /&gt;&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;cf.pem&lt;/code&gt; 上传到 VPS 的 &lt;code&gt;/etc/ssl/certs/&lt;/code&gt; 目录，将 &lt;code&gt;cf.key&lt;/code&gt; 上传到 &lt;code&gt;/etc/ssl/private/&lt;/code&gt; 目录：&lt;/li&gt;
&lt;li&gt;编辑前面的 Nginx 配置文件，将端口改为443，并在 &lt;code&gt;server_name&lt;/code&gt; 下方添加证书：&lt;pre&gt;&lt;code&gt;server {
    listen 80;
    listen 443;
    server_name yourdomain.com;  # 改为你解析的域名
    ssl_certificate /etc/ssl/certs/cf.pem;
    ssl_certificate_key /etc/ssl/private/cf.key;
    
    location / {
        proxy_pass http://127.0.0.1:5244;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $http_cf_connecting_ip;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_request_buffering off;
        proxy_set_header Connection &quot;&quot;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;终端输入下面的命令重载 Nginx：&lt;pre&gt;&lt;code&gt;sudo nginx -t &amp;amp;&amp;amp; sudo nginx -s reload
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;5. 开启 Cloudflare 小黄云&lt;/h3&gt;
&lt;p&gt;证书申请成功后，回到 Cloudflare DNS 设置，将该记录的代理状态开启（小黄云）。&lt;/p&gt;
&lt;p&gt;进入域名的 SSL/TLS 设置的概述页面，点击配置：
&lt;img src=&quot;cloudflare-ssl-encryption-mode.webp&quot; alt=&quot;Cloudflare SSL/TLS 加密模式设置&quot; /&gt;
选择自定义 SSL/TLS，将加密模式设置为 &lt;code&gt;完全（严格）&lt;/code&gt;：
&lt;img src=&quot;cloudflare-set-ssl-strict-mode.webp&quot; alt=&quot;配置并保存完全（严格）加密模式&quot; /&gt;
:::note
VPS 已配置源证书，使用 &lt;code&gt;完全（严格）&lt;/code&gt; 模式可确保端到端的全加密传输。
:::&lt;/p&gt;
&lt;h3&gt;6. 登录面板修改密码&lt;/h3&gt;
&lt;p&gt;通过域名访问 OpenList 面板，使用一键脚本生成的用户名和密码登录。点击页面底部的管理，进入“个人资料”设置，第一时间修改用户名和密码，以保障安全性。
&lt;img src=&quot;openlist-admin-profile-settings.webp&quot; alt=&quot;OpenList 管理后台个人资料设置&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;使用示例&lt;/h2&gt;
&lt;p&gt;OpenList 的核心就是将“资源聚合”做到了极致。它不仅能把各种大容量网盘直接挂载到 VPS 上，实现像本地磁盘一样的操作体验，还支持通过 WebDAV 协议直接向外输出，让你能够摆脱第三方客户端的束缚，通过极其轻量化的方式搞定各类场景，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全平台私有影音库&lt;/strong&gt;：配合 Infuse 或网易爆米花，抓取网盘资源生成海报墙，实现网盘影片的流畅点播。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨设备协作中枢&lt;/strong&gt;：将 OpenList 挂载为电脑的本地磁盘，实现办公文档在不同设备间的实时同步。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;轻量化全能下载站&lt;/strong&gt;：对接 Aria2 或离线下载，让网盘直接变身成为你的离线缓存库。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关于如何中添加各种网盘，可以查看 &lt;a href=&quot;https://doc.oplist.org/guide&quot;&gt;官方文档&lt;/a&gt; 中的 &lt;code&gt;添加存储&lt;/code&gt; 板块。&lt;/p&gt;
&lt;p&gt;下面介绍一下如何搭配网易爆米花搭建个人影音服务：
&lt;img src=&quot;configure-webdav-in-baomihua-app.webp&quot; alt=&quot;网易爆米花配置 WebDAV&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开网易爆米花，点击添加资源。&lt;/li&gt;
&lt;li&gt;选择 WebDAV。&lt;/li&gt;
&lt;li&gt;输入 WebDAV 配置：
&lt;ul&gt;
&lt;li&gt;协议：选择 HTTPS&lt;/li&gt;
&lt;li&gt;安全：打开 HTTPS 证书校验&lt;/li&gt;
&lt;li&gt;地址：填入你解析的域名&lt;/li&gt;
&lt;li&gt;端口：输入 443&lt;/li&gt;
&lt;li&gt;用户名和密码：输入你用户名和密码&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;选择你要导入的资源，点击导入。&lt;/li&gt;
&lt;li&gt;回到媒体库界面，网易爆米花会自动扫描 OpenList 挂载的网盘内容，抓取元数据，生成海报墙。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;至此，你已经成功在 VPS 上部署了 OpenList 并接入了 Cloudflare CDN，搭建好了个人影音服务，ENJOY～&lt;/p&gt;
</content:encoded></item><item><title>使用 Certbot 自动化申请与续签 SSL 证书教程</title><link>https://www.smaritron.com/posts/certbot-ssl-certificate-tutorial/</link><guid isPermaLink="true">https://www.smaritron.com/posts/certbot-ssl-certificate-tutorial/</guid><pubDate>Sun, 01 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;在如今的互联网环境下，HTTP（超文本传输协议）已经是“不安全”的代名词。HTTP 采用明文形式传输数据，信息在客户端与服务器之间的传递过程中，容易被中间节点窃听或篡改。而 HTTPS 在 HTTP 的基础上引入了 SSL/TLS 加密层，通过对传输数据进行加密，确保了通信过程的私密性与数据完整性。因此，无论是出于 SEO、数据加密的考虑，还是为了配合 Cloudflare 等 CDN 服务，为 VPS 上的服务配置 SSL 证书都是必要环节。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nginx&lt;/strong&gt; 是一款高性能的 HTTP 和反向代理服务器，常用于处理流量分发与后端服务代理。而在众多的证书获取方案中，&lt;strong&gt;Certbot&lt;/strong&gt; 是申请 Let&apos;s Encrypt 免费证书的常用工具。它的优势在于支持自动化操作，能够自动完成证书的申请、验证与后续续签，有效降低了手动维护的成本。&lt;/p&gt;
&lt;p&gt;本文将介绍如何配置 &lt;strong&gt;Nginx&lt;/strong&gt;，并利用 &lt;strong&gt;Certbot&lt;/strong&gt; 实现 SSL 证书的自动化申请与续签流程。&lt;/p&gt;
&lt;h2&gt;环境准备&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;在开始之前，请确保你已经：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拥有一台安装了 Linux（如 Ubuntu/Debian）的 VPS。&lt;/li&gt;
&lt;li&gt;拥有一个域名并已正确解析到该 VPS 的 IP。&lt;/li&gt;
&lt;li&gt;VPS 开放了 80 和 443 端口。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;配置教程&lt;/h2&gt;
&lt;h3&gt;安装 Nginx&lt;/h3&gt;
&lt;p&gt;在 Ubuntu/Debian 系统中，可以使用以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install nginx -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完成后，确保 Nginx 处于运行状态，并建议将其设置为开机自启：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl start nginx
sudo systemctl enable nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;安装 Certbot&lt;/h3&gt;
&lt;p&gt;在 Ubuntu/Debian 系统中，可以使用以下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install certbot
sudo apt install python3-certbot-nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;创建 Nginx 配置文件&lt;/h3&gt;
&lt;p&gt;要申请证书，需要先为你的服务写好 Nginx 配置文件。如果你已经写好了配置文件可以跳过这步。&lt;/p&gt;
&lt;p&gt;新建配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo touch /etc/nginx/conf.d/yourdomain.com.conf    # 改为你的域名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编辑配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/nginx/conf.d/yourdomain.com.conf     # 改为你的域名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根据你的服务需要，修改配置文件，以下仅是一个示例，请自行修改：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;server {
    listen 80;
    server_name yourdomain.com; # 改为你的域名

    root /var/www/html; # 输入网站根目录
    index index.html;   # 输入首页 html

    location / {
        try_files $uri $uri/ =404;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编辑完成后，&lt;code&gt;Ctrl + O&lt;/code&gt; 写入并保存，&lt;code&gt;Ctrl + X&lt;/code&gt; 退出编辑器。&lt;/p&gt;
&lt;h3&gt;申请证书&lt;/h3&gt;
&lt;p&gt;通过前面的步骤我们已经配置好了 Nginx，下面进行证书申请操作。
:::important
请确保域名已解析到该 VPS，并开放了 80、443 端口。
:::
使用下面的命令申请证书：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo certbot --nginx -d yourdomain.com  # 改为你的域名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
Certbot 会自动识别 &lt;code&gt;server_name&lt;/code&gt; 为你申请证书并修改配置文件，把 HTTP 重定向到 HTTPS。
:::&lt;/p&gt;
&lt;h3&gt;检查证书状态&lt;/h3&gt;
&lt;p&gt;证书申请完成后，我们需要检查证书状态，确保配置已经生效且没有安全漏洞。
最直观的方法是使用浏览器访问你的网站，点击地址栏的“锁”图标查看证书详情。&lt;/p&gt;
&lt;p&gt;对于生产环境，推荐使用专业的在线工具进行扫描，这不仅能验证证书，还能检查你的 Nginx SSL 配置是否存在安全隐患（如弱加密套件）：访问 &lt;a href=&quot;https://www.ssllabs.com/ssltest&quot;&gt;Qualys SSL Labs Test&lt;/a&gt; ，输入你的域名进行检测。通常拿到 A 或 A+ 评分才算合格。&lt;/p&gt;
&lt;h3&gt;自动化续签&lt;/h3&gt;
&lt;p&gt;Let&apos;s Encrypt 的证书有效期只有 90 天，但 Certbot 默认会安装一个定时任务（cron job）来处理续签。&lt;/p&gt;
&lt;p&gt;你可以通过以下命令模拟续签流程，检查是否配置成功：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo certbot renew --dry-run
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;进阶使用方法&lt;/h2&gt;
&lt;h3&gt;Standalone 模式&lt;/h3&gt;
&lt;p&gt;如果你的后端服务暂未运行，或者你不想让 Certbot 修改你的 Nginx 配置文件，可以使用 Standalone 模式。Certbot 会在本地临时开启一个监听 80 端口 的服务，向 Let&apos;s Encrypt 证明这个域名确实指向这台 VPS。在验证期间，80 端口必须是空闲的，因此在运行前要停止 Nginx。该模式的缺点也显而易见，在验证期间，Nginx 会短暂不可用。&lt;/p&gt;
&lt;p&gt;为了实现后续的自动化续签，建议在申请证书时就直接加上 pre-hook（续签前操作）和 post-hook（续签后操作）参数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo certbot certonly --standalone -d yourdomain.com --pre-hook &quot;systemctl stop nginx&quot; --post-hook &quot;systemctl start nginx&quot; # 改为你的域名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;参数说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--pre-hook &quot;systemctl stop nginx&quot;&lt;/code&gt;：在验证开始前，自动停止 Nginx 以释放 80 端口。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--post-hook &quot;systemctl start nginx&quot;&lt;/code&gt;：在验证完成（无论成功或失败）后，自动重新启动 Nginx。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;DNS 验证模式&lt;/h3&gt;
&lt;p&gt;如果你想申请通配符证书，让 &lt;code&gt;*.yourdomain.com&lt;/code&gt; 及其主域名都共用一张证书，则必须使用 DNS 验证：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo certbot certonly --manual --preferred-challenges dns -d &quot;*.yourdomain.com&quot; -d yourdomain.com  # 改为你的域名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按照提示去你的域名服务商（如 Cloudflare/腾讯云）后台添加一条 TXT 解析记录，确认解析生效后再按回车。&lt;/p&gt;
&lt;p&gt;:::note
手动 DNS 验证模式不支持自动续签，若要自动续签需要安装并配置对应服务商的插件，如 &lt;code&gt;certbot-dns-cloudflare&lt;/code&gt;。
:::&lt;/p&gt;
&lt;h2&gt;常见问题排查（FAQ）&lt;/h2&gt;
&lt;p&gt;验证失败 (Challenge failed)：检查防火墙是否开启了 80 端口，或者是否有其他程序占用了端口。&lt;/p&gt;
&lt;p&gt;Too Many Requests：Let&apos;s Encrypt 对单位时间内申请证书的次数有限制，调试时建议加上 &lt;code&gt;--staging&lt;/code&gt; 参数。&lt;/p&gt;
&lt;p&gt;反代 502 问题：如果申请证书是为了反代，请确保 Nginx 配置中的 &lt;code&gt;proxy_pass&lt;/code&gt; 指向了正确的后端地址。&lt;/p&gt;
&lt;h2&gt;附录&lt;/h2&gt;
&lt;h3&gt;Nginx 常用命令&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable nginx     # 设置开机自启
sudo systemctl status nginx     # 查看 Nginx 运行状态
sudo nginx -t                   # 检查配置文件语法是否正确
sudo nginx -s reload            # 平滑重新加载配置（不中断服务）
sudo systemctl start nginx      # 启动 Nginx
sudo systemctl stop nginx       # 停止 Nginx
sudo systemctl restart nginx    # 重启 Nginx
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Certbot 常用命令&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;sudo certbot --version                          # 查看 Certbot 版本
sudo certbot certificates                       # 列出所有证书及有效期
sudo certbot renew                              # 手动尝试续签所有证书
sudo certbot renew --dry-run                    # 模拟续签流程
sudo certbot delete                             # 交互式删除证书
sudo certbot revoke --cert-name yourdomain.com  # 撤销指定的证书
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Fuwari：添加友情链接页面</title><link>https://www.smaritron.com/posts/fuwari-friends-links/</link><guid isPermaLink="true">https://www.smaritron.com/posts/fuwari-friends-links/</guid><pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;Fuwari 是一款极其纯粹、极简的 Astro 博客主题，但是并没有内置专用的友情链接页面。
本文将记录我添加一个功能完备的友链页的过程。&lt;/p&gt;
&lt;p&gt;:::note[参考来源]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://aulypc1.github.io/posts/website/add_friendspage_in_fuwari/&quot;&gt;AULyPc大佬的教程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tr0.cn/friends/&quot;&gt;雾创岛-友情链接样式&lt;/a&gt;
:::&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;创建友链页面&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;src/types/config.ts&lt;/code&gt; 文件内添加以下内容：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;export enum LinkPreset {
	Home = 0,
	Archive = 1,
	About = 2,
	Friends = 3,
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;src/i18n/i18nKey.ts&lt;/code&gt; 文件内添加以下内容：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;	home = &quot;home&quot;,
	about = &quot;about&quot;,
	archive = &quot;archive&quot;,
	friends = &quot;friends&quot;,
	search = &quot;search&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;src/i18n/languages&lt;/code&gt; 目录中编辑博客使用的语言文件，添加一个Key。这里以 &lt;code&gt;zh_CN.ts&lt;/code&gt; 为例：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;	[Key.author]: &quot;作者&quot;,
	[Key.publishedAt]: &quot;发布于&quot;,
	[Key.license]: &quot;许可协议&quot;,
	[Key.friends]: &quot;友链&quot;,
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;src/constants/link-presets.ts&lt;/code&gt; 文件内添加以下内容：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;	[LinkPreset.Archive]: {
		name: i18n(I18nKey.archive),
		url: &quot;/archive/&quot;,
	},
	[LinkPreset.Friends]: {
		name: i18n(I18nKey.friends),
		url: &quot;/friends/&quot;,
	},
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;src/pages&lt;/code&gt; 目录下新建 &lt;code&gt;friends.astro&lt;/code&gt; 文件，填入以下内容：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;---
import { getEntry, render } from &quot;astro:content&quot;;
import Markdown from &quot;@components/misc/Markdown.astro&quot;;
import { friends } from &quot;@/config&quot;;
import ImageWrapper from &quot;../components/misc/ImageWrapper.astro&quot;;
import I18nKey from &quot;../i18n/i18nKey&quot;;
import { i18n } from &quot;../i18n/translation&quot;;
import MainGridLayout from &quot;../layouts/MainGridLayout.astro&quot;;

const friendsPost = await getEntry(&quot;spec&quot;, &quot;friends&quot;);

if (!friendsPost) {
	throw new Error(&quot;Friends page content not found&quot;);
}

const { Content } = await render(friendsPost);
---
&amp;lt;MainGridLayout title={i18n(I18nKey.friends)} description={i18n(I18nKey.friends)}&amp;gt;
    &amp;lt;div class=&quot;card-base flex flex-col w-full rounded-[var(--radius-large)] overflow-hidden relative min-h-32&quot;&amp;gt;
        &amp;lt;div class=&quot;px-6 md:px-9 pt-6 md:pt-7 pb-8 relative w-full&quot;&amp;gt;
            &amp;lt;h1 class=&quot;transition w-full block font-bold mb-6 text-3xl text-90
                mt-1 md:mt-0
                before:w-1 before:h-5 before:rounded-md before:bg-[var(--primary)]
                before:absolute before:top-[35px] before:left-[18px] before:hidden md:before:block
            &quot;&amp;gt;
                友情链接
            &amp;lt;/h1&amp;gt;
            &amp;lt;Markdown class=&quot;-mt-2&quot;&amp;gt;
                &amp;lt;Content /&amp;gt;
            &amp;lt;/Markdown&amp;gt;
            &amp;lt;div class=&quot;grid grid-cols-1 md:grid-cols-2 gap-4&quot;&amp;gt;
                {friends.map((item) =&amp;gt; (
                    &amp;lt;div class=&quot;friend-card btn-plain scale-animation active:scale-95 overflow-hidden h-[92px]&quot;&amp;gt;
                        &amp;lt;a href={item.url} target=&quot;_blank&quot; rel=&quot;noopener&quot; class=&quot;flex items-center gap-3 p-4 w-full h-full group&quot;&amp;gt;
                            &amp;lt;div class=&quot;w-[60px] h-[60px] rounded-lg overflow-hidden bg-[#fff] shrink-0 z-10&quot;&amp;gt;
                                &amp;lt;ImageWrapper src={item.avatar} class=&quot;w-full h-full object-cover&quot;&amp;gt;&amp;lt;/ImageWrapper&amp;gt;
                            &amp;lt;/div&amp;gt;
                            &amp;lt;div class=&quot;max-w-[calc(100%-5rem)] flex flex-col z-10&quot;&amp;gt;
                                &amp;lt;div class=&quot;font-bold text-black dark:text-white group-hover:text-[var(--primary)] transition-colors truncate&quot;&amp;gt;
                                    {item.name}
                                &amp;lt;/div&amp;gt;
                                &amp;lt;div class=&quot;text-sm text-black/50 dark:text-white/50 line-clamp-2 mt-0.5&quot;&amp;gt;
                                    {item.description}
                                &amp;lt;/div&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/a&amp;gt;
                    &amp;lt;/div&amp;gt;
                ))}
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/MainGridLayout&amp;gt;

&amp;lt;style&amp;gt;
.friend-card {
    @apply flex flex-initial rounded-[var(--radius-large)] bg-[var(--card-bg)] 
           hover:bg-[var(--btn-plain-bg-hover)] transition-all duration-200;
}
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
样式参考自 &lt;a href=&quot;https://www.tr0.cn/friends/&quot;&gt;雾创岛-友情链接&lt;/a&gt; ，本人进行了一定修改。
:::&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;src/content/spec&lt;/code&gt; 目录下新建 &lt;code&gt;friends.md&lt;/code&gt; 文件，在里面写上友链的介绍，例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;**欢迎各位！如需添加友链，请邮件联系我！**
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;src/config.ts&lt;/code&gt; 文件内添加以下内容：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;export const navBarConfig: NavBarConfig = {
	links: [
		LinkPreset.Home,
		LinkPreset.Archive,
		LinkPreset.About,
		LinkPreset.Friends,
		//...
	],
};
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;code&gt;src/config.ts&lt;/code&gt; 文件的最后添加友链配置：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;export const friends = [
	{
		name: &quot;Smaritron&quot;,
		url: &quot;https://www.smaritron.com&quot;,
		avatar:
			&quot;https://www.smaritron.com/images/avatar.webp&quot;,
		description: &quot;找你找了一个世界&quot;,
	},
];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后续要新增友链只需要修改此配置即可。&lt;/p&gt;
&lt;p&gt;至此，友情链接页面的配置已经完成。&lt;a href=&quot;/friends/&quot;&gt;点击查看效果&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Fuwari：如何让外部链接自动在新标签页打开</title><link>https://www.smaritron.com/posts/ext-links-blank/</link><guid isPermaLink="true">https://www.smaritron.com/posts/ext-links-blank/</guid><pubDate>Fri, 13 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;为什么需要这个优化？&lt;/h3&gt;
&lt;p&gt;Fuwari 默认对 Markdown 中的链接处理较为简单，点击外部链接时会直接在当前页面跳转。这对于读者来说并不友好：当他们想看一眼参考资料时，原本的阅读进度就被迫中断了。&lt;/p&gt;
&lt;p&gt;为了解决这个问题，我们可以利用 &lt;code&gt;rehype-external-links&lt;/code&gt; 插件，它能自动识别外部链接并为其注入 &lt;code&gt;target=&quot;_blank&quot;&lt;/code&gt; 属性，从而让外部链接自动在新标签页打开。&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;rehypejs/rehype-external-links&quot;}&lt;/p&gt;
&lt;h3&gt;安装插件&lt;/h3&gt;
&lt;p&gt;进入博客根目录，使用包管理器安装插件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;pnpm add rehype-external-links
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置Astro 配置文件&lt;/h3&gt;
&lt;p&gt;安装完成后，我们需要在 &lt;code&gt;astro.config.mjs&lt;/code&gt; 中启用它。
在博客根目录编辑 &lt;code&gt;astro.config.mjs&lt;/code&gt; 文件，在文件顶部引入插件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import rehypeComponents from &quot;rehype-components&quot;;
import rehypeExternalLinks from &quot;rehype-external-links&quot;;
import rehypeKatex from &quot;rehype-katex&quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;找到 &lt;code&gt;markdown&lt;/code&gt; 配置部分的 &lt;code&gt;rehypePlugins&lt;/code&gt; 数组，添加 &lt;code&gt;rehypeExternalLinks&lt;/code&gt; 配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;	markdown: {
		//... 其他配置
		rehypePlugins: [
			rehypeKatex,
			[
				rehypeExternalLinks,
				{
					target: &quot;_blank&quot;,
					rel: [&quot;nofollow&quot;, &quot;noopener&quot;, &quot;noreferrer&quot;],
				},
			],
			rehypeSlug,
			//... 其他插件
		]
		//... 其他配置
	}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;参数说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;target: &quot;_blank&quot;&lt;/code&gt; ：强制链接在新标签页打开。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;rel: [&apos;nofollow&apos;, &apos;noopener&apos;, &apos;noreferrer&apos;]&lt;/code&gt; ：添加安全属性。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nofollow&lt;/code&gt; ：告诉搜索引擎不要追踪此链接，保护站点权重。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;noopener &amp;amp; noreferrer&lt;/code&gt; ：阻断新页面对原页面的控制权限，防范恶意脚本攻击。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;进阶技巧&lt;/h3&gt;
&lt;p&gt;该插件也可以给外部链接加一个小图标（比如 &lt;code&gt;↗&lt;/code&gt; ），你可以添加一个 &lt;code&gt;content&lt;/code&gt; 属性：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;rehypeExternalLinks,
{
	target: &quot;_blank&quot;,
	content: { type: &quot;text&quot;, value: &quot;↗&quot; }
},
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样，所有的外部链接后面都会自动跟一个箭头符号，清晰地提示用户 &lt;a href=&quot;https://www.bilibili.com&quot;&gt;这是一个外部跳转&lt;/a&gt; 。&lt;/p&gt;
&lt;h3&gt;对比测试&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;这是一个内部链接：&lt;a href=&quot;/&quot;&gt;博客主页&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;这是一个外部链接：&lt;a href=&quot;https://www.bilibili.com&quot;&gt;哔哩哔哩&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>如何在一天内彻底改变你的人生</title><link>https://www.smaritron.com/posts/how-to-fix-your-entire-life/</link><guid isPermaLink="true">https://www.smaritron.com/posts/how-to-fix-your-entire-life/</guid><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Dan Koe《如何在一天内彻底改变你的人生》全文中文翻译&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;译文说明&lt;/strong&gt;：本文为Dan Koe于2026年1月13日发布于X平台（原Twitter）的万字长文《How to fix your entire life in 1 day》完整中文翻译，严格贴合原文语义，保留作者核心观点、心理学逻辑与实操步骤，删减原文重复冗余表述，适配中文阅读习惯与打印需求，关键观点标注原文核心要义，便于理解与落地执行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;每年伊始，无数人立下新年决心——减肥、存钱、创业、摆脱内耗，但99%的人都会在几周内半途而废，最终回到原点，甚至陷入更深的自我怀疑。我们总以为，失败的原因是不够自律、意志力薄弱，或是方法不对，但真相远比这更深刻：你之所以无法达成目标，不是因为你做得不够多，而是因为你始终没有成为“能达成那个目标的人”。&lt;/p&gt;
&lt;p&gt;绝大多数人都在颠倒改变的顺序：他们试图通过改变行为来获得想要的结果，却忽略了“身份”才是所有行为的根源。就像健身达人无需强迫自己吃健康餐——对他们而言，不健康的饮食才需要消耗意志力；成功的创业者无需刻意早起工作——躺在床上无所事事，反而会让他们感到煎熬。&lt;/p&gt;
&lt;p&gt;真正的人生改变，从来都不是从“做什么”开始，而是从“你是谁”开始。身份塑造认知，认知指导行动，行动强化身份，这是一个循环往复的闭环。你今天的每一个选择，都在强化你当前的身份；而只有先重塑身份，你的行为才会自然跟随，结果也会不请自来。&lt;/p&gt;
&lt;p&gt;这篇文章的核心，不是教你一套“快速成功”的技巧，而是给你一套可在一天内完成的“心理重置协议”——通过三个阶段的深度自我剖析与行动校准，打破旧身份的桎梏，锚定新身份的坐标，让你在一天内启动持久的人生转变。它不需要你拥有超强的意志力，也不需要你投入大量的时间和金钱，只需要你拥有直面真相的勇气。&lt;/p&gt;
&lt;h2&gt;一、为什么你的改变总是半途而废？&lt;/h2&gt;
&lt;h3&gt;1. 你在试图用“旧身份”去过“新人生”&lt;/h3&gt;
&lt;p&gt;如果你内心深处仍然认为自己是“一个需要稳定、不敢冒险的普通人”，哪怕你立下“辞职创业”的目标，也会无意识地回避所有风险，最终半途而废；如果你始终觉得自己是“一个懒惰、不爱学习的人”，就算你制定了“每天读书1小时”的计划，也会找各种借口拖延，直到彻底放弃。&lt;/p&gt;
&lt;p&gt;你的行为永远无法超越你对“自己是谁”的认知。你可以暂时强迫自己做出不符合当前身份的行为，但这种强迫无法持久——就像你无法让一个骨子里认为自己“不适合运动”的人，长期坚持健身一样。改变的关键，不是对抗旧行为，而是替换旧身份。&lt;/p&gt;
&lt;h3&gt;2. 你所谓的“渴望”，其实并不是真的想要&lt;/h3&gt;
&lt;p&gt;心理学家阿德勒曾说：“只相信行动。生活发生在事件层面，而不是语言层面。”很多人嘴上说着“我想减肥”“我想成长”“我想变得更优秀”，但他们的行动却在诉说着相反的答案：宁愿刷手机到深夜，也不愿花30分钟运动；宁愿抱怨现状，也不愿花1小时学习；宁愿维持痛苦的舒适区，也不愿迈出改变的第一步。&lt;/p&gt;
&lt;p&gt;真相很残酷，但很真实：你没有达成目标，不是因为你做不到，而是因为你并非真的渴望。真正的渴望，一定会伴随着行动；而那些只停留在嘴上的“愿望”，不过是你逃避现实的借口——你渴望的不是改变后的生活，而是“无需付出代价，就能拥有改变后生活”的幻想。&lt;/p&gt;
&lt;h3&gt;3. 你害怕的不是失败，而是“成为另一个人”&lt;/h3&gt;
&lt;p&gt;很多人看似渴望改变，实则恐惧改变。这种恐惧，不是来自于“失败的风险”，而是来自于“身份被颠覆的不安”。人不仅会保护自己的身体安全，更会拼命保护自己的“心理身份”——当你试图改变身份时，大脑会将其解读为“生存威胁”，进而触发“战斗或逃跑”反应。&lt;/p&gt;
&lt;p&gt;这就是为什么很多人在即将成功时会主动“搞砸”事情：比如，在即将完成一个重要项目时故意拖延，在即将减肥成功时暴饮暴食。因为成功意味着“旧身份的死亡”——你将不再是那个“平庸、安全、不被关注”的人，你需要面对新的责任、新的审视，以及新的自己。这种未知，远比失败更让人恐惧。&lt;/p&gt;
&lt;h3&gt;4. 所有“自我毁灭”的行为，都是有目的的&lt;/h3&gt;
&lt;p&gt;你所谓的“拖延”、“懒惰”、“内耗”，并不是无意义的自我放弃，而是你潜意识里的“自我保护”。拖延工作，不是因为你不够自律，而是因为你害怕作品完成后被他人评判——拖延让你永远不必面对“被否定”的风险；留在一份痛苦的工作里，不是因为你没有勇气辞职，而是因为你在追求“安全感”——哪怕这份工作让你痛苦，也能让你避免“失业、被别人看不起”的尴尬。&lt;/p&gt;
&lt;p&gt;所有行为都是目标导向的，哪怕是那些看似“自我毁灭”的行为。你之所以无法改变，是因为你当前的行为，正在帮你达成一个“隐藏目标”——可能是安全感，可能是不被评判，可能是避免失败。而真正的改变，不是“换一个表层目标”，而是替换这套“隐藏的目标系统”。&lt;/p&gt;
&lt;h2&gt;二、身份的循环：它如何把你锁死，又如何被你打破？&lt;/h2&gt;
&lt;p&gt;身份的形成，是一个持续循环的过程，这个循环从童年时期就开始了——你依赖父母生存，必须服从他们的信念和价值观，否则就会被惩罚；而你的父母，也经历过同样的过程，他们的观念来自上一代人，来自所处的时代。除非你主动打破这个循环，否则你永远都在运行“别人写好的代码”，永远无法成为真正的自己。&lt;/p&gt;
&lt;h3&gt;身份形成的7步循环&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;你为了某个表层目标（比如“减肥”、“赚钱”）开始行动；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;你开始透过这个目标的“感知透镜”看待现实——只关注那些有助于达成目标的信息，忽略所有无关的内容；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;你重复相关行为，并获得一些正反馈（比如减肥瘦了2斤，赚钱多了1000元）；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这种行为逐渐变成自动化的习惯——你不需要再刻意提醒自己，就能自然做出选择；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这个习惯慢慢成为你身份的一部分——你开始给自己贴标签：“我是一个爱健身的人”、“我是一个能赚钱的人”；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;你开始拼命捍卫这个身份，以维持心理一致性——哪怕这个身份已经不再适合你，哪怕它正在阻碍你的成长，你也会拒绝改变；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;这个身份会塑造你的新目标，循环重新启动。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个循环的致命之处，在于第6步：一旦某个行为成为你身份的一部分，你就会把它当作“自己的一部分”，而不是“可以调整的选择”。比如，一个长期拖延的人，会把“拖延”当作自己的性格特质——“我就是这样一个人，改不了了”，而不是意识到“拖延只是一种行为，我可以选择改变它”。&lt;/p&gt;
&lt;p&gt;而打破这个循环的关键，就是“主动中断惯性”——通过深度自我剖析，看清旧身份的真相，重新定义自己，然后用新的行动，启动新的身份循环。这正是我们接下来要做的“一天重置计划”的核心逻辑。&lt;/p&gt;
&lt;h2&gt;三、心智发展的9个阶段：你处于哪个层次？&lt;/h2&gt;
&lt;p&gt;Dan Koe结合马斯洛需求层次理论、螺旋动力学等多种心理学模型，将人的心智发展分为9个阶段。你的心智层次，决定了你对世界的认知，也决定了你改变的难易程度。多数人处于第4到第8阶段，而无论你当前处于哪个阶段，向上成长的方法都是相似的——直面真相，主动迭代。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;冲动期&lt;/strong&gt;：冲动与行动之间没有任何间隔，就像愤怒的幼儿会直接动手打人，完全被本能支配，不会考虑后果；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;自我保护期&lt;/strong&gt;：开始学会保护自己，比如藏起不及格的成绩单，对大人说他们想听的话，核心是“避免惩罚、获得安全感”；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;从众期&lt;/strong&gt;：你的身份等于你的群体，群体的规则就是“现实本身”，你无法理解为什么有人会和你有不同的想法、不同的选择，核心是“寻求归属、避免孤立”；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;自我觉察期&lt;/strong&gt;：开始发现自己的内心世界与外在表现不一致，比如在人群中假装开心，独处时却感到孤独；在教堂里跟着众人祈祷，内心却并不相信，核心是“开始觉醒、质疑自我”；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;尽责期&lt;/strong&gt;：开始建立自己的原则和价值观，并努力对自己负责，比如经过深思熟虑后，离开家庭传承的宗教信仰，坚持自己认为正确的事情，核心是“坚守原则、自我负责”；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;个体期&lt;/strong&gt;：意识到自己的原则和价值观，也是被环境塑造的，开始更灵活地看待它们，不再固执己见，比如发现自己的政治观点，更多来自成长环境而非客观真理，核心是“接纳局限、灵活成长”；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;战略期&lt;/strong&gt;：能够在系统中工作，同时意识到自己也是系统的一部分，能够主动质疑自己的盲点，不再被单一的框架束缚，核心是“系统思维、自我校准”；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;构建觉察期&lt;/strong&gt;：把所有的框架，包括自己的身份，都视为“有用的虚构”，能够以温和的幽默看待自己扮演的角色，不再被身份绑架，核心是“跳出自我、接纳无常”；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;统一期&lt;/strong&gt;：自我与生活的分离彻底消融，工作、休息、娱乐不再是相互割裂的部分，而是一种统一的生活状态，核心是“内心平和、知行合一”。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;四、一天重置计划：如何在24小时内，重启你的人生？&lt;/h2&gt;
&lt;p&gt;请记住：“一天内彻底改变人生”，并不是指你能在一天内实现所有目标、获得想要的一切，而是指你能在一天内完成“身份重置”——看清旧身份的代价，锚定新身份的坐标，启动新的行为循环。这一天，是你人生转变的“起点”，而不是“终点”。&lt;/p&gt;
&lt;p&gt;整个计划分为三个阶段：上午（心理挖掘）、白天（打断惯性）、晚上（整合复盘），总耗时约2–3小时，其余时间正常工作、生活即可，无需刻意打乱原有节奏。&lt;/p&gt;
&lt;h3&gt;第一阶段：上午（30–60分钟）——心理挖掘，直面真相&lt;/h3&gt;
&lt;p&gt;这个阶段的核心，是“唤醒改变的动力”——通过深度自我剖析，直面当前的痛苦与恐惧，构建“反愿景”（你绝不想过的人生）和“理想愿景”（你真正想要的人生），让你产生“再也不想继续这样下去”的决心，这种决心，才是改变最强大的动力。&lt;/p&gt;
&lt;h4&gt;步骤1：直面当下的痛苦（15分钟）&lt;/h4&gt;
&lt;p&gt;找一个无干扰的空间，关闭手机通知、断网，准备好纸笔或备忘录，坦诚地回答以下问题（不要欺骗自己，不要找任何借口，哪怕答案让你感到羞愧、痛苦）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;写下3个你长期忍受、反复抱怨，却从未真正改变的“钝痛”——比如：每天刷手机到深夜，第二天精神萎靡；下班躺平无所事事，睡前充满愧疚；明明想成长，却始终拖延，一事无成；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;追问自己：如果一个旁观者，只看你的行为（不看你的想法、不听你的借口），他会断定你真正想要的是什么？（比如：你每天刷手机，旁观者会认为你真正想要的是“短暂的快乐”，而不是“成长”；你每天抱怨工作，却不辞职，旁观者会认为你真正想要的是“安全感”，而不是“理想的工作”）；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;坦诚写下：关于你当前的现状，有什么真相，是你最羞于对自己敬重的人（比如父母、偶像、朋友）承认的？（比如：“我其实很懒惰，我所谓的‘努力’，只是自我感动”；“我其实很害怕失败，所以我不敢尝试任何新事物”；“我其实并不喜欢现在的自己，却没有勇气改变”）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;步骤2：构建反愿景（15分钟）&lt;/h4&gt;
&lt;p&gt;反愿景，就是“你绝不想过的人生”。很多人之所以无法坚持改变，是因为他们只看到了“理想生活的美好”，却没有看清“维持现状的代价”。构建反愿景，就是让你清晰地看到“如果不改变，你未来会变成什么样”，从而产生强烈的逃避动力。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;细节描摹&lt;/strong&gt;：假设你5年后的生活，和现在没有任何变化，描述一个“普通周二”的完整状态——比如：早上7点半被闹钟叫醒，不情愿地起床，洗漱时抱怨生活，早餐随便应付一口；上午在工作中摸鱼、拖延，应付完当天的任务，内心充满愧疚；中午和同事闲聊，吐槽工作和生活，却从未想过改变；下午继续浑浑噩噩，下班後刷手机、追剧，直到深夜12点；睡前想起自己的目标，感到焦虑和自责，却还是决定“明天再开始改变”，然后带着愧疚入睡；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;延伸思考&lt;/strong&gt;：如果继续这样下去，10年后你会错过什么机会？（比如：错过学习新技能的机会，错过创业的机会，错过陪伴家人的机会）；谁会放弃你？（比如：曾经对你充满期待的父母，曾经愿意帮助你的朋友，曾经欣赏你的偶像）；当你走到生命尽头时，回顾这种“安全、平庸”的人生，你会付出什么代价？（比如：从未真正为自己活过，从未实现自己的价值，临终前充满遗憾和悔恨）；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定位阻力&lt;/strong&gt;：坦诚地写下，你至今未改变的“最尴尬的原因”——不是“我没时间”“我没能力”这种“合情合理”的借口，而是最真实的内心阻力（比如：恐惧失败，害怕自己做不到；懒惰，不想付出努力；害怕改变后，自己不再是“原来的自己”；依赖舒适区，不想面对未知）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;步骤3：构建理想愿景（15–30分钟）&lt;/h4&gt;
&lt;p&gt;理想愿景，不是“有钱有闲”这种空泛的想象，而是“你真正想要的生活状态”，更重要的是——通过愿景，锚定你“想要成为什么样的人”。请记住：愿景的核心，不是“你想拥有什么”，而是“你想成为谁”。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;细节描摹&lt;/strong&gt;：假设3年后，你已经成为了“理想中的自己”，描述一个“普通周二”的完整状态——比如：早上6点半自然醒来，洗漱后进行10分钟拉伸，然后吃一顿营养的早餐，一边早餐一边阅读30分钟；上午专注于自己的工作或事业，高效完成当天的核心任务，内心充满成就感；中午和志同道合的朋友交流，分享彼此的成长和收获；下午利用空闲时间学习新技能，或者做自己喜欢的事情（比如写作、画画）；下班後陪伴家人，或者进行适量运动；晚上10点半洗漱完毕，复盘当天的收获，规划第二天的任务，然后带着满足感入睡；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关键追问&lt;/strong&gt;：要过上这种理想的生活，你必须成为什么样的人？（请写得具体、可落地，不要写“我想成为一个努力的人”“我想成为一个优秀的人”这种空泛的答案，比如：“我想成为一个每天有1小时创造时间的成长者”“我想成为一个专注、高效、不内耗的创业者”“我想成为一个懂得爱自己、也懂得爱家人的人”）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;第二阶段：白天（贯穿全天，无需额外耗时）——打断惯性，落地新身份&lt;/h3&gt;
&lt;p&gt;这个阶段的核心，是“让新身份落地”——我们的日常行为，大多是“自动化的惯性”，而这些惯性，都是旧身份塑造的。通过“随机提醒”和“微行动”，打断旧惯性，让你在日常生活中，主动践行新身份的行为，从而慢慢强化新身份。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;设置6个随机闹钟：在手机上设置6个随机的闹钟（比如：9:15、10:30、11:45、14:20、16:10、18:30），闹钟响起时，立即停下手中的事情，花1分钟时间，自问以下3个问题，然后根据答案，调整自己接下来的行为：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我此刻的行为，是靠近理想愿景，还是滑向反愿景？（比如：闹钟响起时，你正在刷手机，这就是滑向反愿景；如果你正在阅读、工作，这就是靠近理想愿景）；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;我现在做的事，是出于旧身份的自我保护，还是真心渴望？（比如：你正在拖延工作，是因为害怕失败——旧身份的自我保护；还是因为你真的不想做这份工作——真心渴望改变）；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;如果我已经是理想中的自己，会做这件事吗？（比如：理想中的你是一个“专注成长的人”，那么理想中的你，不会花大量时间刷手机，不会拖延工作）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;拆解当前日程：花10分钟时间，拆解自己当天的日程，标出“时间黑洞”和“高价值时段”——时间黑洞，就是那些无意义、消耗精力的时间（比如：刷手机、无效聊天、漫无目的地刷视频）；高价值时段，就是你精力最旺盛、最适合做重要事情的时间（比如：早上9–10点、下午2–3点）；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;微启动行动：做1件与新身份匹配的小事（无需太大，无需追求完美，只要能践行新身份即可）——比如：理想中的你是一个“创作者”，就写500字；理想中的你是一个“健康主义者”，就拉伸10分钟；理想中的你是一个“学习者”，就阅读30分钟；理想中的你是一个“高效工作者”，就专注完成1件核心任务。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这个阶段的关键，不是“做多少事”，而是“培养觉察力”——让你意识到自己的行为与身份的关联，不再无意识地被旧惯性支配。哪怕你只是在闹钟响起时，调整了自己的行为，哪怕你只做了一件小事，也是在强化新身份。&lt;/p&gt;
&lt;h3&gt;第三阶段：晚上（30分钟）——整合复盘，固化改变&lt;/h3&gt;
&lt;p&gt;这个阶段的核心，是“固化改变的成果”——通过复盘当天的经历，明确内心的阻碍，压缩愿景与反愿景，制定可落地的目标，让新身份真正扎根在你的心里，为接下来的持续迭代，奠定基础。&lt;/p&gt;
&lt;h4&gt;步骤1：核心复盘（10分钟）&lt;/h4&gt;
&lt;p&gt;再次回到无干扰的空间，坦诚地回答以下2个问题（不要自我欺骗，不要自我感动，真实的答案，才能让你真正成长）：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;今天最痛苦的真相是什么？真正的内在阻碍（敌人）是什么？&lt;/strong&gt;（比如：“我最痛苦的真相是，我一直在自我欺骗，我所谓的‘渴望改变’，只是一种自我安慰”；“我真正的内在阻碍，是恐惧失败，我害怕自己付出努力后，仍然无法成为理想中的自己”）；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;我真正想构建的生活，核心是什么？&lt;/strong&gt;（用1句话概括，不要空泛，要具体——比如：“我真正想构建的生活，是每天都能成长，有自己的事业，有陪伴家人的时间，内心平和、充满成就感”）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;步骤2：写下2句宣言（10分钟）&lt;/h4&gt;
&lt;p&gt;宣言的作用，是“锚定身份”——通过语言的强化，让新身份深入你的潜意识，让你在面对诱惑和阻碍时，能够快速想起自己的选择。请认真写下以下2句宣言，最好能大声读出来，并且贴在你能经常看到的地方（比如：桌面、手机壁纸）：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;拒绝宣言（反愿景压缩版）&lt;/strong&gt;：用1句话，明确你“拒绝成为什么样的人”“拒绝过什么样的生活”——比如：“我拒绝浑浑噩噩、拖延内耗，拒绝过充满遗憾、毫无价值的人生”；“我拒绝被旧身份绑架，拒绝停留在舒适区，拒绝自我欺骗、自我感动”；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;承诺宣言（新身份锚点）&lt;/strong&gt;：用1句话，明确你“想成为什么样的人”“会做出什么样的行动”——比如：“我是一个持续成长的创作者，我会每天输出300字，专注提升自己，不内耗、不拖延”；“我是一个健康、自律的人，我会每天早起拉伸，坚持阅读，用心对待自己的身体和生活”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;步骤3：制定3个层级目标（10分钟）&lt;/h4&gt;
&lt;p&gt;目标的作用，是“指引行动”——没有目标的行动，就是盲目跟风；而过于宏大、不切实际的目标，只会让你感到挫败，最终放弃。请制定3个层级的目标（落地性优先，无需贪多），让新身份的行动，能够持续下去：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一年视角（长期目标）&lt;/strong&gt;：做1件具体的事，打破旧身份的模式——比如：掌握1项可变现的技能（写作、设计、编程等）；辞职创业，开启自己的事业；减掉30斤，拥有健康的身体；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;一月视角（中期目标）&lt;/strong&gt;：做1件具体的事，让一年的长期目标落地——比如：每周学习3次技能，每次1小时；每周输出4篇文章，每篇500字以上；每周运动3次，每次30分钟；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;每日视角（短期目标）&lt;/strong&gt;：明天做2–3件与新身份匹配的小事，无需太大，只要能持续践行即可——比如：早起拉伸10分钟、阅读30分钟、输出300字、不刷手机超过30分钟、专注完成1件核心任务。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;五、后续执行关键：如何让改变持久下去？&lt;/h2&gt;
&lt;p&gt;一天的重置，只是改变的起点。要让改变持久下去，让新身份彻底取代旧身份，还需要记住以下4个关键原则——它们能帮你避免反弹，持续迭代，最终活成理想中的自己。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;身份优先，行为为辅&lt;/strong&gt;：无论做任何事情，都要先问自己：“这符合我的新身份吗？” 不要强迫自己“必须做什么”，而是告诉自己“我作为这样的人，应该做什么”。当身份扎根在你的心里，行为就会自然跟随，无需刻意坚持——就像健身达人自然会吃健康餐，创作者自然会坚持输出一样。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;每日1小时，持续迭代&lt;/strong&gt;：固定每天1个“高价值时段”（30–60分钟），只做2件事——学习输入（30分钟）和创造输出（30分钟）。学习输入，是为了提升认知，让你更清晰地理解“理想中的自己”应该具备什么样的能力；创造输出，是为了强化行动，让你在实践中，慢慢成为理想中的自己。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定期校准，避免偏离&lt;/strong&gt;：每季度安排1次“重启日”（和今天的流程一样），复盘自己过去3个月的目标与行动——看看自己的行为是否符合新身份，看看目标是否需要调整，看看自己是否陷入了“自我感动”的陷阱。定期校准，能帮你避免偏离方向，让改变持续下去。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;接受不完美，允许破例&lt;/strong&gt;：改变不是一个“一帆风顺”的过程，你可能会偶尔破例，可能会偶尔回到旧的行为模式——这很正常，不要因为一次破例，就否定自己所有的努力，就放弃改变。允许自己破例，但要记住：破例之后，要快速回归新身份的轨道，不要让“一次破例”变成“彻底放弃”。同时，不要贪多——先聚焦1–2个核心习惯，把它们做好、做持久，比同时尝试很多事情，最终一事无成，要好得多。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;六、核心观点速记（打印后可贴在桌面）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;你到不了理想境地，是因为你还不是能抵达那里的人——先成为，再拥有。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;行动是唯一的标准，真正的渴望，一定会付出代价；只停留在嘴上的愿望，不过是逃避现实的借口。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;身份形成循环：目标→认知→行动→身份→新目标，打破循环的关键，是重塑身份。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;改变的阻力，从来不是懒惰或意志力薄弱，而是旧身份的自我保护，和对未知的恐惧。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一天的重置，不是终点，而是起点；真正的改变，是日复一日的迭代与坚持。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;你不需要更努力，你需要成为另一个人——身份对了，一切都会水到渠成。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;很多人都在等待一个“合适的时机”，等待自己“足够自律”、“足够有能力”，再开始改变。但真相是：从来没有什么“合适的时机”，也没有什么“完美的开始”。改变的最好时机，就是现在；改变的最好方式，就是“先假装自己已经是理想中的人，然后按照他的方式去生活”。&lt;/p&gt;
&lt;p&gt;你今天的每一个选择，都在塑造未来的自己。你可以选择继续停留在舒适区，被旧身份绑架，过着充满遗憾的人生；也可以选择勇敢地直面真相，重塑身份，从今天开始，一步步活成自己想要的样子。&lt;/p&gt;
&lt;p&gt;记住：人生的改变，从来都不是一蹴而就的，但只要你迈出了第一步，只要你持续迭代，时间一定会给你最好的回报。今天，就是你人生全新的起点——&lt;strong&gt;从此刻开始，做理想中的自己，过理想中的生活&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&amp;lt;small&amp;gt;&lt;strong&gt;来源：&lt;/strong&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s/huVeSMUrymDq4MfoW4-ERw&quot;&gt;Dan Koe《如何在一天内彻底改变你的人生》全文中文翻译&lt;/a&gt;&amp;lt;/small&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>UFW简明配置指南</title><link>https://www.smaritron.com/posts/ufw-brief-guide/</link><guid isPermaLink="true">https://www.smaritron.com/posts/ufw-brief-guide/</guid><pubDate>Fri, 12 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在 VPS (Virtual Private Server) 运维中，安全是第一要素。&lt;strong&gt;UFW (Uncomplicated Firewall)&lt;/strong&gt; 是 Ubuntu 和 Debian 系统上默认的防火墙配置工具。它旨在简化 &lt;code&gt;iptables&lt;/code&gt; 的复杂语法，让用户能以更直观的方式管理网络流量。&lt;/p&gt;
&lt;h2&gt;安装与基础状态&lt;/h2&gt;
&lt;p&gt;虽然大多数 Ubuntu 镜像默认安装了 UFW，但为了保险起见，可以检查一下。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 更新源并安装 UFW
sudo apt update &amp;amp;&amp;amp; sudo apt install ufw

# 查看当前状态 (默认通常是 inactive/未激活)
sudo ufw status verbose
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;设置默认策略 (Default Policies)&lt;/h2&gt;
&lt;p&gt;在添加具体规则之前，建议配置“&lt;strong&gt;默认拒绝所有入站连接，允许所有出站连接&lt;/strong&gt;”的策略。这是一种安全基线，意味着除非你明确允许，否则没人能访问你的VPS，但你的VPS可以访问外部网络（如更新软件）。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 拒绝所有入站流量
sudo ufw default deny incoming

# 允许所有出站流量
sudo ufw default allow outgoing
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;关键步骤：允许 SSH 连接&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;在启用防火墙之前，必须先允许 SSH 连接！&lt;/strong&gt; 否则当你启动 UFW 时，你会被立即踢出服务器，且无法再次连接。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 允许默认 SSH 端口 (22)
sudo ufw allow ssh

# 或者，如果你的 SSH 使用了自定义端口 (例如 2222)，请使用：
sudo ufw allow 2222/tcp
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;常用服务配置指令&lt;/h2&gt;
&lt;p&gt;根据你的 VPS 用途，开放相应的端口。以下是最常见的配置场景：&lt;/p&gt;
&lt;h3&gt;Web 服务 (HTTP/HTTPS)&lt;/h3&gt;
&lt;p&gt;如果你运行网站（Nginx/Apache）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 允许 HTTP (80)
sudo ufw allow 80/tcp

# 允许 HTTPS (443)
sudo ufw allow 443/tcp

# 或者直接使用服务名 (如果已安装 Nginx)
sudo ufw allow &apos;Nginx Full&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;数据库与邮件&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 允许 MySQL (仅限受信任的 IP 访问比较安全，详见进阶)
sudo ufw allow 3306/tcp

# 允许 SMTP 邮件服务
sudo ufw allow 25/tcp
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;指定特定 IP 访问 (进阶安全)&lt;/h3&gt;
&lt;p&gt;如果你只想让你自己的 IP 访问某个端口（例如数据库或 SSH）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 格式: sudo ufw allow from &amp;lt;IP地址&amp;gt; to any port &amp;lt;端口号&amp;gt;
sudo ufw allow from 192.168.1.100 to any port 22
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;启用与管理防火墙&lt;/h2&gt;
&lt;p&gt;配置好规则后，正式启用防火墙。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 启用防火墙 (系统会提示可能会中断 SSH，输入 y 确认)
sudo ufw enable

# 禁用防火墙
sudo ufw disable

# 重载配置 (修改配置文件后使用)
sudo ufw reload
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;删除规则与查看状态&lt;/h2&gt;
&lt;h3&gt;查看带编号的规则列表&lt;/h3&gt;
&lt;p&gt;这是管理规则最方便的方式，因为你可以通过编号来删除规则。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo ufw status numbered
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;输出示例：&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;删除规则&lt;/h3&gt;
&lt;p&gt;假设你想删除上面列表中的第 2 条规则（即 80/tcp）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 按编号删除
sudo ufw delete 2

# 或者按具体规则内容删除
sudo ufw delete allow 80/tcp
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;重置配置&lt;/h2&gt;
&lt;p&gt;如果你把规则配置乱了，想从头开始：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 禁用 UFW 并删除所有自定义规则，恢复默认设置
sudo ufw reset
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;快速检查清单&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;设置默认拒绝入站 (&lt;code&gt;default deny incoming&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;务必&lt;/strong&gt;允许 SSH (&lt;code&gt;allow ssh&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;允许必要的业务端口 (如 80, 443).&lt;/li&gt;
&lt;li&gt;启用防火墙 (&lt;code&gt;enable&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;检查状态 (&lt;code&gt;status&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item></channel></rss>