<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Yukkihome</title><description>blog</description><link>https://yukkihome.netlify.app/</link><language>zh_CN</language><item><title>Office 365 订阅状态监控系统的配置</title><link>https://yukkihome.netlify.app/posts/network/microsoft-e3/</link><guid isPermaLink="true">https://yukkihome.netlify.app/posts/network/microsoft-e3/</guid><description>一个轻量级的 Office 365 订阅状态监控系统，支持自动检测、手动检测和异常通知。</description><pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这是&lt;code&gt;xiaokun567&lt;/code&gt;佬开发的一款面板，可以检查当前365订阅的状态和用户信息&lt;/p&gt;
&lt;p&gt;项目地址：&lt;a href=&quot;https://github.com/xiaokun567/office365&quot;&gt;xiaokun567/office365: 一个轻量级的 Office 365 订阅状态监控系统，支持自动检测、手动检测和异常通知。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://b2-piclist.982641.xyz/user-dm8ee3c48b70atobcs-top-a3f14139-662d-4bed-9cee-e915c94f1dec/Pasted%20image%2020251115040258.png&quot; alt=&quot;Pasted image 20251115040258.png|697&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;下载和启动&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;创建一个文件夹，例如office365&lt;/li&gt;
&lt;li&gt;进入文件夹内，输入&lt;code&gt;git clone https://github.com/xiaokun567/office365&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;安装依赖，&lt;code&gt;pip install -r requirements.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;启动程序，&lt;code&gt;python app.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;访问系统，看Terminal显示的地址&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
依赖安装到虚拟环境的方法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h2&gt;配置方法&lt;/h2&gt;
&lt;h3&gt;1. 进入面板&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;点击右上角设置&lt;/li&gt;
&lt;li&gt;往下移动点击添加订阅
&lt;img src=&quot;https://b2-piclist.982641.xyz/user-dm8ee3c48b70atobcs-top-a3f14139-662d-4bed-9cee-e915c94f1dec/Pasted%20image%2020251115040258.png&quot; alt=&quot;Pasted image 20251115040258.png|697&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;2. 获取订阅token&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;进入Admin面板-Billing-Licenses-随便找个你订阅的365点进去&lt;/li&gt;
&lt;li&gt;F12打开开发者工具，找到网络，搜索&lt;code&gt;subscriptions&lt;/code&gt;，刷新&lt;/li&gt;
&lt;li&gt;选择复制为cURL(bash)&lt;/li&gt;
&lt;li&gt;粘贴到&lt;code&gt;许可证查询 Curl 命令&lt;/code&gt;
&lt;img src=&quot;https://b2-piclist.982641.xyz/user-dm8ee3c48b70atobcs-top-a3f14139-662d-4bed-9cee-e915c94f1dec/Pasted%20image%2020251115035311.png&quot; alt=&quot;Pasted image 20251115035311.png|707&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;3. 获取用户token&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;进入Admin面板-Users-Active users&lt;/li&gt;
&lt;li&gt;F12打开开发者工具，找到网络，搜索&lt;code&gt;user&lt;/code&gt;，刷新&lt;/li&gt;
&lt;li&gt;选择复制为cURL(bash)&lt;/li&gt;
&lt;li&gt;粘贴到&lt;code&gt;创建用户的 Curl 命令&lt;/code&gt;
&lt;img src=&quot;https://b2-piclist.982641.xyz/user-dm8ee3c48b70atobcs-top-a3f14139-662d-4bed-9cee-e915c94f1dec/Pasted%20image%2020251115034515.png&quot; alt=&quot;Pasted image 20251115034515.png|697&quot; /&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>试一试缤纷云</title><link>https://yukkihome.netlify.app/posts/network/bitiful/</link><guid isPermaLink="true">https://yukkihome.netlify.app/posts/network/bitiful/</guid><description>继七牛云对象存储踩坑后，试试新出的缤纷云</description><pubDate>Sat, 01 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;存储费用&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://b2-piclist.982641.xyz/user-dm8ee3c48b70atobcs-top-a3f14139-662d-4bed-9cee-e915c94f1dec/bitiful1.png&quot; alt=&quot;bitiful1.png|707&quot; /&gt;
给了慷慨的50G，而且还有一条规则：&lt;em&gt;每个小时 S4 产生的出口流量数可抵扣当前小时相应容量的存储费用，即：该小时 A、B、C 三个桶的出口流量总共为 40GB，则该小时存储费用全免（12GB存储费用被40GB流量抵消&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;流量费用&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://b2-piclist.982641.xyz/user-dm8ee3c48b70atobcs-top-a3f14139-662d-4bed-9cee-e915c94f1dec/bitiful2.png&quot; alt=&quot;bitiful2.png&quot; /&gt;
&lt;img src=&quot;https://b2-piclist.982641.xyz/user-dm8ee3c48b70atobcs-top-a3f14139-662d-4bed-9cee-e915c94f1dec/bitiful4.png&quot; alt=&quot;bitiful4.png|703&quot; /&gt;并且这三项每项独立，不知道S4出口流量和CDN回源流量是不是一起算的。并且CDN 海外节点回源跨境加速流量&lt;strong&gt;目前&lt;/strong&gt;是全免费的
另外还有一条限制：&lt;em&gt;免费额度为每月每项10GB，但为防止滥用，目前限制每天用量不能超过5GB（当天超过5GB后会开始计费）&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;请求费用&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://b2-piclist.982641.xyz/user-dm8ee3c48b70atobcs-top-a3f14139-662d-4bed-9cee-e915c94f1dec/bitiful5.png&quot; alt=&quot;bitiful5.png|695&quot; /&gt;每月免费10w次，看起来直接请求存储桶和请求CDN是分开算的&lt;/p&gt;
&lt;h2&gt;媒体处理费用&lt;/h2&gt;
&lt;p&gt;这项目前还是免费使用&lt;/p&gt;
</content:encoded></item><item><title>七牛云免费额度的坑</title><link>https://yukkihome.netlify.app/posts/network/qiniuyun/</link><guid isPermaLink="true">https://yukkihome.netlify.app/posts/network/qiniuyun/</guid><description>记录一下七牛云免费额度kodo对象存储和CDN踩的坑</description><pubDate>Sat, 01 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Kodo对象存储&lt;/h2&gt;
&lt;p&gt;首先，只有&lt;strong&gt;标准存储&lt;/strong&gt;才有免费额度，空间是10G，创建存储桶的时候不能选错
&lt;img src=&quot;https://b2-piclist.982641.xyz/user-dm8ee3c48b70atobcs-top-a3f14139-662d-4bed-9cee-e915c94f1dec/qiniuyun1.png&quot; alt=&quot;qiniuyun1.png|739&quot; /&gt;&lt;/p&gt;
&lt;p&gt;流出流量的10G免费额度，必须通过CDN回源才行，直接访问存储桶是会被收费的
&lt;img src=&quot;https://b2-piclist.982641.xyz/user-dm8ee3c48b70atobcs-top-a3f14139-662d-4bed-9cee-e915c94f1dec/qiniuyun2.png&quot; alt=&quot;qiniuyun2.png|729&quot; /&gt;
幸好我这里没有直接投入生产使用，没有被扣太多费用&lt;/p&gt;
&lt;h2&gt;CDN&lt;/h2&gt;
&lt;p&gt;于是赶紧去配置了Kodo的加速域名（七牛云会系统分配一个域名，但是每30天会变，很麻烦），但是没想到CDN还有一层坑
&lt;img src=&quot;https://b2-piclist.982641.xyz/user-dm8ee3c48b70atobcs-top-a3f14139-662d-4bed-9cee-e915c94f1dec/qiniuyun3.png&quot; alt=&quot;qiniuyun3.png|714&quot; /&gt;
七牛云的CDN流量是额外计费的，每个月是10G，而且只有&lt;strong&gt;HTTP流量&lt;/strong&gt;有免费额度。难怪官方分配的域名是HTTP的
&lt;img src=&quot;https://b2-piclist.982641.xyz/user-dm8ee3c48b70atobcs-top-a3f14139-662d-4bed-9cee-e915c94f1dec/qiniuyun4.png&quot; alt=&quot;qiniuyun4.png|703&quot; /&gt;
最后，如果要删除配置好的域名，需要到控制台-加速域名，选择停用并输入密码，然后才可以删除&lt;/p&gt;
</content:encoded></item><item><title>一种备份本地Postgres和Redis数据库到Neon和Upstash的方法</title><link>https://yukkihome.netlify.app/posts/docker/redis-and-postgres-backup/</link><guid isPermaLink="true">https://yukkihome.netlify.app/posts/docker/redis-and-postgres-backup/</guid><description>备份本地Postgres和Redis数据库到Neon和Upstash，并且实现不停机无缝迁移</description><pubDate>Wed, 29 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Postgress&lt;/h2&gt;
&lt;h3&gt;从Neon拉取到本地&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;使用本地的postgres从neon dump&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;sudo docker compose exec -T memos-postgres pg_dump &quot;You_PG_URL&quot; &amp;gt; ./backup/memos_backup.sql
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;恢复到本地postgres数据库&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;cat ./backup/memos_backup.sql | sudo docker compose exec -T memos-postgres psql -U memos -d memos
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;备份到云端&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;创建脚本 sync_to_cloud_backup.sh&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
set -euo pipefail

