{"version":"https://jsonfeed.org/version/1.1","title":"Linus的FUN天地","home_page_url":"https://blog.xsy.fun/","feed_url":"https://blog.xsy.fun/feed.json","description":"Linus Xiong 的个人博客：技术笔记、运维实践与生活记录。","language":"zh-CN","icon":"https://blog.xsy.fun/apple-touch-icon.png","favicon":"https://blog.xsy.fun/favicon.svg","authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"items":[{"id":"https://blog.xsy.fun/posts/why-this-blog-is-fast/","url":"https://blog.xsy.fun/posts/why-this-blog-is-fast/","title":"新博客为什么这么快？从技术选型到每一个字节","content_html":"<p>博客重做了一遍。最直观的变化是：点开任何一页，内容几乎是瞬间出现的。这不是换了更贵的服务器，而是从技术选型开始，把每一层\"没必要的东西\"都拿掉了。这篇文章把背后的取舍讲清楚：为什么选静态站点和 Astro，构建管线长什么样，CSS、JavaScript、字体、图片、页面切换、SEO 各做了什么，以及用数字说明效果。</p>\n<section class=\"post-section\"><h2 id=\"先看结果\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/why-this-blog-is-fast/#%E5%85%88%E7%9C%8B%E7%BB%93%E6%9E%9C\">先看结果</a></h2>\n<p>下面是一篇典型文章页在生产环境的数据（移动端 Lighthouse，模拟慢速网络）：</p>\n<div class=\"table-wrap\" tabindex=\"0\"><table><thead><tr><th>指标</th><th>数值</th></tr></thead><tbody><tr><td>HTML（gzip 后）</td><td>16–18 KB，样式已包含在内</td></tr><tr><td>CSS</td><td>约 20 KB，内联在页面里，零额外请求</td></tr><tr><td>首屏 JavaScript</td><td>约 6 KB（主题切换、搜索框、复制按钮、链接预取）</td></tr><tr><td>Web 字体</td><td>0 字节</td></tr><tr><td>首屏第三方请求</td><td>0 个</td></tr><tr><td>Lighthouse</td><td>性能 100 · 无障碍 100 · 最佳实践 100 · SEO 100</td></tr><tr><td>CLS（布局偏移）</td><td>0</td></tr></tbody></table></div>\n<p>这些数字不是靠某一个\"黑科技\"，而是每一层都少做一点事的累积结果。</p>\n</section><section class=\"post-section\"><h2 id=\"为什么是静态站点为什么是-astro\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/why-this-blog-is-fast/#%E4%B8%BA%E4%BB%80%E4%B9%88%E6%98%AF%E9%9D%99%E6%80%81%E7%AB%99%E7%82%B9%E4%B8%BA%E4%BB%80%E4%B9%88%E6%98%AF-astro\">为什么是静态站点，为什么是 Astro</a></h2>\n<p>博客的本质是\"写好的文章给人读\"，内容在我提交的那一刻就确定了。那就没有理由让服务器在每次访问时重新渲染，更没有理由让读者的浏览器下载一个应用框架再把文章\"水合\"一遍。所以第一个决定是：<strong>全部在构建时生成静态 HTML</strong>，服务器（其实是 CDN）只负责把文件发出去。</p>\n<p>选型时我实际构建了几个候选方案，量了它们在一个\"预渲染好的文章页\"上下发多少 JavaScript：</p>\n<div class=\"table-wrap\" tabindex=\"0\"><table><thead><tr><th>方案</th><th>文章页下发的 JS（gzip）</th><th>说明</th></tr></thead><tbody><tr><td>Astro 7（静态输出）</td><td><strong>0 B</strong></td><td>默认零 JS，需要交互时按需加载\"岛屿\"</td></tr><tr><td>TanStack Start 1.0（React）</td><td>约 108 KB</td><td>预渲染之后仍然要整页水合，没有零 JS 模式</td></tr><tr><td>TanStack Start（Solid）</td><td>约 48 KB</td><td>同上，只是运行时更小</td></tr><tr><td>Next.js App Router</td><td>数十 KB + RSC 负载</td><td>某知名博客的存档页 HTML 达 645 KB，其中 61% 是内联的组件数据</td></tr></tbody></table></div>\n<p>TanStack 系列做应用很好，但它的 Markdown 包刚到 1.0、官方示例还是在浏览器里解析 Markdown，这和\"文章型站点\"的目标相反。Astro 的内容集合、图片优化、Shiki 高亮、sitemap 与 RSS 都是一等公民，而且页面默认一个字节 JS 都不带——这正是我要的。</p>\n<p>HeroUI 这类 React 组件库也测过：一个按钮岛屿要 96 KB（其中 React 约 70 KB）。最终只借用了它的视觉语言，所有按钮、标签、卡片都用零 JS 的 Astro 组件实现。</p>\n</section><section class=\"post-section\"><h2 id=\"构建管线\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/why-this-blog-is-fast/#%E6%9E%84%E5%BB%BA%E7%AE%A1%E7%BA%BF\">构建管线</a></h2>\n<figure class=\"diagram\" data-pagefind-ignore=\"\"><pre class=\"mermaid\" data-source=\"graph LR\n  A[content/posts/*.md] --> B[内容集合 + Zod 校验]\n  B --> C[remark 插件<br/>摘要 · 阅读时间]\n  C --> D[rehype 插件<br/>标题锚点 · 代码块外壳 · 表格 · 章节]\n  D --> E[Shiki 高亮<br/>浅色 + 深色]\n  E --> F[页面 HTML<br/>CSS 内联]\n  F --> G[dist/ + Pagefind 索引 + OG 图 + sitemap]\">graph LR\n  A[content/posts/*.md] --> B[内容集合 + Zod 校验]\n  B --> C[remark 插件&#x3C;br/>摘要 · 阅读时间]\n  C --> D[rehype 插件&#x3C;br/>标题锚点 · 代码块外壳 · 表格 · 章节]\n  D --> E[Shiki 高亮&#x3C;br/>浅色 + 深色]\n  E --> F[页面 HTML&#x3C;br/>CSS 内联]\n  F --> G[dist/ + Pagefind 索引 + OG 图 + sitemap]</pre></figure>\n<p>文章就是 <code>content/posts/</code> 下的 Markdown 文件，frontmatter 由 Zod 校验：日期格式错了、slug 里混进中文或空格，构建直接失败，而不是上线后才发现。Markdown 经过 remark/rehype 管线：<code>&#x3C;!-- more --></code> 之前的内容成为摘要；阅读时间按\"中文 300 字/分钟 + 英文 200 词/分钟\"分别计算；每个标题带稳定的 id 与锚点；代码块被包进带语言标签和复制按钮的外壳；每个二级标题的章节包成一个 <code>&#x3C;section></code>，并开启 <code>content-visibility: auto</code>，长文章的布局计算只做可见部分。</p>\n<p>代码高亮在构建时完成。Shiki 同时输出浅色和深色两套颜色，以 CSS 变量的形式写在每个 token 上，切换主题只是换一组变量，浏览器里没有任何高亮程序在跑。</p>\n</section><section class=\"post-section\"><h2 id=\"css20-kb内联不闪\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/why-this-blog-is-fast/#css20-kb%E5%86%85%E8%81%94%E4%B8%8D%E9%97%AA\">CSS：20 KB，内联，不闪</a></h2>\n<p>样式用 Tailwind v4，设计令牌（颜色、字号、圆角）写在 <code>@theme</code> 里，所有组件只引用令牌。构建时 Tailwind 只输出真正用到的工具类，整站样式约 20 KB，并通过 <code>inlineStylesheets: 'always'</code> 直接内联进每个页面：少一次请求，首屏渲染不需要等任何外部文件。</p>\n<p>我给 CSS 定了一条硬预算：文章页内联样式不超过 20 KiB，每次改样式都重新测量。有两次差点超标，原因很有代表性：Tailwind 会扫描源码里所有像类名的词，组件样式里写的 <code>transition</code>、<code>grid</code> 这种属性名也会被当成工具类打进全局；解决方法是把这些词加进扫描排除表。另一次是把只有文章页需要的样式放进了全局样式表——Astro 按导入关系打包组件样式，而不是按是否渲染。</p>\n<p>深色模式由 <code>&#x3C;head></code> 里一段不到 1 KB 的内联脚本在首次绘制前设置 <code>data-theme</code>，所以不会出现先白后黑的闪烁；深色底色用的是接近黑的 <code>#121214</code>，而不是纯黑，长文阅读不刺眼，层级靠\"更亮的表面\"而不是描边来表达。</p>\n</section><section class=\"post-section\"><h2 id=\"javascript按需而且很小\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/why-this-blog-is-fast/#javascript%E6%8C%89%E9%9C%80%E8%80%8C%E4%B8%94%E5%BE%88%E5%B0%8F\">JavaScript：按需，而且很小</a></h2>\n<p>文章页只有四个小脚本：主题切换（1.0 KB）、搜索框启动器（1.4 KB）、代码复制（0.5 KB）、链接预取（2.4 KB）。真正\"重\"的东西全部延迟：</p>\n<ul>\n<li><strong>评论（Disqus）</strong>：评论区距离视口 600 px 以内才注入 embed 脚本。</li>\n<li><strong>搜索（Pagefind）</strong>：静态索引在构建时生成，点开搜索框才加载 UI 和索引分片。</li>\n<li><strong>流程图（Mermaid）</strong>：库有几 MB，只在含图表的页面、图表接近视口时才动态 <code>import()</code>，并随主题重新渲染。</li>\n</ul>\n<p>没有 React，没有客户端路由，没有在浏览器里解析 Markdown。</p>\n</section><section class=\"post-section\"><h2 id=\"字体一个字节都不下载\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/why-this-blog-is-fast/#%E5%AD%97%E4%BD%93%E4%B8%80%E4%B8%AA%E5%AD%97%E8%8A%82%E9%83%BD%E4%B8%8D%E4%B8%8B%E8%BD%BD\">字体：一个字节都不下载</a></h2>\n<p>中文 Web 字体动辄几 MB，再怎么子集化也是首屏的负担。这里直接用设备自带的字体栈：Apple 平台上是 SF Pro 和苹方，Windows 上是微软雅黑，Linux/Android 上是 Noto Sans CJK。图标用内联 SVG，不用图标字体。</p>\n</section><section class=\"post-section\"><h2 id=\"图片构建时处理好\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/why-this-blog-is-fast/#%E5%9B%BE%E7%89%87%E6%9E%84%E5%BB%BA%E6%97%B6%E5%A4%84%E7%90%86%E5%A5%BD\">图片：构建时处理好</a></h2>\n<p>文章目录里的图片在构建时由 sharp 转成 WebP，并按 640–1280 px 等多个宽度生成 <code>srcset</code>；<code>sizes</code> 按正文栏宽（832 px）设置，手机不会去下载桌面尺寸。每张图都带固有宽高，页面不会因为图片加载而跳动，这是 CLS 为 0 的关键。封面是首屏最大元素（LCP），所以用 eager 加载并加 <code>fetchpriority=\"high\"</code>；正文图片一律原生懒加载。</p>\n</section><section class=\"post-section\"><h2 id=\"页面切换像翻书\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/why-this-blog-is-fast/#%E9%A1%B5%E9%9D%A2%E5%88%87%E6%8D%A2%E5%83%8F%E7%BF%BB%E4%B9%A6\">页面切换：像翻书</a></h2>\n<p>三件事叠在一起：</p>\n<ol>\n<li>鼠标悬停时预取链接（Astro 的 prefetch，2.4 KB）。</li>\n<li>Chromium 的 Speculation Rules：一段 JSON，浏览器在悬停时直接在后台预渲染下一页，零 JS。</li>\n<li>跨文档 View Transition：纯 CSS 的 <code>@view-transition { navigation: auto }</code>，切换时淡入淡出。</li>\n</ol>\n<p>第三点踩过一个坑：浏览器会在新页面\"第一次有机会渲染\"时截取快照，而 Chromium 在 <code>&#x3C;body></code> 解析完之前就会渲染，于是过渡会落在一张空白页上、内容再弹出来。解决办法是一行标记，让渲染等到页面末尾解析完成：</p>\n<figure class=\"code-block\" data-lang=\"html\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">html</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"html\"><code><span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">link</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> rel</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"expect\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> href</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"#page-end\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> blocking</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"render\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span></code></pre></figure>\n<p>页面本身只有几十 KB，这一行不影响首屏时间，但换来了完整的过渡。</p>\n</section><section class=\"post-section\"><h2 id=\"seo-与-url\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/why-this-blog-is-fast/#seo-%E4%B8%8E-url\">SEO 与 URL</a></h2>\n<ul>\n<li><strong>URL 全部 ASCII</strong>：中文标题自动转拼音作为 slug，旧的 Hexo 链接（带空格和中文）保存在 frontmatter 的 <code>aliases</code> 里；构建会为每条旧链接生成带 canonical 的跳转页，Vercel 上还会配置成真正的 308 重定向，搜索引擎的收录可以平滑迁移。</li>\n<li><strong>每篇文章的 OG 图</strong>在构建时用 satori + resvg 生成（中文字体按文字子集下载并缓存），社交平台分享有图。</li>\n<li><strong>sitemap 带 <code>lastmod</code></strong>，RSS/Atom/JSON Feed 三种订阅源输出全文，JSON-LD 标注 <code>BlogPosting</code> 和面包屑。</li>\n<li><strong>中英双语</strong>：英文版是与原文并列的 <code>.en.md</code> 文件，带 <code>hreflang</code> 与各自的订阅源；翻译可以人工写，也可以用 DeepL、Google 或大模型的接口批量生成，译文记录原文哈希，原文改动后会被标记为过期。</li>\n</ul>\n</section><section class=\"post-section\"><h2 id=\"托管\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/why-this-blog-is-fast/#%E6%89%98%E7%AE%A1\">托管</a></h2>\n<p>站点部署在 Vercel，静态文件走 CDN。<code>/_astro/*</code> 这类带哈希的资源缓存一年且 <code>immutable</code>，HTML 走 <code>must-revalidate</code>；安全响应头和尾斜杠策略写在 <code>vercel.json</code> 里。构建在 CI 里跑 <code>pnpm build</code>，类型检查和 500 多个单元测试一起跑。</p>\n</section><section class=\"post-section\"><h2 id=\"取舍与没做的事\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/why-this-blog-is-fast/#%E5%8F%96%E8%88%8D%E4%B8%8E%E6%B2%A1%E5%81%9A%E7%9A%84%E4%BA%8B\">取舍与没做的事</a></h2>\n<ul>\n<li>Disqus 的 iframe 会阻止 bfcache（浏览器的前进/后退缓存），这是第三方评论的代价；它只在滚到评论区时才加载，影响已经降到最小。</li>\n<li>Mermaid 的体积很大，所以只按需加载；如果以后图表多了，可以改成构建时渲染成 SVG。</li>\n<li>Pagefind 不做中文词干化，子串搜索够用。</li>\n<li>拼音 slug 不如英文可读，所以提供了用大模型生成英文 slug 的命令，旧 slug 自动变成别名。</li>\n<li>没有用任何运行时 UI 库。想要 HeroUI 那种交互组件时，也只会放进\"点击后再加载\"的岛屿里。</li>\n</ul>\n</section><section class=\"post-section\"><h2 id=\"怎么衡量\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/why-this-blog-is-fast/#%E6%80%8E%E4%B9%88%E8%A1%A1%E9%87%8F\">怎么衡量</a></h2>\n<p>每次改动都重新跑移动端 Lighthouse，同时用脚本测量文章页的内联 CSS 字节数和脚本总大小，超出预算就算失败。这些工具不难，难的是把\"少做事\"坚持成一条规矩。</p>\n<p>整套代码是开源的。如果你也想自己搭一个，<code>pnpm build</code> 一条命令就能把 <code>content/</code> 里的 Markdown 变成一个这样的站点。</p></section>","summary":"把博客从 Hexo 重写为 Astro 之后，首屏约一秒、Lighthouse 四项 100。这篇文章深入浅出地讲清楚技术选型、构建管线，以及 CSS、JavaScript、字体、图片、导航、SEO 每一层各做了什么取舍，并给出实测数字。","image":"https://blog.xsy.fun/og/why-this-blog-is-fast.png","date_published":"2026-10-21T01:00:00.000Z","date_modified":"2026-10-21T01:00:00.000Z","tags":["Astro","性能","前端","博客","Markdown"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/","url":"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/","title":"在 BIRD2 主机上将IPv6 地址池绑定到新网卡并实现多源 IPv6 出网","content_html":"<section class=\"post-section\"><h2 id=\"前言\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E5%89%8D%E8%A8%80\">前言</a></h2>\n<p>这次的目标很明确：</p>\n<ul>\n<li>机器已经在运行 BIRD2，并且正常通过 BGP 广播 IPv6 前缀</li>\n<li>现在希望把一段 <code>/47</code> IPv6 前缀作为<strong>本机可使用的 IPv6 地址池</strong></li>\n<li>同时为了让结构更清晰，计划将这段地址“挂”到一个新的逻辑网卡上</li>\n<li>最终实现：\n<ul>\n<li>应用可以绑定这段 <code>/47</code> 里的任意 IPv6 地址</li>\n<li>流量仍然从真实物理网卡出网</li>\n<li>BIRD 只负责广播，不去干扰系统默认路由和地址管理</li>\n</ul>\n</li>\n</ul>\n<blockquote>\n<p>说明：本文中的 IPv4、IPv6、ASN、BGP 邻居、认证口令等信息都已经替换为<strong>文档示例值</strong>，用于记录配置思路，避免暴露真实生产环境信息。</p>\n</blockquote>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"现有-bird2-配置梳理\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E7%8E%B0%E6%9C%89-bird2-%E9%85%8D%E7%BD%AE%E6%A2%B3%E7%90%86\">现有 BIRD2 配置梳理</a></h2>\n<p>当前机器上的 BIRD2 配置大致有几个关键点：</p>\n<ol>\n<li><code>protocol direct</code> 只跟踪 <code>dummy*</code> 接口</li>\n<li><code>protocol kernel</code> 对 IPv4 / IPv6 都是 <code>import none; export none;</code></li>\n<li><code>protocol static static_v6</code> 里通过 <code>reject</code> 的方式把需要广播的 IPv6 前缀放进 BIRD RIB</li>\n<li>BGP 对外只导出 <code>RTS_STATIC</code> 的 IPv6 前缀</li>\n</ol>\n<p>也就是说，这套设计本身就已经把职责分得很清楚了：</p>\n<ul>\n<li><strong>BIRD 负责广播</strong></li>\n<li><strong>内核负责真实转发与本机地址绑定</strong></li>\n<li><strong>不会让 BIRD 去改内核默认路由</strong></li>\n</ul>\n<p>这个思路是对的，应该继续保持。</p>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"先说结论这件事不应该只改-bird\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E5%85%88%E8%AF%B4%E7%BB%93%E8%AE%BA%E8%BF%99%E4%BB%B6%E4%BA%8B%E4%B8%8D%E5%BA%94%E8%AF%A5%E5%8F%AA%E6%94%B9-bird\">先说结论：这件事不应该只改 BIRD</a></h2>\n<p>很多人在第一次做这类配置时，会直觉认为“既然是广播的前缀，就在 BIRD 里把它绑到接口上”。</p>\n<p>实际上不是这样。</p>\n<h3 id=\"bird-的职责\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#bird-%E7%9A%84%E8%81%8C%E8%B4%A3\">BIRD 的职责</a></h3>\n<p>BIRD 只需要完成一件事：</p>\n<ul>\n<li><strong>把目标 <code>/47</code> 前缀继续宣告出去</strong></li>\n</ul>\n<h3 id=\"linux-内核的职责\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#linux-%E5%86%85%E6%A0%B8%E7%9A%84%E8%81%8C%E8%B4%A3\">Linux 内核的职责</a></h3>\n<p>真正让这段 <code>/47</code>：</p>\n<ul>\n<li>可以在本机 <code>bind()</code></li>\n<li>可以作为源地址发起连接</li>\n<li>可以通过真实物理网卡出网</li>\n</ul>\n<p>靠的是 Linux 网络栈，而不是 BIRD。</p>\n<p>所以最终方案是：</p>\n<ul>\n<li>新建一个 <strong>dummy 网卡</strong>，例如 <code>dummy47</code></li>\n<li>给它放一个池内“锚点地址”</li>\n<li>通过 <code>ip -6 route add local ...</code> 告诉内核：这一整段 <code>/47</code> 都属于本机</li>\n<li>开启 <code>net.ipv6.ip_nonlocal_bind=1</code>，允许应用绑定未显式加到接口上的地址</li>\n</ul>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"为什么要用-dummy-网卡\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E7%94%A8-dummy-%E7%BD%91%E5%8D%A1\">为什么要用 dummy 网卡</a></h2>\n<p>我这里没有直接把整段 <code>/47</code> 塞进真实物理网卡，而是单独新建一个逻辑接口 <code>dummy47</code>，原因有三点：</p>\n<ol>\n<li>\n<p><strong>职责更清晰</strong></p>\n<ul>\n<li><code>dummy47</code> 表示“这是一段本机管理的业务地址池”</li>\n<li>物理网卡只负责真正收发包</li>\n</ul>\n</li>\n<li>\n<p><strong>更容易排障</strong></p>\n<ul>\n<li>看接口配置时一眼就能知道这段地址池是专门干什么的</li>\n</ul>\n</li>\n<li>\n<p><strong>和现有 BIRD 配置兼容</strong></p>\n<ul>\n<li>当前 <code>protocol direct</code> 已经匹配 <code>dummy*</code></li>\n<li>新建 <code>dummy47</code> 后不需要大改</li>\n</ul>\n</li>\n</ol>\n<p>要注意的是：</p>\n<blockquote>\n<p><code>dummy47</code> 不是实际出网网卡。<br>\n真正的发包依然会走默认路由对应的物理接口，比如 <code>eth0</code> 或 <code>ens3</code>。</p>\n</blockquote>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"参考思路local-route--ip_nonlocal_bind\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E5%8F%82%E8%80%83%E6%80%9D%E8%B7%AFlocal-route--ip_nonlocal_bind\">参考思路：local route + ip_nonlocal_bind</a></h2>\n<p>这次配置的核心思路是：</p>\n<ul>\n<li>不去枚举添加大量静态地址</li>\n<li>不去把整段前缀当作普通地址直接 <code>addr add</code></li>\n<li>而是通过：</li>\n</ul>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">ip</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> route</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> add</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> local</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 2001:db8:4700::/47</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dev</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> lo</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">sysctl</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> net.ipv6.ip_nonlocal_bind=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">1</span></span></code></pre></figure>\n<p>让内核认为：</p>\n<ul>\n<li>这整段 <code>/47</code> 都是“本机可接收”的地址</li>\n<li>进程可以直接绑定其中任意地址</li>\n</ul>\n<p>这是最关键的两步。</p>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"脱敏后的-bird2-配置示意\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E8%84%B1%E6%95%8F%E5%90%8E%E7%9A%84-bird2-%E9%85%8D%E7%BD%AE%E7%A4%BA%E6%84%8F\">脱敏后的 BIRD2 配置示意</a></h2>\n<p>下面是一份经过脱敏处理的配置骨架，用来说明和本文相关的关键部分。</p>\n<figure class=\"code-block\" data-lang=\"bird\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bird</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bird\"><code><span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">################################################</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">#                 Variables                     #</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">################################################</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">define</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> OWNAS   </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 64500</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">define</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> OWNIP   </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 198.51.100.10</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">define</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> OWNIPv6 </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 2001:db8:100::10</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">define</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> OWNNETSET_V4 </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> [];</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">define</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> OWNNETSET_V6 </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> [</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">    2001:db8:4700::/47</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">];</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">################################################</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">#                 Global                        #</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">################################################</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">router</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> id</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> OWNIP;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">protocol</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> device</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    scan</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> time</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 10</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">}</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">################################################</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">#                  Direct                       #</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">################################################</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">protocol</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> direct</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    ipv4</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    ipv6</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    interface</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> \"dummy*\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">}</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">################################################</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">#              Kernel isolation                 #</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">################################################</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">protocol</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> kernel</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> krt_ipv4</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    scan</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> time</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 20</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    ipv4</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        import </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">none</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        export </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">none</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    };</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">}</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">protocol</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> kernel</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> krt_ipv6</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    scan</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> time</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 20</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    ipv6</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        import </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">none</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        export </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">none</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    };</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">}</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">################################################</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">#              Static announcements             #</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">################################################</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">protocol</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> static</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> static_v6</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    route</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 2001:db8:4700::/47</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> reject</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    ipv6</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        import </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">all</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        export </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">none</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    };</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">}</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">################################################</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">#               BGP template                    #</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">################################################</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">template</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> bgp</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> tpl_bgp</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    local</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> as</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> OWNAS</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    path metric</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 1</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    graceful restart</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    ipv4</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        import </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">none</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        export filter { </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">reject</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">; };</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">        export limit</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 100</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> action</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> disable</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">        extended next hop</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> on</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    };</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    ipv6</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        import </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">none</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        export filter {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">            if</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> source</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> !=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> RTS_STATIC</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> then</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> reject</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">            accept</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        };</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">        export limit</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 100</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> action</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> disable</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    };</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">}</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">################################################</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">#                 Upstream BGP                  #</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">################################################</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">protocol</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> bgp</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> bgp_upstream_v4</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> from</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> tpl_bgp</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">    source</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> address</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> OWNIP;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    neighbor</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 169.254.0.1</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> as</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 64496</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    multihop</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 2</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    password</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> \"REDACTED_PASSWORD\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">}</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">protocol</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> bgp</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> bgp_upstream_v6</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> from</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> tpl_bgp</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">    source</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> address</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> OWNIPv6;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    neighbor</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 2001:db8:ffff::1</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> as</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 64496</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    multihop</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 2</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    password</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> \"REDACTED_PASSWORD\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">}</span></span></code></pre></figure>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"bird2-配置是否需要修改\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#bird2-%E9%85%8D%E7%BD%AE%E6%98%AF%E5%90%A6%E9%9C%80%E8%A6%81%E4%BF%AE%E6%94%B9\">BIRD2 配置是否需要修改</a></h2>\n<h3 id=\"结论\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E7%BB%93%E8%AE%BA\">结论</a></h3>\n<p><strong>大多数情况下几乎不用改。</strong></p>\n<p>因为当前已经有：</p>\n<figure class=\"code-block\" data-lang=\"bird\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bird</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bird\"><code><span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">protocol</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> direct</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    ipv4</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    ipv6</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    interface</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> \"dummy*\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">}</span></span></code></pre></figure>\n<p>所以只要新的逻辑网卡叫 <code>dummy47</code>，它天然就会被匹配。</p>\n<p>而 IPv6 静态广播部分本身也是对的：</p>\n<figure class=\"code-block\" data-lang=\"bird\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bird</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bird\"><code><span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">protocol</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> static</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> static_v6</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    route</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 2001:db8:4700::/47</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> reject</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    ipv6</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        import </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">all</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        export </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">none</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    };</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">}</span></span></code></pre></figure>\n<h3 id=\"为什么不用把-47-从-reject-改掉\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E7%94%A8%E6%8A%8A-47-%E4%BB%8E-reject-%E6%94%B9%E6%8E%89\">为什么不用把 <code>/47</code> 从 reject 改掉</a></h3>\n<p>因为这里的 <code>reject</code> 路由只是为了：</p>\n<ul>\n<li>让前缀进入 BIRD RIB</li>\n<li>满足 BGP 导出条件</li>\n<li>作为“我拥有并广播这个前缀”的声明</li>\n</ul>\n<p>它<strong>不是</strong>为了给 Linux 内核做真实转发或本机地址绑定。</p>\n<p>所以 <code>/47</code> 继续保留 <code>reject</code> 方式是合理的。</p>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"实际配置步骤\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E5%AE%9E%E9%99%85%E9%85%8D%E7%BD%AE%E6%AD%A5%E9%AA%A4\">实际配置步骤</a></h2>\n<p>下面开始做 Linux 网络配置。</p>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"第一步创建新的-dummy-网卡\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E7%AC%AC%E4%B8%80%E6%AD%A5%E5%88%9B%E5%BB%BA%E6%96%B0%E7%9A%84-dummy-%E7%BD%91%E5%8D%A1\">第一步：创建新的 dummy 网卡</a></h2>\n<p>先加载模块并创建逻辑网卡：</p>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">modprobe</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">ip</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> link</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> add</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy47</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> type</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">ip</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> link</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> set</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy47</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> up</span></span></code></pre></figure>\n<p>执行后可以用下面命令确认：</p>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">ip</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> link</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> show</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy47</span></span></code></pre></figure>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"第二步给-dummy47-加一个锚点地址\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E7%AC%AC%E4%BA%8C%E6%AD%A5%E7%BB%99-dummy47-%E5%8A%A0%E4%B8%80%E4%B8%AA%E9%94%9A%E7%82%B9%E5%9C%B0%E5%9D%80\">第二步：给 dummy47 加一个锚点地址</a></h2>\n<p>虽然我们要使用的是整个 <code>/47</code> 地址池，但还是建议在 <code>dummy47</code> 上放一个明确的单地址作为“锚点”：</p>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">ip</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> addr</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> add</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 2001:db8:4700::1/128</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dev</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy47</span></span></code></pre></figure>\n<p>这里使用 <code>/128</code> 即可，不需要把整个 <code>/47</code> 当作普通接口地址加上去。</p>\n<h3 id=\"为什么不用\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E7%94%A8\">为什么不用：</a></h3>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">ip</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> addr</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> add</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 2001:db8:4700::/47</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dev</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy47</span></span></code></pre></figure>\n<p>因为这并不能达到“本机可以绑定整个 <code>/47</code>”的目的。<br>\n它只是给接口加了一个 connected route 的语义，不等于把整段前缀都变成可直接绑定的本地地址池。</p>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"第三步把整个-47-加为-local-route\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E7%AC%AC%E4%B8%89%E6%AD%A5%E6%8A%8A%E6%95%B4%E4%B8%AA-47-%E5%8A%A0%E4%B8%BA-local-route\">第三步：把整个 <code>/47</code> 加为 local route</a></h2>\n<p>这一步是最关键的。</p>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">ip</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> route</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> replace</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> local</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 2001:db8:4700::/47</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dev</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> lo</span></span></code></pre></figure>\n<p>这样内核会认为：</p>\n<blockquote>\n<p><code>2001:db8:4700::/47</code> 整段都属于本机 local address space</p>\n</blockquote>\n<p>也就是说，只要后续应用去绑定这一段里的任意 IPv6 地址，内核都会接受。</p>\n<h3 id=\"为什么挂到-lo\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E4%B8%BA%E4%BB%80%E4%B9%88%E6%8C%82%E5%88%B0-lo\">为什么挂到 <code>lo</code></a></h3>\n<p>因为这是一条 <strong>local route</strong>，它表达的意思不是“从 loopback 发包”，而是：</p>\n<ul>\n<li>这段前缀按本地地址处理</li>\n<li>由本机持有</li>\n</ul>\n<p>这是 Linux 处理这类场景的标准方式。</p>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"第四步开启-ip_nonlocal_bind\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E7%AC%AC%E5%9B%9B%E6%AD%A5%E5%BC%80%E5%90%AF-ip_nonlocal_bind\">第四步：开启 ip_nonlocal_bind</a></h2>\n<p>即使有了 <code>local route</code>，很多程序默认仍然不能随便绑定“没有显式加在接口上的地址”。</p>\n<p>所以还要开启：</p>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">sysctl</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -w</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> net.ipv6.ip_nonlocal_bind=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">1</span></span></code></pre></figure>\n<p>为了持久化，建议写入单独的 sysctl 配置文件：</p>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">cat</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> ></span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">/etc/sysctl.d/99-ipv6-pool.conf</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> &#x3C;&#x3C;</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'EOF'</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">net.ipv6.ip_nonlocal_bind = 1</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">EOF</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">sysctl</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> --system</span></span></code></pre></figure>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"第五步重新加载-bird2\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E7%AC%AC%E4%BA%94%E6%AD%A5%E9%87%8D%E6%96%B0%E5%8A%A0%E8%BD%BD-bird2\">第五步：重新加载 BIRD2</a></h2>\n<p>如果 BIRD 配置本身没有改动，这一步理论上不是必须的。<br>\n但如果顺手调整了配置，执行一次重载最保险：</p>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">birdc</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> configure</span></span></code></pre></figure>\n<p>然后检查路由是否在 BIRD RIB 中：</p>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">birdc</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> show</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> route</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> for</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 2001:db8:4700::/47</span></span></code></pre></figure>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"验证方法\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E9%AA%8C%E8%AF%81%E6%96%B9%E6%B3%95\">验证方法</a></h2>\n<h3 id=\"查看-dummy47-地址\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E6%9F%A5%E7%9C%8B-dummy47-%E5%9C%B0%E5%9D%80\">查看 dummy47 地址</a></h3>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">ip</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> addr</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> show</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dev</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy47</span></span></code></pre></figure>\n<p>预期至少能看到：</p>\n<figure class=\"code-block\" data-lang=\"text\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">text</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"text\"><code><span class=\"line\"><span>inet6 2001:db8:4700::1/128 scope global</span></span></code></pre></figure>\n<h3 id=\"查看-local-route\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E6%9F%A5%E7%9C%8B-local-route\">查看 local route</a></h3>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">ip</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> route</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> show</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> table</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> local</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> |</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> grep</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> '2001:db8:4700::/47'</span></span></code></pre></figure>\n<p>预期看到类似：</p>\n<figure class=\"code-block\" data-lang=\"text\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">text</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"text\"><code><span class=\"line\"><span>local 2001:db8:4700::/47 dev lo</span></span></code></pre></figure>\n<h3 id=\"用指定源-ipv6-测试出网\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E7%94%A8%E6%8C%87%E5%AE%9A%E6%BA%90-ipv6-%E6%B5%8B%E8%AF%95%E5%87%BA%E7%BD%91\">用指定源 IPv6 测试出网</a></h3>\n<p>这里不要写接口名 <code>dummy47</code>，而是直接绑定具体源地址：</p>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">curl</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> --interface</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 2001:db8:4700::100</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> https://ipv6.ip.sb</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">curl</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> --interface</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 2001:db8:4700::200</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> https://ipv6.ip.sb</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">curl</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> --interface</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 2001:db8:4701::1234</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> https://ipv6.ip.sb</span></span></code></pre></figure>\n<p>如果返回值分别就是你指定的源地址，说明配置成功。</p>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"一个容易踩坑的点绑定接口不等于绑定源地址\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E4%B8%80%E4%B8%AA%E5%AE%B9%E6%98%93%E8%B8%A9%E5%9D%91%E7%9A%84%E7%82%B9%E7%BB%91%E5%AE%9A%E6%8E%A5%E5%8F%A3%E4%B8%8D%E7%AD%89%E4%BA%8E%E7%BB%91%E5%AE%9A%E6%BA%90%E5%9C%B0%E5%9D%80\">一个容易踩坑的点：绑定“接口”不等于绑定“源地址”</a></h2>\n<p>很多人会下意识这样测：</p>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">curl</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> --interface</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy47</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> https://ipv6.ip.sb</span></span></code></pre></figure>\n<p>这个测试方式并不适合这里。</p>\n<p>因为 <code>dummy47</code> 不是物理出口网卡，它只是一个逻辑承载接口。<br>\n真正的流量出网仍然依赖系统默认路由，一般还是会走类似 <code>eth0</code> 或 <code>ens3</code> 这样的真实物理网卡。</p>\n<p>所以正确姿势应该是：</p>\n<ul>\n<li><strong>绑定具体源 IPv6 地址</strong></li>\n<li>而不是绑定 <code>dummy47</code> 这个接口名</li>\n</ul>\n<p>即：</p>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">curl</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> --interface</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 2001:db8:4700::100</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> https://ipv6.ip.sb</span></span></code></pre></figure>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"关于-ndppd这次场景一般不需要\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E5%85%B3%E4%BA%8E-ndppd%E8%BF%99%E6%AC%A1%E5%9C%BA%E6%99%AF%E4%B8%80%E8%88%AC%E4%B8%8D%E9%9C%80%E8%A6%81\">关于 ndppd：这次场景一般不需要</a></h2>\n<p>一些“整段 IPv6 绑定并直接使用”的文章里，会额外提到 <code>ndppd</code>。<br>\n那通常是因为上游把 IPv6 前缀作为 <strong>on-link 网络</strong> 给到机器，需要对每个地址做 NDP 邻居发现。</p>\n<p>但这里的场景不同：</p>\n<ul>\n<li>机器已经通过 <strong>BGP</strong> 广播这段前缀</li>\n<li>上游更像是把这段前缀<strong>路由到这台机器</strong></li>\n<li>而不是要求本机在二层上对整段地址逐个做 NDP 响应</li>\n</ul>\n<p>所以在这种设计下，一般：</p>\n<ul>\n<li><strong>不需要 <code>ndppd</code></strong></li>\n<li>只需要：\n<ul>\n<li>BIRD 正常广播前缀</li>\n<li>内核有 <code>local route</code></li>\n<li>开启 <code>ip_nonlocal_bind</code></li>\n</ul>\n</li>\n</ul>\n<p>只有当服务商明确要求这段前缀是二层直连、必须对目标地址进行邻居发现时，才需要额外考虑 <code>ndppd</code> 或 <code>proxy_ndp</code>。</p>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"持久化方案systemd-service\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E6%8C%81%E4%B9%85%E5%8C%96%E6%96%B9%E6%A1%88systemd-service\">持久化方案：systemd service</a></h2>\n<p>为了避免重启后丢失，我最后把这套配置写成了一个简单的 systemd 服务。</p>\n<p>创建文件：</p>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">vim</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> /etc/systemd/system/dummy47-v6pool.service</span></span></code></pre></figure>\n<p>内容如下：</p>\n<figure class=\"code-block\" data-lang=\"ini\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">ini</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"ini\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">[Unit]</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">Description</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=IPv6 pool on dummy47</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">After</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=network-online.target</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">Wants</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=network-online.target</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">[Service]</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">Type</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=oneshot</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">RemainAfterExit</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=yes</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">ExecStart</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=/sbin/modprobe dummy</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">ExecStart</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=/sbin/ip link add dummy47 type dummy</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">ExecStart</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=/sbin/ip link set dummy47 up</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">ExecStart</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=/sbin/ip -6 addr add 2001:db8:4700::1/128 dev dummy47</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">ExecStart</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=/sbin/ip -6 route replace local 2001:db8:4700::/47 dev lo</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">ExecStart</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=/sbin/sysctl -w </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">net.ipv6.ip_nonlocal_bind</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=1</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">ExecStop</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=/sbin/ip -6 route del local 2001:db8:4700::/47 dev lo</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">ExecStop</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=/sbin/ip -6 addr del 2001:db8:4700::1/128 dev dummy47</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">ExecStop</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=/sbin/ip link del dummy47</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">[Install]</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">WantedBy</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=multi-user.target</span></span></code></pre></figure>\n<p>然后执行：</p>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">systemctl</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> daemon-reload</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">systemctl</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> enable</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> --now</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy47-v6pool.service</span></span></code></pre></figure>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"一份完整的操作命令汇总\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E4%B8%80%E4%BB%BD%E5%AE%8C%E6%95%B4%E7%9A%84%E6%93%8D%E4%BD%9C%E5%91%BD%E4%BB%A4%E6%B1%87%E6%80%BB\">一份完整的操作命令汇总</a></h2>\n<p>为了方便复制，这里把完整步骤汇总成一段：</p>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">modprobe</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">ip</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> link</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> add</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy47</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> type</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> ||</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> true</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">ip</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> link</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> set</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy47</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> up</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">ip</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> addr</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> add</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 2001:db8:4700::1/128</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dev</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy47</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> ||</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> true</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">ip</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> route</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> replace</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> local</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 2001:db8:4700::/47</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dev</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> lo</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">sysctl</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -w</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> net.ipv6.ip_nonlocal_bind=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">1</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">birdc</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> configure</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">birdc</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> show</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> route</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> for</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 2001:db8:4700::/47</span></span></code></pre></figure>\n<p>验证：</p>\n<figure class=\"code-block\" data-lang=\"bash\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">bash</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"bash\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">ip</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> addr</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> show</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dev</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> dummy47</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">ip</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> route</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> show</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> table</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> local</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> |</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> grep</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> '2001:db8:4700::/47'</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">curl</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> --interface</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 2001:db8:4700::100</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> https://ipv6.ip.sb</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">curl</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> --interface</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 2001:db8:4700::200</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> https://ipv6.ip.sb</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">curl</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> -6</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> --interface</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 2001:db8:4701::1234</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> https://ipv6.ip.sb</span></span></code></pre></figure>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"我的最终理解\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E6%88%91%E7%9A%84%E6%9C%80%E7%BB%88%E7%90%86%E8%A7%A3\">我的最终理解</a></h2>\n<p>这次配置做完之后，整个结构就很清晰了：</p>\n<h3 id=\"bird2-做什么\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#bird2-%E5%81%9A%E4%BB%80%E4%B9%88\">BIRD2 做什么</a></h3>\n<ul>\n<li>继续通过 BGP 广播目标 <code>/47</code></li>\n<li>继续使用 <code>static ... reject</code> 的方式将前缀放入 BIRD RIB</li>\n<li>不导入、不导出 Linux 内核路由</li>\n</ul>\n<h3 id=\"linux-内核做什么\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#linux-%E5%86%85%E6%A0%B8%E5%81%9A%E4%BB%80%E4%B9%88\">Linux 内核做什么</a></h3>\n<ul>\n<li>通过 <code>dummy47</code> 提供逻辑承载</li>\n<li>通过 <code>local route</code> 将整个 <code>/47</code> 标记为本机地址空间</li>\n<li>通过 <code>ip_nonlocal_bind</code> 允许应用绑定池中任意 IPv6</li>\n</ul>\n<h3 id=\"应用怎么用\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E5%BA%94%E7%94%A8%E6%80%8E%E4%B9%88%E7%94%A8\">应用怎么用</a></h3>\n<ul>\n<li>不是绑定 <code>dummy47</code></li>\n<li>而是绑定目标 <code>/47</code> 中的具体某个 IPv6 作为源地址</li>\n<li>流量最终仍然走系统默认路由，从真实物理接口出网</li>\n</ul>\n<hr>\n</section><section class=\"post-section\"><h2 id=\"后记\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/bird2-ipv6-pool-sanitized/#%E5%90%8E%E8%AE%B0\">后记</a></h2>\n<p>一开始我也很容易把“前缀广播”和“本机地址绑定”混成一件事。<br>\n但真正拆开以后就会发现，这其实是两个层面的事情：</p>\n<ul>\n<li><strong>路由控制面</strong>：BIRD/BGP</li>\n<li><strong>主机数据面</strong>：Linux 网络栈</li>\n</ul>\n<p>把这两者分开处理后，整套方案就会非常稳定，也更容易维护和排障。</p>\n<p>如果后续还要继续扩展这台机器承载更多 IPv6 地址池，我会优先继续沿用这个思路：</p>\n<ul>\n<li>BIRD 只负责广播</li>\n<li>业务地址池通过 <code>dummy + local route + ip_nonlocal_bind</code> 管理</li>\n</ul>\n<p>这样结构最干净。</p></section>","summary":"记录一次在 Linux + BIRD2 环境下，将一个 IPv6 /47 地址池作为本机可绑定地址使用，并通过新建 dummy 网卡实现可绑定、可出网的配置过程。","image":"https://blog.xsy.fun/og/bird2-ipv6-pool-sanitized.png","date_published":"2026-04-15T14:00:00.000Z","date_modified":"2026-04-15T14:00:00.000Z","tags":["bird2","ipv6","linux","bgp","网络"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/kafka-experience/","url":"https://blog.xsy.fun/posts/kafka-experience/","title":"AWS服务和Kafka集群实操日记","content_html":"<section class=\"post-section\"><h2 id=\"简介\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/kafka-experience/#%E7%AE%80%E4%BB%8B\">简介</a></h2>\n<p>最近有一个项目需要使用AWS服务，鉴于我是第一次上手AWS和使用其中的服务，我认为有必要写一篇博客记录下我新接触到的技术，一些理解和感悟，并且保留一些实际操作经历方便我回顾和重新使用其中的一些命令。</p>\n<p>这个项目涉及到了</p>\n<ul>\n<li>Amazon MSK也就是Fully Managed Apache Kafka，说白了就是一个kafka集群</li>\n<li>Amazon的Iot Core，是一个MQTT broker类似的东西</li>\n<li>Amazon的Lambda，一个支持多编程语言的serverless平台</li>\n<li>Amazon的S3，Scalable Storage in the Cloud</li>\n<li>Amazon的IAM的权限控制</li>\n<li>Amazon的CloudWatch - 类似于Grafana的平台</li>\n</ul>\n<p>这篇日记将会围绕上述内容展开，并且将所有服务串成一个数据流</p>\n</section><section class=\"post-section\"><h2 id=\"正文\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/kafka-experience/#%E6%AD%A3%E6%96%87\">正文</a></h2>\n<h3 id=\"业务流程\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/kafka-experience/#%E4%B8%9A%E5%8A%A1%E6%B5%81%E7%A8%8B\">业务流程</a></h3>\n<p>我们从数据的入口开始逐步追随数据的脚步完成追踪从而串联所有使用到的服务。</p>\n<p>Iot Core将会作为入口，接受来自iot设备或者其他使用mqtt协议的服务，将接收到的数据使用Message routing的Rules功能将信息转发到kafka的topic中或者发送到Lambda经过处理写入S3的Json文件中。</p>\n<figure class=\"post-figure\"><img alt=\"\" sizes=\"(min-width: 864px) 832px, 100vw\" loading=\"lazy\" decoding=\"async\" width=\"1288\" height=\"344\" src=\"https://blog.xsy.fun/_astro/chart.BXZSZmvX_Zn5uoX.webp\" srcset=\"https://blog.xsy.fun/_astro/chart.BXZSZmvX_2ct5ky.webp 640w, https://blog.xsy.fun/_astro/chart.BXZSZmvX_Z3F7N3.webp 750w, https://blog.xsy.fun/_astro/chart.BXZSZmvX_Z1Hvz7r.webp 828w, https://blog.xsy.fun/_astro/chart.BXZSZmvX_Z2pkx6I.webp 1080w, https://blog.xsy.fun/_astro/chart.BXZSZmvX_ZjvvEG.webp 1280w, https://blog.xsy.fun/_astro/chart.BXZSZmvX_Zn5uoX.webp 1288w\"></figure>\n<figure class=\"diagram\" data-pagefind-ignore=\"\"><pre class=\"mermaid\" data-source=\"graph LR\nA[mqtt message]-- Message Rule --->B[Kafka Cluster topic]\nA-- Message Rule --->C[Lambda - Process Data] ---> D[S3]\">graph LR\nA[mqtt message]-- Message Rule --->B[Kafka Cluster topic]\nA-- Message Rule --->C[Lambda - Process Data] ---> D[S3]</pre></figure>\n<h3 id=\"iam权限控制\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/kafka-experience/#iam%E6%9D%83%E9%99%90%E6%8E%A7%E5%88%B6\">IAM权限控制</a></h3>\n<p>其中如果Iot Core在遇到错误抛出将会将日志写入CloudWatch服务。完成上述要求首先要求用户配置多个服务的Policy，然后将不同的Policy分配给多种Role，然后这些服务将会使用Role提供的权限来操作AWS中的各类服务，总而言之Policy是包含多单个权限的集合，例如s3:ListBucket就是Policy中所有权限的例子。</p>\n<p>而Role则包含一个或多个Policy的集合，例如分别有S3 Admin Policy和CloudWatch Write Policy，这些将会为Role中的Policy。只有将拥有相应权限的Role分配给AWS服务的instance，这个instance才能操作和有访问权限，这是一大先决条件。</p>\n<h3 id=\"msk配置\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/kafka-experience/#msk%E9%85%8D%E7%BD%AE\">MSK配置</a></h3>\n<p>首先MSK分为Provisioned和Serverless两种类型，其中<strong>serverless不能具有除了IAM之外的验证方式</strong>，这就使得如果想让Iot core和msk搭配使用，必须要使用provision版本的，因为Iot core rule只支持使用SASL/SCRAM身份验证或者SSL身份验证。</p>\n<p>此外如果想从外部访问MSK集群中的节点去创建topic有多种方式，而我采用的是使用一个EC2的client machine，也就是一台虚拟机作为一个跳板机，并且在跳板机器上搭建代理，使得从外部可以通过代理连接到Amazon内部与EC2同一VPC网络下的节点，但是很重要的一点是<strong>不能疏忽了MSK和EC2的防火墙配置是否放通，如果不放通会无法连接</strong>，我在这里排查了很久才发现是防火墙的问题</p>\n<p>关于如何设置跳板机可以参见官方的文档<a href=\"https://docs.aws.amazon.com/msk/latest/developerguide/create-client-machine.html\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">https://docs.aws.amazon.com/msk/latest/developerguide/create-client-machine.html</a></p>\n<figure class=\"post-figure\"><img alt=\"firewall example\" sizes=\"(min-width: 864px) 832px, 100vw\" loading=\"lazy\" decoding=\"async\" width=\"2778\" height=\"616\" src=\"https://blog.xsy.fun/_astro/firewall.XWH4oXXv_Z1kat7i.webp\" srcset=\"https://blog.xsy.fun/_astro/firewall.XWH4oXXv_1MU77U.webp 640w, https://blog.xsy.fun/_astro/firewall.XWH4oXXv_Z1zRx32.webp 750w, https://blog.xsy.fun/_astro/firewall.XWH4oXXv_PMRDa.webp 828w, https://blog.xsy.fun/_astro/firewall.XWH4oXXv_ZaeDuO.webp 1080w, https://blog.xsy.fun/_astro/firewall.XWH4oXXv_ZmgObE.webp 1280w, https://blog.xsy.fun/_astro/firewall.XWH4oXXv_23OIk6.webp 1668w, https://blog.xsy.fun/_astro/firewall.XWH4oXXv_Z1x3JyB.webp 2048w, https://blog.xsy.fun/_astro/firewall.XWH4oXXv_1jzJYu.webp 2560w, https://blog.xsy.fun/_astro/firewall.XWH4oXXv_Z1kat7i.webp 2778w\"></figure>\n<p>讲清楚了访问，我们再深入讲讲连接和权限控制，首先确保EC2的IAM Role有权限访问MSK集群的节点和topic，然后连接跳板机可以通过如下命令完成topic的创建和订阅和发送消息到topic</p>\n<figure class=\"code-block\" data-lang=\"console\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">console</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"console\"><code><span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"># subscribe topic</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">./kafka-console-consumer.sh \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">  --bootstrap-server url:port,url2:port \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">  --topic topic \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">  --consumer.config client.properties</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"># push data to topic, producer</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">./kafka-console-producer.sh \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">  --bootstrap-server url:port,url2:port \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">  --topic topic \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">  --producer.config client.properties</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"># check all the topic</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">./kafka-topics.sh --list \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">  --bootstrap-server url:port,url2:port \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">  --consumer.config sasl.properties</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"># create a topic</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">./kafka-topics.sh --create \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">  --bootstrap-server url:port,url2:port \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">  --topic topic \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">  --partitions 6 \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">  --replication-factor 2 \\</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> --command-config sasl.properties</span></span>\n<span class=\"line\"></span></code></pre></figure>\n<p>其中如果遇到了诸如提示Error while executing topic command : The AdminClient thread has exited. Call: createTopics，基本上可以判定是权限问题，请先检查你配置的IAM和SASL/SCRAM/SSL是否正确，其中IAM如果在EC2上只要在网站上正确配置了IAM role，那么使用那个IP就可以直接使用IAM方式访问。</p>\n<figure class=\"code-block\" data-lang=\"console\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">console</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"console\"><code><span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">[ec2-user@ bin]</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">$ ./kafka-topics.sh --create --bootstrap-server url:port --topic your_topic --partitions 6 --replication-factor 2</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">WARNING: Due to limitations in metric names, topics with a period ('.') or underscore ('') could collide. To avoid issues it is best to use either, but not both.</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">Error while executing topic command : The AdminClient thread has exited. Call: createTopics</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">[2025-06-11 05:00:49,875] ERROR org.apache.kafka.common.errors.TimeoutException: The AdminClient thread has exited. Call: createTopics</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> (org.apache.kafka.tools.TopicCommand)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">[2025-06-11 05:00:49,890] ERROR Uncaught exception in thread 'kafka-admin-client-thread | adminclient-1': (org.apache.kafka.common.utils.KafkaThread)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">java.lang.OutOfMemoryError: Java heap space</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        at java.base/java.nio.HeapByteBuffer.&#x3C;init>(HeapByteBuffer.java:61)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        at java.base/java.nio.ByteBuffer.allocate(ByteBuffer.java:348)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        at org.apache.kafka.common.memory.MemoryPool$1.tryAllocate(MemoryPool.java:30)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        at org.apache.kafka.common.network.NetworkReceive.readFrom(NetworkReceive.java:103)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        at org.apache.kafka.common.network.KafkaChannel.receive(KafkaChannel.java:462)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        at org.apache.kafka.common.network.KafkaChannel.read(KafkaChannel.java:412)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        at org.apache.kafka.common.network.Selector.attemptRead(Selector.java:694)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        at org.apache.kafka.common.network.Selector.pollSelectionKeys(Selector.java:596)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        at org.apache.kafka.common.network.Selector.poll(Selector.java:501)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:596)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        at org.apache.kafka.clients.admin.KafkaAdminClient$AdminClientRunnable.processRequests(KafkaAdminClient.java:1542)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        at org.apache.kafka.clients.admin.KafkaAdminClient$AdminClientRunnable.run(KafkaAdminClient.java:1473)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        at java.base/java.lang.Thread.run(Thread.java:829)</span></span></code></pre></figure>\n<h3 id=\"iot-core设置\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/kafka-experience/#iot-core%E8%AE%BE%E7%BD%AE\">Iot Core设置</a></h3>\n<p>我们可以通过打开AWS IoT - Message routing - Rules，来新增一条规则，我这里记录我使用Rule将数据转发到Kafka的过程，首先我们选择Rule actions为Kafka，并且在Destination里添加一个VPC，这个同样需要对应的IAM Role去完成，接着我们可以设置Kafka topic为你之前创建的topic，Key我填写了${clientid()}，主要是提供给kafka做数据分区使用，如果单个key太多可能会导致某个分区中的内容过多导致倾斜。</p>\n<p>特别需要注意的是在SASL Configuration中，username和password需要先在AWS Secrets Manager中填写用户密码的键值对，然后绑定在Key Management Service (KMS)中生成的Key即可，后续的访问中如果使用SASL/SCRAM，这里设置的键值对就是你的用户密码</p>\n<figure class=\"post-figure\"><img alt=\"alt text\" sizes=\"(min-width: 864px) 832px, 100vw\" loading=\"lazy\" decoding=\"async\" width=\"1986\" height=\"1588\" src=\"https://blog.xsy.fun/_astro/secrets.BukECRdb_1ESl7f.webp\" srcset=\"https://blog.xsy.fun/_astro/secrets.BukECRdb_1xEe9N.webp 640w, https://blog.xsy.fun/_astro/secrets.BukECRdb_Z1g1I3x.webp 750w, https://blog.xsy.fun/_astro/secrets.BukECRdb_ZpktBj.webp 828w, https://blog.xsy.fun/_astro/secrets.BukECRdb_ZbdwRm.webp 1080w, https://blog.xsy.fun/_astro/secrets.BukECRdb_Z1gb4cz.webp 1280w, https://blog.xsy.fun/_astro/secrets.BukECRdb_26s2qa.webp 1668w, https://blog.xsy.fun/_astro/secrets.BukECRdb_1ESl7f.webp 1986w\"></figure>\n<p>然后我们需要使用这个来获取存储在Secrets Manager中的键值，这个是用户名，密码则替换username即可\n<code> ${get_secret('AmazonMSK_iot', 'SecretString', 'username', 'you role arn')}</code>\n当然你也可以设置一些header来方便识别信息，但是如果设置过多也许会些许影响性能</p>\n<figure class=\"post-figure\"><img alt=\"alt text\" sizes=\"(min-width: 864px) 832px, 100vw\" loading=\"lazy\" decoding=\"async\" width=\"1968\" height=\"692\" src=\"https://blog.xsy.fun/_astro/headers.Bz7JxUWd_1TGk04.webp\" srcset=\"https://blog.xsy.fun/_astro/headers.Bz7JxUWd_pQGNK.webp 640w, https://blog.xsy.fun/_astro/headers.Bz7JxUWd_Z2g9jH2.webp 750w, https://blog.xsy.fun/_astro/headers.Bz7JxUWd_1nJvNa.webp 828w, https://blog.xsy.fun/_astro/headers.Bz7JxUWd_Z25GGWA.webp 1080w, https://blog.xsy.fun/_astro/headers.Bz7JxUWd_ZhoOYI.webp 1280w, https://blog.xsy.fun/_astro/headers.Bz7JxUWd_1RQO7P.webp 1668w, https://blog.xsy.fun/_astro/headers.Bz7JxUWd_1TGk04.webp 1968w\"></figure>\n<h3 id=\"lambda设置\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/kafka-experience/#lambda%E8%AE%BE%E7%BD%AE\">Lambda设置</a></h3>\n<p>只需要在Lambda中添加一个Functions，然后在Iot core中的rule设置一个action到这个function就可以将iot的数据一同发送过来，然后我就在这里合并获取到的mqtt数据然后上传到s3,如果直接将数据通过iot core的rule转发到s3的话，会为每条数据生成一个文件，似乎不方便管理和查看，所以为什么这里要使用Lambda去转发。</p>\n<p>但是由于我这里直接而使用了Lambda去上传数据到s3，并没有做任何缓存，如果数据量比较大可能会出问题</p>\n</section><section class=\"post-section\"><h2 id=\"结尾\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/kafka-experience/#%E7%BB%93%E5%B0%BE\">结尾</a></h2>\n<p>这就是所有我最近上手的AWS服务了，如果有什么新的，以后可以再加</p></section>","summary":"记录第一次上手AWS的实操过程，串联IoT Core、MSK Kafka、Lambda、S3与IAM权限配置组成的数据流。","image":"https://blog.xsy.fun/og/kafka-experience.png","date_published":"2025-06-12T15:41:55.000Z","date_modified":"2025-06-12T15:41:55.000Z","tags":["AWS","Kafka","IAM","MQTT","S3"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/hello-world/","url":"https://blog.xsy.fun/posts/hello-world/","title":"将Typecho文章迁移到Hexo系统","content_html":"<section class=\"post-section\"><h2 id=\"前言\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/hello-world/#%E5%89%8D%E8%A8%80\">前言</a></h2>\n<p>将Typecho文章迁移到Hexo系统，实在是过去太久了，我终于又把我的博客捡起来了，上次写博客还是在5年前，一转眼我就快大学毕业了，想想我之前加入的十年之约博客项目真的是笑话，确实坚持续费服务器的花费是不小的，但是随着年龄的增长和知识储备的增加，应该会使这个博客应该能活到10年吧。</p>\n<p>废话说完，这篇文章是讲我如何将typecho的博客系统迁移到hexo的，其实很简单就一个python文件就搞定了，但是评论系统的更换导致原来的记录很难被迁移，所以只能有所取舍，目前我只迁移了所有的文章，并且将tag对应上，至于图片我一开始就用的是对象存储所以问题应该不大。</p>\n<p>代码如下</p>\n<h3 id=\"迁移代码\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/hello-world/#%E8%BF%81%E7%A7%BB%E4%BB%A3%E7%A0%81\">迁移代码</a></h3>\n<figure class=\"code-block\" data-lang=\"python\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">python</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"python\"><code><span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\"># -*- coding: utf-8 -*-</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">import</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> os</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">import</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> pymysql</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">import</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> arrow</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">from</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> box </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">import</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> Box</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">def</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> create_data</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(db):</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    cursor </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> db.cursor()</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">    # 创建文章</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    cursor.execute(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"select cid, title, slug, text, created, modified from ty_contents where type='post'\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">    # 创建分类和标签</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    entries </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> cursor.fetchall()</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">    for</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> e </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">in</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> entries:</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        e </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> Box(e)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        title </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> e.title</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        title </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> title.strip(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">' '</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        print</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(title)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        content </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> str</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(e.text).replace(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'&#x3C;!--markdown-->'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">, </span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">''</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">        # 文章太长截断</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        max_length </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> 150</span><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">  # Set the maximum content length here</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">        if</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> len</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(content) </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">></span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> max_length:</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">            content </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> content[:max_length] </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">+</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> \"</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">\\n</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">&#x3C;!--more--></span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">\\n</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> +</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> content[max_length:]</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        tags </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> []</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        cursor.execute(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"select type, name, slug from `ty_relationships` ts, ty_metas tm where tm.mid = ts.mid and ts.cid = </span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">%d</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> %</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> e.cid)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        metas </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> cursor.fetchall()</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">        for</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> m </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">in</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> metas:</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">            m </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> Box(m)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">            if</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> m.type </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">==</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 'tag'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">:</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">                tags.append(m.name)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        path </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 'data/_posts/'</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">        if</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> not</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> os.path.exists(path):</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">            os.makedirs(path)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        filename </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> arrow.get(e.created).format(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'YYYY-MM-DD'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">) </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">+</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> \" \"</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> +</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> title.replace(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'/'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">, </span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'-'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        f </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> open</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">f</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">{</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">path</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">}</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">/</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">{</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">filename</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">}</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">.md\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">, </span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'w'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">, </span><span style=\"--shiki-light:#E36209;--shiki-dark:#FFAB70\">encoding</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"utf-8\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        f.write(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"---</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">\\n</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        f.write(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"title: '</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">%s</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">\\n</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> %</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> title)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        f.write(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"date: </span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">%s\\n</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> %</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> arrow.get(e.created).format(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'YYYY-MM-DD HH:mm:ss'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">))</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        f.write(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"updated: </span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">%s\\n</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> %</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> arrow.get(e.modified).format(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'YYYY-MM-DD HH:mm:ss'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">))</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        f.write(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"tags: [</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">%s</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">]</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">\\n</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> %</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> ','</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">.join(tags))</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        f.write(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"published: true</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">\\n</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        f.write(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"lang: zh-cn</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">\\n</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        f.write(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"---</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">\\n</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        f.write(content)</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        f.close()</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">def</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> main</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">():</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">    # 把数据库连接信息</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    db </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> pymysql.connect(</span><span style=\"--shiki-light:#E36209;--shiki-dark:#FFAB70\">host</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'localhost'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E36209;--shiki-dark:#FFAB70\">                                 user</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'root'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E36209;--shiki-dark:#FFAB70\">                                 password</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'xxxxx'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E36209;--shiki-dark:#FFAB70\">                                 database</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'typecho'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">,</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#E36209;--shiki-dark:#FFAB70\">                                 cursorclass</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">pymysql.cursors.DictCursor)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    create_data(db)</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">if</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> __name__</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> ==</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> \"__main__\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">:</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    main()</span></span></code></pre></figure>\n<p>这个代码也不是全是我原创的，我从网上翻出来然后改了改适应了下我自己的情况，如果需要进一步的迁移你也可以自己修改代码。</p>\n<h3 id=\"结语\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/hello-world/#%E7%BB%93%E8%AF%AD\">结语</a></h3>\n<p>总算是回来了，从年轻时候花里胡哨的主题页面，到如今追求访问性能和主题简洁真的是变化不小啊</p></section>","summary":"介绍如何用一个Python脚本把Typecho博客的文章和标签迁移到Hexo，并说明评论数据取舍和图片处理方式。","image":"https://blog.xsy.fun/og/hello-world.png","date_published":"2024-11-03T09:24:00.000Z","date_modified":"2024-11-03T09:24:00.000Z","tags":["Hexo","Typecho","数据迁移","Python","博客"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2020-05-16-wei-typecho-tian-jia-liang-bu-yan-zheng/","url":"https://blog.xsy.fun/posts/2020-05-16-wei-typecho-tian-jia-liang-bu-yan-zheng/","title":"为Typecho添加两步验证","content_html":"<section class=\"post-section\"><h2 id=\"前言\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-05-16-wei-typecho-tian-jia-liang-bu-yan-zheng/#%E5%89%8D%E8%A8%80\">前言</a></h2>\n<p>今天发现了超级好用的应用Google系的Authenticator，这是一款基于时间与哈希算法的两步验证软件客户端，并且符合 RFC 6238 和 RFC 4226标准，因为博客的安全性还是很重要的，毕竟事关服务器，所以两步验证在这里就十分有必要。而刚好Typecho有一款Google Authenticator插件，开源在Github，质疑安全性的小伙伴可以自行查看：<a href=\"https://github.com/naicfeng/typecho-Authenticator\" title=\"项目地址\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">项目地址</a></p>\n</section><section class=\"post-section\"><h2 id=\"使用方法\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-05-16-wei-typecho-tian-jia-liang-bu-yan-zheng/#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95\">使用方法</a></h2>\n<p>修改文件名为GAuthenticator放到/usr/plugins目录，然后到后台启用</p>\n<p>插件默认关闭，首次开启需要扫描二维码绑定之后填写手机上显示的代码，验证成功之后才可以启用</p>\n<h4 id=\"下载地址在此点我\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-05-16-wei-typecho-tian-jia-liang-bu-yan-zheng/#%E4%B8%8B%E8%BD%BD%E5%9C%B0%E5%9D%80%E5%9C%A8%E6%AD%A4%E7%82%B9%E6%88%91\">下载地址在此：</a><a href=\"https://github.com/naicfeng/typecho-Authenticator/releases\" title=\"github\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">点我</a></h4>\n<h3 id=\"安装客户端\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-05-16-wei-typecho-tian-jia-liang-bu-yan-zheng/#%E5%AE%89%E8%A3%85%E5%AE%A2%E6%88%B7%E7%AB%AF\">安装客户端</a></h3>\n<p>兼容所有符合 <a href=\"https://tools.ietf.org/html/rfc6238\" title=\"rfc6238\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">RFC6238</a> 规范的AuthOTP软件</p>\n<ul>\n<li>Microsoft Authenticator</li>\n<li>Google Authenticator</li>\n<li>1Password</li>\n<li>Authy</li>\n<li>KeePass</li>\n<li>LastPass</li>\n<li>...</li>\n</ul>\n<p>在这里，我个人使用的是Google系的Authenticator，对于系统的占用也比较小，简洁方便</p></section>","summary":"介绍如何为Typecho博客安装Google Authenticator插件并绑定两步验证客户端，提升后台登录安全性。","image":"https://blog.xsy.fun/og/2020-05-16-wei-typecho-tian-jia-liang-bu-yan-zheng.png","date_published":"2020-05-16T20:23:00.000Z","date_modified":"2020-05-16T20:24:57.000Z","tags":["Typecho","网络安全","两步验证","博客"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2020-04-20-xiao-cheng-xu-ban-typecho-gou-jian/","url":"https://blog.xsy.fun/posts/2020-04-20-xiao-cheng-xu-ban-typecho-gou-jian/","title":"小程序版Typecho构建","content_html":"<section class=\"post-section\"><h2 id=\"前言\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-04-20-xiao-cheng-xu-ban-typecho-gou-jian/#%E5%89%8D%E8%A8%80\">前言</a></h2>\n<p>最近我看到不少博主都发布了微信小程序版Typecho，但是质量层次不齐，开源的界面不美观，也有美观的，但是要收费，秉着节俭的原则，还是在github尝试了n多的项目之后找到了个真正能跑起来的项目，先不说界面怎么样，起码是可以跑起来的，其他项目多多少少在我这个主题下有些问题，也可能是当时的调试问题吧，毕竟是第一次接触微信小程序，最开始还不是很熟悉项目的构建，后来慢慢花的时间多了才摸清楚具体的操作，正是因为开源的程序界面并不是很美观而且handsome主题启用他们比较困难，例如头图的丢失，文章摘要的丢失，等等，所以我选择在一版能跑起来的项目上修改前端页面。</p>\n<h3 id=\"项目地址\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-04-20-xiao-cheng-xu-ban-typecho-gou-jian/#%E9%A1%B9%E7%9B%AE%E5%9C%B0%E5%9D%80\">项目地址</a></h3>\n<p><a href=\"https://github.com/xsy2004/WeChat-Typecho\" title=\"WeChat-Typecho\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">WeChat-Typecho</a></p>\n<p>求求大佬Star啊，卑微</p>\n<h4 id=\"扫码预览\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-04-20-xiao-cheng-xu-ban-typecho-gou-jian/#%E6%89%AB%E7%A0%81%E9%A2%84%E8%A7%88\">扫码预览</a></h4>\n<figure class=\"post-figure\"><a href=\"https://cdn.xsiy.ltd/photo/cid178/cxm.jpg\" title=\"小程序码\" rel=\"noopener noreferrer nofollow\" target=\"_blank\"><img src=\"https://cdn.xsiy.ltd/photo/cid178/cxm.jpg\" alt=\"小程序码\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></a><figcaption>小程序码</figcaption></figure>\n</section><section class=\"post-section\"><h2 id=\"特别鸣谢\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-04-20-xiao-cheng-xu-ban-typecho-gou-jian/#%E7%89%B9%E5%88%AB%E9%B8%A3%E8%B0%A2\">特别鸣谢</a></h2>\n<p>把致谢放在最开头是因为我自己也是一个<del>码农</del>菜鸡，所以深知写代码的不容易，所以在此特别感谢</p>\n<p><a href=\"https://github.com/MingliangLu/WeTypecho\" title=\"WeTypecho\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">WeTypecho</a>——成都第七帅大佬，博客端插件作者</p>\n<p><a href=\"https://gitee.com/Byclemon/Pisces-Mini-Program\" title=\"Pisces-Mini-Program\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Pisces-Mini-Program</a>——基于WeTypecho修改作者</p>\n<p><a href=\"https://github.com/weilanwl/ColorUI\" title=\"ColorUI\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">ColorUI</a>——小程序CSS库</p>\n</section><section class=\"post-section\"><h2 id=\"说明\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-04-20-xiao-cheng-xu-ban-typecho-gou-jian/#%E8%AF%B4%E6%98%8E\">说明</a></h2>\n<p>为什么我没有选择github上的其他作者的项目？</p>\n<p>因为我希望我的微信小程序不仅仅是可以浏览，而是可以交互，用户可以做到使用小程序评论，去表达对文章的看法与思考，如果以后我有能力去编写后端js了，我会将github上我觉得很好看的项目给完善</p>\n<p>例如 <a href=\"https://github.com/loveempathy/WxappForTypecho\" title=\"WxappForTypecho\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">WxappForTypecho</a></p>\n<h4 id=\"项目中的字母函数命名不是我写的\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-04-20-xiao-cheng-xu-ban-typecho-gou-jian/#%E9%A1%B9%E7%9B%AE%E4%B8%AD%E7%9A%84%E5%AD%97%E6%AF%8D%E5%87%BD%E6%95%B0%E5%91%BD%E5%90%8D%E4%B8%8D%E6%98%AF%E6%88%91%E5%86%99%E7%9A%84\">项目中的字母函数命名不是我写的！！！</a></h4>\n</section><section class=\"post-section\"><h2 id=\"小程序发布要求\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-04-20-xiao-cheng-xu-ban-typecho-gou-jian/#%E5%B0%8F%E7%A8%8B%E5%BA%8F%E5%8F%91%E5%B8%83%E8%A6%81%E6%B1%82\">小程序发布要求</a></h2>\n<ol>\n<li>域名已备案</li>\n<li>域名开启Https</li>\n<li>已成年，或者拥有18岁以上微信绑卡账号</li>\n</ol>\n<figure class=\"post-figure\"><a href=\"https://cdn.xsiy.ltd/photo/cid178/1.png\" title=\"微信端域名配置\" rel=\"noopener noreferrer nofollow\" target=\"_blank\"><img src=\"https://cdn.xsiy.ltd/photo/cid178/1.png\" alt=\"微信端域名配置\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></a><figcaption>微信端域名配置</figcaption></figure>\n<p>将你的域名添加进去，如果你的图片等资源存放的地址不是你上面设置的域名</p>\n<p>还需要将你的图片资源域名添加进去，否则小程序端可能无法显示资源。</p>\n</section><section class=\"post-section\"><h2 id=\"功能\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-04-20-xiao-cheng-xu-ban-typecho-gou-jian/#%E5%8A%9F%E8%83%BD\">功能</a></h2>\n<p>目前支持的基本功能如下：</p>\n<ol>\n<li>查看分类目录文章</li>\n<li>个人关于界面显示</li>\n<li>首页文章轮播图</li>\n<li>评论文章</li>\n<li>自动获取文章头图</li>\n<li>图片视频显示</li>\n<li>支持markdown,html解析</li>\n<li>推荐阅读文章</li>\n<li>搜索文章</li>\n<li>自定义字符显示不同卡片样式</li>\n</ol>\n<h3 id=\"自定义字符\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-04-20-xiao-cheng-xu-ban-typecho-gou-jian/#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AD%97%E7%AC%A6\">自定义字符</a></h3>\n<p>style （首页文章显示样式，值默认为3，其他的我也没测试）</p>\n<ol>\n<li>代码大图卡片形式</li>\n<li>代表小图卡片显示形式</li>\n<li>代表背景卡片形式</li>\n</ol>\n<p>isPay（文章是否需要广告启动，默认为0） 1：是 0：否</p>\n<p>thumb（文章缩略图）</p>\n</section><section class=\"post-section\"><h2 id=\"教程\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-04-20-xiao-cheng-xu-ban-typecho-gou-jian/#%E6%95%99%E7%A8%8B\">教程</a></h2>\n<p>在<code>/common/vendor.js</code>第236行修改你的信息，这函数命名规则不是我写的，别打我</p>\n<p>在微信开发者工具调试的时候要在详情里面勾选，不校验合法域名，web-view，那一项，要不然在调试的时候会显示不了文章</p>\n<p><strong>修改r和i并且与后端小程序对应上</strong></p>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/cid178/2.png\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<p>在<code>/pages/about/home/home.wxml</code>第6行和第8行修改你的博客名和简介</p>\n<p>在<code>/pages/index/index.wxml</code>第三行修改小程序最顶上的名称</p>\n<p>在<code>/pages/index/index.js</code>第57行修改每篇文章下的作者信息</p>\n<p>在<code>/app.json</code>第16行修改你的博客名</p>\n<p>在<code>/pages/about/home/home.wxss</code>第2行修改关于界面的头像地址</p>\n<p>在<code>/pages/about/home/home.wxml</code>第4行修改头像地址</p>\n<p>在<code>/pages/about/home/home.js第73</code>和74行修改微信赞赏码的图片地址</p>\n<p>在<code>/pages/details/details.wxml</code>第157行修改你自己想点赞后出现的图片，反正自己改</p>\n<h3 id=\"typecho插件端\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-04-20-xiao-cheng-xu-ban-typecho-gou-jian/#typecho%E6%8F%92%E4%BB%B6%E7%AB%AF\">Typecho插件端</a></h3>\n<p>复制<code>WeTypecho</code>到插件目录， 在后台激活并设置，名字要对否则报错。</p>\n<ul>\n<li>APISEC</li>\n<li>博客作者名称</li>\n<li>博客网址</li>\n</ul>\n<p>这三项必填，其他随便（吧）</p>\n<p>要与小程序端config.js中API_SECRET字段保持一致，否则无法从服务器读取数据</p>\n<h3 id=\"代码解释\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-04-20-xiao-cheng-xu-ban-typecho-gou-jian/#%E4%BB%A3%E7%A0%81%E8%A7%A3%E9%87%8A\">代码解释</a></h3>\n<p>app.js是最初的入口文件，wxss是相当于html项目中的css，如果在js里添加新代码要再json文件中声明。</p>\n<p>static是放资源文件的地方，可以自行修改素材，但好像不是全部都引用了，自己慢慢找吧。</p>\n<p>pages是所有的页面，可以被引用跳转，例如跳转关于页面，地址为<code>pages/about/home/home</code>about下的home目录的home方法叭，大概就这意思，我也是第一次接触微信小程序。。</p>\n<p>这个项目引入了Color UI，可以自己去下载demo自己 <del>抄</del> 写。</p>\n<p>在/pages/index/index.js第26行下面是修改首页那两个跳转按钮的</p>\n<figure class=\"code-block\" data-lang=\"text\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">text</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\"><code><span class=\"line\"><span>\tcategories: [{</span></span>\n<span class=\"line\"><span>\t\tcuIcon: \"write\",//这个是图标，可以自己去color ui的小程序找名称修改</span></span>\n<span class=\"line\"><span>\t\tcolor: \"white\",//这个是文字颜色</span></span>\n<span class=\"line\"><span>\t\tbg_color: \"bg-gradual-green\",//这个是背景颜色，可自行修改</span></span>\n<span class=\"line\"><span>\t\tbadge: 1,//小红点文章个数，填1就是一个小红点，大于1就是显示数字，大于99显示99+</span></span>\n<span class=\"line\"><span>\t\tmid: \"24\",//这个是分类id</span></span>\n<span class=\"line\"><span>\t\ttitle: \"随笔\",</span></span>\n<span class=\"line\"><span>\t\tname: \"Essay\"</span></span>\n<span class=\"line\"><span>\t}，</span></span></code></pre></figure>\n<p>可以自行添加参数，调用方法如下<code>{{item.title}}</code>使用前要声明<code>wx:for=\"{{categories}}\"</code></p>\n<p>求大佬赞赏啦<img src=\"https://cdn.xsiy.ltd/wxxcx/zsm.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></p></section>","summary":"介绍如何基于WeChat-Typecho项目搭建并修改微信小程序版Typecho博客，包括域名配置、插件设置与页面定制。","image":"https://blog.xsy.fun/og/2020-04-20-xiao-cheng-xu-ban-typecho-gou-jian.png","date_published":"2020-04-20T18:35:00.000Z","date_modified":"2020-07-06T07:27:12.000Z","tags":["Typecho","微信小程序","前端","博客"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2020-04-04-wang-zhan-quan-ju-bian-hui-cao-zuo-fang-shi-ji-shi-xian-css-dai-ma/","url":"https://blog.xsy.fun/posts/2020-04-04-wang-zhan-quan-ju-bian-hui-cao-zuo-fang-shi-ji-shi-xian-css-dai-ma/","title":"网站全局变灰操作方式及实现CSS代码","content_html":"<br>\n<section class=\"post-section\"><h2 id=\"前言\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-04-04-wang-zhan-quan-ju-bian-hui-cao-zuo-fang-shi-ji-shi-xian-css-dai-ma/#%E5%89%8D%E8%A8%80\">前言</a></h2>\n<p>为表达全国各族人民对抗击新冠肺炎疫情斗争牺牲烈士和逝世同胞的深切哀悼，国务院决定，2020年4月4日举行全国性哀悼活动。</p>\n<p>为响应国务院办公厅关于为新冠肺炎疫情牺牲烈士和逝世同胞举行全国性哀悼活动的通知，同时按照客户的要求将部分客户网站于4月4日0时至24时变黑白。同时我们伟致官网也同步变灰，以悼念抗击新冠肺炎疫情斗争牺牲烈士和逝世同胞，简单描述下如何将网站变灰。</p>\n</section><section class=\"post-section\"><h2 id=\"正文\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-04-04-wang-zhan-quan-ju-bian-hui-cao-zuo-fang-shi-ji-shi-xian-css-dai-ma/#%E6%AD%A3%E6%96%87\">正文</a></h2>\n<h3 id=\"css方法\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-04-04-wang-zhan-quan-ju-bian-hui-cao-zuo-fang-shi-ji-shi-xian-css-dai-ma/#css%E6%96%B9%E6%B3%95\">CSS方法</a></h3>\n<p>在网站需要变灰的页面head部分加入一行style</p>\n<figure class=\"code-block\" data-lang=\"html\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">html</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"html\"><code><span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">style</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> type</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"text/css\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">>html {</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">-webkit-filter</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">: </span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">grayscale</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">100</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">%</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">);}&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">style</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span></code></pre></figure>\n<p>以上代码适用于主流浏览器，如新版的chrom，edge等</p>\n<figure class=\"code-block\" data-lang=\"html\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">html</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"html\"><code><span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">style</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">    html</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> {</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        -webkit-filter</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">: </span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">grayscale</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">100</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">%</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">);</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        -moz-filter</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">: </span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">grayscale</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">100</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">%</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">);</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        -ms-filter</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">: </span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">grayscale</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">100</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">%</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">);</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        -o-filter</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">: </span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">grayscale</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">100</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">%</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">);</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">        filter</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">:progid:DXImageTransform.Microsoft.BasicImage(</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">grayscale</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">1</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">);</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">        _</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">filter</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">:</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">none</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    }</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">style</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span></code></pre></figure>\n<p>以上代码兼容绝大多数浏览器，包括QQ浏览器，360极速浏览器，IE浏览器等</p></section>","summary":"介绍如何用 CSS 的 grayscale 滤镜让整个网站变灰，并给出兼容主流浏览器和旧版 IE 的写法。","image":"https://blog.xsy.fun/og/2020-04-04-wang-zhan-quan-ju-bian-hui-cao-zuo-fang-shi-ji-shi-xian-css-dai-ma.png","date_published":"2020-04-04T08:24:00.000Z","date_modified":"2020-04-04T08:45:25.000Z","tags":["前端","CSS","兼容性"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2020-03-31-jiang-chrome-li-xian-xiao-kong-long-qian-ru-bo-ke/","url":"https://blog.xsy.fun/posts/2020-03-31-jiang-chrome-li-xian-xiao-kong-long-qian-ru-bo-ke/","title":"将Chrome离线小恐龙嵌入博客","content_html":"<section class=\"post-section\"><h2 id=\"前言\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-03-31-jiang-chrome-li-xian-xiao-kong-long-qian-ru-bo-ke/#%E5%89%8D%E8%A8%80\">前言</a></h2>\n<p>最近我逛各位大佬的博客时，看到了将chrome的离线游戏嵌入博客，就觉得比较有意思，想抄过来，发现原博客的实现方法和源代码实在粗糙，于是我在github上找到了源码，将其进一步更方便嵌入博客，现在讲讲步骤</p>\n<p>先来玩下我的吧 <a href=\"https://www.xsy.fun/game.html\" title=\"点我开始玩耍\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">点我开始玩耍</a></p>\n</section><section class=\"post-section\"><h2 id=\"正文\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-03-31-jiang-chrome-li-xian-xiao-kong-long-qian-ru-bo-ke/#%E6%AD%A3%E6%96%87\">正文</a></h2>\n<p>首先，项目源码在此：<a href=\"https://github.com/xsy2004/chrome_dino_game\" title=\"Github\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">Github</a></p>\n<h3 id=\"一般网页\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-03-31-jiang-chrome-li-xian-xiao-kong-long-qian-ru-bo-ke/#%E4%B8%80%E8%88%AC%E7%BD%91%E9%A1%B5\">一般网页</a></h3>\n<p>使用方法很简单，如果在一般的网页中使用直接添加</p>\n<figure class=\"code-block\" data-lang=\"html\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">html</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"html\"><code><span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">div</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> id</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"container\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">>&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">div</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">script</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> src</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"runner.js\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">>&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">script</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">script</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> initRunner</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'#container'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">);</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">script</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span></code></pre></figure>\n<p>其中<code>runner.js</code>可以为任意地址，你可以把runner放在本地，也可以把runner放在OSS（阿里云对象储存）等储存。</p>\n<h3 id=\"typecho博客\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-03-31-jiang-chrome-li-xian-xiao-kong-long-qian-ru-bo-ke/#typecho%E5%8D%9A%E5%AE%A2\">Typecho博客</a></h3>\n<p>我们还可以将这段代码嵌入到博客里去，当然因为在这里图个方便，我直接使用iframe方法来引入，比较方便，我在这贴下我的方法</p>\n<figure class=\"code-block\" data-lang=\"html\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">html</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"html\"><code><span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">iframe</span><span style=\"--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic\"> align</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"center\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> width</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"100%\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> height</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"200px\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> src</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"https://cdn.xsiy.ltd/site/typecho/game/index.html\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">  frameborder</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"no\"</span><span style=\"--shiki-light:#B31D28;--shiki-light-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic\"> border</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"0\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">  scrolling</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"no\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> marginwidth</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"0\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> marginheight</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"0\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> >&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">iframe</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span></code></pre></figure>\n<p>很简单啊，就一句话就可以了，当然你也可以选择常规的方式去嵌入。</p>\n<p>我的方法是引入我OSS（阿里云对象储存）存放的html文件，所以要保证你的OSS（阿里云对象储存）和你的网站活的一样久。</p>\n<p>index.html的网页源码如下</p>\n<figure class=\"code-block\" data-lang=\"html\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">html</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"html\"><code><span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;!</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">DOCTYPE</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> html</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">html</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> lang</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"zh-CN\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">head</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    &#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">meta</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> charset</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"UTF-8\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    &#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">meta</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> name</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"viewport\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> content</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">    &#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">title</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">>Runner&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">title</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">head</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">body</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">div</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> id</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"test\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">>&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">div</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">script</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> src</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"https://cdn.xsiy.ltd/site/typecho/game/runner.js\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">>&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">script</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">script</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">    initRunner</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">( </span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'#test'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> );</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">script</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">body</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">html</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"></span></code></pre></figure>\n<p>你可以自己存放在本地服务器去引用，js同理</p>\n</section><section class=\"post-section\"><h2 id=\"注意\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-03-31-jiang-chrome-li-xian-xiao-kong-long-qian-ru-bo-ke/#%E6%B3%A8%E6%84%8F\">注意</a></h2>\n<p>在typecho中的markdown语法<code>!!!你的代码!!!</code>这样是嵌入代码，记得是英文感叹号。</p>\n<p>不要直接复制我的代码使用，因为设置了Referer白名单防止盗链，直接使用是无效的。</p>\n<p>本方法支持手机，电脑，等设备玩耍。</p></section>","summary":"介绍如何把 Chrome 离线小恐龙游戏嵌入 Typecho 博客，包括通用网页引入方式、iframe 嵌入代码和使用注意事项。","image":"https://blog.xsy.fun/og/2020-03-31-jiang-chrome-li-xian-xiao-kong-long-qian-ru-bo-ke.png","date_published":"2020-03-31T17:22:00.000Z","date_modified":"2020-03-31T17:23:35.000Z","tags":["前端","Typecho","博客","Markdown"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2020-03-02-visual-studio-yuan-cheng-kai-fa/","url":"https://blog.xsy.fun/posts/2020-03-02-visual-studio-yuan-cheng-kai-fa/","title":"Visual Studio远程开发","content_html":"<section class=\"post-section\"><h2 id=\"前言\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-03-02-visual-studio-yuan-cheng-kai-fa/#%E5%89%8D%E8%A8%80\">前言</a></h2>\n<p>近期，搞了个远程开发的项目<code>Visual Studio Code Remote Development</code>就是将vscode客户端搬上云端，</p>\n<p>让你可以在容器中、远程设备上、甚至是 Windows 的 Linux 子系统（WSL）上使用具有完整功能的开发环境</p>\n<h3 id=\"官方说明\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-03-02-visual-studio-yuan-cheng-kai-fa/#%E5%AE%98%E6%96%B9%E8%AF%B4%E6%98%8E\">官方说明</a></h3>\n<blockquote>\n<p>在您部署到的同一操作系统上进行开发，或使用更大或更专业的硬件。</p>\n</blockquote>\n<p>将开发环境沙盒化，以免影响本地计算机配置。</p>\n<p>使新贡献者易于上手，并使每个人都保持一致的环境。</p>\n<p>使用本地操作系统上不可用的工具或运行时，或管理它们的多个版本。</p>\n<p>使用Windows Linux子系统开发Linux部署的应用程序。</p>\n<p>从多台机器或位置访问现有的开发环境。</p>\n<p>调试在其他位置（例如客户站点或云中）运行的应用程序。</p>\n<figure class=\"post-figure\"><img src=\"https://code.visualstudio.com/assets/docs/remote/remote-overview/architecture.png\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n</section><section class=\"post-section\"><h2 id=\"如何安装\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-03-02-visual-studio-yuan-cheng-kai-fa/#%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85\">如何安装</a></h2>\n<h4 id=\"系统要求\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-03-02-visual-studio-yuan-cheng-kai-fa/#%E7%B3%BB%E7%BB%9F%E8%A6%81%E6%B1%82\">系统要求</a></h4>\n<p>本地：还必须安装受支持的OpenSSH兼容SSH客户端。</p>\n<h4 id=\"远程ssh主机在以下位置运行的ssh服务器\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-03-02-visual-studio-yuan-cheng-kai-fa/#%E8%BF%9C%E7%A8%8Bssh%E4%B8%BB%E6%9C%BA%E5%9C%A8%E4%BB%A5%E4%B8%8B%E4%BD%8D%E7%BD%AE%E8%BF%90%E8%A1%8C%E7%9A%84ssh%E6%9C%8D%E5%8A%A1%E5%99%A8\">远程SSH主机：在以下位置运行的SSH服务器：</a></h4>\n<p>x86_64 Debian 8以上版本，Ubuntu 16.04以上版本，CentOS / RHEL 7以上版本。</p>\n<p>ARMv7l（AArch32）Raspbian Stretch / 9 +（32位）。</p>\n<p>ARMv8l（AArch64）Ubuntu 18.04+（64位）。</p>\n<h4 id=\"实验性ssh主机支持仅vs-code-insiders\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-03-02-visual-studio-yuan-cheng-kai-fa/#%E5%AE%9E%E9%AA%8C%E6%80%A7ssh%E4%B8%BB%E6%9C%BA%E6%94%AF%E6%8C%81%E4%BB%85vs-code-insiders\">实验性SSH主机支持（仅VS Code Insiders）：</a></h4>\n<p>Windows 10 / Server 2016/2019（1803+），使用官方的OpenSSH Server并remote.SSH.useLocalServer 在VS Code设置中启用。</p>\n</section><section class=\"post-section\"><h2 id=\"ubuntu-1804\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-03-02-visual-studio-yuan-cheng-kai-fa/#ubuntu-1804\">Ubuntu 18.04</a></h2>\n<p>首先先在github下载软件包<a href=\"https://github.com/cdr/code-server/releases\" title=\"下载地址\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">下载地址</a></p>\n<figure class=\"code-block\" data-lang=\"text\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">text</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\"><code><span class=\"line\"><span>wget https://github.com/cdr/code-server/releases/download/2.1698/code-server2.1698-vsc1.41.1-linux-x86_64.tar.gz</span></span>\n<span class=\"line\"><span>tar xvzf code-server2.1698-vsc1.41.1-linux-x86_64.tar.gz</span></span>\n<span class=\"line\"><span>cd code-server2.1698-vsc1.41.1-linux-x86_64</span></span>\n<span class=\"line\"><span># 设置密码</span></span>\n<span class=\"line\"><span>export PASSWORD=password</span></span>\n<span class=\"line\"><span>./code-server --auth password</span></span></code></pre></figure>\n<h3 id=\"进程守护\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-03-02-visual-studio-yuan-cheng-kai-fa/#%E8%BF%9B%E7%A8%8B%E5%AE%88%E6%8A%A4\">进程守护</a></h3>\n<figure class=\"code-block\" data-lang=\"text\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">text</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\"><code><span class=\"line\"><span>sudo nano /etc/systemd/system/code-server.service</span></span></code></pre></figure>\n<p>添加下面的配置：</p>\n<figure class=\"code-block\" data-lang=\"text\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">text</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\"><code><span class=\"line\"><span>[Unit]</span></span>\n<span class=\"line\"><span>Description=Code Server IDE</span></span>\n<span class=\"line\"><span>After=network.target</span></span>\n<span class=\"line\"><span>[Service]</span></span>\n<span class=\"line\"><span>Type=simple</span></span>\n<span class=\"line\"><span>User=root</span></span>\n<span class=\"line\"><span>Restart=on-failure</span></span>\n<span class=\"line\"><span>RestartSec=10</span></span>\n<span class=\"line\"><span> </span></span>\n<span class=\"line\"><span>Environment=\"PASSWORD=password\"</span></span>\n<span class=\"line\"><span> </span></span>\n<span class=\"line\"><span>ExecStart=/path/to/code-server --auth password </span></span>\n<span class=\"line\"><span> </span></span>\n<span class=\"line\"><span>StandardOutput=file:/var/log/code-server-output.log</span></span>\n<span class=\"line\"><span>StandardError=file:/var/log/code-server-error.log</span></span>\n<span class=\"line\"><span>[Install]</span></span>\n<span class=\"line\"><span>WantedBy=multi-user.target</span></span></code></pre></figure>\n</section><section class=\"post-section\"><h2 id=\"启动服务\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2020-03-02-visual-studio-yuan-cheng-kai-fa/#%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1\">启动服务</a></h2>\n<figure class=\"code-block\" data-lang=\"text\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">text</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\"><code><span class=\"line\"><span>systemctl start code-server</span></span></code></pre></figure></section>","summary":"介绍如何在 Ubuntu 上部署 code-server 并用 systemd 守护进程，实现 VS Code 远程开发环境。","image":"https://blog.xsy.fun/og/2020-03-02-visual-studio-yuan-cheng-kai-fa.png","date_published":"2020-03-02T16:24:00.000Z","date_modified":"2020-03-02T16:25:08.000Z","tags":["linux","运维","网络"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2019-11-15-dong-ting-hu-kao-cha-day-3/","url":"https://blog.xsy.fun/posts/2019-11-15-dong-ting-hu-kao-cha-day-3/","title":"洞庭湖考察-Day 3","content_html":"<p>在为期三天的研学的最后一天，我们于上午七点二十分出发，车行将近两个小时九十公里后到达了我们研学旅途的最后一站:江豚江道保护站。</p>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/cid163/1D7S%24U9Y%7E3KAU73J_SP51JX.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<p>我们在简单的休整后便开始了江道巡游，全班站在船上观察有无江豚活动，而我们不仅看到了江豚跃出水面的画面，还看到了稀有禽类在天空飞翔，所谓收获颇丰。</p>\n<p>站在船头感受江风吹过，江水在脚底激荡着，浪花在不断拍击着，呼吸无污染的纯净空气，我们打心底地意识到环境保护是多么的重要，而且我们也下定决心去以身作则，自觉保护生态环境。</p>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/cid163/EW%7DU%251A%25G2%40_4%40JU%24Q%7E_QDM.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<p>巡游结束后，我们有幸见到了保护站的站长。作为长期在保护长江环境战斗的第一线，站长对保护江豚有着非常独到的见解和渊博的知识。于是我们问出了我们准备许久的几个问题，如保护江豚与经济发展是否有冲突，江豚能否与同科物种进行杂交等等。站长十分热切地为我们解答，他的回答独树一帜，开拓了我们新的思维，使我们受益匪浅。</p>\n<p>在离去前，为作此次巡江活动的纪念，我们主动向站长提出合影的请求，站长也积极地回应了我们，与我们集体学生和带队老师留下了一张意义非凡的合影照片。</p>\n<p>在离开后我们到就近餐馆用了午餐，正式标志着最后一项活动的落幕，随后便开始了返回长沙东高铁站的车程。经历4个小时的大巴，2个小时的火车，我们在7:00顺利回到了南昌，结束了最后一天的行程。</p>\n<p>回望三天我们荣幸看到了我们从未了解过的江豚；认识了研学负责人稻哥，麋鹿保护区李站长，洞庭湖民间保护人大明哥，湖南华容集成长江故道邓主任。因为他们我们学习到了关于江豚，麋鹿，候鸟各个方面的知识。经过三天的研学我们了解到保护江豚有多么重要，保护江豚的种子在心里发芽，改善江豚的生存环境需要每个人都行动起来。</p>\n<p>江豚研学三天虽短，但这些记忆我们将永存！</p>","summary":"记录洞庭湖研学第三天的行程，包括江豚巡游、与保护站站长的交流以及返程经历。","image":"https://blog.xsy.fun/og/2019-11-15-dong-ting-hu-kao-cha-day-3.png","date_published":"2019-11-16T04:53:00.000Z","date_modified":"2019-11-16T05:00:23.000Z","tags":["读书笔记","运维"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2019-11-14-dong-ting-hu-kao-cha-day-2/","url":"https://blog.xsy.fun/posts/2019-11-14-dong-ting-hu-kao-cha-day-2/","title":"洞庭湖考察-Day 2","content_html":"<p>2019年11月14日是我们来到湖南岳阳研学的第二天。这是世界著名的中国传统文化发源地——洞庭湖。我们小组搭上了游艇，去近距离接触国家一级珍惜保护动物——江豚。</p>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid162/-4fb97907021e7194.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<p>江豚是世界濒危物种，在洞庭湖的存活数量也仅仅300只左右。但是，在幸运女神的庇护下，我们有幸见到江豚并幸运的记录下了江豚出水的瞬间。</p>\n<p>在游艇上吹着海风，看着蓝天白云，在不经意间看到两道黑色的弧线“:是江豚！”同学们惊喜地喊着。在江豚出水的一瞬间，几位同学拿出相机拍下江豚出水的优雅姿态。</p>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid162/qq_pic_merged_1573745529532.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<p>登上瞭望塔所属的小岛上，同学们见到了两个“守卫者”，那是被工作人员收养的两只小狗，在喂食的过程中，有几位同学为了“研学伟业”，不甚陷入沼泽地，牺牲了自己的鞋子，经过了这些小插曲，我们准备返航了。</p>\n<p>突然，一艘庞然大物出现了。稻哥说：“看那，前面应该是非法采砂，整个洞庭湖江面严禁采砂。”，听到这个消息我们愤慨，却又无可奈何，我们能做的就只是向国家相关部门进行举报，但是我转念一想，群众的见证就是对非法采砂者最好的震慑，我们，让他们感受到了社会的关注，我们真正的为江豚的保护事业出一份力！</p>\n<p>警笛声响起，我们知道，是船政工作人员到来了，相信不法分子会得到严惩。但是，船政工作人员对我们解释道：“那是有合法手续的清淤船”。我们只是手里拿着相机，什么也不说，就默默拍下这一幅画面，沙一斗一斗的运上，钱一捆一捆的进账，我们能做的，也只有这些了。</p>\n<p>人性是复杂的，商人是逐利的，但世界也不总是黑暗的，那一丝的光明，将由我们点亮，在黑暗中，打开一盏灯，照亮黑暗，温暖人心。</p>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid162/220e8f7b8ff41454.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<p>午饭后我们稍时休息，把鞋子和衣服上的泥土收拾了一下，开始了我们下午的两个实验调查。</p>\n<p>第一个实验是底栖生物实验。我们用刘老师带来的专业仪器——彼得逊底泥采样器，我们把底泥捞上来后，经过层层过滤，多道工序，筛序出适合采集生物的样本，紧接着用镊子把贝壳，田螺，蜻蜓幼虫等生物收集在瓶内，这样我们就可以通过收集到的生物来判断水质是否良好。</p>\n<p>经过刘老师的讲解，我们了解到，每当在一片水域中出现蜻蜓幼虫时则表明此地水质较好，而出现水蛭，蚂蟥时表明此地水域污染严重。在实验中，我们小组很幸运的收集到了蜻蜓幼虫，当然还有一些贝壳和田螺。由此可见洞庭湖的水质相对来说不错。</p>\n<p>第二个实验是样本水通过PH试纸，氨氮和高锰酸钾的数据来判断水质的好坏。我们对污水排放处和地表水面的样本进行对比，发现污水排放处的水质污染严重超标，可见一些工厂对环境伤害的理所应当。但可惜的是我们即使发现了这个问题，也不能制止污染环境行为，只能将样本放回湖中。</p>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid162/0s01032834384P91114-164110.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<p>在晚饭过后，我们驱车回到了宾馆，来到二楼会议室参加今日总结小会。首先刘老师给我们介绍了明日计划——去集成研究所和迁地保护区，告诉我们明天需要到达的目标和注意事项。然后总结了今天的日程，通过这次小会我们体会到研学旅行注重“研”而不是“旅”，我们要透过现象看到本质问题，并对相应问题提出建议。最后今天的行程在观看了刘老师之前去长江巡航探测江豚的纪录片落下帷幕。</p>\n<p>明天既是新的开始又是我们归航的日子，我们定会珍惜去集成所的机会，希望明天不留遗憾！</p>","summary":"记录2019年洞庭湖研学第二天的行程，包括江豚观察、底栖生物与水质实验以及当日总结。","image":"https://blog.xsy.fun/og/2019-11-14-dong-ting-hu-kao-cha-day-2.png","date_published":"2019-11-14T21:14:00.000Z","date_modified":"2019-11-14T21:32:17.000Z","tags":["网络安全","运维","读书笔记"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2019-11-13-dong-ting-hu-kao-cha-day-1/","url":"https://blog.xsy.fun/posts/2019-11-13-dong-ting-hu-kao-cha-day-1/","title":"洞庭湖考察-Day 1","content_html":"<p>在11月13号早晨10点08分，南昌市心远学校高一国际班的学生们从南昌来到湖南岳阳进行为期三天的江豚科研调查活动，活动第一天圆满结束，动态报告如下：</p>\n<p>上午经过了2个小时的车程，我们抵达了长沙东火车站，经过短暂的休息之后，我们又启程前往岳阳，于12点56分抵达岳阳，在用完午餐后，跟随刘老师到达李站长所管理的麋鹿保护区，近距离观察到了国家一级珍惜保护动物麋鹿——点点。</p>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid160/_1397309447_DSCF8077_1573652006000_xg_0.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<p>我们积极地询问了李站长有关麋鹿的形态特征，栖息环境，生活习性，分布范围，繁殖方式，种族现状等信息，而李站长也热切地回应了我们。</p>\n<p>我们不仅了解到了关于麋鹿的具体信息，并且我们每一位同学都在李站长的带领下亲手将食物喂给了麋鹿点点</p>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid160/mmexport1573651769998.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<p>通过我们设身处地的调查与研究，我们感受到了李站长对保护野生动物与自然环境的毅力和决心，这使得我们下定决心，也要学习李站长，以李站长为榜样，树立保护野生动物的意识。</p>\n<p>临走前，我们主动向李站长提出了合照的请求，李站长欣然接受，于是我们留下了一张与李站长和点点的大合照以作为我们此次研学调查的纪念与回忆。</p>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid160/mmexport1573652297114.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<p>在结束对点点的调查后，我们驱车来到了东洞庭湖自然保护区。</p>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid160/%7DQL0J67T9%5BPA5ZI%25W%5DK22U2.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<p>在东洞庭湖国家级自然保护区湿地生物科学馆我们观看了保护洞庭湖环境的纪录片，在纪录片中“支撑着湖南整个用水和曾使长江无数次的洪患化险为夷”“洞庭湖以水而名，以鸟而盛”使我们更深刻体会到洞庭湖的重要性。同时，我们还了解到鸟，野生植物，淡水鱼，江豚等8类真实标本。</p>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid160/mmexport1573651768653.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<p>在刘老师的带领下我们运用专业的望远镜观察到雁，鸭等候鸟物种，其中在采桑湖上有一群鸭子在湖上休闲嬉戏。刘老师告诉我们识别候鸟种类分三步骤:先看喙，再看腿，最后看羽毛；我们还了解到有一些游客曾经为了拍出漂亮的照片，被迫候鸟飞起来使得他们的翅膀受到伤害。我们体会到观察候鸟不仅仅要观察他们的外观，辨别他们的种类，还要学会保护他们的环境，他们的习性，在观察同时尽量不打扰他们的生活。在晚饭过后，我们结束了第一天的行程。</p>\n<p>这一天有陌生，有惊喜，也有失望，学会了很多知识也知道我们的一举一动都会影响着环境。夜幕降临，我们期待着明天洞庭湖江豚之旅，愿明天有更多新收获！</p>","summary":"记录南昌高一学生在湖南岳阳开展江豚科研调查的第一天行程，包括麋鹿保护区参观和洞庭湖候鸟观察。","image":"https://blog.xsy.fun/og/2019-11-13-dong-ting-hu-kao-cha-day-1.png","date_published":"2019-11-13T18:26:00.000Z","date_modified":"2019-11-13T18:42:09.000Z","tags":["读书笔记","写作"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2019-06-19-zhong-kao-qian-de-sheng-huo/","url":"https://blog.xsy.fun/posts/2019-06-19-zhong-kao-qian-de-sheng-huo/","title":"中考前的生活","content_html":"<p>今天12点钟以后能限制我的只有中华人民共和国宪法了，考完了是真的开心，也就有时间来写这一篇博客了，先说说考试前吧，那个日子真的是惨啊，因为我考试的前十天就没在学校上课了，跑去了一个教育机构补习物理化学和英语，这十天真的是过的难受啊，也算是为自己拼搏了一次吧，我想，也许学霸每个周末都是这么过的吧。想到这，我就有点惭愧了，平时不努力就只能临时抱抱佛脚了呗。</p>\n<p>说说这十天我是怎么过的吧，每天有着不亚于学校上课强度的课程，早上8点到10点的英语，接着是物理，下午2点到4点的化学课，接着就是写卷子，一般是物理两张，化学一张，英语听力和阅读理解了，这个是每天的训练量，最后转化率只有英语比较低，化学也进步了20分吧，可想而知我之前的成绩是有多差啊，物理呢进步了10分左右，有时候不逼自己一把也不知道自己能做到怎样的一种程度吧！也许苦尽甘来就是这样了！虽然这十天过的很累，但是我体会了一种劳动人民收获的喜悦，只能说这感觉非常棒，人，是要给自己定目标的，而我呢，比较喜欢去执行而不去指导，所以也就不怎么给自己定目标吧。</p>\n<p>虽然只有10天但是还是发生了很多事情吧，第一天过去或许还有新鲜感，但是过了第二天只剩下痛苦了，所以呐，经常一个人到天台上散散心，这种感觉真的很不错呢。</p>\n<p>貌似到最后还跟老师发生了点冲突，但是没关系啦，过了这些时间也就见不到她了，怎么说呢，有人认为我比较轴，仔细想想好像有一点，但是我只是在我自己坚决认同的事情上比较轴，而我认为我并没有做错什么啊，比如说一个人想抢我的零食，我就算丢掉也不会给他，但是如果他礼貌的向我要的话我是会给他的（当然，关系很好的除外）这毕竟侵犯了公民的财产权对吧，所以说我认为我没有什么错误啊，反而是他的这种行为损害了我的财产权。</p>\n<p>而且我非常讨厌别人威胁我，如果有人拿着一把刀子对着我的话，并且有想要捅我的欲望我会毫不犹豫的还手，这也许的一种人的本能吧，但是在生活中呢，有人威胁我吧，我一定会报复她，而且是悄无声息的报复，脸上一定会对敌人带着笑容，背地里捅刀子，我觉得这样是最好不过的了，毕竟体面人是吧。</p>\n<p>文章写的有点杂，基本上是想到什么写什么吧，见谅了！</p>\n<p>最近我还干了一件事情，最近我哥到我家来就反映打游戏老是会460ms，我就觉得肯定是mesh路由器的问题，所以我把路由器挂到闲鱼卖400多再花300买了个斐讯K3和一个散热改装件</p>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid158/IMG_20190618_201209.jpg\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<p>这个就是成品啦，应该降温了10多度，效果还是很明显的！但是还是要等我哥来我家实测啦！我又不打游戏（小声BB）</p>\n<p>还有就是拍了几个视频，虽然没什么人看，但是我觉得还是要坚持下去把，毕竟是一个自己爱好的兴趣，所以我应该会在这个假期更新很多视频把，也许技术性的东西会少很多，而记录生活的写实视频会占大部分，假期来的太快了，多少有一点不真实，想想马上就要进入到一个全新的环境——高中，心里不免有些失落，这条从家里到学校的路我都习惯了呢！</p>\n<p>但是呢，人还是要学会跳出自己的舒适区，去学会改变一些事情，因为我本身就是个乐观主义者（可能是经历不好的事情太多了罢）所以说新的环境有新的老师，新的同学啊，也会遇到更好的人呢，也希望自己在接下来的新的旅途中做到更多更好玩还有更重要的是更努力的学习吧！</p>\n<p>好像没啥好写的了。就这样结束吧，感谢你看完我一个人瞎写些的什么东西。</p>","summary":"作者记录中考前十天补习的经历、考后心态，并顺带提到给家里路由器加装散热改装件的小事。","image":"https://blog.xsy.fun/og/2019-06-19-zhong-kao-qian-de-sheng-huo.png","date_published":"2019-06-19T19:41:00.000Z","date_modified":"2019-06-19T19:55:41.000Z","tags":["写作","运维","网络"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2019-04-27-imgurl-tu-chuang-de-an-zhuang/","url":"https://blog.xsy.fun/posts/2019-04-27-imgurl-tu-chuang-de-an-zhuang/","title":"ImgURL图床的安装","content_html":"<section class=\"post-section\"><h2 id=\"前言\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-imgurl-tu-chuang-de-an-zhuang/#%E5%89%8D%E8%A8%80\">前言</a></h2>\n<p>上篇文章我们写的是新浪图床失效的解决方案，但是我们的广大博主不甘心在新浪的制约下并且随着新浪的心情而变化使得博客收到影响，特意写此篇文章，来保证广大博主的图片资料安全！</p>\n<blockquote>\n<p>ImgURL是一款简单、纯粹的图床程序，使用PHP + SQLite 3开发。</p>\n</blockquote>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid155/68747470733a2f2f692e626d702e6f76682f696d67732f323031382f31322f303663663061633362373632356236622e706e67.png\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid155/68747470733a2f2f692e626d702e6f76682f696d67732f323031382f31322f663062353635653265306666613136362e706e67.png\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid155/68747470733a2f2f692e626d702e6f76682f696d67732f323031382f31322f303137633565363662353364623464312e706e67.png\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<h3 id=\"主要功能\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-imgurl-tu-chuang-de-an-zhuang/#%E4%B8%BB%E8%A6%81%E5%8A%9F%E8%83%BD\">主要功能</a></h3>\n<ul class=\"contains-task-list\">\n<li class=\"task-list-item\"><input type=\"checkbox\" checked disabled> 支持拽拖上传、多图上传、Ctrl + V粘贴上传、URL上传</li>\n<li class=\"task-list-item\"><input type=\"checkbox\" checked disabled> 支持图片裁剪，自动生成缩略图</li>\n<li class=\"task-list-item\"><input type=\"checkbox\" checked disabled> 限制访客上传数量</li>\n<li class=\"task-list-item\"><input type=\"checkbox\" checked disabled> 图片压缩/批量压缩</li>\n<li class=\"task-list-item\"><input type=\"checkbox\" checked disabled> 图片鉴黄/批量鉴黄</li>\n<li class=\"task-list-item\"><input type=\"checkbox\" checked disabled> API支持</li>\n<li class=\"task-list-item\"><input type=\"checkbox\" disabled> 在线更新</li>\n<li class=\"task-list-item\"><input type=\"checkbox\" disabled> 外部存储</li>\n</ul>\n<h3 id=\"环境要求\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-imgurl-tu-chuang-de-an-zhuang/#%E7%8E%AF%E5%A2%83%E8%A6%81%E6%B1%82\">环境要求</a></h3>\n<ul>\n<li>PHP >= 5.6</li>\n<li>PDO_SQLite</li>\n<li>GD2</li>\n<li>ImageMagick</li>\n<li>fileinfo</li>\n<li>pathinfo</li>\n</ul>\n</section><section class=\"post-section\"><h2 id=\"正文\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-imgurl-tu-chuang-de-an-zhuang/#%E6%AD%A3%E6%96%87\">正文</a></h2>\n<p>废话不多说，直接开搞</p>\n<h3 id=\"配置伪静态\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-imgurl-tu-chuang-de-an-zhuang/#%E9%85%8D%E7%BD%AE%E4%BC%AA%E9%9D%99%E6%80%81\">配置伪静态</a></h3>\n<p><strong>Nginx</strong></p>\n<figure class=\"code-block\" data-lang=\"text\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">text</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\"><code><span class=\"line\"><span>location / {</span></span>\n<span class=\"line\"><span>try_files $uri $uri/ /index.php?$query_string;</span></span>\n<span class=\"line\"><span>}</span></span>\n<span class=\"line\"><span>location ~* \\.(db3|json)$ {</span></span>\n<span class=\"line\"><span>  deny all;</span></span>\n<span class=\"line\"><span>}</span></span>\n<span class=\"line\"><span>location ~* ^/(temp|upload|imgs|data|application|static|system)/.*.(php|php5)$ {</span></span>\n<span class=\"line\"><span>    return 403;</span></span>\n<span class=\"line\"><span>}</span></span></code></pre></figure>\n<p>将上面的规则添加到Nginx server段内，别忘记重载一次Nginx</p>\n<p><strong>Apache</strong></p>\n<p>默认已经包含**.htaccess**规则，默认无需设置。</p>\n<h3 id=\"安装\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-imgurl-tu-chuang-de-an-zhuang/#%E5%AE%89%E8%A3%85\">安装</a></h3>\n<p>访问：<a href=\"https://github.com/helloxz/imgurl/releases\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">https://github.com/helloxz/imgurl/releases</a> 下载最新版源码，并解压到站点根目录。（注意目录权限、注意目录权限、注意目录权限）</p>\n<p>访问您的域名<code>http(s)://domain.com/install/?setup=1</code> 根据提示进行安装，如果环境检测不通过，请自行解决环境问题。</p>\n<h3 id=\"安装fileinfo--imagemagick\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-imgurl-tu-chuang-de-an-zhuang/#%E5%AE%89%E8%A3%85fileinfo--imagemagick\">安装fileinfo &#x26; imagemagick</a></h3>\n<p>如果您未安装，就接着往下看</p>\n<p>（演示均使用宝塔面板）</p>\n<p>在宝塔后台 - 软件管理 - 找到您站点对应的PHP版本 - 设置PHP - 安装扩展 - 勾选fileinfo和imagemagick，如下截图。</p>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid155/snipaste_20190109_185759.png\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<p>PS：ImageMagick非必须，这个操作需要您的imgURL版本在ImgURL v2.1以上</p>\n</section><section class=\"post-section\"><h2 id=\"最后\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-imgurl-tu-chuang-de-an-zhuang/#%E6%9C%80%E5%90%8E\">最后</a></h2>\n<p>祝您使用愉快，嘿嘿，多多分享哦！</p></section>","summary":"介绍自建图床ImgURL的功能特点、环境要求、Nginx伪静态配置以及宝塔面板下的安装步骤。","image":"https://blog.xsy.fun/og/2019-04-27-imgurl-tu-chuang-de-an-zhuang.png","date_published":"2019-04-27T12:46:00.000Z","date_modified":"2019-04-27T13:15:03.000Z","tags":["运维","PHP","Nginx","Markdown"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2019-04-27-xin-lang-tu-chuang-shi-xiao-jie-jue-fang-an/","url":"https://blog.xsy.fun/posts/2019-04-27-xin-lang-tu-chuang-shi-xiao-jie-jue-fang-an/","title":"新浪图床失效解决方案","content_html":"<section class=\"post-section\"><h2 id=\"前言\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-xin-lang-tu-chuang-shi-xiao-jie-jue-fang-an/#%E5%89%8D%E8%A8%80\">前言</a></h2>\n<p>最近，新浪云对图床做了Referer防盗链验证，导致广大使用新浪当图床的博主的文章内的引用素材失效，无法显示，为此，我们可以经过中转或者伪装等方式来绕过Referer防盗链验证</p>\n<h3 id=\"referer防盗链是什么\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-xin-lang-tu-chuang-shi-xiao-jie-jue-fang-an/#referer%E9%98%B2%E7%9B%97%E9%93%BE%E6%98%AF%E4%BB%80%E4%B9%88\">Referer防盗链是什么</a></h3>\n<blockquote>\n<p>HTTP Referer是Header的一部分，当浏览器向web服务器发送请求的时候，一般会带上Referer，告诉服务器我是从哪个页面链接过来的，服务器藉此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里，他的服务器就能够从HTTP Referer中统计出每天有多少用户点击我主页上的链接访问他的网站。</p>\n</blockquote>\n<p>基于Referer我们就可以在服务端知道哪些是“友军”哪些是外链，从而达到过滤和节约服务器资源的目的。</p>\n<p>我们的解决方案就是通过不发送referer的方式来访问，所以就需要伪装或者中转，话不多说，贴解决方案</p>\n</section><section class=\"post-section\"><h2 id=\"解决方案\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-xin-lang-tu-chuang-shi-xiao-jie-jue-fang-an/#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88\">解决方案</a></h2>\n<h3 id=\"php文件中转\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-xin-lang-tu-chuang-shi-xiao-jie-jue-fang-an/#php%E6%96%87%E4%BB%B6%E4%B8%AD%E8%BD%AC\">PHP文件中转</a></h3>\n<figure class=\"code-block\" data-lang=\"php\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">php</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"php\"><code><span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">&#x3C;?</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">php</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">header</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'Content-type: image/jpeg'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">);</span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">echo</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> file_get_contents</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">isset</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">($_GET[</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"url\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">])</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">?</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">$_GET[</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"url\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">]</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">:</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">''</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">);</span></span></code></pre></figure>\n<p>原理：通过传入Url再输出来显示图片</p>\n<p>优缺点：<strong>可以使用统计类组件</strong>，效率低，需要大批量更换链接</p>\n<p>使用方法：建立一个PHP文件在某个服务器上</p>\n<p>http（s）://你的域名/img.php?url=照片地址</p>\n<p>使用实例：</p>\n<figure class=\"code-block\" data-lang=\"php\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">php</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"php\"><code><span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">&#x3C;</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">img</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> src</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"https://your-domain-name/img.php?url=https://ws3.sinaimg.cn/large/006tNbRwly1fyq4yujgssj30jg0jgmxg.jpg\"</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> /></span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">   </span></span></code></pre></figure>\n<p>（已验证可用）</p>\n<h3 id=\"使用iframe\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-xin-lang-tu-chuang-shi-xiao-jie-jue-fang-an/#%E4%BD%BF%E7%94%A8iframe\">使用iframe</a></h3>\n<figure class=\"code-block\" data-lang=\"html\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">html</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"html\"><code><span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">script</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">>window.sc</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"&#x3C;img src='https://blog.xsy.fun/posts/2019-04-27-xin-lang-tu-chuang-shi-xiao-jie-jue-fang-an/%E5%9B%BE%E7%89%87%E9%93%BE%E6%8E%A5?%22%3C/span%3E%3Cspan%20style=%22--shiki-light:#D73A49;--shiki-dark:#F97583%22%3E+%3C/span%3E%3Cspan%20style=%22--shiki-light:#24292E;--shiki-dark:#E1E4E8%22%3EMath.%3C/span%3E%3Cspan%20style=%22--shiki-light:#6F42C1;--shiki-dark:#B392F0%22%3Erandom%3C/span%3E%3Cspan%20style=%22--shiki-light:#24292E;--shiki-dark:#E1E4E8%22%3E()%3C/span%3E%3Cspan%20style=%22--shiki-light:#D73A49;--shiki-dark:#F97583%22%3E+%3C/span%3E%3Cspan%20style=%22--shiki-light:#032F62;--shiki-dark:#9ECBFF%22%3E%22'>\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">script</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">>  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">iframe</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> id</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"imiframe\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> src</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"javascript:parent.sc\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> style</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"border:none; overflow: hidden;\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> scrolling</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"no\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> frameborder</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"0\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> onload</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">javascript</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">:</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">var</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> x</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">document</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">.</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\">getElementById</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">('imiframe').</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">contentWindow</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">.</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">document</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">.</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">images</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">[</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">0</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">];</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">this</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">.</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">width</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">x</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">.</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">width</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">+</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">10</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">;</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">this</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">.</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">height</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">x</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">.</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">height</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">+</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">10</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">;\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">>&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">iframe</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">>  </span></span></code></pre></figure>\n<p>原理：通过iframe引用</p>\n<p>优缺点：慢，吧</p>\n<p>（未验证）</p>\n<h3 id=\"curl\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-xin-lang-tu-chuang-shi-xiao-jie-jue-fang-an/#curl\">Curl</a></h3>\n<figure class=\"code-block\" data-lang=\"php\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">php</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"php\"><code><span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">&#x3C;?</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">php</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">$url </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> $_GET[</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"url\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">];  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">$dir </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> pathinfo</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">($url);  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">$host </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> $dir[</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'dirname'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">];  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">$refer </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> $host</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">.</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'/'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">$ch </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> curl_init</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">($url);  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">curl_setopt</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> ($ch, </span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">CURLOPT_REFERER</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">, $refer);  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">curl_setopt</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">($ch, </span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">CURLOPT_RETURNTRANSFER</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">, </span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">true</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">);</span><span style=\"--shiki-light:#6A737D;--shiki-dark:#6A737D\">//激活可修改页面,Activation can modify the page  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">curl_setopt</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">($ch, </span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">CURLOPT_RETURNTRANSFER</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">, </span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">1</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">);  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">curl_setopt</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">($ch, </span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">CURLOPT_BINARYTRANSFER</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">, </span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">1</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">);  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">$data </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> curl_exec</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">($ch);  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">curl_close</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">($ch);  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">$ext </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> strtolower</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">substr</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">strrchr</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">($img,</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'.'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">),</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">1</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">,</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">10</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">));  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">$types </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> array</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">            'gif'</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=></span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'image/gif'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">,  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">            'jpeg'</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=></span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'image/jpeg'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">,  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">            'jpg'</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=></span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'image/jpeg'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">,  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">            'jpe'</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=></span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'image/jpeg'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">,  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">            'png'</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=></span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">'image/png'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">,  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">);  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">$type </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> $types[$ext] </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">?</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> $types[$ext] </span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">:</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\"> 'image/jpeg'</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">;  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">header</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">(</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"Content-type: \"</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">.</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">$type);  </span></span>\n<span class=\"line\"><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">echo</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\"> $data;   </span></span></code></pre></figure>\n<p>原理：不发送Referer</p>\n<p>优缺点：<strong>可以使用统计类组件</strong>，慢，需要大批量更换链接</p>\n<p>使用方法：建立一个PHP文件在某个服务器上</p>\n<p>http（s）://你的域名/img.php?url=照片地址</p>\n<p>使用实例：</p>\n<figure class=\"code-block\" data-lang=\"php\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">php</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"php\"><code><span class=\"line\"><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">&#x3C;</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\">img</span><span style=\"--shiki-light:#005CC5;--shiki-dark:#79B8FF\"> src</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"https://your-domain-name/img.php?url=https://ws3.sinaimg.cn/large/006tNbRwly1fyq4yujgssj30jg0jgmxg.jpg\"</span><span style=\"--shiki-light:#D73A49;--shiki-dark:#F97583\"> /></span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">   </span></span></code></pre></figure>\n<p>（已验证可用）</p>\n<h3 id=\"meta-标签\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-xin-lang-tu-chuang-shi-xiao-jie-jue-fang-an/#meta-%E6%A0%87%E7%AD%BE\">Meta 标签</a></h3>\n<figure class=\"code-block\" data-lang=\"html\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">html</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"html\"><code><span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">meta</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> name</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"referrer\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> content</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"never\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span></code></pre></figure>\n<p>**原理：**不发送Referer，通过指定 name 值为 referrer 的 meta 标签</p>\n<p>优缺点：统计类组件无法使用，因为统计也是通过这个原理</p>\n<p>（未验证）</p>\n<h3 id=\"csp-响应头\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-xin-lang-tu-chuang-shi-xiao-jie-jue-fang-an/#csp-%E5%93%8D%E5%BA%94%E5%A4%B4\">CSP 响应头</a></h3>\n<figure class=\"code-block\" data-lang=\"html\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">html</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"html\"><code><span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">meta</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> http-equiv</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"Content-Security-Policy\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> content</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"referrer\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span></code></pre></figure>\n<p>**原理：**CSP（Content Security Policy），是一个跟页面内容安全有关的规范。在 HTTP 中通过响应头中的 Content-Security-Policy 字段来告诉浏览器当前页面要使用何种 CSP 策略</p>\n<p>（未验证）</p>\n<h3 id=\"a-标签的-referer-属性\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-xin-lang-tu-chuang-shi-xiao-jie-jue-fang-an/#a-%E6%A0%87%E7%AD%BE%E7%9A%84-referer-%E5%B1%9E%E6%80%A7\"><code>&#x3C;a> </code>标签的 Referer 属性</a></h3>\n<figure class=\"code-block\" data-lang=\"html\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">html</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"html\"><code><span class=\"line\"><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">&#x3C;</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">a</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> href</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"https://www.xsy.fun\"</span><span style=\"--shiki-light:#6F42C1;--shiki-dark:#B392F0\"> referrer</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">=</span><span style=\"--shiki-light:#032F62;--shiki-dark:#9ECBFF\">\"no-referrer\"</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">>XSY的FUN天地&#x3C;/</span><span style=\"--shiki-light:#22863A;--shiki-dark:#85E89D\">a</span><span style=\"--shiki-light:#24292E;--shiki-dark:#E1E4E8\">></span></span>\n<span class=\"line\"></span></code></pre></figure>\n<p>**原理：**在<code>&#x3C;a> </code>标签内添加no-referrer策略</p>\n<p>优缺点：这种方式作用的只是这一个链接。</p>\n<p>并且，<code>&#x3C;a> </code>标签可用的 Referrer 策略只有三种：no-referrer、origin 以及 unsafe-url 。</p>\n<p>另外，这样针对单个链接设置的策略优先级比CSP要高。</p>\n</section><section class=\"post-section\"><h2 id=\"emmm\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-04-27-xin-lang-tu-chuang-shi-xiao-jie-jue-fang-an/#emmm\">Emmm</a></h2>\n<p>最好的办法就是使用自建图床或者使用对象储存</p>\n<p>推荐阿里云的OSS，资费低，速度快，可以使用CDN全球加速（另收费）</p>\n<p>云产品通用红包：<a href=\"https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=w7yzqy3r\" title=\"点我\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">点我</a></p>\n<p>另外，<strong>迁移方案</strong>已经有大佬放出</p>\n<p>参见Github：<a href=\"https://github.com/ihewro/PullSinaimgtoTypecho\" title=\"链接\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">链接</a></p></section>","summary":"介绍新浪图床因Referer防盗链失效后，通过PHP中转、meta标签等方法绕过验证的几种解决方案。","image":"https://blog.xsy.fun/og/2019-04-27-xin-lang-tu-chuang-shi-xiao-jie-jue-fang-an.png","date_published":"2019-04-27T12:31:00.000Z","date_modified":"2019-04-27T12:37:15.000Z","tags":["网络安全","Typecho","数据迁移","前端"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2019-03-28-jin-xu-3-xing-dai-ma-rang-xun-lei-wu-shi-ying-ban-quan-fang-yao-qiu-wu-fa-xia-zai/","url":"https://blog.xsy.fun/posts/2019-03-28-jin-xu-3-xing-dai-ma-rang-xun-lei-wu-shi-ying-ban-quan-fang-yao-qiu-wu-fa-xia-zai/","title":"仅需 3 行 代码，让迅雷无视“应版权方要求，无法下载”","content_html":"<section class=\"post-section\"><h2 id=\"前言\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-03-28-jin-xu-3-xing-dai-ma-rang-xun-lei-wu-shi-ying-ban-quan-fang-yao-qiu-wu-fa-xia-zai/#%E5%89%8D%E8%A8%80\">前言</a></h2>\n<p>哇，真的好久没水文章了，最近真的很忙，每天作业什么的。本文测试环境仅限于迅雷极速版，不保证所有客户端均有效。</p>\n<p>如果实在不行，就用迅雷5 吧，不需要修改什么文件，直接用即可，没有版权限制。</p>\n<p>其实实现过程很简单啦，直接修改hosts就好了</p>\n</section><section class=\"post-section\"><h2 id=\"教程\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-03-28-jin-xu-3-xing-dai-ma-rang-xun-lei-wu-shi-ying-ban-quan-fang-yao-qiu-wu-fa-xia-zai/#%E6%95%99%E7%A8%8B\">教程</a></h2>\n<h3 id=\"step-1\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-03-28-jin-xu-3-xing-dai-ma-rang-xun-lei-wu-shi-ying-ban-quan-fang-yao-qiu-wu-fa-xia-zai/#step-1\">Step 1</a></h3>\n<p>打开 hosts，具体文件位置：</p>\n<p><code>C:\\Windows\\System32\\drivers\\etc\\hosts</code></p>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid132/1.png\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<h3 id=\"step-2\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-03-28-jin-xu-3-xing-dai-ma-rang-xun-lei-wu-shi-ying-ban-quan-fang-yao-qiu-wu-fa-xia-zai/#step-2\">Step 2</a></h3>\n<p>鼠标右键点击 hosts，打开方式选择<code>记事本</code>打开。</p>\n<h3 id=\"step-3\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-03-28-jin-xu-3-xing-dai-ma-rang-xun-lei-wu-shi-ying-ban-quan-fang-yao-qiu-wu-fa-xia-zai/#step-3\">Step 3</a></h3>\n<p>别改里面的东西，直接在最后一排加上以下三行代码，保存即可。</p>\n<figure class=\"code-block\" data-lang=\"text\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">text</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\"><code><span class=\"line\"><span>127.0.0.1 hub5btmain.sandai.net </span></span>\n<span class=\"line\"><span>127.0.0.1 hub5emu.sandai.net </span></span>\n<span class=\"line\"><span>127.0.0.1 upgrade.xl9.xunlei.com</span></span></code></pre></figure>\n<figure class=\"post-figure\"><img src=\"https://cdn.xsiy.ltd/photo/pid132/2.png\" alt=\"\" loading=\"lazy\" decoding=\"async\" referrerpolicy=\"no-referrer\"></figure>\n<h3 id=\"step-4\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-03-28-jin-xu-3-xing-dai-ma-rang-xun-lei-wu-shi-ying-ban-quan-fang-yao-qiu-wu-fa-xia-zai/#step-4\">Step 4</a></h3>\n<p>刷新 DNS（不要输入下面的直角引号）</p>\n<p>按下快捷键<code>Win + R</code>打开运行窗口输入「cmd」，点击确定即可打开命令符窗口。</p>\n<p>在命令行窗口输入<code>ipconfig /flushdns</code>按下回车键，即可刷新本地的DNS缓存数据。</p>\n<h3 id=\"ps\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-03-28-jin-xu-3-xing-dai-ma-rang-xun-lei-wu-shi-ying-ban-quan-fang-yao-qiu-wu-fa-xia-zai/#ps\">PS</a></h3>\n<p>若提示需要管理员权限则把文件拉到桌面再修改保存，拖回去就行了！</p></section>","summary":"介绍如何通过修改 Windows hosts 文件屏蔽迅雷的部分域名，绕过版权方限制提示的操作步骤。","image":"https://blog.xsy.fun/og/2019-03-28-jin-xu-3-xing-dai-ma-rang-xun-lei-wu-shi-ying-ban-quan-fang-yao-qiu-wu-fa-xia-zai.png","date_published":"2019-03-28T18:12:00.000Z","date_modified":"2019-03-28T18:18:01.000Z","tags":["网络","网络安全","运维"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2019-03-25-bo-ke-yun-xing-yi-zhou-nian-la/","url":"https://blog.xsy.fun/posts/2019-03-25-bo-ke-yun-xing-yi-zhou-nian-la/","title":"博客运行一周年啦","content_html":"<p>恭喜博客稳定运行一周年（昨天忘记发了）</p>","summary":"作者记录个人博客稳定运行满一年的纪念短文，并补发了迟到的周年说明。","image":"https://blog.xsy.fun/og/2019-03-25-bo-ke-yun-xing-yi-zhou-nian-la.png","date_published":"2019-03-25T17:11:00.000Z","date_modified":"2019-04-04T18:09:06.000Z","tags":["博客","写作"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2019-02-07-xie-zai-a-li-yun-jian-kong-ji-ping-bi-yun-dun-ip/","url":"https://blog.xsy.fun/posts/2019-02-07-xie-zai-a-li-yun-jian-kong-ji-ping-bi-yun-dun-ip/","title":"卸载阿里云监控及屏蔽云盾IP","content_html":"<section class=\"post-section\"><h2 id=\"前言\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-02-07-xie-zai-a-li-yun-jian-kong-ji-ping-bi-yun-dun-ip/#%E5%89%8D%E8%A8%80\">前言</a></h2>\n<p>我相信大家都发现在阿里云购买的云服务器开机后进程里都会自带AliYunDun、aliyun-service、AliYunDunUpdate程序。</p>\n<p>其实它就是阿里云盾（安骑士），是用来监控云服务器是否安全，可用以起到自动扫描查杀病毒的作用，同时还可以检测服务器是否有违规进程。那么云盾IP又是做什么的？云盾IP是来自阿里云的漏洞扫描机，主要是检测你的服务器是否存在已知漏洞。阿里云盾（安骑士）有好处，也有坏处，好处是一定程度保证你的服务器安全（估计作用不大），坏处时时刻刻监控你的云服务器，你完全没有任何隐私而言，不但对病毒起监控作用，还对你存放的内容进行监控。</p>\n<p>那么把自带的阿里云盾（安骑士）卸载了吧！方法很简单，执行下面三段命令即可。</p>\n</section><section class=\"post-section\"><h2 id=\"命令\"><a class=\"heading-anchor\" href=\"https://blog.xsy.fun/posts/2019-02-07-xie-zai-a-li-yun-jian-kong-ji-ping-bi-yun-dun-ip/#%E5%91%BD%E4%BB%A4\">命令</a></h2>\n<p>卸载安骑士</p>\n<figure class=\"code-block\" data-lang=\"text\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">text</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\"><code><span class=\"line\"><span>wget http://update.aegis.aliyun.com/download/uninstall.sh</span></span>\n<span class=\"line\"><span>chmod +x uninstall.sh</span></span>\n<span class=\"line\"><span>./uninstall.sh</span></span>\n<span class=\"line\"><span>wget http://update.aegis.aliyun.com/download/quartz_uninstall.sh</span></span>\n<span class=\"line\"><span>chmod +x quartz_uninstall.sh</span></span>\n<span class=\"line\"><span>./quartz_uninstall.sh</span></span></code></pre></figure>\n<p>删除残留：</p>\n<figure class=\"code-block\" data-lang=\"text\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">text</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\"><code><span class=\"line\"><span>pkill aliyun-service</span></span>\n<span class=\"line\"><span>rm -fr /etc/init.d/agentwatch /usr/sbin/aliyun-service</span></span>\n<span class=\"line\"><span>rm -rf /usr/local/aegis*</span></span></code></pre></figure>\n<p>屏蔽云盾IP：</p>\n<figure class=\"code-block\" data-lang=\"text\"><div class=\"code-block__bar\"><span class=\"code-block__lang\">text</span></div><pre class=\"astro-code astro-code-themes github-light github-dark\" style=\"--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e; overflow-x: auto;\" tabindex=\"0\" data-language=\"plaintext\"><code><span class=\"line\"><span>iptables -I INPUT -s 140.205.201.0/28 -j DROP</span></span>\n<span class=\"line\"><span>iptables -I INPUT -s 140.205.201.16/29 -j DROP</span></span>\n<span class=\"line\"><span>iptables -I INPUT -s 140.205.201.32/28 -j DROP</span></span>\n<span class=\"line\"><span>iptables -I INPUT -s 140.205.225.192/29 -j DROP</span></span>\n<span class=\"line\"><span>iptables -I INPUT -s 140.205.225.200/30 -j DROP</span></span>\n<span class=\"line\"><span>iptables -I INPUT -s 140.205.225.184/29 -j DROP</span></span>\n<span class=\"line\"><span>iptables -I INPUT -s 140.205.225.183/32 -j DROP</span></span>\n<span class=\"line\"><span>iptables -I INPUT -s 140.205.225.206/32 -j DROP</span></span>\n<span class=\"line\"><span>iptables -I INPUT -s 140.205.225.205/32 -j DROP</span></span>\n<span class=\"line\"><span>iptables -I INPUT -s 140.205.225.195/32 -j DROP</span></span>\n<span class=\"line\"><span>iptables -I INPUT -s 140.205.225.204/32 -j DROP</span></span></code></pre></figure></section>","summary":"介绍如何卸载阿里云盾（安骑士）及其残留文件，并通过 iptables 屏蔽云盾漏洞扫描机 IP。","image":"https://blog.xsy.fun/og/2019-02-07-xie-zai-a-li-yun-jian-kong-ji-ping-bi-yun-dun-ip.png","date_published":"2019-02-07T12:46:00.000Z","date_modified":"2019-04-04T18:37:04.000Z","tags":["运维","linux","网络安全","iptables"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2018-12-21-zhong-kao/","url":"https://blog.xsy.fun/posts/2018-12-21-zhong-kao/","title":"中考","content_html":"<p>博主马上中考啦，所以博客很多问题没有处理，见谅。</p>","summary":"博主因临近中考，暂时无暇处理博客中的诸多问题，向读者致歉。","image":"https://blog.xsy.fun/og/2018-12-21-zhong-kao.png","date_published":"2018-12-21T18:34:00.000Z","date_modified":"2018-12-24T20:12:18.000Z","tags":["写作","博客"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"},{"id":"https://blog.xsy.fun/posts/2018-11-11-chun-jing-ban-shou-ji-wps/","url":"https://blog.xsy.fun/posts/2018-11-11-chun-jing-ban-shou-ji-wps/","title":"纯净版手机WPS","content_html":"<p>我从某火腿肠手机上提取了HTC定制版本的WPS，纯净无广告，记得要卸载原来的再安装哦！</p>\n<p><a href=\"https://cdn.xsiy.ltd/share/hTC%E9%A2%84%E8%A3%85%E7%89%88WPS.apk\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">https://cdn.xsiy.ltd/share/hTC预装版WPS.apk</a></p>","summary":"分享从手机预装系统中提取的纯净无广告版WPS安装包，并提醒需先卸载原版再安装。","image":"https://blog.xsy.fun/og/2018-11-11-chun-jing-ban-shou-ji-wps.png","date_published":"2018-11-11T14:17:00.000Z","date_modified":"2019-01-14T18:51:43.000Z","tags":["兼容性","运维"],"authors":[{"name":"Linus Xiong","url":"https://blog.xsy.fun"}],"language":"zh-CN"}]}