<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>网络 on 欧式fifty 的 blog</title><link>https://blog.ous50.moe/categories/%E7%BD%91%E7%BB%9C/</link><description>Recent content in 网络 on 欧式fifty 的 blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>欧式fifty 2020-</copyright><lastBuildDate>Thu, 29 Jan 2026 00:58:18 +0800</lastBuildDate><atom:link href="https://blog.ous50.moe/categories/%E7%BD%91%E7%BB%9C/index.xml" rel="self" type="application/rss+xml"/><item><title>如何在 RouterOS 上利用 OSPF 和 PVE 上的 ShellCrash 打造无感网络</title><link>https://blog.ous50.moe/p/%E5%A6%82%E4%BD%95%E5%9C%A8-routeros-%E4%B8%8A%E5%88%A9%E7%94%A8-ospf-%E5%92%8C-pve-%E4%B8%8A%E7%9A%84-shellcrash-%E6%89%93%E9%80%A0%E6%97%A0%E6%84%9F%E7%BD%91%E7%BB%9C/</link><pubDate>Thu, 29 Jan 2026 00:58:18 +0800</pubDate><guid>https://blog.ous50.moe/p/%E5%A6%82%E4%BD%95%E5%9C%A8-routeros-%E4%B8%8A%E5%88%A9%E7%94%A8-ospf-%E5%92%8C-pve-%E4%B8%8A%E7%9A%84-shellcrash-%E6%89%93%E9%80%A0%E6%97%A0%E6%84%9F%E7%BD%91%E7%BB%9C/</guid><description>

&lt;style&gt;
 .light-quote { font-weight: 300; }
 .bold-quote { font-weight: 700; }
 .extrabold-quote { font-weight: 900}
&lt;/style&gt;


 &lt;blockquote class="gh-blockquote gh-note"&gt;
 &lt;span class="extrabold-quote"&gt;Note&lt;/span&gt;
 &lt;br&gt;

 本文内容基于 &lt;strong&gt;2026年1月29日&lt;/strong&gt; 的环境撰写，使用的是 RouterOS &lt;code&gt;7.20.1&lt;/code&gt; 和 ShellCrash &lt;code&gt;1.9.4beta6&lt;/code&gt;，两者均作为 KVM 实例运行在 PVE 上。如果你使用的 RouterOS 或 ShellCrash 版本不同，具体内容可能会有所差异，请灵活变通。
 &lt;/blockquote&gt;


&lt;h2 id="简介"&gt;&lt;a href="#%e7%ae%80%e4%bb%8b" class="header-anchor"&gt;&lt;/a&gt;简介
&lt;/h2&gt;&lt;p&gt;以前我通过 DHCP 指定网关的方式让网络中的设备使用代理。虽然这种方法能成功实现无感代理，但我没法把这种体验扩展到所有设备上，因为 ShellCrash 有时候是真的会“Crash（崩溃）”，这会直接影响正常的网络流量。我对 OSPF 功能早有耳闻，所以最近参考 &lt;a class="link" href="https://deeprouter.org/article/routeros-ospf-intelligent-traffic-split" target="_blank" rel="noopener"
 &gt;DeepRouter 的文章&lt;/a&gt; 在 RouterOS 上配置了 OSPF。这篇文章主要用来记录我的折腾经验，并分享我是如何增强整个系统的健壮性（Robustness）的。&lt;/p&gt;