# === Configuration ===

# 1. Your Compose project network&apos;s full name
# Verify with: sudo docker network ls | grep caddy_network
COMPOSE_NETWORK=&quot;docker_caddy_network&quot; 

# 2. Backup path (using your home directory for safety)
BACKUP_DIR=&quot;/home/yukki/docker/backup&quot;
mkdir -p &quot;$BACKUP_DIR&quot;
DUMP_FILE=&quot;$BACKUP_DIR/redis.dump&quot; # Define the dump file name

# 3. PostgreSQL (Neon connection string)
NEON_DB_URL=&quot;You_PG_URL&quot;

# 4. Redis (Upstash connection string)
UPSTASH_URL=&quot;You_Upstash_URL&quot;

# 5. Log file
LOG_FILE=&quot;$BACKUP_DIR/backup_$(date +%Y%m%d_%H%M%S).log&quot;
exec &amp;gt; &amp;gt;(tee -a &quot;$LOG_FILE&quot;) 2&amp;gt;&amp;amp;1

echo &quot;===== Backup started at $(date) =====&quot;

# === PostgreSQL Part (Memos Backup) ===
# ... (This part was correct, keep it) ...
echo &quot;[1/2] Dumping PostgreSQL from &apos;memos-postgres&apos;...&quot;
docker compose exec -T memos-postgres \
    pg_dump -U memos -d memos --format=custom \
    &amp;gt; &quot;$BACKUP_DIR/memos.dump&quot;

echo &quot;[1/2] Restoring PostgreSQL dump to Neon...&quot;
docker run --rm -v &quot;$BACKUP_DIR/memos.dump:/backup/memos.dump&quot; postgres:17 \
    pg_restore --clean --no-acl --no-owner -d &quot;$NEON_DB_URL&quot; /backup/memos.dump

echo &quot;✅ PostgreSQL (Memos) backup to Neon successful.&quot;

# === Redis Part (LunaTV Backup) ===

# !!! Using the Go binary to DUMP and redis-cli to PIPE from file !!!
echo &quot;[2/2] Dumping Redis from &apos;lunatv-redis&apos; (using Go tool)...&quot;

# !!! Prerequisite: Ensure lunatv-redis exposes port 6379 to host&apos;s localhost:
# ports:
#  - &quot;127.0.0.1:6379:6379&quot;
# (Restart lunatv-redis if you just added this)

# Execute the Go binary to dump to the file
# Using the correct flags based on its help output
./backup/upstash-redis-dump \
    -host localhost \
    -port 6379 \
    --output resp \
    &amp;gt; &quot;$DUMP_FILE&quot;

echo &quot;[2/2] Piping Redis dump file to Upstash (using redis-cli)...&quot;

# Execute redis-cli inside the lunatv-redis container
# Use --tls and --pipe, reading (&amp;lt;) from the dump file
# Note: We mount the backup dir into the container temporarily
docker run --rm \
    --network=&quot;$COMPOSE_NETWORK&quot; \
    -v &quot;$BACKUP_DIR:/backup&quot; \
    redis:alpine \
    sh -c &quot;redis-cli --tls -u &apos;$UPSTASH_URL&apos; --pipe &amp;lt; /backup/redis.dump&quot;

echo &quot;✅ Redis (LunaTV) backup to Upstash successful.&quot;

# Cleanup the temporary dump file (optional)
# rm -f &quot;$DUMP_FILE&quot;

echo &quot;===== Backup finished successfully at $(date) =====&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下载upstash-redis-dump到backup目录
https://github.com/upstash/upstash-redis-dump&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;给予执行权限&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chmod +x /home/yukki/docker/sync_to_cloud_backup.sh
chmod +x /home/yukki/docker/backup/upstash-redis-dump
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;执行脚本&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo /home/yukki/docker/sync_to_cloud_backup.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;定时备份&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo crontab -e
# 每天凌晨 3:00 执行备份脚本
0 3 * * * /usr/bin/bash /home/yukki/docker/sync_to_cloud_backup.sh &amp;gt;&amp;gt; /home/yukki/docker/backup/cron_$(date +\%Y\%m\%d).log 2&amp;gt;&amp;amp;1
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>Web开发免费资源指南</title><link>https://yukkihome.netlify.app/posts/network/free-cloud-source/</link><guid isPermaLink="true">https://yukkihome.netlify.app/posts/network/free-cloud-source/</guid><description>免费额度的云构建、部署与存储服务</description><pubDate>Wed, 22 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;一、 前端部署服务 (Frontend Deployment)&lt;/h3&gt;
&lt;p&gt;对于现代前端框架（如 React, Vue, Svelte）构建的静态或服务端渲染（SSR）应用，以下平台提供了极致的部署体验和慷慨的免费额度。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://vercel.com/&quot;&gt;Vercel&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;免费额度 (Hobby Plan):&lt;/strong&gt; Vercel 的 Hobby 套餐非常适合个人项目。它提供每月 &lt;strong&gt;100GB 带宽&lt;/strong&gt;、每月 6,000 次 Serverless Function 执行，以及自动 CI/CD。对于个人博客或作品集网站来说绰绰有余。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.netlify.com/&quot;&gt;Netlify&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;免费额度 (Starter Plan):&lt;/strong&gt; 提供每月 &lt;strong&gt;100GB 带宽&lt;/strong&gt;、&lt;strong&gt;300 分钟构建时间&lt;/strong&gt;（Build Minutes）。它同样拥有强大的全球 CDN、CI/CD、Serverless Functions，并包含表单处理、身份认证等功能。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://pages.cloudflare.com/&quot;&gt;Cloudflare Pages&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;免费额度:&lt;/strong&gt; 免费版提供了&lt;strong&gt;无限的静态站点&lt;/strong&gt;、&lt;strong&gt;无限的请求数&lt;/strong&gt;和&lt;strong&gt;无限的带宽&lt;/strong&gt;。其全球边缘网络性能顶级，并能与 Workers 无缝集成。是纯静态网站的“天花板”选择。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://www.google.com/search?q=https://www.tencentcloud.com/zh/products/edgeone/&quot;&gt;腾讯云 EdgeOne&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;免费额度 (个人版):&lt;/strong&gt; 面向中国大陆访问的绝佳选择。个人版（免费）提供&lt;strong&gt;不限量的 CDN 流量&lt;/strong&gt;和&lt;strong&gt;不限量的 DDoS 防护&lt;/strong&gt;，并有每月 10 万次的边缘函数（Edge Functions）调用额度。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;二、 后端与全栈部署 (Backend &amp;amp; Full-Stack Deployment)&lt;/h3&gt;
&lt;p&gt;需要托管 Docker 容器、后端 API 或更复杂的应用时，以下平台提供了强大的 Serverless 或 PaaS（平台即服务）能力。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://cloud.google.com/run/pricing&quot;&gt;Google Cloud Run&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;免费额度 (Always Free):&lt;/strong&gt; 永久免费层级包括每月 &lt;strong&gt;200 万次请求&lt;/strong&gt;、&lt;strong&gt;180,000 vCPU-秒&lt;/strong&gt; 的计算时间和 &lt;strong&gt;360,000 GiB-秒&lt;/strong&gt; 的内存使用。它会根据请求自动缩放至零，没有请求时不产生费用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://zeabur.com/&quot;&gt;Zeabur&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;免费额度:&lt;/strong&gt; 提供每月 &lt;strong&gt;5 美元的免费信用额度&lt;/strong&gt;。您可以用来部署任意服务（如 Node.js, Docker, Postgres 等）。对于小型服务，5 美元的额度足以支撑多个项目免费运行。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://run.claw.cloud/&quot;&gt;ClawCloud Run&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;免费额度:&lt;/strong&gt; 使用大于180天的Github账号注册，提供每月 &lt;strong&gt;5 美元的免费额度&lt;/strong&gt;。可以用来部署任意Docker服务（如 Node.js, Docker, Postgres 等）。按照CPU核数、Ram、Storage和实例数量付费。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://render.com/pricing&quot;&gt;Render&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;免费额度 (Web Services):&lt;/strong&gt; 提供每月共 &lt;strong&gt;750 小时的免费实例运行时间&lt;/strong&gt;（所有免费 Web 服务共享）。服务在闲置 15 分钟后会自动休眠（下次访问时唤醒）。此外还包括 &lt;strong&gt;100GB 免费出口带宽&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(请注意：Render 的免费 Postgres 数据库有 30 天的试用期限制，之后会过期，不适合用于永久免费存储。)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Railway](&lt;a href=&quot;https://railway.com/pricing&quot;&gt;Railway Pricing and Plans&lt;/a&gt;)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;免费额度第一个月5美元，后面每个月1美元。最多512MB存储，1v CPU，0.5G Volume&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;三、 Serverless Postgres 数据库&lt;/h3&gt;
&lt;p&gt;Serverless 数据库按需使用、自动扩展，并提供慷慨的永久免费层级。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://neon.tech/pricing&quot;&gt;Neon&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;免费额度 (Free Tier):&lt;/strong&gt; 提供 &lt;strong&gt;20 个项目&lt;/strong&gt;，每个项目 &lt;strong&gt;0.5 GB 存储空间&lt;/strong&gt;，每月每个项目 &lt;strong&gt;100 计算小时&lt;/strong&gt;（Compute Hours）。支持数据库分支（Branching）功能，并会在不活动时自动休眠。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://supabase.com/pricing&quot;&gt;Supabase&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;免费额度 (Free Plan):&lt;/strong&gt; 不只是数据库，更是一个开源的 Firebase 替代品。免费版包含 &lt;strong&gt;2 个免费项目&lt;/strong&gt;、每个项目 &lt;strong&gt;500MB 数据库空间&lt;/strong&gt;、&lt;strong&gt;1GB 文件存储&lt;/strong&gt;、&lt;strong&gt;50,000 月活跃用户&lt;/strong&gt;（Auth），以及实时数据库和边缘函数。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.prisma.io/pricing&quot;&gt;Prisma Postgres&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;免费额度：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;100,000&lt;/strong&gt; operations included&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;500 MB&lt;/strong&gt; storage&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5&lt;/strong&gt; databases&lt;/li&gt;
&lt;li&gt;No credit card required&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;四、 Serverless Redis 缓存&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://upstash.com/pricing/redis&quot;&gt;Upstash&lt;/a&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;免费额度 (Free Tier):&lt;/strong&gt; 提供了性能极高的 Serverless Redis。免费版支持每天 &lt;strong&gt;10,000 条命令&lt;/strong&gt;，最大 256MB 数据存储，延迟极低，非常适合用作缓存、会话存储或速率限制。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;五、 对象存储 (Object Storage)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.cloudflare.com/zh-tw/developer-platform/products/r2/&quot;&gt;Cloudflare R2&lt;/a&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;免费额度:&lt;/strong&gt; 大善人CF最大的亮点是 &lt;strong&gt;$0 出口（Egress）费用&lt;/strong&gt;。免费版每月提供 &lt;strong&gt;10GB 存储&lt;/strong&gt;、&lt;strong&gt;100 万次 A 类（写入）操作&lt;/strong&gt;和 &lt;strong&gt;1000 万次 B 类（读取）操作&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;需要绑定支付方式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.google.com/search?q=https://www.backblaze.com/b2/cloud-storage.html&quot;&gt;Backblaze B2&lt;/a&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;免费额度:&lt;/strong&gt; 免费版提供 &lt;strong&gt;10GB 存储空间&lt;/strong&gt;、&lt;strong&gt;每天 1GB 的下载流量&lt;/strong&gt;（通过 Cloudflare CDN 可免费）以及无限的上传。&lt;/li&gt;
&lt;li&gt;不绑定支付方式无法设置公开桶（可以在CF worker设置反代）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tebi.io/&quot;&gt;Tebi&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;免费额度：25G（额外送一个镜像）和每月250G流量，但需要绑卡。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bitiful.com/&quot;&gt;缤纷云 Bitiful&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;免费额度：50G。10G CDN出口流量，但每日限5G。是小厂，且需要实名认证。绑定自己域名需要备案。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://www.qiniu.com/prices/kodo&quot;&gt;七牛云 Kodo&lt;/a&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;免费额度 (标准存储):&lt;/strong&gt; 为实名认证用户提供每月 &lt;strong&gt;10GB 标准存储空间&lt;/strong&gt;、&lt;strong&gt;10GB CDN 回源流出流量&lt;/strong&gt;、&lt;strong&gt;100 万次 GET 请求&lt;/strong&gt;和 &lt;strong&gt;10 万次 PUT/DELETE 请求&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;但是！免费额度仅限CDN回源，并且CDN免费流量仅限HTTP。HTTPs是没有免费额度的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>从DDNS到零信任：家庭NAS远程访问技术栈</title><link>https://yukkihome.netlify.app/posts/network/nat-trans-and-ipv6/</link><guid isPermaLink="true">https://yukkihome.netlify.app/posts/network/nat-trans-and-ipv6/</guid><description>用于解决动态 IP、NAT 限制以及非标准端口（如 :5001）暴露，以及纯IPv6访问的方案</description><pubDate>Wed, 22 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;引言：远程访问的三大障碍&lt;/h3&gt;
&lt;p&gt;在数字化时代，家庭网络附加存储（NAS）已成为个人和家庭的数据中心。然而，将其安全、稳定地暴露给公网，以便随时随地访问，始终面临三大经典挑战：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;动态IP（Dynamic IP）：&lt;/strong&gt; 家庭宽带的公网IP地址经常变化，导致域名无法持续指向。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;网络地址转换（NAT）：&lt;/strong&gt; 设备位于路由器后方的内网，无法被公网直接寻址。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;非标准端口（Non-standard Ports）：&lt;/strong&gt; NAS管理页面（如&lt;code&gt;:5001&lt;/code&gt;）等服务使用非标准端口，直接暴露既不美观也不安全。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本文将按照问题分类，系统性地梳理解决这些挑战的主流技术方案。&lt;/p&gt;
&lt;h3&gt;第一部分：解决“IP在变”的问题 —— DDNS&lt;/h3&gt;
&lt;p&gt;这是实现远程访问的基石。&lt;/p&gt;
&lt;h4&gt;DDNS：传统的动态IP解决方案&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;技术原理：
DDNS（Dynamic DNS，动态域名解析）是解决动态IP问题的传统方案。其核心逻辑是：在NAS或路由器上运行一个DDNS客户端，该客户端会定时检测公网IP地址。一旦IP发生变更，客户端会立即通知DDNS服务商，更新特定域名（例如 mynas.provider.com）所指向的IP记录。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;评估：
如果宽带提供商分配的是固定公网IP，则无需此方案。DDNS的缺点在于需要在客户端设备上进行配置，并依赖第三方DDNS服务的稳定性。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;值得注意的是，DDNS本身&lt;strong&gt;只解决“找到你家大门”的问题&lt;/strong&gt;，并不能帮你“进入大门”（即穿透NAT）或“找到正确的房间”（即访问特定端口）。&lt;/p&gt;
&lt;h3&gt;第二部分：穿透“NAT之墙”并隐藏端口&lt;/h3&gt;
&lt;p&gt;解决了IP寻址后，我们必须面对NAT环境。这里的方案根据您对网络出口的控制权分为两类。&lt;/p&gt;
&lt;h4&gt;场景一：公网出口路由器可控&lt;/h4&gt;
&lt;p&gt;这是最理想的家庭网络环境，例如光猫已设为桥接模式，由自己的高性能路由器负责拨号和NAT。&lt;/p&gt;
&lt;h5&gt;1. 基础操作：端口转发 (Port Forwarding)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;技术原理：
这是实现内网服务公网访问的必要前提。您需要在边缘路由器上配置NAT规则，将来自公网的特定端口（例如 TCP/443）的入站流量，转发到内网NAS主机的IP地址和端口（例如 192.168.1.10:443）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;2. 端口美化与整合：两种截然不同的方案&lt;/h5&gt;
&lt;p&gt;完成了端口转发，您虽然可以通过 &lt;code&gt;https://mynas.provider.com:5001&lt;/code&gt; 访问，但这暴露了端口。要实现 &lt;code&gt;https://nas.yourdomain.com&lt;/code&gt; 这样的优雅访问，您需要解决端口问题：&lt;/p&gt;
&lt;h6&gt;1. &lt;strong&gt;方案A ：本地反向代理 (Reverse Proxy)&lt;/strong&gt;&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;技术原理：
这是专业且健壮的解决方案。您在NAS上（或内网任何主机上）部署Nginx、Caddy或使用系统内置的反向代理服务（如群晖的“应用程序门户”）。此服务监听标准的 80/443 端口，并根据HTTP请求的Host标头（例如 nas.yourdomain.com），将流量代理至正确的内部服务（如 localhost:5001）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;优点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SSL终止：&lt;/strong&gt; 可以在反代层统一处理SSL证书，实现HTTPS加密。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高可扩展性：&lt;/strong&gt; 可用单一 &lt;code&gt;443&lt;/code&gt; 端口，通过不同子域名代理内网所有服务（NAS, Plex, Home Assistant等）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全增强：&lt;/strong&gt; 可在反代层配置WAF、访问控制等安全策略。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;缺点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要本地自部署反向代理服务&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h6&gt;2. &lt;strong&gt;方案B ：DNS服务商的URL转发&lt;/strong&gt;&lt;/h6&gt;
&lt;p&gt;此方案尝试在DNS应用层“取巧”，而非在网络层解决问题。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;1. 隐性URL转发 (Masked Forwarding)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;技术原理：&lt;/strong&gt; DNS服务商在其服务器上配置一个网页，该网页使用HTML &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&gt; 框架来嵌入并显示您的目标地址（例如 &lt;code&gt;https://[DDNS域名]:5001&lt;/code&gt;）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;评估：&lt;/strong&gt; 此方案在现代Web环境中&lt;strong&gt;基本不可用&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;安全策略阻断：&lt;/strong&gt; 绝大多数Web应用（包括NAS后台）都会发送 &lt;code&gt;X-Frame-Options: DENY&lt;/code&gt; 或 &lt;code&gt;CSP: frame-ancestors &apos;none&apos;&lt;/code&gt; HTTP标头，以防范“点击劫持”攻击。这将&lt;strong&gt;强制浏览器拒绝&lt;/strong&gt;在 &lt;code&gt;&amp;lt;iframe&amp;gt;&lt;/code&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;HTTPS兼容性：&lt;/strong&gt; 极易引发“混合内容”（Mixed Content）安全错误。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;2. 显性URL转发 (301/302 Redirect)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;技术原理：&lt;/strong&gt; DNS服务商对访问请求返回 &lt;code&gt;301&lt;/code&gt; 或 &lt;code&gt;302&lt;/code&gt; HTTP状态码，将浏览器重定向到目标地址 &lt;code&gt;https://[DDNS域名]:5001&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;评估：&lt;/strong&gt; 此方案功能有效，但&lt;strong&gt;不符合核心需求&lt;/strong&gt;。浏览器地址栏会立即更新为完整的目标URL，导致端口号完全暴露，未实现“隐藏端口”的目的。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;本节结论：&lt;/strong&gt; 对于可控的公网环境，&lt;strong&gt;“DDNS + 端口转发 + 反向代理”&lt;/strong&gt; 是传统上最专业的技术栈。URL转发方案因其固有的技术缺陷，不应被视为可靠的解决方案。&lt;/p&gt;
&lt;h4&gt;场景二：公网路由器不可控（CG-NAT）&lt;/h4&gt;
&lt;p&gt;这是日益普遍的困境，例如处于运营商级NAT（大内网）、校园网、公寓楼共享宽带等环境。没有公网IP，或者无法配置边缘路由器。&lt;/p&gt;
&lt;h6&gt;1. 方案C：内网穿透 (NAT Traversal)&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;技术原理：
此方案（如Frp, Sakura Frp, nps等）的核心是“反向连接”。您在内网NAS上运行一个客户端，该客户端主动连接到一台您部署在公网VPS上的服务端。公网服务端充当一个中继，将来自公网的访问请求通过这条已建立的连接，转发给内网的客户端。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;缺点：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需要一台公网VPS，有额外成本。&lt;/li&gt;
&lt;li&gt;数据流量受限于VPS的带宽和性能。&lt;/li&gt;
&lt;li&gt;需要自行部署和维护服务端，有一定技术门槛。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h6&gt;2. 方案D：虚拟组网 (SD-WAN / Mesh VPN)&lt;/h6&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;技术原理：
此方案（如Tailscale, Zerotier, 蒲公英, Easytier等）旨在创建一个“虚拟局域网”。您在所有设备（NAS、电脑、手机）上安装客户端，它们会共同加入一个私有的虚拟网络。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;评估：
这是一种点对点的解决方案，非常适合个人或小团队的私有访问。所有设备如同在同一局域网内，可以直接通过分配的虚拟IP（如 100.x.x.x）互相访问，安全性极高。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;缺点：
它的设计目标不是向公网发布服务。如果您希望任何人都能通过域名访问，而不是仅限已安装客户端的设备访问，此方案不适用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;第三部分：统一方案：Cloudflare Tunnel (零信任网络接入)&lt;/h3&gt;
&lt;p&gt;面对上述所有方案的复杂性和局限性，Cloudflare Tunnel 提供了一种基于“零信任（Zero Trust）”模型的现代、统一解决方案。它&lt;strong&gt;同时解决了动态IP、CG-NAT和端口隐藏&lt;/strong&gt;三大问题。&lt;/p&gt;
&lt;h4&gt;技术原理&lt;/h4&gt;
&lt;p&gt;此方案通过反向连接（Reversed Connection）彻底颠覆了传统的访问模式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Connector (cloudflared)：&lt;/strong&gt; 在NAS主机上（通常通过Docker）部署一个轻量级的守护进程 &lt;code&gt;cloudflared&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;持久化出站隧道：&lt;/strong&gt; &lt;code&gt;cloudflared&lt;/code&gt; 进程主动向Cloudflare的全球边缘网络发起加密（QUIC）出站连接，建立一条安全隧道。&lt;strong&gt;因为连接是出站的，所以无需公网IP，也无需端口转发。&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;请求代理：&lt;/strong&gt; 用户的DNS请求将 &lt;code&gt;nas.yourdomain.com&lt;/code&gt; 解析到Cloudflare的任播IP。请求到达Cloudflare边缘后，Cloudflare鉴权并&lt;strong&gt;通过已建立的隧道&lt;/strong&gt;将请求安全地代理到您内网的&lt;code&gt;cloudflared&lt;/code&gt;进程。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;本地转发：&lt;/strong&gt; &lt;code&gt;cloudflared&lt;/code&gt; 进程再将流量转发到本地配置的服务（如 &lt;code&gt;localhost:5001&lt;/code&gt;），这步在功能上取代了反向代理。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;方案优势（Pros）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;极致安全（核心优势）：&lt;/strong&gt; &lt;strong&gt;无需在路由器上开放任何入站端口&lt;/strong&gt;。NAS主机和家庭IP地址对公网完全不可见（零攻击面），从根本上杜绝了来自公网的扫描和直接攻击。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;无视网络限制：&lt;/strong&gt; 由于连接是出站发起的，因此&lt;strong&gt;完美兼容CG-NAT和动态IP环境&lt;/strong&gt;，彻底摆脱了对公网IP和DDNS的依赖。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;自动化安全：&lt;/strong&gt; Cloudflare自动处理公网侧的SSL证书签发与续期，并提供基础的WAF和DDoS防护。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;权衡与考量（Cons）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;服务依赖：&lt;/strong&gt; 强依赖Cloudflare服务的可用性和性能（尽管其稳定性全球顶尖）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;潜在延迟：&lt;/strong&gt; 所有流量必须绕行Cloudflare边缘节点，相比传统的直连方案，可能会引入额外的网络延迟。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;配置门槛：&lt;/strong&gt; 初始设置需要在NAS上安装和配置&lt;code&gt;cloudflared&lt;/code&gt;守护进程，需要一定的命令行或Docker基础。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;服务条款：&lt;/strong&gt; Cloudflare免费套餐的ToS限制（2.8节）主要针对非HTML内容（如视频流）的大规模分发，但对于个人合理使用（如NAS管理、文件访问）通常是默许的。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;结论&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;传统方案（DDNS+端口转发+反代）&lt;/strong&gt; 提供了最佳性能和控制权，但它配置复杂、依赖公网IP，且安全风险最高。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;内网穿透/虚拟组网&lt;/strong&gt; 解决了CG-NAT问题，但各有其局限性（成本或访问模型）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare Tunnel&lt;/strong&gt; 以其零信任的安全模型、对复杂网络的普适性和高度集成的功能，成为了目前个人用户在安全、便利和成本之间取得最佳平衡的&lt;strong&gt;现代标准方案&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>校园网环境下路由器双栈（IPv4/IPv6）连接问题排查总结</title><link>https://yukkihome.netlify.app/posts/network/router-in-school-network/</link><guid isPermaLink="true">https://yukkihome.netlify.app/posts/network/router-in-school-network/</guid><description>校园网环境下路由器双栈连接问题排查</description><pubDate>Fri, 17 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;🎯 问题现象&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;同时插网线 + Wi-Fi&lt;/strong&gt;：IPv6 可用，IPv4 不可用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仅插网线&lt;/strong&gt;：IPv4/IPv6 均不可用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;仅连 Wi-Fi&lt;/strong&gt;：IPv4/IPv6 均可用&lt;/li&gt;
&lt;li&gt;手动设置以太网 DNS 后，&lt;strong&gt;无线 IPv4 恢复&lt;/strong&gt;（看似“影响无线”，实为修复全局 DNS）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;🔍 根本原因分析&lt;/h2&gt;
&lt;h3&gt;1. &lt;strong&gt;网络环境特征&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;属于&lt;strong&gt;校园网/科研网&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;路由器 WAN 口获取&lt;strong&gt;公网 IPv4 + IPv6 前缀&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;启用 &lt;strong&gt;MAC 地址绑定认证&lt;/strong&gt;，且策略严格&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. &lt;strong&gt;初始错误配置&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;注册了电脑有线网卡 MAC&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;路由器 WAN 口克隆该 MAC&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;导致 &lt;strong&gt;同一 MAC 从两个端口出现&lt;/strong&gt;（路由器 WAN 口 + 电脑有线口）&lt;/li&gt;
&lt;li&gt;触发校园网 &lt;strong&gt;MAC 冲突保护&lt;/strong&gt; → 阻断有线单播通信（ARP/NDP 失败）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. &lt;strong&gt;IPv6 Passthrough 的双刃剑&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点&lt;/strong&gt;：内网设备直获公网 IPv6&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缺点&lt;/strong&gt;：暴露电脑真实 MAC 给校园网&lt;/li&gt;
&lt;li&gt;当 MAC 未正确注册或存在冲突时，&lt;strong&gt;IPv4 被策略阻断，IPv6 因策略宽松仍通&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;🛠️ 排查与解决步骤&lt;/h2&gt;
&lt;h3&gt;✅ 步骤 1：理解 DNS 设置“影响无线”的真相&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Windows DNS 解析是&lt;strong&gt;系统级全局行为&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;手动设置以太网 DNS → 加入可靠 DNS 服务器 → &lt;strong&gt;全局 DNS 恢复&lt;/strong&gt; → 无线“看似变好”&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;✅ 步骤 2：确认有线链路层故障&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;单独插网线时：
&lt;ul&gt;
&lt;li&gt;能获取 IP（DHCP 广播成功）&lt;/li&gt;
&lt;li&gt;但 &lt;code&gt;ping 192.168.31.1&lt;/code&gt; 和 &lt;code&gt;ping fe80::...%9&lt;/code&gt; 均失败&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;证明：&lt;strong&gt;L2（数据链路层）单播通信故障&lt;/strong&gt;，非 IP 配置问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;✅ 步骤 3：识别 MAC 冲突核心问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;路由器克隆电脑 MAC + 电脑直连 → &lt;strong&gt;同一 MAC 多端口出现&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;校园网交换机触发 &lt;strong&gt;MAC flapping 保护&lt;/strong&gt; → 静默丢弃流量&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;✅ 步骤 4：尝试 DHCPv6 模式失败原因&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;校园网 &lt;strong&gt;只允许终端设备（IA_NA）获取 IPv6&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拒绝路由器前缀委派请求（IA_PD）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;导致 LAN 无公网 IPv6 前缀 → 仅剩 &lt;code&gt;fe80::&lt;/code&gt; 本地地址&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;✅ 步骤 5：正确解决方案&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;操作&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. 取消路由器 MAC 克隆&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;使用路由器原生 WAN MAC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. 将路由器 WAN MAC 提交注册&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;让校园网信任路由器本身&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. WAN 设置：IPv4 DHCP + IPv6 Passthrough&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;保持 IPv6 端到端能力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. 避免电脑有线/无线同时连接&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;防止多 MAC 混淆&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;✅ 最终效果&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IPv4&lt;/strong&gt;：经路由器 NAT，校园网只认路由器 MAC → 正常&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPv6&lt;/strong&gt;：Passthrough 下电脑获公网地址，因端口已认证 → 正常&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;双栈全通，稳定可靠&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;💡 经验总结（最佳实践）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;在受控网络（校园/企业）中使用家用路由器：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;永远注册路由器自身的 MAC&lt;/strong&gt;，而非终端设备 MAC&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不要启用 MAC 克隆&lt;/strong&gt;（除非明确需要且无终端直连）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优先使用 IPv6 Passthrough&lt;/strong&gt;（若需公网 IPv6）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;避免同一设备多网卡同时接入&lt;/strong&gt;（防策略冲突）&lt;/li&gt;
&lt;li&gt;若 IPv6 非必需，&lt;strong&gt;关闭 IPv6 可极大提升稳定性&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;🎉 问题本质：&lt;strong&gt;不是技术故障，而是网络策略与家用设备行为的冲突&lt;/strong&gt;。&lt;br /&gt;
正确理解认证机制 + 合理配置 MAC 注册，即可完美解决。&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>CF D1 database 访问</title><link>https://yukkihome.netlify.app/posts/network/cf-workers/</link><guid isPermaLink="true">https://yukkihome.netlify.app/posts/network/cf-workers/</guid><description>How code blocks look in Markdown using Expressive Code.</description><pubDate>Thu, 16 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;D1 必须通过 Cloudflare Workers 或 Pages Functions 访问&lt;/strong&gt;。您不能像传统数据库那样使用 IP 地址或端口从外部直接连接。&lt;/p&gt;
&lt;p&gt;以下是 Worker 访问 D1 的详细步骤和配置参数：&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Cloudflare Worker 访问 D1 的步骤&lt;/h2&gt;
&lt;h3&gt;1. 在 &lt;code&gt;wrangler.toml&lt;/code&gt; 文件中配置绑定&lt;/h3&gt;
&lt;p&gt;D1 数据库是通过一种称为“&lt;strong&gt;Bindings&lt;/strong&gt;”的机制连接到 Worker 的。您需要在 Worker 项目的配置文件 &lt;code&gt;wrangler.toml&lt;/code&gt; 中声明这个绑定。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;配置示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name = &quot;my-d1-worker&quot;
main = &quot;src/index.ts&quot;
compatibility_date = &quot;2024-01-01&quot;