&lt;h2 id="shellcrash-和-bird-的配置"&gt;&lt;a href="#shellcrash-%e5%92%8c-bird-%e7%9a%84%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;ShellCrash 和 Bird 的配置
&lt;/h2&gt;&lt;p&gt;虽然把 ShellCrash 和 BIRD 部署在不同的实例里也没问题，但我 &lt;strong&gt;强烈建议&lt;/strong&gt; 将它们部署在同一个实例中。&lt;/p&gt;
&lt;p&gt;这里略过 ShellCrash 的安装过程，请确保在 DNS 配置中使用了 MIX 模式（按 &lt;code&gt;2&lt;/code&gt; (功能设置) - &lt;code&gt;2&lt;/code&gt; (DNS 设置)）。&lt;/p&gt;
&lt;h3 id="检查-ipv4-和-ipv6-转发配置"&gt;&lt;a href="#%e6%a3%80%e6%9f%a5-ipv4-%e5%92%8c-ipv6-%e8%bd%ac%e5%8f%91%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;检查 IPv4 和 IPv6 转发配置
&lt;/h3&gt;&lt;p&gt;运行 &lt;code&gt;sudo sysctl -p&lt;/code&gt; 并检查以下项是否已正确配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net.ipv4.ip_forward=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net.ipv6.conf.all.forwarding=1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果没有，请编辑 &lt;code&gt;/etc/sysctl.conf&lt;/code&gt; 进行修改。&lt;/p&gt;
&lt;h3 id="bird"&gt;&lt;a href="#bird" class="header-anchor"&gt;&lt;/a&gt;BIRD
&lt;/h3&gt;&lt;p&gt;我们将使用 &lt;a class="link" href="https://github.com/ous50/nchnroutes" target="_blank" rel="noopener"
 &gt;!chnroutes&lt;/a&gt; 来区分国内 IP。&lt;/p&gt;