# D1 数据库绑定部分
[[ d1_databases ]]
binding = &quot;DB&quot;        # 1. Worker 脚本中引用的变量名
database_name = &quot;my-d1-db&quot; # 2. D1 数据库的实际名称 (在 Cloudflare 控制台创建的)
database_id = &quot;xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&quot; # 3. D1 数据库的唯一 ID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;关键参数解释：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;参数&lt;/th&gt;
&lt;th&gt;描述&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;binding&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;您的 &lt;strong&gt;Worker 脚本&lt;/strong&gt;中将用来访问 D1 的环境变量名。&lt;/td&gt;
&lt;td&gt;在您的代码中，您会通过 &lt;code&gt;env.DB&lt;/code&gt; 来调用 D1 API。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;database_name&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;D1 数据库在 &lt;strong&gt;Cloudflare 控制台&lt;/strong&gt;中显示的名称。&lt;/td&gt;
&lt;td&gt;用于管理和识别。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;database_id&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;D1 数据库的&lt;strong&gt;唯一标识符&lt;/strong&gt;。&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;最关键的参数&lt;/strong&gt;。您必须在 Cloudflare 控制台的 D1 页面获取此 ID。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;2. 在 Worker 脚本中执行查询&lt;/h3&gt;
&lt;p&gt;一旦绑定配置完成，D1 数据库就会作为&lt;strong&gt;环境变量&lt;/strong&gt;注入到您的 Worker 代码中。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TypeScript/JavaScript 示例：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;假设您的 Worker 是一个&lt;code&gt;Module&lt;/code&gt; Worker，并且您的 &lt;code&gt;wrangler.toml&lt;/code&gt; 中配置的 &lt;code&gt;binding&lt;/code&gt; 是 &lt;code&gt;&quot;DB&quot;&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// src/index.ts (或 .js)