&lt;p&gt;安装完 bird 后，请确保不要立即启用或启动它。我们需要先做一些配置工作。&lt;/p&gt;
&lt;p&gt;对于 Debian 系统：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install bird2 make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="birdconf"&gt;&lt;a href="#birdconf" class="header-anchor"&gt;&lt;/a&gt;bird.conf
&lt;/h4&gt;&lt;p&gt;编辑 &lt;code&gt;/etc/bird/bird.conf&lt;/code&gt; 并按照如下内容进行修改。&lt;/p&gt;
&lt;p&gt;请确保：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;router id&lt;/code&gt; 是你的 ShellCrash/BIRD 实例的 IP。&lt;/li&gt;
&lt;li&gt;ospf v2 和 v3 中的 &lt;code&gt;interface&lt;/code&gt; 都要设置为该实例连接网关（LAN口）所使用的网卡接口名称。
你可以通过 &lt;code&gt;ip a&lt;/code&gt; 或 &lt;code&gt;ip link&lt;/code&gt; 来查看，找到那个 &lt;strong&gt;不是&lt;/strong&gt; &lt;code&gt;lo&lt;/code&gt; 的接口。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;log&lt;/span&gt; &lt;span class="n"&gt;syslog&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;114.51&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 这里改成你实例的 IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;scan&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="n"&gt;kernel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv4&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="n"&gt;kernel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv6&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/etc/bird/routes4.conf&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/etc/bird/routes6.conf&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="n"&gt;ospf&lt;/span&gt; &lt;span class="n"&gt;v2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv4&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;interface&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ens18&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;# 改成你的网卡接口名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;pointopoint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="n"&gt;ospf&lt;/span&gt; &lt;span class="n"&gt;v3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv6&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;interface&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ens18&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;# 改成你的网卡接口名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;pointopoint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="生成路由表"&gt;&lt;a href="#%e7%94%9f%e6%88%90%e8%b7%af%e7%94%b1%e8%a1%a8" class="header-anchor"&gt;&lt;/a&gt;生成路由表
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/ous50/nchnroutes.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; nchnroutes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你连接 github.com 有困难，可以使用镜像站：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://hk.gh-proxy.org/https://github.com/ous50/nchnroutes.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; nchnroutes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果看到以下输出，说明一切顺利，可以继续：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 produce.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv routes4.conf /etc/bird/routes4.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv routes6.conf /etc/bird/routes6.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo birdc configure
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BIRD 2.0.12 ready.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Reading configuration from /etc/bird/bird.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Reconfigured
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="routeros-配置"&gt;&lt;a href="#routeros-%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;RouterOS 配置
&lt;/h2&gt;&lt;p&gt;你需要先设置一个旁路路由表，以防止 OSPF 邻居建立后瞬间发生环路。&lt;/p&gt;
&lt;h3 id="绕过-shellcrash-防止环路并设置例外"&gt;&lt;a href="#%e7%bb%95%e8%bf%87-shellcrash-%e9%98%b2%e6%ad%a2%e7%8e%af%e8%b7%af%e5%b9%b6%e8%ae%be%e7%bd%ae%e4%be%8b%e5%a4%96" class="header-anchor"&gt;&lt;/a&gt;绕过 ShellCrash 防止环路并设置例外
&lt;/h3&gt;&lt;p&gt;我们将创建一个新的路由表来绕过来自 ShellCrash 的流量，从而防止死循环。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/routing table
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add disabled=no fib name=bypass-shellcrash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/routing rule
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add action=lookup-only-in-table comment=&amp;#34;Bypass Shellcrash Gateway using Routing Mark&amp;#34; disabled=no routing-mark=bypass-shellcrash table=bypass-shellcrash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将你的默认路由从 &lt;code&gt;main&lt;/code&gt; 表迁移到 &lt;code&gt;bypass-shellcrash&lt;/code&gt; 表：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;你的局域网网段带掩码&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lan&lt;/span&gt; &lt;span class="n"&gt;routing&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bypass&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;shellcrash&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="n"&gt;suppress&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hw&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;offload&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;你的互联网网关&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;routing&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bypass&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;shellcrash&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="n"&gt;suppress&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hw&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;offload&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="防火墙标记-mangle"&gt;&lt;a href="#%e9%98%b2%e7%81%ab%e5%a2%99%e6%a0%87%e8%ae%b0-mangle" class="header-anchor"&gt;&lt;/a&gt;防火墙标记 (Mangle)
&lt;/h4&gt;&lt;p&gt;请确保：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将 dst-address 改为你的局域网网段，保留前面的感叹号 &lt;code&gt;!&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;将 src-mac-address 改为 ShellCrash 实例网卡接口的 MAC 地址（可以在 ShellCrash 实例中用 &lt;code&gt;ip link&lt;/code&gt; 查看，或者直接在 PVE 界面看）。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/ip firewall mangle
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add action=mark-routing chain=prerouting comment=bypass-shellcrash-gateway dst-address=!192.168.0.0/23 new-routing-mark=bypass-shellcrash src-mac-address=11:45:14:19:19:81
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ospf-配置"&gt;&lt;a href="#ospf-%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;OSPF 配置
&lt;/h3&gt;&lt;p&gt;默认情况下，你不需要更改此脚本中的任何内容。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/routing ospf instance
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add disabled=no name=shellcrash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add disabled=no name=shellcrash-v6 version=3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/routing ospf area
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add disabled=no instance=shellcrash name=ospf-area-v4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add disabled=no instance=shellcrash-v6 name=ospf-area-v6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/routing ospf interface-template
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add area=ospf-area-v4 cost=10 disabled=no priority=32 type=ptp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add area=ospf-area-v6 cost=10 disabled=no priority=32 type=ptp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="进阶技巧-tricks"&gt;&lt;a href="#%e8%bf%9b%e9%98%b6%e6%8a%80%e5%b7%a7-tricks" class="header-anchor"&gt;&lt;/a&gt;进阶技巧 (Tricks)
&lt;/h2&gt;&lt;h3 id="健壮的-dns-设置"&gt;&lt;a href="#%e5%81%a5%e5%a3%ae%e7%9a%84-dns-%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;健壮的 DNS 设置
&lt;/h3&gt;&lt;p&gt;由于 ShellCrash 使用了 &lt;code&gt;fake-ip&lt;/code&gt; 模式，你应该将 ShellCrash 的 DNS 设置为上游。&lt;/p&gt;
&lt;p&gt;在这种情况下，我们假设将 RouterOS 的 DNS 下发给客户端，并使用以下 RouterOS 脚本来动态更新上游 DNS 源，以增强健壮性，防止 ShellCrash 挂掉导致全网断网。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:global ospfInstance &amp;#34;shellsrash&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:global ospfDNS &amp;#34;1.1.4.5&amp;#34; # 你的 ShellCrash 实例 IP
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:global publicDNS &amp;#34;223.5.5.5&amp;#34; # 这里改为你用于直接上网的公共 DNS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# (true / false), 测试完成后关闭调试模式，否则日志里全是烦人的调试信息。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:local DEBUG false
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 标记最终状态，默认值为 false (down)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:local isOspfActive false
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 尝试寻找邻居
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:local neighborIds [/routing ospf neighbor find instance=$ospfInstance]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 检查是否找到邻居
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:if ([:len $neighborIds] &amp;gt; 0) do={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # 注意：这里我们假设只使用一个实例。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # 如果你有多个实例，可能需要遍历查找。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :local neighborState [/routing ospf neighbor get ($neighborIds-&amp;gt;0) state]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($DEBUG) do={:log info &amp;#34;[DEBUG] Neighbor found! State: $neighborState&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # 只有当状态为 &amp;#34;Full&amp;#34; 时才认为 OSPF 活跃。记住是 &amp;#34;Full&amp;#34; 不是 &amp;#34;full&amp;#34;。这个状态名在不同 RouterOS 版本可能不同。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($neighborState = &amp;#34;Full&amp;#34;) do={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :set isOspfActive true
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;} else={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # 如果长度为 0，说明未找到邻居。检查 bird 配置/状态。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($DEBUG) do={:log info &amp;#34;[DEBUG] No OSPF neighbor found. Logic assumes DOWN.&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :set isOspfActive false
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 根据变量 isOspfActive 更改 DNS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:local currentDNS [/ip dns get servers]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:if ($isOspfActive) do={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # OSPF 在线
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($DEBUG) do={:log info &amp;#34;[DEBUG] Decision: OSPF is UP.&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($currentDNS != $ospfDNS) do={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :log warning &amp;#34;OSPF Shellcrash Up: Switching to OSPF DNS ($ospfDNS).&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /ip dns set servers=$ospfDNS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /ip dns cache flush
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; } else={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($DEBUG) do={:log info &amp;#34;[DEBUG] DNS is already correct (OSPF).&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;} else={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # OSPF 离线 (或丢失邻居)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($DEBUG) do={:log info &amp;#34;[DEBUG] Decision: OSPF is DOWN/MISSING.&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($currentDNS != $publicDNS) do={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :log warning &amp;#34;OSPF Shellcrash Down: Switching to Public DNS ($publicDNS).&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /ip dns set servers=$publicDNS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /ip dns cache flush
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; } else={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($DEBUG) do={:log info &amp;#34;[DEBUG] DNS is already correct (Public).&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="当-shellcrash-崩溃时关闭-bird"&gt;&lt;a href="#%e5%bd%93-shellcrash-%e5%b4%a9%e6%ba%83%e6%97%b6%e5%85%b3%e9%97%ad-bird" class="header-anchor"&gt;&lt;/a&gt;当 ShellCrash 崩溃时关闭 Bird
&lt;/h3&gt;&lt;p&gt;我们将使用一个 bash 脚本来主动检查 ShellCrash 是否存活。如果 API 无法连接，它将停止 Bird 服务以撤回 OSPF 路由。&lt;/p&gt;
&lt;p&gt;将以下代码块复制并粘贴到你的 PVE Shell 中（以 &lt;code&gt;clash&lt;/code&gt; 用户登录，或具有 sudo 权限的用户）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 创建看门狗脚本 (Watchdog script)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 注意：我们使用 &amp;#39;EOF&amp;#39; (带引号) 来防止创建时变量被展开。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tee /home/clash/check_clash.sh &amp;gt; /dev/null &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;# 配置
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;API_URL=&amp;#34;http://127.0.0.1:9999/&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;LOG_FILE=&amp;#34;/home/clash/clash_watchdog.log&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;DEBUG=false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;INTERVAL=3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;# 初始化状态 (0=未知, 1=正常, 2=已崩溃)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;LAST_STATE=0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;while true; do
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # 检查 ShellCrash API
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; HTTP_CODE=$(curl -s -m 1 -o /dev/null -w &amp;#34;%{http_code}&amp;#34; &amp;#34;$API_URL&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$DEBUG&amp;#34; = &amp;#34;true&amp;#34; ]; then 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;[DEBUG] Dashboard code: $HTTP_CODE&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$HTTP_CODE&amp;#34; == &amp;#34;200&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # ShellCrash 存活
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$LAST_STATE&amp;#34; != &amp;#34;1&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; DATE=$(date &amp;#34;+%Y-%m-%d %H:%M:%S&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # 使用 systemctl 的返回码检查 Bird 是否在运行 (更可靠)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; sudo systemctl is-active --quiet bird
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; BIRD_EXIT_CODE=$?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ $BIRD_EXIT_CODE -ne 0 ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$DEBUG&amp;#34; = &amp;#34;true&amp;#34; ]; then 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;ShellCrash detected. Starting Bird...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;[$DATE] ShellCrash recovered/detected. Starting Bird...&amp;#34; &amp;gt;&amp;gt; $LOG_FILE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; sudo systemctl start bird
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; LAST_STATE=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # ShellCrash 已挂
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$LAST_STATE&amp;#34; != &amp;#34;2&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; DATE=$(date &amp;#34;+%Y-%m-%d %H:%M:%S&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$DEBUG&amp;#34; = &amp;#34;true&amp;#34; ]; then 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;[$DATE] Alert! ShellCrash died (Code: $HTTP_CODE). Stopping Bird!&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;[$DATE] Alert! ShellCrash died (Code: $HTTP_CODE). Stopping Bird!&amp;#34; &amp;gt;&amp;gt; $LOG_FILE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; sudo systemctl stop bird
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; LAST_STATE=2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; sleep $INTERVAL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;done
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 赋予执行权限&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod +x /home/clash/check_clash.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 创建 Systemd 服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tee /etc/systemd/system/clash-watchdog.service &amp;gt; /dev/null &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Description=ShellCrash Watchdog for Bird OSPF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;After=network.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;User=clash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Group=clash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ExecStart=/home/clash/check_clash.sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Restart=always
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;RestartSec=3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. 启用并启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now clash-watchdog.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl status clash-watchdog.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>在 PVE 上安装 EasyTier</title><link>https://blog.ous50.moe/p/%E5%9C%A8-pve-%E4%B8%8A%E5%AE%89%E8%A3%85-easytier/</link><pubDate>Tue, 26 Aug 2025 10:30:16 +0800</pubDate><guid>https://blog.ous50.moe/p/%E5%9C%A8-pve-%E4%B8%8A%E5%AE%89%E8%A3%85-easytier/</guid><description>&lt;h2 id="安装-easytier"&gt;&lt;a href="#%e5%ae%89%e8%a3%85-easytier" class="header-anchor"&gt;&lt;/a&gt;安装 EasyTier
&lt;/h2&gt;&lt;p&gt;如果你的网络提供商干扰了 GitHub，你可以使用以下命令来安装 EasyTier：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt update -y sudo unzip openssl 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O /tmp/easytier.sh &lt;span class="s2"&gt;&amp;#34;https://ghfast.top/https://raw.githubusercontent.com/EasyTier/EasyTier/main/script/install.sh&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo bash /tmp/easytier.sh install --gh-proxy https://ghfast.top/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl disable --now easytier@default.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你可以在&lt;a class="link" href="https://ghproxy.link" target="_blank" rel="noopener"
 &gt;这里&lt;/a&gt;检查最新的代理。&lt;/p&gt;
&lt;p&gt;否则，只需使用默认的 GitHub URL。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt update -y sudo unzip openssl 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O /tmp/easytier.sh &lt;span class="s2"&gt;&amp;#34;https://raw.githubusercontent.com/EasyTier/EasyTier/main/script/install.sh&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo bash /tmp/easytier.sh install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl disable --now easytier@default.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="启用-easytier-服务"&gt;&lt;a href="#%e5%90%af%e7%94%a8-easytier-%e6%9c%8d%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;启用 EasyTier 服务
&lt;/h2&gt;&lt;h3 id="使用-easytier-仪表板进行管理"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8-easytier-%e4%bb%aa%e8%a1%a8%e6%9d%bf%e8%bf%9b%e8%a1%8c%e7%ae%a1%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;使用 easytier 仪表板进行管理
&lt;/h3&gt;&lt;p&gt;如果你希望使用 easytier 仪表板进行管理，可以使用以下命令启用该服务：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;你的用户名&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Description=EasyTier Service
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;After=network.target syslog.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Wants=network.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Type=simple
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;ExecStart=/usr/sbin/easytier-core -w &lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/systemd/system/easytier.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now easytier.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后你就可以在 &lt;a class="link" href="https://easytier.cn/web" target="_blank" rel="noopener"
 &gt;https://easytier.cn/web&lt;/a&gt; 访问 EasyTier 仪表板了。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;请注意：你需要先在 EasyTier 仪表板中注册账号再启用该功能。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="手动配置"&gt;&lt;a href="#%e6%89%8b%e5%8a%a8%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;手动配置
&lt;/h3&gt;&lt;p&gt;直接跟随&lt;a class="link" href="https://easytier.cn/guide/network/install-as-a-systemd-service.html" target="_blank" rel="noopener"
 &gt;官方文档&lt;/a&gt;进行配置即可。&lt;/p&gt;</description></item><item><title>我有特别的 FnOS 配置和使用技巧</title><link>https://blog.ous50.moe/p/%E6%88%91%E6%9C%89%E7%89%B9%E5%88%AB%E7%9A%84-fnos-%E9%85%8D%E7%BD%AE%E5%92%8C%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/</link><pubDate>Fri, 08 Aug 2025 11:26:29 +0800</pubDate><guid>https://blog.ous50.moe/p/%E6%88%91%E6%9C%89%E7%89%B9%E5%88%AB%E7%9A%84-fnos-%E9%85%8D%E7%BD%AE%E5%92%8C%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/</guid><description>&lt;p&gt;本文专注于&lt;a class="link" href="https://www.fnnas.com/" target="_blank" rel="noopener"
 &gt;飞牛OS&lt;/a&gt;使用时的优化。如需查看如何在 PVE 或实体机器安装飞牛OS，请看&lt;a class="link" href="../%e5%9c%a8-proxmox-ve-pve-%e4%b8%8a%e5%ae%89%e8%a3%85-fnos" &gt;上一篇文章&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="网络优化"&gt;&lt;a href="#%e7%bd%91%e7%bb%9c%e4%bc%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;网络优化
&lt;/h2&gt;&lt;p&gt;以下可选步骤可提高网络吞吐量和隐私。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;执行此脚本以启用 BBR 拥塞控制算法:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/sysctl.d/99-enable-bbr.conf &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.core.default_qdisc=fq
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv4.tcp_congestion_control=bbr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;无需重启即可应用BBR配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl -p /etc/sysctl.d/99-enable-bbr.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;执行此脚本以启用现代 IPv6 隐私地址标准（RFC 7217 和 RFC 4941）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/sysctl.d/99-enable-private-ipv6.conf &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.all.use_tempaddr = 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.default.use_tempaddr = 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.all.addr_gen_mode=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.default.addr_gen_mode=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;应用sysctl配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl -p /etc/sysctl.d/99-enable-private-ipv6.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;🚨 &lt;strong&gt;警告&lt;/strong&gt;：请不要在 FnOS Web 界面中使用“EUI-64”选项。这样做会通过在其 IPv6 地址中&lt;strong&gt;暴露设备的 MAC 地址使这些隐私增强功能失效&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;应用网络更改&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;要激活新的 IPv6 地址设置，必须重置网络接口。这可以通过 &lt;code&gt;nmcli&lt;/code&gt; 完成，而无需完全系统重启。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;🚨 重要提示&lt;/strong&gt;：从 PVE Web 控制台 (&lt;code&gt;Xterm.js&lt;/code&gt;) 执行这些命令，因为通过 SSH 运行&lt;strong&gt;会因为IPv6地址改变导致连线断开&lt;/strong&gt;，且可能无法恢复。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;步骤 1：识别连接名称&lt;/strong&gt;
列出所有活动连接以找到主接口的名称。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nmcli connection show
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出将列出可用的连接。记下您的以太网连接的名称，通常是 &lt;code&gt;Wired connection 1&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤 2：重置连接&lt;/strong&gt;
使用识别出的名称重新启动网络接口：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nmcli connection down &lt;span class="s2"&gt;&amp;#34;Wired connection 1&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; nmcli connection up &lt;span class="s2"&gt;&amp;#34;Wired connection 1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;网络接口将重新启动。您可以使用 &lt;code&gt;ip a&lt;/code&gt; 或者在 PVE Web 控制台中虚拟机的 &lt;code&gt;Summary&lt;/code&gt; 页面中确认新的 IPv6 地址配置。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;启用作为虚拟机宿主机的 IPv6 路由通告（RA）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;要使其内部的虚拟机也能透过 SLAAC 获取 IPv6，需要更改其 RA 设定：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/sysctl.d/99-virtual-machine.conf &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.all.accept_ra = 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.default.accept_ra = 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl -p /etc/sysctl.d/99-virtual-machine.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="作为-pveqemu-客户机时启用内存与cpu热插拔"&gt;&lt;a href="#%e4%bd%9c%e4%b8%ba-pveqemu-%e5%ae%a2%e6%88%b7%e6%9c%ba%e6%97%b6%e5%90%af%e7%94%a8%e5%86%85%e5%ad%98%e4%b8%8ecpu%e7%83%ad%e6%8f%92%e6%8b%94" class="header-anchor"&gt;&lt;/a&gt;作为 PVE/QEMU 客户机时启用内存与CPU热插拔
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;修改 &lt;code&gt;/etc/default/grub&lt;/code&gt; 以启用内存热插拔:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- GRUB_CMDLINE_LINUX=&amp;#34;modprobe.blacklist=pcspkr&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ GRUB_CMDLINE_LINUX=&amp;#34;modprobe.blacklist=pcspkr memhp_default_state=online&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建 UDEV 规则以启用 CPU 热插拔：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /lib/udev/rules.d/80-hotplug-cpu.rules &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;SUBSYSTEM==&amp;#34;cpu&amp;#34;, ACTION==&amp;#34;add&amp;#34;, TEST==&amp;#34;online&amp;#34;, ATTR{online}==&amp;#34;0&amp;#34;, ATTR{online}=&amp;#34;1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关闭虚拟机。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 PVE 网页控制台的处理器页面中勾选 「启用 NUMA」。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 PVE 网页控制台的选项页面的「热插拔」选项列表中勾选&lt;code&gt;内存&lt;/code&gt;与&lt;code&gt;CPU&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>在 Proxmox VE (PVE) 上安装 FnOS</title><link>https://blog.ous50.moe/p/%E5%9C%A8-proxmox-ve-pve-%E4%B8%8A%E5%AE%89%E8%A3%85-fnos/</link><pubDate>Sun, 03 Aug 2025 10:12:00 +0800</pubDate><guid>https://blog.ous50.moe/p/%E5%9C%A8-proxmox-ve-pve-%E4%B8%8A%E5%AE%89%E8%A3%85-fnos/</guid><description>&lt;h2 id="简介"&gt;&lt;a href="#%e7%ae%80%e4%bb%8b" class="header-anchor"&gt;&lt;/a&gt;简介
&lt;/h2&gt;&lt;p&gt;本文档解决了在 PVE 环境中安装 FnOS 后遇到的常见问题，例如系统被锁定和 PVE Web 控制台无响应。通过遵循这些步骤，您将获得一个完全可访问、安全且优化的 FnOS 虚拟机。&lt;/p&gt;
&lt;p&gt;如果您已经安装完毕，并想查看更多优化技巧，请看&lt;a class="link" href="../%e6%88%91%e6%9c%89%e7%89%b9%e5%88%ab%e7%9a%84-fnos-%e9%85%8d%e7%bd%ae%e5%92%8c%e4%bd%bf%e7%94%a8%e6%8a%80%e5%b7%a7" &gt;这一篇文章&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="安装准备"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e5%87%86%e5%a4%87" class="header-anchor"&gt;&lt;/a&gt;安装准备
&lt;/h2&gt;&lt;p&gt;FnOS ISO：访问 &lt;a class="link" href="https://www.fnnas.com/" target="_blank" rel="noopener"
 &gt;https://www.fnnas.com/&lt;/a&gt; 并通过“直接下载”获取。&lt;/p&gt;
&lt;p&gt;建议 PVE 至少具有 3GB RAM 和 2 核。&lt;/p&gt;
&lt;p&gt;按照&lt;a class="link" href="https://help.fnnas.com/articles/fnosV1/start/install-os.md" target="_blank" rel="noopener"
 &gt;官方指南&lt;/a&gt;安装系统。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="安装后配置"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e5%90%8e%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;安装后配置
&lt;/h2&gt;&lt;p&gt;首次启动时，有两个主要问题会阻止访问新的 FnOS 实例：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;登录禁用&lt;/strong&gt;：在完成基于 Web 的初始设置之前，系统控制台不接受任何凭据（包括 &lt;code&gt;root&lt;/code&gt;）。这对于可能只有 IPv6 访问权限的远程机器来说是个问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PVE 控制台无响应&lt;/strong&gt;：PVE Web UI 中的 &lt;code&gt;Xterm.js&lt;/code&gt; 串行控制台默认情况下无法工作。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以下部分提供了这些问题的解决方案。&lt;/p&gt;
&lt;h3 id="获取初始-root-访问权限"&gt;&lt;a href="#%e8%8e%b7%e5%8f%96%e5%88%9d%e5%a7%8b-root-%e8%ae%bf%e9%97%ae%e6%9d%83%e9%99%90" class="header-anchor"&gt;&lt;/a&gt;获取初始 root 访问权限
&lt;/h3&gt;&lt;p&gt;首先，我们必须绕过标准启动序列来设置 root 密码。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 PVE 控制台中，重启虚拟机。在 GRUB 启动菜单中，按 &lt;code&gt;e&lt;/code&gt; 编辑启动参数。&lt;/li&gt;
&lt;li&gt;找到以 &lt;code&gt;linux&lt;/code&gt; 开头的行。它将类似于以下内容：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;linux /boot/vmlinuz-6.12.18-trim root=UUID=... ro quiet
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;在此行末尾添加 &lt;code&gt;single init=/bin/bash&lt;/code&gt;。此参数将系统直接引导到 root shell。&lt;/li&gt;
&lt;li&gt;按 &lt;code&gt;Ctrl+X&lt;/code&gt; 或 &lt;code&gt;F10&lt;/code&gt; 启动。&lt;/li&gt;
&lt;li&gt;在 root shell 中，执行 &lt;code&gt;passwd&lt;/code&gt; 命令为 &lt;code&gt;root&lt;/code&gt; 用户设置新密码。&lt;/li&gt;
&lt;li&gt;完成后，重启虚拟机。引导参数更改是临时的，不会持久化。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="启用永久控制台访问和功能"&gt;&lt;a href="#%e5%90%af%e7%94%a8%e6%b0%b8%e4%b9%85%e6%8e%a7%e5%88%b6%e5%8f%b0%e8%ae%bf%e9%97%ae%e5%92%8c%e5%8a%9f%e8%83%bd" class="header-anchor"&gt;&lt;/a&gt;启用永久控制台访问和功能
&lt;/h3&gt;&lt;p&gt;建立 root 访问权限后，永久修改 GRUB 配置以启用 PVE 串行控制台和其他功能。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;使用新设置的密码以 &lt;code&gt;root&lt;/code&gt; 身份登录。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编辑 GRUB 配置文件：&lt;code&gt;nano /etc/default/grub&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改 &lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/code&gt; 行，以包含串行控制台和可选的嵌套虚拟化 IOMMU 支持。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;对于 Intel CPU：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;quiet&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;quiet console=tty0 console=ttyS0,115200 intel_iommu=on iommu=pt&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;对于 AMD CPU：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;quiet&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;quiet console=tty0 console=ttyS0,115200 amd_iommu=on iommu=pt&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; &lt;code&gt;console=ttyS0,115200&lt;/code&gt; 是 PVE &lt;code&gt;Xterm.js&lt;/code&gt; 功能的关键参数。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保存更改并退出编辑器。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过执行以下命令应用新配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;update-grub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重启虚拟机。PVE Web 控制台现在应该完全正常工作。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="安装-qemu-客户机代理"&gt;&lt;a href="#%e5%ae%89%e8%a3%85-qemu-%e5%ae%a2%e6%88%b7%e6%9c%ba%e4%bb%a3%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;安装 QEMU 客户机代理
&lt;/h3&gt;&lt;p&gt;为了更好地与 PVE 集成，例如在虚拟机摘要中显示网络信息，我们需要安装&lt;code&gt;qemu-guest-agent&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```shell
apt update &amp;amp;&amp;amp; apt -y install qemu-guest-agent
systemctl enable --now qemu-guest-agent
```
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="结语"&gt;&lt;a href="#%e7%bb%93%e8%af%ad" class="header-anchor"&gt;&lt;/a&gt;结语
&lt;/h2&gt;&lt;p&gt;您已成功在 Proxmox VE 上配置了 FnOS 实例。系统现在完全可访问，并与 PVE 主机正确集成。后续配置与优化我将在&lt;a class="link" href="../%e6%88%91%e6%9c%89%e7%89%b9%e5%88%ab%e7%9a%84-fnos-%e9%85%8d%e7%bd%ae%e5%92%8c%e4%bd%bf%e7%94%a8%e6%8a%80%e5%b7%a7" &gt;新的一篇文章&lt;/a&gt;展现。&lt;/p&gt;</description></item></channel></rss>