export interface Env {
  DB: D1Database; // D1Database 类型是 Cloudflare 提供的
}

export default {
  async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise&amp;lt;Response&amp;gt; {
    try {
      // 1. 使用绑定变量 (env.DB) 访问 D1
      const { results } = await env.DB.prepare(
        &quot;SELECT * FROM users WHERE status = ?&quot;
      )
        .bind(&quot;active&quot;) // 绑定参数以防止 SQL 注入
        .all(); // 执行并获取所有结果

      // 2. 返回查询结果
      return Response.json({ success: true, users: results });
      
    } catch (error) {
      console.error(error);
      return Response.json({ success: false, error: &quot;Database query failed&quot; }, { status: 500 });
    }
  },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;核心访问方法：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 Worker 代码内部，您使用 &lt;code&gt;env.DB&lt;/code&gt;（或您在 &lt;code&gt;binding&lt;/code&gt; 中设置的任何名称）来访问 D1 API：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;env.DB.prepare(sql)&lt;/code&gt;:&lt;/strong&gt; 准备一个 SQL 语句（推荐使用这种方式）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.bind(params...)&lt;/code&gt;:&lt;/strong&gt; 绑定参数（非常重要，用于安全地处理用户输入）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.all()&lt;/code&gt;:&lt;/strong&gt; 执行语句并返回所有结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.first()&lt;/code&gt;:&lt;/strong&gt; 执行语句并返回第一行结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;.run()&lt;/code&gt;:&lt;/strong&gt; 执行非查询语句（如 &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;），返回执行信息（如影响的行数）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总结一下，访问 D1 &lt;strong&gt;不是&lt;/strong&gt;通过网络连接字符串，而是通过在 &lt;strong&gt;&lt;code&gt;wrangler.toml&lt;/code&gt;&lt;/strong&gt; 中配置 &lt;strong&gt;&lt;code&gt;database_id&lt;/code&gt;&lt;/strong&gt; 和 &lt;strong&gt;&lt;code&gt;binding&lt;/code&gt;&lt;/strong&gt; 名称，然后直接在 Worker 代码中使用 &lt;strong&gt;&lt;code&gt;env.BINDING_NAME&lt;/code&gt;&lt;/strong&gt; 变量。&lt;/p&gt;
</content:encoded></item><item><title>Steam探索队列脚本</title><link>https://yukkihome.netlify.app/posts/game/steam-discovery-queue/</link><guid isPermaLink="true">https://yukkihome.netlify.app/posts/game/steam-discovery-queue/</guid><description>快速完成Steam探索队列</description><pubDate>Thu, 16 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;使用方法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;打开steam任意网页界面&lt;/li&gt;
&lt;li&gt;按F12打开控制台，输入以下代码并回车&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;(function _exec(){
var appids, 
    running = true, 
    queueNumber, 
    progressDialog = ShowAlertDialog(&apos;探索中&apos;, $J(&apos;&amp;lt;div/&amp;gt;&apos;).append($J(&apos;&amp;lt;div/&amp;gt;&apos;, {&apos;class&apos;: &apos;waiting_dialog_throbber&apos;}) ).append( $J(&apos;&amp;lt;div/&amp;gt;&apos;, {&apos;id&apos;: &apos;progressContainer&apos;}).text(&apos;获取进度...&apos;) ), &apos;停止&apos;).done(abort);
function abort(){
  running = false;
  progressDialog.Dismiss();
}
function retry(){
  abort();
  ShowConfirmDialog(&apos;错误&apos;, &apos;是否重试?&apos;, &apos;重试&apos;, &apos;放弃&apos;).done(_exec)
}
function clearApp(){
  if(!running)
    return;
  showProgress();
  var appid = appids.shift();
  !appid ? generateQueue() : $J.post( appids.length ? &apos;/app/&apos; + appid : &apos;/explore/next/&apos;, {sessionid: g_sessionID, appid_to_clear_from_queue: appid} ).done(clearApp).fail(retry); 
}
function generateQueue(){
  running &amp;amp;&amp;amp; $J.post(&apos;/explore/generatenewdiscoveryqueue&apos;, {sessionid: g_sessionID, queuetype: 0}).done(beginQueue).fail(retry);
}
function beginQueue(){
  if(!running)
    return;
  $J.get(&apos;/explore/&apos;).done(function(htmlText){
    var cardInfo = htmlText.match(/&amp;lt;div class=&quot;subtext&quot;&amp;gt;\\D+(\\d)\\D+&amp;lt;\\/div&amp;gt;/);
    if( !cardInfo ){
      abort();
      ShowAlertDialog(&apos;完成&apos;,&apos;已完成全部3轮探索队列&apos;);
      return;
    }
    var matchedAppids = htmlText.match(/0,\\s+(\\[.*\\])/);
    if( !matchedAppids ){
      retry();
      return;
    }
    appids = JSON.parse(matchedAppids[1]);
    queueNumber = cardInfo[1];
    appids.length == 0 ? generateQueue() : clearApp();
    showProgress();
  })
}
function showProgress(){
  $J(&apos;#progressContainer&apos;).html( &apos;&amp;lt;br&amp;gt;剩余&apos; + queueNumber + &apos;个待探索队列, 当前队列剩余&apos; + appids.length + &apos;个待探索游戏&apos; );
}
beginQueue();
}())

&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script src=&quot;&amp;lt;https://gist.github.com/MuYukk1/ee1f0810aa7303284b86804c0332c140.js&amp;gt;&quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item></channel></rss>