<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on HiDa</title><link>https://www.0niu.cn/posts/</link><description>Recent content in Posts on HiDa</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Thu, 21 May 2026 10:50:57 +0800</lastBuildDate><atom:link href="https://www.0niu.cn/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>屏蔽深信服BBC登录页粒子动画</title><link>https://www.0niu.cn/posts/block-sangfor-bbc-particles-animation/</link><pubDate>Thu, 21 May 2026 10:50:57 +0800</pubDate><guid>https://www.0niu.cn/posts/block-sangfor-bbc-particles-animation/</guid><description>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>每次登录深信服 BBC（Business Behavior Control）时，都会被登录页面上那个花里胡哨的粒子动画困扰——漂浮的小点、连线，看起来酷炫，实际毫无用处，纯纯画蛇添足、华而不实，还白白浪费 CPU 和 GPU 资源。&lt;/p></description><content>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>每次登录深信服 BBC（Business Behavior Control）时，都会被登录页面上那个花里胡哨的粒子动画困扰——漂浮的小点、连线，看起来酷炫，实际毫无用处，纯纯画蛇添足、华而不实，还白白浪费 CPU 和 GPU 资源。&lt;/p>
&lt;h2 id="解决方案">解决方案&lt;/h2>
&lt;p>只需要在 uBlock Origin Lite 中添加一条自定义过滤规则，即可屏蔽这个烦人的粒子动画。&lt;/p>
&lt;h3 id="操作步骤">操作步骤&lt;/h3>
&lt;ol>
&lt;li>打开 uBlock Origin Lite 的选项页面（点击扩展图标 → 齿轮图标）&lt;/li>
&lt;li>切换到 &lt;strong>&amp;ldquo;我的规则&amp;rdquo;（My Rules）&lt;/strong> 选项卡&lt;/li>
&lt;li>在规则输入框中添加以下规则：&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>&amp;lt;hostip&amp;gt;##canvas.particles-js-canvas-el
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>将 &lt;code>&amp;lt;hostip&amp;gt;&lt;/code> 替换为你的深信服 BBC 服务器地址，例如：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>10.0.0.1##canvas.particles-js-canvas-el
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="4">
&lt;li>点击 &lt;strong>&amp;ldquo;应用更改&amp;rdquo;（Apply changes）&lt;/strong>&lt;/li>
&lt;/ol>
&lt;h3 id="规则说明">规则说明&lt;/h3>
&lt;ul>
&lt;li>&lt;code>10.0.0.1&lt;/code> — 你的深信服 BBC 服务器 IP 地址&lt;/li>
&lt;li>&lt;code>##&lt;/code> — uBlock Origin 的元素隐藏语法&lt;/li>
&lt;li>&lt;code>canvas.particles-js-canvas-el&lt;/code> — 粒子动画使用的 Canvas 元素的 CSS 选择器&lt;/li>
&lt;/ul>
&lt;p>这条规则会让 uBlock Origin Lite 直接隐藏该 Canvas 元素，页面不再渲染粒子动画，登录页面瞬间清爽，CPU/GPU 占用也随之降低。&lt;/p>
&lt;h2 id="效果">效果&lt;/h2>
&lt;p>添加规则后，深信服 BBC 登录页面将不再显示粒子动画，只保留干净的登录表单。页面加载更快，资源占用更低。&lt;/p>
&lt;h2 id="参考">参考&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://github.com/uBlockOrigin/uBlock/wiki/Static-filter-syntax#element-hiding-filters">uBlock Origin Lite — element hiding syntax&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/VincentGarreau/particles.js/">particles.js&lt;/a>&lt;/li>
&lt;/ul></content></item><item><title>firewalld 配置 internal 到 public 区域的流量转发</title><link>https://www.0niu.cn/posts/firewalld-forward-internal-to-public/</link><pubDate>Mon, 18 May 2026 19:22:32 +0800</pubDate><guid>https://www.0niu.cn/posts/firewalld-forward-internal-to-public/</guid><description>&lt;p>firewalld 支持通过 Policy 对象实现跨区域流量转发。本文介绍如何配置策略，允许 internal 区域的流量转发到 public 区域，使内网主机可以通过防火墙访问外部网络。&lt;/p>
&lt;h2 id="前提条件">前提条件&lt;/h2>
&lt;ul>
&lt;li>firewalld 已安装并运行（&lt;code>systemctl status firewalld&lt;/code>）&lt;/li>
&lt;li>有 root 或 sudo 权限&lt;/li>
&lt;li>了解 firewalld 的 Zone 和 Policy 概念&lt;/li>
&lt;/ul></description><content>&lt;p>firewalld 支持通过 Policy 对象实现跨区域流量转发。本文介绍如何配置策略，允许 internal 区域的流量转发到 public 区域，使内网主机可以通过防火墙访问外部网络。&lt;/p>
&lt;h2 id="前提条件">前提条件&lt;/h2>
&lt;ul>
&lt;li>firewalld 已安装并运行（&lt;code>systemctl status firewalld&lt;/code>）&lt;/li>
&lt;li>有 root 或 sudo 权限&lt;/li>
&lt;li>了解 firewalld 的 Zone 和 Policy 概念&lt;/li>
&lt;/ul>
&lt;h2 id="创建转发策略">创建转发策略&lt;/h2>
&lt;p>firewalld 的 Zone 控制接口上的流量方向，而 Policy 用于定义跨区域的流量转发规则。我们需要创建一个 Policy，将 internal 作为入口区域，public 作为出口区域。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 创建新策略&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --permanent --new-policy allow-internal-to-public
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 设置入口区域（源）为 internal，出口区域（目标）为 public&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --permanent --policy allow-internal-to-public --add-ingress-zone internal
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --permanent --policy allow-internal-to-public --add-egress-zone public
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 设置动作为 ACCEPT，并给予高优先级（确保不被其他策略覆盖）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --permanent --policy allow-internal-to-public --set-target ACCEPT
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --permanent --policy allow-internal-to-public --set-priority -100
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>关键参数说明：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>参数&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>--add-ingress-zone&lt;/code>&lt;/td>
&lt;td>流量进入的区域（源区域）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--add-egress-zone&lt;/code>&lt;/td>
&lt;td>流量出去的区域（目标区域）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--set-target ACCEPT&lt;/code>&lt;/td>
&lt;td>匹配该策略的流量默认放行&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>--set-priority -100&lt;/code>&lt;/td>
&lt;td>优先级数值越小越优先，负数确保优先于默认策略&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="开启伪装masquerade">开启伪装（MASQUERADE）&lt;/h2>
&lt;p>为了让内网 IP 的流量通过 public 区域的出口 IP 访问外部网络，需要为 public 区域开启源地址伪装（SNAT）：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --permanent --zone&lt;span style="color:#f92672">=&lt;/span>public --add-masquerade
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="启用-ip-转发">启用 IP 转发&lt;/h2>
&lt;p>Linux 内核默认关闭 IP 转发功能，需要手动开启：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 临时启用（重启后失效）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo sysctl -w net.ipv4.ip_forward&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 永久启用&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>echo net.ipv4.ip_forward&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span> | sudo tee -a /etc/sysctl.d/99-ipforward.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="重载防火墙">重载防火墙&lt;/h2>
&lt;p>以上所有 &lt;code>--permanent&lt;/code> 操作需要重载后才会生效：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --reload
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="验证配置">验证配置&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看策略列表&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --get-policies
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看策略详情&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --info-policy allow-internal-to-public
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看 public 区域是否开启伪装&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo firewall-cmd --zone&lt;span style="color:#f92672">=&lt;/span>public --query-masquerade
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看 IP 转发状态&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sysctl net.ipv4.ip_forward
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="常见问题">常见问题&lt;/h2>
&lt;p>&lt;strong>内网主机无法访问外部？&lt;/strong> 检查以下几点：&lt;/p>
&lt;ol>
&lt;li>确认 &lt;code>net.ipv4.ip_forward&lt;/code> 已设为 &lt;code>1&lt;/code>&lt;/li>
&lt;li>确认 public 区域的伪装已开启&lt;/li>
&lt;li>确认 internal 区域的接口绑定正确：&lt;code>sudo firewall-cmd --zone=internal --list-all&lt;/code>&lt;/li>
&lt;li>确认内网主机的默认网关指向防火墙的 internal 接口 IP&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>策略优先级被覆盖？&lt;/strong> 使用更小的优先级数值（如 &lt;code>-200&lt;/code>），firewalld 优先级范围是 &lt;code>-32768&lt;/code> 到 &lt;code>32767&lt;/code>，数值越小越优先。&lt;/p>
&lt;h2 id="参考">参考&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://firewalld.org/documentation/concepts/policies.html">firewalld 官方文档 - Policies&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://firewalld.org/documentation/man-pages/firewalld.zone.html">firewalld.zone(5) man page&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://firewalld.org/documentation/man-pages/firewalld.policy.html">firewalld.policy(5) man page&lt;/a>&lt;/li>
&lt;/ul></content></item><item><title>在VyOS上运行ZeroTier实现站点间组网</title><link>https://www.0niu.cn/posts/vyos-zerotier-site-to-site/</link><pubDate>Wed, 22 Apr 2026 10:42:28 +0800</pubDate><guid>https://www.0niu.cn/posts/vyos-zerotier-site-to-site/</guid><description>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>VyOS 是一个开源的路由器操作系统，ZeroTier 则是一个易于使用的 SD-WAN 方案。将两者结合，可以用 VyOS 作为各站点的网关设备，通过 ZeroTier 组建虚拟网络，实现站点间的安全通信。&lt;/p>
&lt;p>相比传统的 IPsec VPN 或 BGP over WireGuard 方案，ZeroTier 的优势在于：无需公网 IP、无需手动配置隧道对端、通过 Central 控制台统一管理路由。适合中小规模的多站点部署。&lt;/p></description><content>&lt;h2 id="前言">前言&lt;/h2>
&lt;p>VyOS 是一个开源的路由器操作系统，ZeroTier 则是一个易于使用的 SD-WAN 方案。将两者结合，可以用 VyOS 作为各站点的网关设备，通过 ZeroTier 组建虚拟网络，实现站点间的安全通信。&lt;/p>
&lt;p>相比传统的 IPsec VPN 或 BGP over WireGuard 方案，ZeroTier 的优势在于：无需公网 IP、无需手动配置隧道对端、通过 Central 控制台统一管理路由。适合中小规模的多站点部署。&lt;/p>
&lt;p>本文基于 VyOS 1.4（Rolling Release）和 ZeroTier 官方 Docker 镜像，演示从容器部署到路由配置的完整流程。&lt;/p>
&lt;h2 id="网络拓扑">网络拓扑&lt;/h2>
&lt;p>假设有 3 个站点，每个站点一台 VyOS 路由器，通过 ZeroTier 组网：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Site 1&lt;/strong>：RTR1，本地子网 10.1.0.0/24&lt;/li>
&lt;li>&lt;strong>Site 2&lt;/strong>：RTR2，本地子网 10.2.0.0/24&lt;/li>
&lt;li>&lt;strong>Site 3&lt;/strong>：RTR3，本地子网 10.3.0.0/24&lt;/li>
&lt;/ul>
&lt;p>ZeroTier 虚拟网络分配 10.13.0.0/16，每个节点通过 ZeroTier 自动分配一个 IP。&lt;/p>
&lt;h2 id="基础网络配置">基础网络配置&lt;/h2>
&lt;p>确保每台 VyOS 有互联网连接和 DNS 解析：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>configure
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set interfaces ethernet eth0 address dhcp
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set system name-server 223.5.5.5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>commit
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>save
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>验证连通性：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>ping 223.5.5.5 count 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="部署-zerotier-容器">部署 ZeroTier 容器&lt;/h2>
&lt;p>VyOS 1.4 原生支持容器管理，我们使用 ZeroTier 官方 Docker 镜像。&lt;/p>
&lt;h3 id="1-拉取镜像">1. 拉取镜像&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>add container image zerotier/zerotier:latest
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>VyOS 1.4 下载镜像时没有进度条，静默等待即可。用以下命令确认：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>show container image
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-创建持久化目录">2. 创建持久化目录&lt;/h3>
&lt;p>将 ZeroTier 数据目录映射到 /config/ 下，确保重启后配置不丢失：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>sudo mkdir -p /config/containers/zt1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-配置容器">3. 配置容器&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span style="display:flex;">&lt;span>configure
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set container name zt1 allow&lt;span style="color:#f92672">-&lt;/span>host&lt;span style="color:#f92672">-&lt;/span>networks
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set container name zt1 cap&lt;span style="color:#f92672">-&lt;/span>add net&lt;span style="color:#f92672">-&lt;/span>admin
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set container name zt1 device tun destination &lt;span style="color:#f92672">/&lt;/span>dev&lt;span style="color:#f92672">/&lt;/span>net&lt;span style="color:#f92672">/&lt;/span>tun
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set container name zt1 device tun source &lt;span style="color:#f92672">/&lt;/span>dev&lt;span style="color:#f92672">/&lt;/span>net&lt;span style="color:#f92672">/&lt;/span>tun
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set container name zt1 image zerotier&lt;span style="color:#f92672">/&lt;/span>zerotier:latest
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set container name zt1 volume ZT_Path destination &lt;span style="color:#f92672">/&lt;/span>&lt;span style="color:#66d9ef">var&lt;/span>&lt;span style="color:#f92672">/&lt;/span>lib&lt;span style="color:#f92672">/&lt;/span>zerotier&lt;span style="color:#f92672">-&lt;/span>one
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set container name zt1 volume ZT_Path source &lt;span style="color:#f92672">/&lt;/span>config&lt;span style="color:#f92672">/&lt;/span>containers&lt;span style="color:#f92672">/&lt;/span>zt1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>commit
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>save
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>关键参数说明：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>allow-host-networks&lt;/strong>：容器共享宿主网络栈，ZeroTier 创建的接口直接出现在 VyOS 上&lt;/li>
&lt;li>&lt;strong>cap-add net-admin&lt;/strong>：授予容器网络管理权限，允许创建虚拟网卡&lt;/li>
&lt;li>&lt;strong>device tun&lt;/strong>：将宿主的 TUN 设备映射进容器&lt;/li>
&lt;li>&lt;strong>volume ZT_Path&lt;/strong>：持久化 ZeroTier 的身份文件和配置&lt;/li>
&lt;/ul>
&lt;p>验证容器状态：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>show container
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="映射-zerotier-接口">映射 ZeroTier 接口&lt;/h2>
&lt;p>通过 devicemap 文件将 ZeroTier 网络映射为指定的以太网接口（如 zt0），便于后续配置防火墙策略：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>sudo su
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cd /config/containers/zt1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cat &amp;gt; devicemap &amp;lt;&amp;lt; EOF
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&amp;lt;NetworkID&amp;gt;=zt0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>EOF
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>exit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>将 &lt;code>&amp;lt;NetworkID&amp;gt;&lt;/code> 替换为你在 ZeroTier Central 创建的网络 ID。然后重启容器使映射生效：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>restart container zt1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="加入-zerotier-网络">加入 ZeroTier 网络&lt;/h2>
&lt;p>进入容器，执行 join 命令：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>connect container zt1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>zerotier-cli join &amp;lt;NetworkID&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>exit
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>返回 &lt;code>200 join OK&lt;/code> 表示加入成功。记录下 &lt;code>zerotier-cli info&lt;/code> 输出的 Node ID。&lt;/p>
&lt;h2 id="在-central-中授权节点">在 Central 中授权节点&lt;/h2>
&lt;p>登录 ZeroTier Central，在对应网络中：&lt;/p>
&lt;ol>
&lt;li>找到新加入的节点，将 Node ID 与各路由器对上&lt;/li>
&lt;li>勾选 Auth 列的复选框授权&lt;/li>
&lt;li>可选：为每个节点设置名称便于识别&lt;/li>
&lt;/ol>
&lt;p>授权后，在 VyOS 上确认接口已获取 IP：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>show interfaces ethernet zt0
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>应能看到 ZeroTier 分配的 IP（如 10.13.x.x/16）。&lt;/p>
&lt;h2 id="配置路由">配置路由&lt;/h2>
&lt;h3 id="方法一通过-zerotier-central-推送路由推荐">方法一：通过 ZeroTier Central 推送路由（推荐）&lt;/h3>
&lt;p>在 ZeroTier Central 的 &lt;strong>Managed Routes&lt;/strong> 中添加各站点路由：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>目标网段&lt;/th>
&lt;th>Via（节点 IP）&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>10.1.0.0/24&lt;/td>
&lt;td>10.13.x.1（RTR1）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>10.2.0.0/24&lt;/td>
&lt;td>10.13.x.2（RTR2）&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>10.3.0.0/24&lt;/td>
&lt;td>10.13.x.3（RTR3）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>路由会自动下发到所有节点。ZeroTier 将路由 metric 设为 5000，不会覆盖本地更优先的路由。&lt;/p>
&lt;h3 id="方法二在-vyos-上配置静态路由">方法二：在 VyOS 上配置静态路由&lt;/h3>
&lt;p>如果不想依赖 Central 推送，也可以手动在 VyOS 上配置：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>configure
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># RTR1 上
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set protocols static route 10.2.0.0/24 next-hop 10.13.x.2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>set protocols static route 10.3.0.0/24 next-hop 10.13.x.3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>commit
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>save
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="验证连通性">验证连通性&lt;/h2>
&lt;p>查看路由表确认路由已下发：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>show ip route
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>从 RTR1 ping 其他站点：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>ping 10.2.0.1 source-address 10.1.0.1 count 2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ping 10.3.0.1 source-address 10.1.0.1 count 2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="注意事项">注意事项&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Managed Routes 上限&lt;/strong>：ZeroTier Central 限制每个网络最多 128 条托管路由&lt;/li>
&lt;li>&lt;strong>路由优先级&lt;/strong>：ZeroTier 推送的路由 metric 为 5000，本地静态路由默认 metric 20，后者优先&lt;/li>
&lt;li>&lt;strong>MTU&lt;/strong>：ZeroTier 虚拟接口 MTU 通常为 2800（内部会自动分片），一般无需调整&lt;/li>
&lt;li>&lt;strong>持久化&lt;/strong>：/config/ 下的文件在 save 和重启后会保留，容器数据和 devicemap 都在其中&lt;/li>
&lt;li>&lt;strong>容器自动启动&lt;/strong>：配置 set container name zt1 后，VyOS 重启会自动启动容器&lt;/li>
&lt;/ul>
&lt;h2 id="扩展大规模部署">扩展：大规模部署&lt;/h2>
&lt;p>如果站点数量超过 127 个（128 条路由减去默认路由），或者需要多租户隔离，可以考虑：&lt;/p>
&lt;ul>
&lt;li>使用 BGP over ZeroTier 替代托管路由，实现更灵活的路由策略&lt;/li>
&lt;li>结合 MPLS 实现多租户场景&lt;/li>
&lt;li>自建 ZeroTier Planet/Moon 控制器，脱离 Central 的托管路由限制&lt;/li>
&lt;/ul>
&lt;h2 id="总结">总结&lt;/h2>
&lt;p>在 VyOS 上通过容器运行 ZeroTier 是一种轻量且易维护的组网方式。核心步骤只有：拉镜像、配容器、join 网络、授权、配路由。对于没有公网 IP 的站点，ZeroTier 可以通过 NAT 穿透建立 P2P 连接，无需额外的 VPN 网关或 DDNS 配置。&lt;/p>
&lt;p>原文：&lt;a href="https://lev-0.com/2024/06/27/using-zerotier-for-site-to-site-routing-on-vyos/">Using ZeroTier for Site-to-Site Routing on VyOS&lt;/a>&lt;/p></content></item><item><title>Alpine Linux 部署 SmokePing 网络监控</title><link>https://www.0niu.cn/posts/alpine-linux-smokeping%E9%83%A8%E7%BD%B2/</link><pubDate>Wed, 25 Mar 2026 14:43:00 +0800</pubDate><guid>https://www.0niu.cn/posts/alpine-linux-smokeping%E9%83%A8%E7%BD%B2/</guid><description>&lt;p>本文介绍如何在 Alpine Linux 系统上部署 SmokePing 网络延迟监控工具，使用 Caddy 作为 Web 服务器，FCGIWrap 处理 CGI 脚本。&lt;/p>
&lt;h2 id="系统要求">系统要求&lt;/h2>
&lt;ul>
&lt;li>Alpine Linux 3.18+&lt;/li>
&lt;li>2GB+ RAM（推荐 4GB+）&lt;/li>
&lt;li>20GB+ 磁盘空间&lt;/li>
&lt;li>网络连接正常&lt;/li>
&lt;/ul>
&lt;h2 id="安装步骤">安装步骤&lt;/h2>
&lt;h3 id="1-安装必要软件包">1. 安装必要软件包&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 更新软件包索引&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>apk update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 安装 SmokePing 及相关组件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>apk add fcgiwrap fcgiwrap-openrc caddy smokeping smokeping-openrc
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 创建 fcgiwrap 服务用户&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>useradd -r fcgiwrap-openrc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-创建数据目录">2. 创建数据目录&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 创建 SmokePing 数据目录&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkdir -p /var/lib/smokeping/Ping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkdir -p /var/lib/smokeping/DNS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 设置权限&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chown smokeping:smokeping /var/lib/smokeping/Ping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chown smokeping:smokeping /var/lib/smokeping/DNS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chmod &lt;span style="color:#ae81ff">777&lt;/span> /var/lib/smokeping/images/Ping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chmod &lt;span style="color:#ae81ff">777&lt;/span> /var/lib/smokeping/images/DNS
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-配置-caddy-web-服务器">3. 配置 Caddy Web 服务器&lt;/h3>
&lt;p>创建 Caddy 配置文件 &lt;code>/etc/caddy/Caddyfile&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-caddyfile" data-lang="caddyfile">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">log&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">output&lt;/span> &lt;span style="color:#e6db74">file&lt;/span> &lt;span style="color:#e6db74">/var/log/caddy/access.log&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">roll_size&lt;/span> &lt;span style="color:#e6db74">100MB&lt;/span>&lt;span style="color:#75715e"> # 单个日志文件最大 100MB
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">roll_keep&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>&lt;span style="color:#75715e"> # 保留最近 10 个日志文件
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">roll_keep_for&lt;/span> &lt;span style="color:#ae81ff">720h&lt;/span>&lt;span style="color:#75715e"> # 保留 30 天（720 小时）
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">format&lt;/span> &lt;span style="color:#e6db74">console&lt;/span>&lt;span style="color:#75715e"> # 易读的格式，也可改用 json 格式（format json）
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://192.168.1.100 {&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> # 处理静态资源
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">handle&lt;/span> &lt;span style="color:#a6e22e">/js/*&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">root&lt;/span> &lt;span style="color:#a6e22e">*&lt;/span> &lt;span style="color:#e6db74">/usr/share/webapps/smokeping/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">file_server&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">handle&lt;/span> &lt;span style="color:#a6e22e">/css/*&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">root&lt;/span> &lt;span style="color:#a6e22e">*&lt;/span> &lt;span style="color:#e6db74">/usr/share/webapps/smokeping/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">file_server&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">handle&lt;/span> &lt;span style="color:#a6e22e">/imgcache/*&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">root&lt;/span> &lt;span style="color:#a6e22e">*&lt;/span> &lt;span style="color:#e6db74">/usr/share/webapps/smokeping/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">file_server&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">handle_path&lt;/span> &lt;span style="color:#a6e22e">/images/*&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">root&lt;/span> &lt;span style="color:#a6e22e">*&lt;/span> &lt;span style="color:#e6db74">/var/lib/smokeping/images&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">file_server&lt;/span> &lt;span style="color:#e6db74">browse&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> # 处理 CGI 请求
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">handle&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">root&lt;/span> &lt;span style="color:#a6e22e">*&lt;/span> &lt;span style="color:#e6db74">/usr/share/webapps/smokeping/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">reverse_proxy&lt;/span> &lt;span style="color:#e6db74">unix//run/fcgiwrap/fcgiwrap.sock&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transport&lt;/span> &lt;span style="color:#e6db74">fastcgi&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">env&lt;/span> &lt;span style="color:#e6db74">SCRIPT_FILENAME&lt;/span> &lt;span style="color:#e6db74">/usr/share/webapps/smokeping/smokeping.cgi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">split&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-配置-smokeping">4. 配置 SmokePing&lt;/h3>
&lt;p>创建配置文件 &lt;code>/etc/smokeping/config&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">***&lt;/span> General &lt;span style="color:#f92672">***&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>owner &lt;span style="color:#f92672">=&lt;/span> Demo User
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>contact &lt;span style="color:#f92672">=&lt;/span> admin&lt;span style="color:#960050;background-color:#1e0010">@&lt;/span>example&lt;span style="color:#f92672">.&lt;/span>com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mailhost &lt;span style="color:#f92672">=&lt;/span> mail&lt;span style="color:#f92672">.&lt;/span>example&lt;span style="color:#f92672">.&lt;/span>com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sendmail &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">/&lt;/span>usr&lt;span style="color:#f92672">/&lt;/span>sbin&lt;span style="color:#f92672">/&lt;/span>sendmail
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># NOTE: do not put the Image Cache below cgi-bin&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># since all files under cgi-bin will be executed ... this is not&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># good for images.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>imgcache &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">/&lt;/span>&lt;span style="color:#66d9ef">var&lt;/span>&lt;span style="color:#f92672">/&lt;/span>lib&lt;span style="color:#f92672">/&lt;/span>smokeping&lt;span style="color:#f92672">/&lt;/span>images
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>imgurl &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">/&lt;/span>images
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>datadir &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">/&lt;/span>&lt;span style="color:#66d9ef">var&lt;/span>&lt;span style="color:#f92672">/&lt;/span>lib&lt;span style="color:#f92672">/&lt;/span>smokeping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>piddir &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">/&lt;/span>run&lt;span style="color:#f92672">/&lt;/span>smokeping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cgiurl &lt;span style="color:#f92672">=&lt;/span> http:&lt;span style="color:#f92672">//&lt;/span>&lt;span style="color:#ae81ff">192.168&lt;/span>&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#ae81ff">1.100&lt;/span>&lt;span style="color:#f92672">/&lt;/span>smokeping&lt;span style="color:#f92672">.&lt;/span>cgi
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>smokemail &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">/&lt;/span>etc&lt;span style="color:#f92672">/&lt;/span>smokeping&lt;span style="color:#f92672">/&lt;/span>smokemail
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tmail &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">/&lt;/span>etc&lt;span style="color:#f92672">/&lt;/span>smokeping&lt;span style="color:#f92672">/&lt;/span>tmail
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># specify this to get syslog logging&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>syslogfacility &lt;span style="color:#f92672">=&lt;/span> local0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># each probe is now run in its own process&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># disable this to revert to the old behaviour&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># concurrentprobes = no&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="5-配置告警规则">5. 配置告警规则&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>*** Alerts ***
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>to = admin@example.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>from = smokeping@example.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># 定义各种告警规则
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+hostdown
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>type = loss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># in percent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pattern ==0%,==0%,==0%, ==U
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>comment = 对端无响应
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+bigloss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>type = loss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># in percent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pattern ==0%,==0%,==0%,==0%,&amp;gt;20%,&amp;gt;20%,&amp;gt;20%
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>comment = 连续3次采样-丢包率超过20%
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+lossdetect
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>type = loss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># in percent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pattern ==0%,==0%,==0%,==0%,&amp;gt;0%,&amp;gt;0%,&amp;gt;0%
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>comment = 连续3次采样-存在丢包
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+someloss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>type = loss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># in percent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pattern &amp;gt;0%,*12*,&amp;gt;0%,*12*,&amp;gt;0%
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>comment = 间断性丢包
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+rttdetect
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>type = rtt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># in milli seconds
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pattern &amp;lt;100,&amp;lt;100,&amp;lt;100,&amp;lt;100,&amp;lt;100,&amp;lt;150,&amp;gt;150,&amp;gt;150,&amp;gt;150
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>comment = 连续3次采样延迟增大-超过150ms
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="6-配置数据库设置">6. 配置数据库设置&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>*** Database ***
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>step = 300
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pings = 20
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># consfn mrhb steps total
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>AVERAGE 0.5 1 28800
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>AVERAGE 0.5 12 9600
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> MIN 0.5 12 9600
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> MAX 0.5 12 9600
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>AVERAGE 0.5 144 2400
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> MAX 0.5 144 2400
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> MIN 0.5 144 2400
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="7-配置显示模板">7. 配置显示模板&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>*** Presentation ***
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>template = /etc/smokeping/basepage.html
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>htmltitle = yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>graphborders = no
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># If enabled, treat all filter menu queries as literal strings instead of regex
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>literalsearch = no
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+ charts
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = Charts
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>title = The most interesting destinations
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>++ stddev
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sorter = StdDev(entries=&amp;gt;4)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>title = Top Standard Deviation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = Std Deviation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>format = Standard Deviation %f
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>++ max
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sorter = Max(entries=&amp;gt;5)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>title = Top Max Roundtrip Time
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = by Max
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>format = Max Roundtrip Time %f seconds
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>++ loss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sorter = Loss(entries=&amp;gt;5)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>title = Top Packet Loss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = Loss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>format = Packets Lost %f
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>++ median
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sorter = Median(entries=&amp;gt;5)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>title = Top Median Roundtrip Time
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = by Median
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>format = Median RTT %f seconds
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="8-配置探针">8. 配置探针&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>*** Probes ***
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+ FPing
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>binary = /usr/sbin/fping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+ DNS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>binary = /usr/bin/dig
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>lookup = g.cn
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pings = 5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>step = 180
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="9-配置主从模式可选">9. 配置主从模式（可选）&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>*** Slaves ***
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>secrets=/etc/smokeping/smokeping_secrets
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+boomer
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>display_name=boomer
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>color=0000ff
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+slave2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>display_name=another
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>color=00ff00
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="10-配置监控目标">10. 配置监控目标&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>*** Targets ***
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>alerts = someloss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>probe = FPing
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = Top
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>title = Network Latency Grapher
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>remark = Welcome to the SmokePing website of &amp;lt;b&amp;gt;Example Company&amp;lt;/b&amp;gt;. \
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Here you will learn all about the latency of our network.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+ Ping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = Ping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>title = 10.0.0.14 Pings
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>alerts = hostdown,bigloss,lossdetect,someloss,rttdetect
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>++ server1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = 192.168.1.50
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>host = 192.168.1.50
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>++ server2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = 192.168.1.51
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>host = 192.168.1.51
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+ DNS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = DNS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>probe = DNS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>alerts = hostdown,bigloss,lossdetect,someloss,rttdetect
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>++ dns-server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = 192.168.1.200
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>host = 192.168.1.200
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="启动服务">启动服务&lt;/h2>
&lt;h3 id="1-启动并启用服务">1. 启动并启用服务&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 启动 Caddy 服务&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service caddy start
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service caddy add
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 启动 SmokePing 服务&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service smokeping start
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service smokeping add
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 启动 fcgiwrap 服务&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service fcgiwrap start
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service fcgiwrap add
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-检查服务状态">2. 检查服务状态&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查 Caddy 状态&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service caddy status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查 SmokePing 状态&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service smokeping status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查 fcgiwrap 状态&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service fcgiwrap status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="验证部署">验证部署&lt;/h2>
&lt;p>访问 &lt;code>http://192.168.1.100/smokeping.cgi&lt;/code> 验证 SmokePing 是否正常工作。&lt;/p></description><content>&lt;p>本文介绍如何在 Alpine Linux 系统上部署 SmokePing 网络延迟监控工具，使用 Caddy 作为 Web 服务器，FCGIWrap 处理 CGI 脚本。&lt;/p>
&lt;h2 id="系统要求">系统要求&lt;/h2>
&lt;ul>
&lt;li>Alpine Linux 3.18+&lt;/li>
&lt;li>2GB+ RAM（推荐 4GB+）&lt;/li>
&lt;li>20GB+ 磁盘空间&lt;/li>
&lt;li>网络连接正常&lt;/li>
&lt;/ul>
&lt;h2 id="安装步骤">安装步骤&lt;/h2>
&lt;h3 id="1-安装必要软件包">1. 安装必要软件包&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 更新软件包索引&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>apk update
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 安装 SmokePing 及相关组件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>apk add fcgiwrap fcgiwrap-openrc caddy smokeping smokeping-openrc
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 创建 fcgiwrap 服务用户&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>useradd -r fcgiwrap-openrc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-创建数据目录">2. 创建数据目录&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 创建 SmokePing 数据目录&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkdir -p /var/lib/smokeping/Ping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mkdir -p /var/lib/smokeping/DNS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 设置权限&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chown smokeping:smokeping /var/lib/smokeping/Ping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chown smokeping:smokeping /var/lib/smokeping/DNS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chmod &lt;span style="color:#ae81ff">777&lt;/span> /var/lib/smokeping/images/Ping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chmod &lt;span style="color:#ae81ff">777&lt;/span> /var/lib/smokeping/images/DNS
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-配置-caddy-web-服务器">3. 配置 Caddy Web 服务器&lt;/h3>
&lt;p>创建 Caddy 配置文件 &lt;code>/etc/caddy/Caddyfile&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-caddyfile" data-lang="caddyfile">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">log&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">output&lt;/span> &lt;span style="color:#e6db74">file&lt;/span> &lt;span style="color:#e6db74">/var/log/caddy/access.log&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">roll_size&lt;/span> &lt;span style="color:#e6db74">100MB&lt;/span>&lt;span style="color:#75715e"> # 单个日志文件最大 100MB
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">roll_keep&lt;/span> &lt;span style="color:#ae81ff">10&lt;/span>&lt;span style="color:#75715e"> # 保留最近 10 个日志文件
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">roll_keep_for&lt;/span> &lt;span style="color:#ae81ff">720h&lt;/span>&lt;span style="color:#75715e"> # 保留 30 天（720 小时）
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">format&lt;/span> &lt;span style="color:#e6db74">console&lt;/span>&lt;span style="color:#75715e"> # 易读的格式，也可改用 json 格式（format json）
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>http://192.168.1.100 {&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> # 处理静态资源
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">handle&lt;/span> &lt;span style="color:#a6e22e">/js/*&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">root&lt;/span> &lt;span style="color:#a6e22e">*&lt;/span> &lt;span style="color:#e6db74">/usr/share/webapps/smokeping/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">file_server&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">handle&lt;/span> &lt;span style="color:#a6e22e">/css/*&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">root&lt;/span> &lt;span style="color:#a6e22e">*&lt;/span> &lt;span style="color:#e6db74">/usr/share/webapps/smokeping/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">file_server&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">handle&lt;/span> &lt;span style="color:#a6e22e">/imgcache/*&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">root&lt;/span> &lt;span style="color:#a6e22e">*&lt;/span> &lt;span style="color:#e6db74">/usr/share/webapps/smokeping/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">file_server&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">handle_path&lt;/span> &lt;span style="color:#a6e22e">/images/*&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">root&lt;/span> &lt;span style="color:#a6e22e">*&lt;/span> &lt;span style="color:#e6db74">/var/lib/smokeping/images&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">file_server&lt;/span> &lt;span style="color:#e6db74">browse&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"> # 处理 CGI 请求
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> &lt;span style="color:#66d9ef">handle&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">root&lt;/span> &lt;span style="color:#a6e22e">*&lt;/span> &lt;span style="color:#e6db74">/usr/share/webapps/smokeping/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">reverse_proxy&lt;/span> &lt;span style="color:#e6db74">unix//run/fcgiwrap/fcgiwrap.sock&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">transport&lt;/span> &lt;span style="color:#e6db74">fastcgi&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">env&lt;/span> &lt;span style="color:#e6db74">SCRIPT_FILENAME&lt;/span> &lt;span style="color:#e6db74">/usr/share/webapps/smokeping/smokeping.cgi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">split&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-配置-smokeping">4. 配置 SmokePing&lt;/h3>
&lt;p>创建配置文件 &lt;code>/etc/smokeping/config&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">***&lt;/span> General &lt;span style="color:#f92672">***&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>owner &lt;span style="color:#f92672">=&lt;/span> Demo User
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>contact &lt;span style="color:#f92672">=&lt;/span> admin&lt;span style="color:#960050;background-color:#1e0010">@&lt;/span>example&lt;span style="color:#f92672">.&lt;/span>com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>mailhost &lt;span style="color:#f92672">=&lt;/span> mail&lt;span style="color:#f92672">.&lt;/span>example&lt;span style="color:#f92672">.&lt;/span>com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sendmail &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">/&lt;/span>usr&lt;span style="color:#f92672">/&lt;/span>sbin&lt;span style="color:#f92672">/&lt;/span>sendmail
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># NOTE: do not put the Image Cache below cgi-bin&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># since all files under cgi-bin will be executed ... this is not&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># good for images.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>imgcache &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">/&lt;/span>&lt;span style="color:#66d9ef">var&lt;/span>&lt;span style="color:#f92672">/&lt;/span>lib&lt;span style="color:#f92672">/&lt;/span>smokeping&lt;span style="color:#f92672">/&lt;/span>images
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>imgurl &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">/&lt;/span>images
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>datadir &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">/&lt;/span>&lt;span style="color:#66d9ef">var&lt;/span>&lt;span style="color:#f92672">/&lt;/span>lib&lt;span style="color:#f92672">/&lt;/span>smokeping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>piddir &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">/&lt;/span>run&lt;span style="color:#f92672">/&lt;/span>smokeping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cgiurl &lt;span style="color:#f92672">=&lt;/span> http:&lt;span style="color:#f92672">//&lt;/span>&lt;span style="color:#ae81ff">192.168&lt;/span>&lt;span style="color:#f92672">.&lt;/span>&lt;span style="color:#ae81ff">1.100&lt;/span>&lt;span style="color:#f92672">/&lt;/span>smokeping&lt;span style="color:#f92672">.&lt;/span>cgi
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>smokemail &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">/&lt;/span>etc&lt;span style="color:#f92672">/&lt;/span>smokeping&lt;span style="color:#f92672">/&lt;/span>smokemail
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tmail &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#f92672">/&lt;/span>etc&lt;span style="color:#f92672">/&lt;/span>smokeping&lt;span style="color:#f92672">/&lt;/span>tmail
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># specify this to get syslog logging&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>syslogfacility &lt;span style="color:#f92672">=&lt;/span> local0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># each probe is now run in its own process&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># disable this to revert to the old behaviour&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># concurrentprobes = no&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="5-配置告警规则">5. 配置告警规则&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>*** Alerts ***
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>to = admin@example.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>from = smokeping@example.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># 定义各种告警规则
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+hostdown
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>type = loss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># in percent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pattern ==0%,==0%,==0%, ==U
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>comment = 对端无响应
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+bigloss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>type = loss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># in percent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pattern ==0%,==0%,==0%,==0%,&amp;gt;20%,&amp;gt;20%,&amp;gt;20%
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>comment = 连续3次采样-丢包率超过20%
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+lossdetect
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>type = loss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># in percent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pattern ==0%,==0%,==0%,==0%,&amp;gt;0%,&amp;gt;0%,&amp;gt;0%
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>comment = 连续3次采样-存在丢包
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+someloss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>type = loss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># in percent
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pattern &amp;gt;0%,*12*,&amp;gt;0%,*12*,&amp;gt;0%
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>comment = 间断性丢包
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+rttdetect
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>type = rtt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># in milli seconds
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pattern &amp;lt;100,&amp;lt;100,&amp;lt;100,&amp;lt;100,&amp;lt;100,&amp;lt;150,&amp;gt;150,&amp;gt;150,&amp;gt;150
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>comment = 连续3次采样延迟增大-超过150ms
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="6-配置数据库设置">6. 配置数据库设置&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>*** Database ***
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>step = 300
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pings = 20
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># consfn mrhb steps total
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>AVERAGE 0.5 1 28800
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>AVERAGE 0.5 12 9600
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> MIN 0.5 12 9600
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> MAX 0.5 12 9600
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>AVERAGE 0.5 144 2400
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> MAX 0.5 144 2400
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> MIN 0.5 144 2400
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="7-配置显示模板">7. 配置显示模板&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>*** Presentation ***
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>template = /etc/smokeping/basepage.html
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>htmltitle = yes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>graphborders = no
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span># If enabled, treat all filter menu queries as literal strings instead of regex
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>literalsearch = no
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+ charts
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = Charts
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>title = The most interesting destinations
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>++ stddev
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sorter = StdDev(entries=&amp;gt;4)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>title = Top Standard Deviation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = Std Deviation
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>format = Standard Deviation %f
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>++ max
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sorter = Max(entries=&amp;gt;5)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>title = Top Max Roundtrip Time
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = by Max
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>format = Max Roundtrip Time %f seconds
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>++ loss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sorter = Loss(entries=&amp;gt;5)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>title = Top Packet Loss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = Loss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>format = Packets Lost %f
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>++ median
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sorter = Median(entries=&amp;gt;5)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>title = Top Median Roundtrip Time
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = by Median
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>format = Median RTT %f seconds
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="8-配置探针">8. 配置探针&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>*** Probes ***
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+ FPing
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>binary = /usr/sbin/fping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+ DNS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>binary = /usr/bin/dig
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>lookup = g.cn
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pings = 5
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>step = 180
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="9-配置主从模式可选">9. 配置主从模式（可选）&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>*** Slaves ***
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>secrets=/etc/smokeping/smokeping_secrets
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+boomer
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>display_name=boomer
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>color=0000ff
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+slave2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>display_name=another
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>color=00ff00
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="10-配置监控目标">10. 配置监控目标&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>*** Targets ***
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>alerts = someloss
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>probe = FPing
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = Top
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>title = Network Latency Grapher
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>remark = Welcome to the SmokePing website of &amp;lt;b&amp;gt;Example Company&amp;lt;/b&amp;gt;. \
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Here you will learn all about the latency of our network.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+ Ping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = Ping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>title = 10.0.0.14 Pings
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>alerts = hostdown,bigloss,lossdetect,someloss,rttdetect
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>++ server1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = 192.168.1.50
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>host = 192.168.1.50
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>++ server2
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = 192.168.1.51
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>host = 192.168.1.51
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>+ DNS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = DNS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>probe = DNS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>alerts = hostdown,bigloss,lossdetect,someloss,rttdetect
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>++ dns-server
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = 192.168.1.200
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>host = 192.168.1.200
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="启动服务">启动服务&lt;/h2>
&lt;h3 id="1-启动并启用服务">1. 启动并启用服务&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 启动 Caddy 服务&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service caddy start
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service caddy add
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 启动 SmokePing 服务&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service smokeping start
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service smokeping add
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 启动 fcgiwrap 服务&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service fcgiwrap start
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service fcgiwrap add
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-检查服务状态">2. 检查服务状态&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查 Caddy 状态&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service caddy status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查 SmokePing 状态&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service smokeping status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查 fcgiwrap 状态&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service fcgiwrap status
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="验证部署">验证部署&lt;/h2>
&lt;p>访问 &lt;code>http://192.168.1.100/smokeping.cgi&lt;/code> 验证 SmokePing 是否正常工作。&lt;/p>
&lt;h2 id="常见问题">常见问题&lt;/h2>
&lt;h3 id="1-caddy-启动失败">1. Caddy 启动失败&lt;/h3>
&lt;p>&lt;strong>症状&lt;/strong>：&lt;code>rc-service caddy start&lt;/code> 失败
&lt;strong>解决&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查配置文件语法&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>caddy validate --config /etc/caddy/Caddyfile
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查端口占用&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>netstat -tlnp | grep &lt;span style="color:#ae81ff">80&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>netstat -tlnp | grep &lt;span style="color:#ae81ff">443&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-smokeping-无法生成图表">2. SmokePing 无法生成图表&lt;/h3>
&lt;p>&lt;strong>症状&lt;/strong>：访问 CGI 脚本显示空白或错误
&lt;strong>解决&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查 fcgiwrap 服务&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service fcgiwrap status
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查 CGI 脚本权限&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ls -la /usr/share/webapps/smokeping/smokeping.cgi
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查数据目录权限&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ls -la /var/lib/smokeping/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-权限问题">3. 权限问题&lt;/h3>
&lt;p>&lt;strong>症状&lt;/strong>：无法创建数据或图片
&lt;strong>解决&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 确保所有目录权限正确&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chown -R smokeping:smokeping /var/lib/smokeping/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chmod -R &lt;span style="color:#ae81ff">755&lt;/span> /var/lib/smokeping/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chmod -R &lt;span style="color:#ae81ff">777&lt;/span> /var/lib/smokeping/images/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-网络连接问题">4. 网络连接问题&lt;/h3>
&lt;p>&lt;strong>症状&lt;/strong>：SmokePing 无法 ping 目标主机
&lt;strong>解决&lt;/strong>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 测试 fping 命令&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>fping -c &lt;span style="color:#ae81ff">5&lt;/span> 10.0.0.14
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查防火墙设置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>iptables -L -n
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="日志管理">日志管理&lt;/h2>
&lt;h3 id="1-caddy-日志">1. Caddy 日志&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看 Caddy 访问日志&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tail -f /var/log/caddy/access.log
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看系统日志&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tail -f /var/log/messages | grep caddy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-smokeping-日志">2. SmokePing 日志&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看 SmokePing 日志&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tail -f /var/log/messages | grep smokeping
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看进程日志&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>journalctl -u smokeping -f
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="定期维护">定期维护&lt;/h2>
&lt;h3 id="1-数据清理">1. 数据清理&lt;/h3>
&lt;p>SmokePing 会自动管理数据文件，但如果需要手动清理：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看磁盘使用情况&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>du -sh /var/lib/smokeping/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 清理旧的图片文件（如果需要）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>find /var/lib/smokeping/images -type f -mtime +90 -delete
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-服务重启">2. 服务重启&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 重启所有服务&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service caddy restart
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service fcgiwrap restart
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>rc-service smokeping restart
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-配置备份">3. 配置备份&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 备份配置文件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>tar -czf /backup/smokeping-config-&lt;span style="color:#66d9ef">$(&lt;/span>date +%Y%m%d&lt;span style="color:#66d9ef">)&lt;/span>.tar.gz &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> /etc/caddy/Caddyfile &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> /etc/smokeping/smokeping.config
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="扩展功能">扩展功能&lt;/h2>
&lt;h3 id="1-添加更多监控目标">1. 添加更多监控目标&lt;/h3>
&lt;p>在配置文件的 &lt;code>*** Targets ***&lt;/code> 部分添加新的目标：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>+ new-host
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>menu = New Host
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>host = 192.168.1.100
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>alerts = hostdown,bigloss
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-配置自定义告警">2. 配置自定义告警&lt;/h3>
&lt;p>根据业务需求自定义告警规则：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>+ custom-alert
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>type = rtt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>pattern &amp;gt;1000,&amp;lt;1000,&amp;lt;1000,&amp;lt;1000,&amp;lt;1000,&amp;lt;1000,&amp;gt;2000
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>comment = 延迟异常增高
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="性能优化">性能优化&lt;/h2>
&lt;h3 id="1-调整采样间隔">1. 调整采样间隔&lt;/h3>
&lt;p>根据网络状况调整 &lt;code>step&lt;/code> 参数：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>step = 600 # 10 分钟采样一次，减少资源占用
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-限制并发探针">2. 限制并发探针&lt;/h3>
&lt;p>如果资源有限，可以禁用并发探针：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span># disable concurrent probes
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>concurrentprobes = no
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>通过以上配置，您将在 Alpine Linux 上成功部署一个功能完整的 SmokePing 网络监控系统，提供实时的网络延迟、丢包率和抖动监控。&lt;/p>
&lt;h2 id="参考资料">参考资料&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://www.cnblogs.com/thatsit/p/6395506.html">自定义smokeping告警(邮件+短信)&lt;/a> - 详细的配置参数和优化建议&lt;/li>
&lt;/ul></content></item><item><title>Gitea 完整实践指南：从部署到自动化</title><link>https://www.0niu.cn/posts/gitea-guide/</link><pubDate>Fri, 13 Mar 2026 00:00:00 +0800</pubDate><guid>https://www.0niu.cn/posts/gitea-guide/</guid><description>&lt;h2 id="一gitea-概述">一、Gitea 概述&lt;/h2>
&lt;h3 id="11-什么是-gitea">1.1 什么是 Gitea&lt;/h3>
&lt;p>Gitea 是一个轻量级的自托管 Git 服务，采用 Go 语言编写，是 GitHub 和 GitLab 的轻量替代方案。它提供了完整的代码托管功能，包括 Issues、Pull Requests、Wiki、CI/CD 等，同时保持了极低的资源占用。&lt;/p>
&lt;h4 id="为什么选择-gitea">为什么选择 Gitea？&lt;/h4>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>特性&lt;/th>
&lt;th>Gitea&lt;/th>
&lt;th>GitLab&lt;/th>
&lt;th>GitHub&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>资源占用&lt;/td>
&lt;td>极低（100MB RAM）&lt;/td>
&lt;td>高（2GB+ RAM）&lt;/td>
&lt;td>SaaS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>部署复杂度&lt;/td>
&lt;td>简单&lt;/td>
&lt;td>复杂&lt;/td>
&lt;td>无需部署&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>数据控制&lt;/td>
&lt;td>完全自控&lt;/td>
&lt;td>完全自控&lt;/td>
&lt;td>依赖第三方&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>国内访问&lt;/td>
&lt;td>可部署内网&lt;/td>
&lt;td>可部署内网&lt;/td>
&lt;td>需代理&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="12-核心特性">1.2 核心特性&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>轻量级&lt;/strong>：单个二进制文件，内存占用极低&lt;/li>
&lt;li>&lt;strong>易部署&lt;/strong>：支持二进制、Docker、包管理器多种方式&lt;/li>
&lt;li>&lt;strong>完整功能&lt;/strong>：Issues、PR、Wiki、CI/CD、LFS、包管理&lt;/li>
&lt;li>&lt;strong>插件系统&lt;/strong>：支持通过 Markdown 插件扩展功能&lt;/li>
&lt;li>&lt;strong>兼容性强&lt;/strong>：支持 GitHub/GitLab 导入，API 兼容&lt;/li>
&lt;/ul>
&lt;h3 id="13-适用场景">1.3 适用场景&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>个人/小团队代码托管&lt;/strong> - 轻量快速启动&lt;/li>
&lt;li>&lt;strong>企业内网 Git 服务&lt;/strong> - 数据完全自控&lt;/li>
&lt;li>&lt;strong>CI/CD 平台基础&lt;/strong> - 结合 Actions 构建自动化流水线&lt;/li>
&lt;li>&lt;strong>镜像仓库中转站&lt;/strong> - 在国内网络环境下加速访问&lt;/li>
&lt;/ol>
&lt;hr></description><content>&lt;h2 id="一gitea-概述">一、Gitea 概述&lt;/h2>
&lt;h3 id="11-什么是-gitea">1.1 什么是 Gitea&lt;/h3>
&lt;p>Gitea 是一个轻量级的自托管 Git 服务，采用 Go 语言编写，是 GitHub 和 GitLab 的轻量替代方案。它提供了完整的代码托管功能，包括 Issues、Pull Requests、Wiki、CI/CD 等，同时保持了极低的资源占用。&lt;/p>
&lt;h4 id="为什么选择-gitea">为什么选择 Gitea？&lt;/h4>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>特性&lt;/th>
&lt;th>Gitea&lt;/th>
&lt;th>GitLab&lt;/th>
&lt;th>GitHub&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>资源占用&lt;/td>
&lt;td>极低（100MB RAM）&lt;/td>
&lt;td>高（2GB+ RAM）&lt;/td>
&lt;td>SaaS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>部署复杂度&lt;/td>
&lt;td>简单&lt;/td>
&lt;td>复杂&lt;/td>
&lt;td>无需部署&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>数据控制&lt;/td>
&lt;td>完全自控&lt;/td>
&lt;td>完全自控&lt;/td>
&lt;td>依赖第三方&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>国内访问&lt;/td>
&lt;td>可部署内网&lt;/td>
&lt;td>可部署内网&lt;/td>
&lt;td>需代理&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="12-核心特性">1.2 核心特性&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>轻量级&lt;/strong>：单个二进制文件，内存占用极低&lt;/li>
&lt;li>&lt;strong>易部署&lt;/strong>：支持二进制、Docker、包管理器多种方式&lt;/li>
&lt;li>&lt;strong>完整功能&lt;/strong>：Issues、PR、Wiki、CI/CD、LFS、包管理&lt;/li>
&lt;li>&lt;strong>插件系统&lt;/strong>：支持通过 Markdown 插件扩展功能&lt;/li>
&lt;li>&lt;strong>兼容性强&lt;/strong>：支持 GitHub/GitLab 导入，API 兼容&lt;/li>
&lt;/ul>
&lt;h3 id="13-适用场景">1.3 适用场景&lt;/h3>
&lt;ol>
&lt;li>&lt;strong>个人/小团队代码托管&lt;/strong> - 轻量快速启动&lt;/li>
&lt;li>&lt;strong>企业内网 Git 服务&lt;/strong> - 数据完全自控&lt;/li>
&lt;li>&lt;strong>CI/CD 平台基础&lt;/strong> - 结合 Actions 构建自动化流水线&lt;/li>
&lt;li>&lt;strong>镜像仓库中转站&lt;/strong> - 在国内网络环境下加速访问&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="二gitea-部署与配置">二、Gitea 部署与配置&lt;/h2>
&lt;h3 id="21-系统要求">2.1 系统要求&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>资源&lt;/th>
&lt;th>最低配置&lt;/th>
&lt;th>推荐配置&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>CPU&lt;/td>
&lt;td>1核&lt;/td>
&lt;td>2核+&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>内存&lt;/td>
&lt;td>512MB&lt;/td>
&lt;td>1GB+&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>磁盘&lt;/td>
&lt;td>10GB&lt;/td>
&lt;td>50GB+&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>操作系统&lt;/td>
&lt;td>Linux/macOS/Windows&lt;/td>
&lt;td>Linux 64位&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="22-二进制安装推荐">2.2 二进制安装（推荐）&lt;/h3>
&lt;h4 id="下载与安装">下载与安装&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 下载最新版本（国内用户建议使用镜像站点）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget https://dl.gitea.io/gitea/1.22/gitea-1.22.0-linux-amd64
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 或使用 GitHub 镜像加速&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget https://mirror.ghproxy.com/https://github.com/go-gitea/gitea/releases/download/v1.22.0/gitea-1.22.0-linux-amd64
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 添加执行权限&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chmod +x gitea-1.22.0-linux-amd64
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 移动到系统路径&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo mv gitea-1.22.0-linux-amd64 /usr/local/bin/gitea
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 创建 gitea 用户&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo useradd -r -m -d /var/lib/gitea -s /bin/bash gitea
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="配置-systemd-服务">配置 Systemd 服务&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 创建服务文件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo nano /etc/systemd/system/gitea.service
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>gitea.service 配置：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[Unit]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Description&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">Gitea&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">After&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">syslog.target&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">After&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">network.target&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">After&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">mariadb.service postgresql.service mysql.service&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[Service]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Type&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">simple&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">User&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">gitea&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Group&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">gitea&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">WorkingDirectory&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">/var/lib/gitea&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">ExecStart&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">/usr/local/bin/gitea web --config /etc/gitea/app.ini&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Restart&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">always&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Environment&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">USER=gitea&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">HOME&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">/var/lib/gitea&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[Install]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">WantedBy&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">multi-user.target&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 重载并启动服务&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo systemctl daemon-reload
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo systemctl enable gitea
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo systemctl start gitea
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看状态&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo systemctl status gitea
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="23-初始化配置">2.3 初始化配置&lt;/h3>
&lt;p>首次访问 &lt;code>http://your-server:3000&lt;/code> 会进入初始化向导：&lt;/p>
&lt;h4 id="数据库配置sqlite">数据库配置（SQLite）&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">数据库类型：&lt;/span>SQLite3
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">路径：&lt;/span>&lt;span style="color:#f92672">/&lt;/span>&lt;span style="color:#66d9ef">var&lt;/span>&lt;span style="color:#f92672">/&lt;/span>lib&lt;span style="color:#f92672">/&lt;/span>gitea&lt;span style="color:#f92672">/&lt;/span>data&lt;span style="color:#f92672">/&lt;/span>gitea&lt;span style="color:#f92672">.&lt;/span>db
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>SQLite 适合小规模部署，无需额外数据库服务，配置最简单。&lt;/p>
&lt;h4 id="基本设置">基本设置&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>服务器域名：your-server.example.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Gitea 基础 URL：https://your-server.example.com/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>SSH 服务端口：22 或自定义
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>监听 HTTP 端口：3000
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="管理员账号">管理员账号&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>用户名：admin
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>密码：[设置强密码]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>邮箱：admin@example.com
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="24-appini-配置文件详解">2.4 app.ini 配置文件详解&lt;/h3>
&lt;p>配置文件位置：&lt;code>/etc/gitea/app.ini&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[server]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">PROTOCOL&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">http&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">DOMAIN&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">your-server.example.com&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">ROOT_URL&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">https://your-server.example.com/&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">HTTP_PORT&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">3000&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">DISABLE_SSH&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">SSH_PORT&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">22&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">START_SSH_SERVER&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">LFS_START_SERVER&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[database]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">TYPE&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">sqlite3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">PATH&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">/var/lib/gitea/data/gitea.db&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[repository]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">ROOT&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">/var/lib/gitea/repositories&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">SCRIPT_TYPE&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">bash&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">DEFAULT_PUSH_CREATE_PRIVATE&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[lfs]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">PATH&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">/var/lib/gitea/data/lfs&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[service]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">DISABLE_REGISTRATION&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">REQUIRE_SIGNIN_VIEW&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">REGISTER_EMAIL_CONFIRM&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[session]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">PROVIDER&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">file&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="25-国内网络环境适配">2.5 国内网络环境适配&lt;/h3>
&lt;h4 id="ssl-证书配置lets-encrypt">SSL 证书配置（Let&amp;rsquo;s Encrypt）&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 安装 certbot&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo apt install certbot
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 申请证书&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo certbot certonly --standalone -d your-server.example.com
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 证书路径&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>证书：/etc/letsencrypt/live/your-server.example.com/fullchain.pem
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>私钥：/etc/letsencrypt/live/your-server.example.com/privkey.pem
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>修改 &lt;code>app.ini&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[server]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">PROTOCOL&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">https&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">CERT_FILE&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">/etc/letsencrypt/live/your-server.example.com/fullchain.pem&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">KEY_FILE&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">/etc/letsencrypt/live/your-server.example.com/privkey.pem&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 重启服务&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo systemctl restart gitea
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="自签名证书内网使用">自签名证书（内网使用）&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 生成自签名证书&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo openssl req -x509 -nodes -days &lt;span style="color:#ae81ff">365&lt;/span> -newkey rsa:2048 &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> -keyout /etc/ssl/private/gitea.key &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> -out /etc/ssl/certs/gitea.crt
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 设置权限&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo chmod &lt;span style="color:#ae81ff">600&lt;/span> /etc/ssl/private/gitea.key
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo chmod &lt;span style="color:#ae81ff">644&lt;/span> /etc/ssl/certs/gitea.crt
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>修改 &lt;code>app.ini&lt;/code> 指向自签名证书路径。&lt;/p>
&lt;hr>
&lt;h2 id="三gitea-actionscicd">三、Gitea Actions（CI/CD）&lt;/h2>
&lt;h3 id="31-actions-简介">3.1 Actions 简介&lt;/h3>
&lt;p>Gitea Actions 是 Gitea 1.19+ 引入的 CI/CD 功能，兼容 GitHub Actions 语法。它由以下组件构成：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Gitea 实例&lt;/strong>：存储 Workflow 文件，触发构建任务&lt;/li>
&lt;li>&lt;strong>Act Runner&lt;/strong>：执行 Workflow 的 Runner 程序&lt;/li>
&lt;li>&lt;strong>Job&lt;/strong>：实际运行的工作单元&lt;/li>
&lt;/ul>
&lt;h3 id="32-act-runner-部署">3.2 Act Runner 部署&lt;/h3>
&lt;h4 id="下载与安装-1">下载与安装&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 下载 act runner&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget https://dl.gitea.com/act-runner/act-runner-0.2.10-linux-amd64
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 添加执行权限&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>chmod +x act-runner-0.2.10-linux-amd64
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo mv act-runner-0.2.10-linux-amd64 /usr/local/bin/act-runner
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 创建 runner 用户&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo useradd -r -m -d /var/lib/act-runner -s /bin/bash act-runner
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="注册-runner">注册 Runner&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 获取注册令牌（在 Gitea 管理页面获取）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Gitea 设置 -&amp;gt; Actions -&amp;gt; Runners -&amp;gt; New Runner&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 注册 Runner&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo -u act-runner act-runner register &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --instance https://your-server.example.com &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --token &amp;lt;your-token&amp;gt; &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --name &lt;span style="color:#e6db74">&amp;#34;linux-runner&amp;#34;&lt;/span> &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --labels &lt;span style="color:#e6db74">&amp;#34;docker:docker&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 创建 systemd 服务&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo nano /etc/systemd/system/act-runner.service
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>act-runner.service 配置：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[Unit]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Description&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">Gitea Actions Runner&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">After&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">network.target&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[Service]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Type&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">simple&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">User&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">act-runner&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Group&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">act-runner&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">WorkingDirectory&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">/var/lib/act-runner&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">ExecStart&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">/usr/local/bin/act-runner daemon --config /var/lib/act-runner/config.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">Restart&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">always&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[Install]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">WantedBy&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">multi-user.target&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 启动服务&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo systemctl daemon-reload
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo systemctl enable act-runner
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo systemctl start act-runner
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo systemctl status act-runner
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="33-workflow-编写">3.3 Workflow 编写&lt;/h3>
&lt;p>Workflow 文件位于仓库的 &lt;code>.gitea/workflows/&lt;/code> 目录下，使用 YAML 格式。&lt;/p>
&lt;h4 id="基本结构">基本结构&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">CI Workflow&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">on&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">push&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">branches&lt;/span>: [ &lt;span style="color:#ae81ff">main, develop ]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">pull_request&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">branches&lt;/span>: [ &lt;span style="color:#ae81ff">main ]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">jobs&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">build&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">runs-on&lt;/span>: &lt;span style="color:#ae81ff">ubuntu-latest&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">steps&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Checkout&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">uses&lt;/span>: &lt;span style="color:#ae81ff">actions/checkout@v4&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Run tests&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">run&lt;/span>: |&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> echo &amp;#34;Running tests...&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> make test&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="自动构建-docker-镜像">自动构建 Docker 镜像&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Build and Push Docker Image&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">on&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">push&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">branches&lt;/span>: [ &lt;span style="color:#ae81ff">main ]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">tags&lt;/span>: [ &lt;span style="color:#e6db74">&amp;#39;v*&amp;#39;&lt;/span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">jobs&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">build&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">runs-on&lt;/span>: &lt;span style="color:#ae81ff">ubuntu-latest&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">steps&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Checkout&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">uses&lt;/span>: &lt;span style="color:#ae81ff">actions/checkout@v4&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Set up Docker Buildx&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">uses&lt;/span>: &lt;span style="color:#ae81ff">docker/setup-buildx-action@v3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Login to Registry&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">uses&lt;/span>: &lt;span style="color:#ae81ff">docker/login-action@v3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">with&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">registry&lt;/span>: &lt;span style="color:#ae81ff">registry.example.com&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">username&lt;/span>: &lt;span style="color:#ae81ff">${{ secrets.REGISTRY_USERNAME }}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">password&lt;/span>: &lt;span style="color:#ae81ff">${{ secrets.REGISTRY_PASSWORD }}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Build and push&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">uses&lt;/span>: &lt;span style="color:#ae81ff">docker/build-push-action@v5&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">with&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">context&lt;/span>: &lt;span style="color:#ae81ff">.&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">push&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">tags&lt;/span>: &lt;span style="color:#ae81ff">registry.example.com/myapp:latest,registry.example.com/myapp:${{ github.ref_name }}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">cache-from&lt;/span>: &lt;span style="color:#ae81ff">type=registry,ref=registry.example.com/myapp:buildcache&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">cache-to&lt;/span>: &lt;span style="color:#ae81ff">type=registry,ref=registry.example.com/myapp:buildcache,mode=max&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="自动化部署">自动化部署&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Deploy to Server&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">on&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">push&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">branches&lt;/span>: [ &lt;span style="color:#ae81ff">main ]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">jobs&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">deploy&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">runs-on&lt;/span>: &lt;span style="color:#ae81ff">ubuntu-latest&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">steps&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Checkout&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">uses&lt;/span>: &lt;span style="color:#ae81ff">actions/checkout@v4&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Deploy via SSH&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">uses&lt;/span>: &lt;span style="color:#ae81ff">appleboy/ssh-action@v1.0.0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">with&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">host&lt;/span>: &lt;span style="color:#ae81ff">${{ secrets.DEPLOY_HOST }}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">username&lt;/span>: &lt;span style="color:#ae81ff">${{ secrets.DEPLOY_USER }}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">key&lt;/span>: &lt;span style="color:#ae81ff">${{ secrets.DEPLOY_SSH_KEY }}&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">script&lt;/span>: |&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> cd /opt/myapp
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> git pull origin main
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> docker-compose down
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> docker-compose pull
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> docker-compose up -d&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="34-国内网络优化">3.4 国内网络优化&lt;/h3>
&lt;h4 id="runner-镜像源配置">Runner 镜像源配置&lt;/h4>
&lt;p>在 Runner 服务器上配置 Docker 镜像加速：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 修改 Docker daemon 配置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo nano /etc/docker/daemon.json
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-json" data-lang="json">&lt;span style="display:flex;">&lt;span>{
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">&amp;#34;registry-mirrors&amp;#34;&lt;/span>: [
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;https://docker.m.daocloud.io&amp;#34;&lt;/span>,
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;https://docker.1panel.live&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ]
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 重启 Docker&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo systemctl restart docker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="workflow-中使用镜像加速">Workflow 中使用镜像加速&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Build with Mirror&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">on&lt;/span>: [&lt;span style="color:#ae81ff">push]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">jobs&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">build&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">runs-on&lt;/span>: &lt;span style="color:#ae81ff">ubuntu-latest&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">container&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">ghcr.m.daocloud.io/catthehacker/ubuntu:act-latest&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">steps&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">uses&lt;/span>: &lt;span style="color:#ae81ff">actions/checkout@v4&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Configure npm mirror&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">run&lt;/span>: |&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> npm config set registry https://registry.npmmirror.com&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Configure pip mirror&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">run&lt;/span>: |&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Configure Go proxy&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">run&lt;/span>: |&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> go env -w GOPROXY=https://goproxy.cn,direct&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Build&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">run&lt;/span>: &lt;span style="color:#ae81ff">make build&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="超时配置giteatimeout">超时配置（giteatimeout）&lt;/h4>
&lt;p>Actions Runner 在国内网络环境下容易遇到超时问题。需要在多个层面配置：&lt;/p>
&lt;p>&lt;strong>1. Runner 服务配置&lt;/strong>&lt;/p>
&lt;p>修改 &lt;code>/var/lib/act-runner/config.yaml&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">runner&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 连接超时（秒）&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">fetch_timeout&lt;/span>: &lt;span style="color:#ae81ff">180&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 运行超时（秒），0 表示不限制&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">timeout&lt;/span>: &lt;span style="color:#ae81ff">10800&lt;/span> &lt;span style="color:#75715e"># 3 小时&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>2. Workflow 级别超时&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">jobs&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">build&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">timeout-minutes&lt;/span>: &lt;span style="color:#ae81ff">60&lt;/span> &lt;span style="color:#75715e"># 单个 Job 超时&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">steps&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">Download with retry&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">run&lt;/span>: |&lt;span style="color:#e6db74">
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> # 使用重试脚本
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> for i in {1..3}; do
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> curl -L -o package.tar.gz ${{ env.DOWNLOAD_URL }} &amp;amp;&amp;amp; break
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> echo &amp;#34;Retrying... ($i/3)&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> sleep 10
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> done&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>3. 网络层面优化&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 增加系统网络超时&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo sysctl -w net.ipv4.tcp_keepalive_time&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">600&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo sysctl -w net.ipv4.tcp_keepalive_intvl&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">60&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo sysctl -w net.ipv4.tcp_keepalive_probes&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="35-secrets-管理">3.5 Secrets 管理&lt;/h3>
&lt;p>在仓库中配置敏感信息：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-gdscript3" data-lang="gdscript3">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#960050;background-color:#1e0010">仓库设置&lt;/span> &lt;span style="color:#f92672">-&amp;gt;&lt;/span> Secrets &lt;span style="color:#f92672">and&lt;/span> variables &lt;span style="color:#f92672">-&amp;gt;&lt;/span> Actions &lt;span style="color:#f92672">-&amp;gt;&lt;/span> New Repository Secret
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>常用 Secrets：&lt;/p>
&lt;ul>
&lt;li>&lt;code>REGISTRY_USERNAME&lt;/code> - 镜像仓库用户名&lt;/li>
&lt;li>&lt;code>REGISTRY_PASSWORD&lt;/code> - 镜像仓库密码&lt;/li>
&lt;li>&lt;code>DEPLOY_SSH_KEY&lt;/code> - 部署服务器 SSH 私钥&lt;/li>
&lt;li>&lt;code>DEPLOY_HOST&lt;/code> - 部署服务器地址&lt;/li>
&lt;li>&lt;code>DEPLOY_USER&lt;/code> - 部署用户名&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="四仓库镜像repository-mirror">四、仓库镜像（Repository Mirror）&lt;/h2>
&lt;h3 id="41-镜像功能概述">4.1 镜像功能概述&lt;/h3>
&lt;p>Gitea 支持两种镜像模式：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>类型&lt;/th>
&lt;th>方向&lt;/th>
&lt;th>说明&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Pull 镜像&lt;/td>
&lt;td>远程 → Gitea&lt;/td>
&lt;td>从 GitHub/GitLab 拉取更新到 Gitea&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Push 镜像&lt;/td>
&lt;td>Gitea → 远程&lt;/td>
&lt;td>将 Gitea 的更改推送到远程&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="42-从-github-同步pull-镜像">4.2 从 GitHub 同步（Pull 镜像）&lt;/h3>
&lt;h4 id="配置步骤">配置步骤&lt;/h4>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>在 GitHub 生成 Personal Access Token&lt;/strong>&lt;/p>
&lt;p>GitHub 设置 -&amp;gt; Developer settings -&amp;gt; Personal access tokens -&amp;gt; Tokens (classic)&lt;/p>
&lt;ul>
&lt;li>勾选 &lt;code>repo&lt;/code> 权限&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>在 Gitea 创建 Pull 镜像&lt;/strong>&lt;/p>
&lt;p>仓库设置 -&amp;gt; Mirroring -&amp;gt; Add New Pull Mirror&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>仓库地址：https://github.com/username/repo.git
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>用户名：your-github-username
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>密码：your-github-pat-token
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>同步间隔：8h（推荐）
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>手动触发同步&lt;/strong>&lt;/p>
&lt;p>仓库设置 -&amp;gt; Mirroring -&amp;gt; Sync Now&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h4 id="配置文件方式">配置文件方式&lt;/h4>
&lt;p>修改 &lt;code>app.ini&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[mirror]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">ENABLED&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">DEFAULT_INTERVAL&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">8h&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="43-推送到远程仓库push-镜像">4.3 推送到远程仓库（Push 镜像）&lt;/h3>
&lt;h4 id="配置步骤-1">配置步骤&lt;/h4>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>获取目标仓库认证信息&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>GitHub：使用 Personal Access Token&lt;/li>
&lt;li>Gitee：使用 Personal Access Token（私有令牌）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>在 Gitea 创建 Push 镜像&lt;/strong>&lt;/p>
&lt;p>仓库设置 -&amp;gt; Mirroring -&amp;gt; Add New Push Mirror&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>仓库地址：https://gitee.com/username/repo.git
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>用户名：your-gitee-username
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>密码：your-gitee-token
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>触发时机&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>每次推送到 Gitea 仓库后自动推送&lt;/li>
&lt;li>可配置推送特定分支&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;h3 id="44-国内网络场景应用">4.4 国内网络场景应用&lt;/h3>
&lt;h4 id="gitee-镜像中转架构">Gitee 镜像中转架构&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>┌─────────┐ ┌─────────┐ ┌─────────┐
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ GitHub │ Pull │ Gitea │ Push │ Gitee │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ (国外) │ ──────&amp;gt; │ (内网) │ ──────&amp;gt; │ (国内) │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>└─────────┘ └─────────┘ └─────────┘
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ↑ ↓
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> │ │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> └────────────── 团队克隆 ───────────────┘
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>实施步骤：&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>设置 GitHub → Gitea Pull 镜像&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># GitHub 同步配置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[mirror]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">INTERVAL&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">4h&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ul>
&lt;li>每 4 小时自动拉取 GitHub 更新&lt;/li>
&lt;li>团队成员直接从 Gitea 克隆（内网快速）&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>设置 Gitea → Gitee Push 镜像&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>将 Gitea 仓库推送到 Gitee&lt;/li>
&lt;li>外部合作伙伴从 Gitee 克隆&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>多地域镜像&lt;/strong>&lt;/p>
&lt;p>在多个 Gitee 实例之间建立镜像链，实现就近访问。&lt;/p>
&lt;/li>
&lt;/ol>
&lt;h4 id="私有仓库镜像">私有仓库镜像&lt;/h4>
&lt;p>&lt;strong>使用 SSH 密钥认证：&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 生成 SSH 密钥对&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ssh-keygen -t ed25519 -C &lt;span style="color:#e6db74">&amp;#34;gitea-mirror&amp;#34;&lt;/span> -f ~/.ssh/gitea_mirror
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 公钥添加到 GitHub/Gitee&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cat ~/.ssh/gitea_mirror.pub
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>在 Gitea 镜像配置中使用 SSH URL：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>git@github.com:username/repo.git
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="45-镜像故障排查">4.5 镜像故障排查&lt;/h3>
&lt;h4 id="常见问题">常见问题&lt;/h4>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>问题&lt;/th>
&lt;th>原因&lt;/th>
&lt;th>解决方案&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>认证失败&lt;/td>
&lt;td>Token 过期&lt;/td>
&lt;td>更新 PAT&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>同步超时&lt;/td>
&lt;td>网络慢&lt;/td>
&lt;td>增加超时时间、使用代理&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LFS 文件未同步&lt;/td>
&lt;td>LFS 未配置&lt;/td>
&lt;td>配置 Git LFS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>大仓库同步慢&lt;/td>
&lt;td>历史记录大&lt;/td>
&lt;td>浅克隆（&amp;ndash;depth 1）&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h4 id="调试同步">调试同步&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看 Gitea 日志&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo journalctl -u gitea -f
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 手动测试镜像&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cd /var/lib/gitea/repositories/username/repo.git
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>sudo -u gitea git fetch --all -v
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="lfs-同步配置">LFS 同步配置&lt;/h4>
&lt;p>修改 &lt;code>app.ini&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[lfs]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">STORAGE_TYPE&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">local&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">PATH&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">/var/lib/gitea/data/lfs&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[server]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">LFS_START_SERVER&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">LFS_JWT_SECRET&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">your-secret-key&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;hr>
&lt;h2 id="五高级话题">五、高级话题&lt;/h2>
&lt;h3 id="51-第三方认证集成">5.1 第三方认证集成&lt;/h3>
&lt;h4 id="ldap-集成">LDAP 集成&lt;/h4>
&lt;p>修改 &lt;code>app.ini&lt;/code>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[service]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">ENABLE_CAPTCHA&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[security]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">ENABLE_LOGIN_SOURCE_COOKIE&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[ldap]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">ENABLED&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">SOURCE_NAME&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">Company LDAP&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">HOST&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">ldap-server.example.com:389&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">BIND_DN&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">cn=admin,dc=example,dc=com&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">BIND_PASSWORD&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">password&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">SEARCH_BASE&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">ou=users,dc=example,dc=com&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">USERNAME_ATTRIBUTE&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">uid&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">USER_FILTER&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">(&amp;amp;(objectClass=person)(|(uid=%[1]s)(mail=%[1]s)))&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">EMAIL_ATTRIBUTE&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">mail&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">NAME_ATTRIBUTE&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">givenName&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">SURNAME_ATTRIBUTE&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">sn&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="52-webhook-集成">5.2 Webhook 集成&lt;/h3>
&lt;p>配置 Webhook 实现自动化通知：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>仓库设置 -&amp;gt; Webhooks -&amp;gt; Add Webhook
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>常见集成：&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>企业微信机器人&lt;/li>
&lt;li>钉钉机器人&lt;/li>
&lt;li>Slack&lt;/li>
&lt;li>自定义 HTTP 服务&lt;/li>
&lt;/ul>
&lt;h3 id="53-安全加固">5.3 安全加固&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>启用 2FA（双因素认证）&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>设置 -&amp;gt; 安全 -&amp;gt; 启用 2FA
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>API 限流&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[api]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">ENABLE_SWAGGER&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">MAX_RESPONSE_ITEMS&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">50&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>审计日志&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ini" data-lang="ini">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">[log]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">MODE&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">file&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">LEVEL&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">info&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>查看日志：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>设置 -&amp;gt; 审计日志
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h2 id="六参考资源">六、参考资源&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://docs.gitea.com/">Gitea 官方文档&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions 文档&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.gitea.com/usage/actions/act-runner">Act Runner 文档&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docker.m.daocloud.io/">Docker Hub 镜像加速&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://registry.npmmirror.com/">NPM 镜像源&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://goproxy.cn/">Go Module 代理&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://pypi.tuna.tsinghua.edu.cn/simple/">PyPI 清华镜像&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://mirror.ghproxy.com/">GitHub 镜像加速&lt;/a>&lt;/li>
&lt;/ul></content></item><item><title>FRR OSPF Route-MAP 配置指南</title><link>https://www.0niu.cn/posts/frr-ospf-route-map/</link><pubDate>Wed, 11 Mar 2026 00:04:00 +0800</pubDate><guid>https://www.0niu.cn/posts/frr-ospf-route-map/</guid><description>&lt;h2 id="概述">概述&lt;/h2>
&lt;p>Route-Map 是 FRR (FRRouting) 中强大的路由策略工具，用于控制 OSPF 路由的发布和接收。通过 Route-Map，可以实现：&lt;/p>
&lt;ul>
&lt;li>路由过滤&lt;/li>
&lt;li>路由属性修改&lt;/li>
&lt;li>条件路由发布&lt;/li>
&lt;/ul>
&lt;h2 id="基本概念">基本概念&lt;/h2>
&lt;h3 id="route-map-结构">Route-Map 结构&lt;/h3>
&lt;p>Route-Map 由一条或多条 &lt;strong>sequence&lt;/strong> 组成，每个 sequence 有：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>匹配条件 (match)&lt;/strong>：定义哪些路由会被处理&lt;/li>
&lt;li>&lt;strong>动作 (action)&lt;/strong>：&lt;code>permit&lt;/code>（允许）或 &lt;code>deny&lt;/code>（拒绝）&lt;/li>
&lt;li>&lt;strong>设置语句 (set)&lt;/strong>：修改路由属性&lt;/li>
&lt;/ul>
&lt;h3 id="顺序执行">顺序执行&lt;/h3>
&lt;p>Route-Map 按序列号从小到大依次执行：&lt;/p>
&lt;ul>
&lt;li>一旦匹配成功，执行对应动作并停止&lt;/li>
&lt;li>如果所有 sequence 都未匹配，默认拒绝&lt;/li>
&lt;/ul>
&lt;h3 id="常用匹配条件">常用匹配条件&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>匹配类型&lt;/th>
&lt;th>说明&lt;/th>
&lt;th>示例&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>ip address&lt;/code>&lt;/td>
&lt;td>匹配 IP 地址/前缀&lt;/td>
&lt;td>&lt;code>match ip address prefix-list LIST&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>interface&lt;/code>&lt;/td>
&lt;td>匹配出接口&lt;/td>
&lt;td>&lt;code>match interface eth0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>metric&lt;/code>&lt;/td>
&lt;td>匹配路由开销&lt;/td>
&lt;td>&lt;code>match metric 100&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>protocol&lt;/code>&lt;/td>
&lt;td>匹配路由协议类型&lt;/td>
&lt;td>&lt;code>match protocol ospf&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>next-hop&lt;/code>&lt;/td>
&lt;td>匹配下一跳地址&lt;/td>
&lt;td>&lt;code>match ip next-hop A.B.C.D&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tag&lt;/code>&lt;/td>
&lt;td>匹配路由标签&lt;/td>
&lt;td>&lt;code>match tag 100&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>as-path&lt;/code>&lt;/td>
&lt;td>匹配 AS 路径（BGP）&lt;/td>
&lt;td>&lt;code>match as-path 100&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="支持的协议类型">支持的协议类型&lt;/h3>
&lt;ul>
&lt;li>&lt;code>ospf&lt;/code> - OSPF 路由&lt;/li>
&lt;li>&lt;code>static&lt;/code> - 静态路由&lt;/li>
&lt;li>&lt;code>connected&lt;/code> - 直连路由&lt;/li>
&lt;li>&lt;code>kernel&lt;/code> - 内核路由&lt;/li>
&lt;li>&lt;code>rip&lt;/code> - RIP 路由&lt;/li>
&lt;li>&lt;code>bgp&lt;/code> - BGP 路由&lt;/li>
&lt;li>&lt;code>isis&lt;/code> - IS-IS 路由&lt;/li>
&lt;li>&lt;code>pim&lt;/code> - PIM 路由&lt;/li>
&lt;/ul>
&lt;h2 id="配置示例">配置示例&lt;/h2>
&lt;h3 id="1-基本路由过滤">1. 基本路由过滤&lt;/h3>
&lt;h4 id="场景只允许特定网段的路由进入-ospf">场景：只允许特定网段的路由进入 OSPF&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 定义前缀列表&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ip prefix-list INTERNAL_NETS seq &lt;span style="color:#ae81ff">5&lt;/span> permit 10.0.0.0/8 le &lt;span style="color:#ae81ff">24&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ip prefix-list INTERNAL_NETS seq &lt;span style="color:#ae81ff">10&lt;/span> permit 172.16.0.0/12 le &lt;span style="color:#ae81ff">24&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ip prefix-list INTERNAL_NETS seq &lt;span style="color:#ae81ff">15&lt;/span> permit 192.168.0.0/16 le &lt;span style="color:#ae81ff">24&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ip prefix-list INTERNAL_NETS seq &lt;span style="color:#ae81ff">20&lt;/span> deny any
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 应用到路由重分发&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute connected route-map FILTER_CONNECTED
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 定义 route-map&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map FILTER_CONNECTED permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list INTERNAL_NETS
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="场景过滤掉特定路由">场景：过滤掉特定路由&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 定义要过滤的网段&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list BLOCK_NETS seq &lt;span style="color:#ae81ff">5&lt;/span> deny 192.168.100.0/24
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list BLOCK_NETS seq &lt;span style="color:#ae81ff">10&lt;/span> permit any
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 应用到路由注入&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> default-information originate route-map FILTER_DEFAULT
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map FILTER_DEFAULT permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list BLOCK_NETS
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-修改路由属性">2. 修改路由属性&lt;/h3>
&lt;h4 id="场景修改路由开销值">场景：修改路由开销值&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>route-map SET_METRIC permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map SET_METRIC permit &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list SPECIAL_NETS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">50&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 应用&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute static route-map SET_METRIC
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="场景根据路由类型设置不同开销">场景：根据路由类型设置不同开销&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>route-map METRIC_BY_TYPE permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list CRITICAL_NETS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map METRIC_BY_TYPE permit &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list NORMAL_NETS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-条件路由发布">3. 条件路由发布&lt;/h3>
&lt;h4 id="场景只在有特定路由时发布默认路由">场景：只在有特定路由时发布默认路由&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 定义匹配条件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list ISP_ROUTE seq &lt;span style="color:#ae81ff">5&lt;/span> permit 0.0.0.0/0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map CONDITIONAL_DEFAULT permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list ISP_ROUTE
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> default-information originate route-map CONDITIONAL_DEFAULT always
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-重分发控制">4. 重分发控制&lt;/h3>
&lt;h4 id="场景从-bgp-重分发到-ospf-时过滤路由">场景：从 BGP 重分发到 OSPF 时过滤路由&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 只允许特定 BGP 路由进入 OSPF&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list FROM_BGP seq &lt;span style="color:#ae81ff">5&lt;/span> permit 203.0.113.0/24
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list FROM_BGP seq &lt;span style="color:#ae81ff">10&lt;/span> permit 198.51.100.0/24
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list FROM_BGP seq &lt;span style="color:#ae81ff">15&lt;/span> deny any
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map BGP_TO_OSPF permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list FROM_BGP
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">50&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric-type type-1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute bgp route-map BGP_TO_OSPF
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="场景不同协议间重分发">场景：不同协议间重分发&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 静态路由重分发&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map STATIC_TO_OSPF permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list STATIC_NETS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 直连路由重分发&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map CONNECTED_TO_OSPF permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match interface eth0 eth1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute connected route-map CONNECTED_TO_OSPF
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute static route-map STATIC_TO_OSPF
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="5-基于-ospf-协议的匹配">5. 基于 OSPF 协议的匹配&lt;/h3>
&lt;h4 id="场景只处理-ospf-协议的路由">场景：只处理 OSPF 协议的路由&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 匹配所有 OSPF 路由&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map ONLY_OSPF permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">50&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 在重分发时应用&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute connected route-map ONLY_OSPF
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="场景排除-ospf-路由处理其他协议">场景：排除 OSPF 路由，处理其他协议&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 排除 OSPF 路由，只允许其他协议的路由&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXCLUDE_OSPF permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol static
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol connected
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol kernel
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXCLUDE_OSPF deny &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 或者使用更简洁的方式&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map FILTER_PROTOCOL permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol static
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">30&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>!
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map FILTER_PROTOCOL permit &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol connected
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>!
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 默认拒绝其他协议（包括 ospf）&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="场景根据-ospf-路由类型处理">场景：根据 OSPF 路由类型处理&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 区分 OSPF 内部路由和外部路由&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map OSPF_INTERNAL permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list INTERNAL_PREFIX
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map OSPF_EXTERNAL permit &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute ospf route-map OSPF_EXTERNAL
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="6-区域间路由控制">6. 区域间路由控制&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 区域间路由过滤&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> area &lt;span style="color:#ae81ff">1&lt;/span> filter-list prefix IN_AREA1 in
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> area &lt;span style="color:#ae81ff">1&lt;/span> filter-list prefix OUT_AREA1 out
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list IN_AREA1 seq &lt;span style="color:#ae81ff">5&lt;/span> deny 192.168.10.0/24
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list IN_AREA1 seq &lt;span style="color:#ae81ff">10&lt;/span> permit 10.0.0.0/8 le &lt;span style="color:#ae81ff">24&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list IN_AREA1 seq &lt;span style="color:#ae81ff">15&lt;/span> permit 172.16.0.0/12 le &lt;span style="color:#ae81ff">24&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list IN_AREA1 seq &lt;span style="color:#ae81ff">20&lt;/span> permit 192.168.0.0/16 le &lt;span style="color:#ae81ff">24&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="常用命令">常用命令&lt;/h2>
&lt;h3 id="查看配置">查看配置&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 显示 route-map 配置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show route-map
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 显示前缀列表&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip prefix-list
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 显示 OSPF 路由表&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip ospf route
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 显示 OSPF 数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip ospf database
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 显示 route-map 统计信息&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip protocols ospf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="调试命令">调试命令&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 启用 OSPF 调试&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>debug ospf lsa
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>debug ospf zebra
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看路由重分发情况&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip ospf redistribute
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看各协议路由&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route static
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route connected
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route bgp
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看 route-map 匹配统计&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route-map detail
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="最佳实践">最佳实践&lt;/h2>
&lt;h3 id="1-命名规范">1. 命名规范&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 使用描述性的名称&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map FILTER_EXTERNAL_STATIC permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map SET_METRIC_INTERNAL permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map BGP_TO_OSPF permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-序列号规划">2. 序列号规划&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 使用 10 的倍数，方便插入新规则&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXAMPLE permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXAMPLE permit &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXAMPLE permit &lt;span style="color:#ae81ff">30&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 后续可以在 10 和 20 之间插入&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXAMPLE permit &lt;span style="color:#ae81ff">15&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-默认拒绝策略">3. 默认拒绝策略&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 总是添加最后的拒绝规则&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXAMPLE permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list ALLOW_NETS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>!
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXAMPLE deny &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>!
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 隐含的 deny any 在最后&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-测试配置">4. 测试配置&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 临时设置为 permit 观察效果&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map TEMP_DEBUG permit &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">999&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 确认无误后调整&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>no route-map TEMP_DEBUG permit &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description><content>&lt;h2 id="概述">概述&lt;/h2>
&lt;p>Route-Map 是 FRR (FRRouting) 中强大的路由策略工具，用于控制 OSPF 路由的发布和接收。通过 Route-Map，可以实现：&lt;/p>
&lt;ul>
&lt;li>路由过滤&lt;/li>
&lt;li>路由属性修改&lt;/li>
&lt;li>条件路由发布&lt;/li>
&lt;/ul>
&lt;h2 id="基本概念">基本概念&lt;/h2>
&lt;h3 id="route-map-结构">Route-Map 结构&lt;/h3>
&lt;p>Route-Map 由一条或多条 &lt;strong>sequence&lt;/strong> 组成，每个 sequence 有：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>匹配条件 (match)&lt;/strong>：定义哪些路由会被处理&lt;/li>
&lt;li>&lt;strong>动作 (action)&lt;/strong>：&lt;code>permit&lt;/code>（允许）或 &lt;code>deny&lt;/code>（拒绝）&lt;/li>
&lt;li>&lt;strong>设置语句 (set)&lt;/strong>：修改路由属性&lt;/li>
&lt;/ul>
&lt;h3 id="顺序执行">顺序执行&lt;/h3>
&lt;p>Route-Map 按序列号从小到大依次执行：&lt;/p>
&lt;ul>
&lt;li>一旦匹配成功，执行对应动作并停止&lt;/li>
&lt;li>如果所有 sequence 都未匹配，默认拒绝&lt;/li>
&lt;/ul>
&lt;h3 id="常用匹配条件">常用匹配条件&lt;/h3>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>匹配类型&lt;/th>
&lt;th>说明&lt;/th>
&lt;th>示例&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>ip address&lt;/code>&lt;/td>
&lt;td>匹配 IP 地址/前缀&lt;/td>
&lt;td>&lt;code>match ip address prefix-list LIST&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>interface&lt;/code>&lt;/td>
&lt;td>匹配出接口&lt;/td>
&lt;td>&lt;code>match interface eth0&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>metric&lt;/code>&lt;/td>
&lt;td>匹配路由开销&lt;/td>
&lt;td>&lt;code>match metric 100&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>protocol&lt;/code>&lt;/td>
&lt;td>匹配路由协议类型&lt;/td>
&lt;td>&lt;code>match protocol ospf&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>next-hop&lt;/code>&lt;/td>
&lt;td>匹配下一跳地址&lt;/td>
&lt;td>&lt;code>match ip next-hop A.B.C.D&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>tag&lt;/code>&lt;/td>
&lt;td>匹配路由标签&lt;/td>
&lt;td>&lt;code>match tag 100&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>as-path&lt;/code>&lt;/td>
&lt;td>匹配 AS 路径（BGP）&lt;/td>
&lt;td>&lt;code>match as-path 100&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h3 id="支持的协议类型">支持的协议类型&lt;/h3>
&lt;ul>
&lt;li>&lt;code>ospf&lt;/code> - OSPF 路由&lt;/li>
&lt;li>&lt;code>static&lt;/code> - 静态路由&lt;/li>
&lt;li>&lt;code>connected&lt;/code> - 直连路由&lt;/li>
&lt;li>&lt;code>kernel&lt;/code> - 内核路由&lt;/li>
&lt;li>&lt;code>rip&lt;/code> - RIP 路由&lt;/li>
&lt;li>&lt;code>bgp&lt;/code> - BGP 路由&lt;/li>
&lt;li>&lt;code>isis&lt;/code> - IS-IS 路由&lt;/li>
&lt;li>&lt;code>pim&lt;/code> - PIM 路由&lt;/li>
&lt;/ul>
&lt;h2 id="配置示例">配置示例&lt;/h2>
&lt;h3 id="1-基本路由过滤">1. 基本路由过滤&lt;/h3>
&lt;h4 id="场景只允许特定网段的路由进入-ospf">场景：只允许特定网段的路由进入 OSPF&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 定义前缀列表&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ip prefix-list INTERNAL_NETS seq &lt;span style="color:#ae81ff">5&lt;/span> permit 10.0.0.0/8 le &lt;span style="color:#ae81ff">24&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ip prefix-list INTERNAL_NETS seq &lt;span style="color:#ae81ff">10&lt;/span> permit 172.16.0.0/12 le &lt;span style="color:#ae81ff">24&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ip prefix-list INTERNAL_NETS seq &lt;span style="color:#ae81ff">15&lt;/span> permit 192.168.0.0/16 le &lt;span style="color:#ae81ff">24&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ip prefix-list INTERNAL_NETS seq &lt;span style="color:#ae81ff">20&lt;/span> deny any
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># 应用到路由重分发&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute connected route-map FILTER_CONNECTED
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 定义 route-map&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map FILTER_CONNECTED permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list INTERNAL_NETS
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="场景过滤掉特定路由">场景：过滤掉特定路由&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 定义要过滤的网段&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list BLOCK_NETS seq &lt;span style="color:#ae81ff">5&lt;/span> deny 192.168.100.0/24
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list BLOCK_NETS seq &lt;span style="color:#ae81ff">10&lt;/span> permit any
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 应用到路由注入&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> default-information originate route-map FILTER_DEFAULT
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map FILTER_DEFAULT permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list BLOCK_NETS
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-修改路由属性">2. 修改路由属性&lt;/h3>
&lt;h4 id="场景修改路由开销值">场景：修改路由开销值&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>route-map SET_METRIC permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map SET_METRIC permit &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list SPECIAL_NETS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">50&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 应用&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute static route-map SET_METRIC
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="场景根据路由类型设置不同开销">场景：根据路由类型设置不同开销&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>route-map METRIC_BY_TYPE permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list CRITICAL_NETS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map METRIC_BY_TYPE permit &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list NORMAL_NETS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-条件路由发布">3. 条件路由发布&lt;/h3>
&lt;h4 id="场景只在有特定路由时发布默认路由">场景：只在有特定路由时发布默认路由&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 定义匹配条件&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list ISP_ROUTE seq &lt;span style="color:#ae81ff">5&lt;/span> permit 0.0.0.0/0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map CONDITIONAL_DEFAULT permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list ISP_ROUTE
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> default-information originate route-map CONDITIONAL_DEFAULT always
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-重分发控制">4. 重分发控制&lt;/h3>
&lt;h4 id="场景从-bgp-重分发到-ospf-时过滤路由">场景：从 BGP 重分发到 OSPF 时过滤路由&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 只允许特定 BGP 路由进入 OSPF&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list FROM_BGP seq &lt;span style="color:#ae81ff">5&lt;/span> permit 203.0.113.0/24
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list FROM_BGP seq &lt;span style="color:#ae81ff">10&lt;/span> permit 198.51.100.0/24
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list FROM_BGP seq &lt;span style="color:#ae81ff">15&lt;/span> deny any
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map BGP_TO_OSPF permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list FROM_BGP
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">50&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric-type type-1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute bgp route-map BGP_TO_OSPF
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="场景不同协议间重分发">场景：不同协议间重分发&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 静态路由重分发&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map STATIC_TO_OSPF permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list STATIC_NETS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 直连路由重分发&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map CONNECTED_TO_OSPF permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match interface eth0 eth1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute connected route-map CONNECTED_TO_OSPF
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute static route-map STATIC_TO_OSPF
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="5-基于-ospf-协议的匹配">5. 基于 OSPF 协议的匹配&lt;/h3>
&lt;h4 id="场景只处理-ospf-协议的路由">场景：只处理 OSPF 协议的路由&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 匹配所有 OSPF 路由&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map ONLY_OSPF permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">50&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 在重分发时应用&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute connected route-map ONLY_OSPF
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="场景排除-ospf-路由处理其他协议">场景：排除 OSPF 路由，处理其他协议&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 排除 OSPF 路由，只允许其他协议的路由&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXCLUDE_OSPF permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol static
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol connected
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol kernel
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXCLUDE_OSPF deny &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 或者使用更简洁的方式&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map FILTER_PROTOCOL permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol static
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">30&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>!
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map FILTER_PROTOCOL permit &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol connected
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>!
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 默认拒绝其他协议（包括 ospf）&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="场景根据-ospf-路由类型处理">场景：根据 OSPF 路由类型处理&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 区分 OSPF 内部路由和外部路由&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map OSPF_INTERNAL permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list INTERNAL_PREFIX
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map OSPF_EXTERNAL permit &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match protocol ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute ospf route-map OSPF_EXTERNAL
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="6-区域间路由控制">6. 区域间路由控制&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 区域间路由过滤&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> area &lt;span style="color:#ae81ff">1&lt;/span> filter-list prefix IN_AREA1 in
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> area &lt;span style="color:#ae81ff">1&lt;/span> filter-list prefix OUT_AREA1 out
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list IN_AREA1 seq &lt;span style="color:#ae81ff">5&lt;/span> deny 192.168.10.0/24
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list IN_AREA1 seq &lt;span style="color:#ae81ff">10&lt;/span> permit 10.0.0.0/8 le &lt;span style="color:#ae81ff">24&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list IN_AREA1 seq &lt;span style="color:#ae81ff">15&lt;/span> permit 172.16.0.0/12 le &lt;span style="color:#ae81ff">24&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list IN_AREA1 seq &lt;span style="color:#ae81ff">20&lt;/span> permit 192.168.0.0/16 le &lt;span style="color:#ae81ff">24&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="常用命令">常用命令&lt;/h2>
&lt;h3 id="查看配置">查看配置&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 显示 route-map 配置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show route-map
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 显示前缀列表&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip prefix-list
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 显示 OSPF 路由表&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip ospf route
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 显示 OSPF 数据库&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip ospf database
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 显示 route-map 统计信息&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip protocols ospf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="调试命令">调试命令&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 启用 OSPF 调试&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>debug ospf lsa
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>debug ospf zebra
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看路由重分发情况&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip ospf redistribute
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看各协议路由&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route static
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route connected
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route bgp
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 查看 route-map 匹配统计&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route-map detail
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="最佳实践">最佳实践&lt;/h2>
&lt;h3 id="1-命名规范">1. 命名规范&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 使用描述性的名称&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map FILTER_EXTERNAL_STATIC permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map SET_METRIC_INTERNAL permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map BGP_TO_OSPF permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-序列号规划">2. 序列号规划&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 使用 10 的倍数，方便插入新规则&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXAMPLE permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXAMPLE permit &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXAMPLE permit &lt;span style="color:#ae81ff">30&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 后续可以在 10 和 20 之间插入&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXAMPLE permit &lt;span style="color:#ae81ff">15&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-默认拒绝策略">3. 默认拒绝策略&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 总是添加最后的拒绝规则&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXAMPLE permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list ALLOW_NETS
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>!
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXAMPLE deny &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>!
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 隐含的 deny any 在最后&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-测试配置">4. 测试配置&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 临时设置为 permit 观察效果&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map TEMP_DEBUG permit &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">999&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 确认无误后调整&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>no route-map TEMP_DEBUG permit &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="故障排查">故障排查&lt;/h2>
&lt;h3 id="问题-1路由未按预期发布">问题 1：路由未按预期发布&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查 route-map 配置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show route-map
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查前缀列表匹配&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip prefix-list
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查 OSPF 进程&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show running-config | section router ospf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="问题-2路由开销未生效">问题 2：路由开销未生效&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查 route-map 是否正确应用&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip protocols ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 验证 set 语句&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show route-map &amp;lt;name&amp;gt;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查路由表&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route ospf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="问题-3所有路由都被过滤">问题 3：所有路由都被过滤&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查是否忘记 permit 规则&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show route-map
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 确认最后一条规则&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map EXAMPLE permit &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="问题-4协议匹配不生效">问题 4：协议匹配不生效&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查路由协议类型&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 确认 route-map 中的 protocol 匹配&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show route-map
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show running-config | section route-map
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 验证特定协议的路由&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route static
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route connected
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查匹配统计&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>show ip route-map detail
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="实战案例">实战案例&lt;/h2>
&lt;h3 id="案例多出口路由选路">案例：多出口路由选路&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 定义 ISP1 的路由&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list ISP1_ROUTES seq &lt;span style="color:#ae81ff">5&lt;/span> permit 203.0.113.0/24
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 定义 ISP2 的路由&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip prefix-list ISP2_ROUTES seq &lt;span style="color:#ae81ff">5&lt;/span> permit 198.51.100.0/24
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 修改 ISP1 路由开销&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map PREFER_ISP1 permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list ISP1_ROUTES
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map PREFER_ISP1 permit &lt;span style="color:#ae81ff">20&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> match ip address prefix-list ISP2_ROUTES
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute static route-map PREFER_ISP1
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="案例路由聚合">案例：路由聚合&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 创建聚合路由&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ip route 10.0.0.0/8 Null0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 控制聚合路由发布&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>route-map AGGREGATE_ROUTE permit &lt;span style="color:#ae81ff">10&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric &lt;span style="color:#ae81ff">50&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> set metric-type type-1
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>router ospf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> redistribute static route-map AGGREGATE_ROUTE
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="还有一条命令全局过滤prefix-list-blocknet中匹配的路由条目">还有一条命令，全局过滤prefix-list BLOCKNET中匹配的路由条目&lt;/h3>
&lt;p>&lt;code>ip protocol ospf route-map BLOCKNET&lt;/code>&lt;/p>
&lt;h2 id="参考资源">参考资源&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://docs.frrouting.org/">FRR 官方文档&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://tools.ietf.org/html/rfc2328">OSPF 协议 RFC 2328&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.frrouting.org/en/latest/routemap.html">Route-Map 配置参考&lt;/a>&lt;/li>
&lt;/ul>
&lt;hr></content></item><item><title>Netbox 迁移到 k3s</title><link>https://www.0niu.cn/posts/netbox%E8%BF%81%E7%A7%BB%E5%88%B0k3s/</link><pubDate>Sat, 28 Feb 2026 12:37:00 +0800</pubDate><guid>https://www.0niu.cn/posts/netbox%E8%BF%81%E7%A7%BB%E5%88%B0k3s/</guid><description>&lt;p>本文记录了将 Netbox 从旧环境迁移到 k3s 集群的过程。&lt;/p>
&lt;h2 id="迁移步骤">迁移步骤&lt;/h2>
&lt;h3 id="1-备份数据库">1. 备份数据库&lt;/h3>
&lt;p>使用 &lt;code>pg_dump&lt;/code> 导出 Netbox 数据库，排除变更日志表以减小备份体积：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pg_dump --username netbox --password --host localhost --exclude-table-data&lt;span style="color:#f92672">=&lt;/span>extras_objectchange netbox &amp;gt; netbox.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-删除旧-pod">2. 删除旧 Pod&lt;/h3>
&lt;p>为了避免 Pod 竞争和锁定问题，先删除现有的 Netbox Pod：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl delete po netbox-68cbd8b854-2hvgp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-修改-postgresql-认证方式">3. 修改 PostgreSQL 认证方式&lt;/h3>
&lt;h4 id="临时禁用密码认证">临时禁用密码认证&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 进入 PostgreSQL Pod&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl exec -it netbox-postgresql-0 -- sed -ibak &lt;span style="color:#e6db74">&amp;#39;s/^\([^#]*\)md5/\1trust/g&amp;#39;&lt;/span> /opt/bitnami/postgresql/conf/pg_hba.conf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 重新加载配置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl exec -it netbox-postgresql-0 -- pg_ctl reload
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="创建新数据库和用户">创建新数据库和用户&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl exec -it netbox-postgresql-0 -- psql -U postgres
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>DROP DATABASE netbox;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>CREATE DATABASE netbox;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ALTER USER netbox WITH PASSWORD &lt;span style="color:#e6db74">&amp;#39;balabalabala&amp;#39;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ALTER DATABASE netbox OWNER TO netbox;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>-- PostgreSQL &lt;span style="color:#ae81ff">15&lt;/span> 及以上版本需要
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">\c&lt;/span>onnect netbox;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>GRANT CREATE ON SCHEMA public TO netbox;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="恢复密码认证">恢复密码认证&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl exec -it netbox-postgresql-0 -- sed -i &lt;span style="color:#e6db74">&amp;#39;s/^\([^#]*\)trust/\1md5/g&amp;#39;&lt;/span> /opt/bitnami/postgresql/conf/pg_hba.conf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl exec -it netbox-postgresql-0 -- pg_ctl reload
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-恢复数据库">4. 恢复数据库&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl exec -it netbox-postgresql-0 -- sh -c &lt;span style="color:#e6db74">&amp;#34;PGPASSWORD=balabalabala psql -U netbox -d netbox &amp;lt; /tmp/netbox.sql&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description><content>&lt;p>本文记录了将 Netbox 从旧环境迁移到 k3s 集群的过程。&lt;/p>
&lt;h2 id="迁移步骤">迁移步骤&lt;/h2>
&lt;h3 id="1-备份数据库">1. 备份数据库&lt;/h3>
&lt;p>使用 &lt;code>pg_dump&lt;/code> 导出 Netbox 数据库，排除变更日志表以减小备份体积：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>pg_dump --username netbox --password --host localhost --exclude-table-data&lt;span style="color:#f92672">=&lt;/span>extras_objectchange netbox &amp;gt; netbox.sql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-删除旧-pod">2. 删除旧 Pod&lt;/h3>
&lt;p>为了避免 Pod 竞争和锁定问题，先删除现有的 Netbox Pod：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl delete po netbox-68cbd8b854-2hvgp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-修改-postgresql-认证方式">3. 修改 PostgreSQL 认证方式&lt;/h3>
&lt;h4 id="临时禁用密码认证">临时禁用密码认证&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 进入 PostgreSQL Pod&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl exec -it netbox-postgresql-0 -- sed -ibak &lt;span style="color:#e6db74">&amp;#39;s/^\([^#]*\)md5/\1trust/g&amp;#39;&lt;/span> /opt/bitnami/postgresql/conf/pg_hba.conf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 重新加载配置&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl exec -it netbox-postgresql-0 -- pg_ctl reload
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="创建新数据库和用户">创建新数据库和用户&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl exec -it netbox-postgresql-0 -- psql -U postgres
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>DROP DATABASE netbox;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>CREATE DATABASE netbox;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ALTER USER netbox WITH PASSWORD &lt;span style="color:#e6db74">&amp;#39;balabalabala&amp;#39;&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>ALTER DATABASE netbox OWNER TO netbox;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>-- PostgreSQL &lt;span style="color:#ae81ff">15&lt;/span> 及以上版本需要
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">\c&lt;/span>onnect netbox;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>GRANT CREATE ON SCHEMA public TO netbox;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h4 id="恢复密码认证">恢复密码认证&lt;/h4>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl exec -it netbox-postgresql-0 -- sed -i &lt;span style="color:#e6db74">&amp;#39;s/^\([^#]*\)trust/\1md5/g&amp;#39;&lt;/span> /opt/bitnami/postgresql/conf/pg_hba.conf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl exec -it netbox-postgresql-0 -- pg_ctl reload
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="4-恢复数据库">4. 恢复数据库&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl exec -it netbox-postgresql-0 -- sh -c &lt;span style="color:#e6db74">&amp;#34;PGPASSWORD=balabalabala psql -U netbox -d netbox &amp;lt; /tmp/netbox.sql&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="参考资料">参考资料&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://netboxlabs.com/docs/netbox/en/stable/administration/replicating-netbox/">Netbox 官方文档 - 副本/备份&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.bitnami.com/virtual-machine/infrastructure/postgresql/administration/change-reset-password/">Bitnami PostgreSQL - 更改密码&lt;/a>&lt;/li>
&lt;/ul></content></item><item><title>wget用Content-Disposition字段值为文件名</title><link>https://www.0niu.cn/posts/wget-content-disposition/</link><pubDate>Thu, 22 Jan 2026 14:17:37 +0800</pubDate><guid>https://www.0niu.cn/posts/wget-content-disposition/</guid><description>&lt;h2 id="基本用法">基本用法&lt;/h2>
&lt;p>wget可以通过&lt;code>--content-disposition&lt;/code>参数使用HTTP响应头中的&lt;code>Content-Disposition&lt;/code>字段来设置下载文件的文件名。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget &lt;span style="color:#f92672">[&lt;/span>--no-check-certificate&lt;span style="color:#f92672">]&lt;/span> --content-disposition &lt;span style="color:#e6db74">&amp;#39;url&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="详细说明">详细说明&lt;/h2>
&lt;h3 id="content-disposition头字段">Content-Disposition头字段&lt;/h3>
&lt;p>&lt;code>Content-Disposition&lt;/code>是HTTP响应头中的一个字段，用于指示如何处理响应内容。当服务器希望浏览器下载文件而不是显示时，会使用这个字段。&lt;/p>
&lt;p>常见的格式：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>Content-Disposition: attachment; filename=&amp;#34;example.pdf&amp;#34;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Content-Disposition: attachment; filename*=UTF-8&amp;#39;&amp;#39;%E4%BE%8B%E5%AD%90.pdf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="参数说明">参数说明&lt;/h3>
&lt;ul>
&lt;li>&lt;code>--content-disposition&lt;/code>: 启用对Content-Disposition头的支持&lt;/li>
&lt;li>&lt;code>--no-check-certificate&lt;/code>: 跳过SSL证书验证（可选，用于自签名证书）&lt;/li>
&lt;/ul>
&lt;h2 id="实际应用场景">实际应用场景&lt;/h2>
&lt;h3 id="1-动态文件下载">1. 动态文件下载&lt;/h3>
&lt;p>当下载链接指向动态生成的文件时，服务器会通过Content-Disposition指定正确的文件名：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget --content-disposition &lt;span style="color:#e6db74">&amp;#34;https://example.com/download.php?id=123&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-中文文件名处理">2. 中文文件名处理&lt;/h3>
&lt;p>对于包含中文字符的文件名，Content-Disposition可能会使用URL编码：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget --content-disposition &lt;span style="color:#e6db74">&amp;#34;https://example.com/中文文件.pdf&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>wget会自动处理URL编码的文件名。&lt;/p>
&lt;h3 id="3-批量下载">3. 批量下载&lt;/h3>
&lt;p>结合其他参数使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 后台下载，使用Content-Disposition文件名&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget -b --content-disposition &lt;span style="color:#e6db74">&amp;#34;https://example.com/file.zip&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 限制下载速度，使用Content-Disposition文件名&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget --limit-rate&lt;span style="color:#f92672">=&lt;/span>100k --content-disposition &lt;span style="color:#e6db74">&amp;#34;https://example.com/large-file.iso&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description><content>&lt;h2 id="基本用法">基本用法&lt;/h2>
&lt;p>wget可以通过&lt;code>--content-disposition&lt;/code>参数使用HTTP响应头中的&lt;code>Content-Disposition&lt;/code>字段来设置下载文件的文件名。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget &lt;span style="color:#f92672">[&lt;/span>--no-check-certificate&lt;span style="color:#f92672">]&lt;/span> --content-disposition &lt;span style="color:#e6db74">&amp;#39;url&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="详细说明">详细说明&lt;/h2>
&lt;h3 id="content-disposition头字段">Content-Disposition头字段&lt;/h3>
&lt;p>&lt;code>Content-Disposition&lt;/code>是HTTP响应头中的一个字段，用于指示如何处理响应内容。当服务器希望浏览器下载文件而不是显示时，会使用这个字段。&lt;/p>
&lt;p>常见的格式：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>Content-Disposition: attachment; filename=&amp;#34;example.pdf&amp;#34;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>Content-Disposition: attachment; filename*=UTF-8&amp;#39;&amp;#39;%E4%BE%8B%E5%AD%90.pdf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="参数说明">参数说明&lt;/h3>
&lt;ul>
&lt;li>&lt;code>--content-disposition&lt;/code>: 启用对Content-Disposition头的支持&lt;/li>
&lt;li>&lt;code>--no-check-certificate&lt;/code>: 跳过SSL证书验证（可选，用于自签名证书）&lt;/li>
&lt;/ul>
&lt;h2 id="实际应用场景">实际应用场景&lt;/h2>
&lt;h3 id="1-动态文件下载">1. 动态文件下载&lt;/h3>
&lt;p>当下载链接指向动态生成的文件时，服务器会通过Content-Disposition指定正确的文件名：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget --content-disposition &lt;span style="color:#e6db74">&amp;#34;https://example.com/download.php?id=123&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="2-中文文件名处理">2. 中文文件名处理&lt;/h3>
&lt;p>对于包含中文字符的文件名，Content-Disposition可能会使用URL编码：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>wget --content-disposition &lt;span style="color:#e6db74">&amp;#34;https://example.com/中文文件.pdf&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>wget会自动处理URL编码的文件名。&lt;/p>
&lt;h3 id="3-批量下载">3. 批量下载&lt;/h3>
&lt;p>结合其他参数使用：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 后台下载，使用Content-Disposition文件名&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget -b --content-disposition &lt;span style="color:#e6db74">&amp;#34;https://example.com/file.zip&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 限制下载速度，使用Content-Disposition文件名&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget --limit-rate&lt;span style="color:#f92672">=&lt;/span>100k --content-disposition &lt;span style="color:#e6db74">&amp;#34;https://example.com/large-file.iso&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="高级用法">高级用法&lt;/h2>
&lt;h3 id="结合其他wget参数">结合其他wget参数&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 断点续传，使用Content-Disposition文件名&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget -c --content-disposition &lt;span style="color:#e6db74">&amp;#34;https://example.com/big-file.tar.gz&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 递归下载，使用Content-Disposition文件名&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget -r --content-disposition &lt;span style="color:#e6db74">&amp;#34;https://example.com/files/&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="脚本中的应用">脚本中的应用&lt;/h3>
&lt;p>在shell脚本中批量处理下载任务：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">#!/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>URLS&lt;span style="color:#f92672">=(&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;https://example.com/file1.pdf&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;https://example.com/file2.doc&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#e6db74">&amp;#34;https://example.com/数据.xlsx&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">for&lt;/span> url in &lt;span style="color:#e6db74">&amp;#34;&lt;/span>&lt;span style="color:#e6db74">${&lt;/span>URLS[@]&lt;span style="color:#e6db74">}&lt;/span>&lt;span style="color:#e6db74">&amp;#34;&lt;/span>; &lt;span style="color:#66d9ef">do&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> echo &lt;span style="color:#e6db74">&amp;#34;正在下载: &lt;/span>$url&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> wget --content-disposition &lt;span style="color:#e6db74">&amp;#34;&lt;/span>$url&lt;span style="color:#e6db74">&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">done&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="注意事项">注意事项&lt;/h2>
&lt;h3 id="1-安全性考虑">1. 安全性考虑&lt;/h3>
&lt;ul>
&lt;li>谨慎使用&lt;code>--no-check-certificate&lt;/code>参数，可能存在安全风险&lt;/li>
&lt;li>建议在可信网络环境中使用&lt;/li>
&lt;/ul>
&lt;h3 id="2-文件名冲突">2. 文件名冲突&lt;/h3>
&lt;p>如果多个URL返回相同的文件名，wget会自动添加数字后缀：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>document.pdf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>document(1).pdf
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>document(2).pdf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="3-编码问题">3. 编码问题&lt;/h3>
&lt;ul>
&lt;li>确保终端支持UTF-8编码以正确显示中文文件名&lt;/li>
&lt;li>在某些系统上可能需要额外的配置&lt;/li>
&lt;/ul>
&lt;h3 id="4-服务器支持">4. 服务器支持&lt;/h3>
&lt;p>并非所有服务器都正确设置Content-Disposition头，某些情况下可能需要手动指定文件名：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 如果Content-Disposition不可用，使用-O参数指定文件名&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget -O custom-name.pdf &lt;span style="color:#e6db74">&amp;#34;https://example.com/download&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="故障排除">故障排除&lt;/h2>
&lt;h3 id="常见问题">常见问题&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>&lt;strong>文件名显示乱码&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 设置locale&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>export LANG&lt;span style="color:#f92672">=&lt;/span>zh_CN.UTF-8
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>下载失败&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查HTTP头&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>curl -I &lt;span style="color:#e6db74">&amp;#34;https://example.com/download&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;li>
&lt;p>&lt;strong>文件名被截断&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># 检查服务器返回的完整Content-Disposition头&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>wget --spider --server-response &lt;span style="color:#e6db74">&amp;#34;https://example.com/download&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/li>
&lt;/ol>
&lt;h2 id="替代方案">替代方案&lt;/h2>
&lt;p>如果wget不可用，也可以使用其他工具：&lt;/p>
&lt;h3 id="使用curl">使用curl&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>curl -J -O &lt;span style="color:#e6db74">&amp;#34;https://example.com/download&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="使用python">使用Python&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-python" data-lang="python">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> requests
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">import&lt;/span> os
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>url &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;https://example.com/download&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>response &lt;span style="color:#f92672">=&lt;/span> requests&lt;span style="color:#f92672">.&lt;/span>get(url, headers&lt;span style="color:#f92672">=&lt;/span>{&lt;span style="color:#e6db74">&amp;#39;User-Agent&amp;#39;&lt;/span>: &lt;span style="color:#e6db74">&amp;#39;Mozilla/5.0&amp;#39;&lt;/span>})
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>filename &lt;span style="color:#f92672">=&lt;/span> response&lt;span style="color:#f92672">.&lt;/span>headers&lt;span style="color:#f92672">.&lt;/span>get(&lt;span style="color:#e6db74">&amp;#39;content-disposition&amp;#39;&lt;/span>, &lt;span style="color:#e6db74">&amp;#39;&amp;#39;&lt;/span>)&lt;span style="color:#f92672">.&lt;/span>split(&lt;span style="color:#e6db74">&amp;#39;filename=&amp;#39;&lt;/span>)[&lt;span style="color:#f92672">-&lt;/span>&lt;span style="color:#ae81ff">1&lt;/span>]&lt;span style="color:#f92672">.&lt;/span>strip(&lt;span style="color:#e6db74">&amp;#39;&amp;#34;&amp;#39;&lt;/span>)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">with&lt;/span> open(filename, &lt;span style="color:#e6db74">&amp;#39;wb&amp;#39;&lt;/span>) &lt;span style="color:#66d9ef">as&lt;/span> f:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> f&lt;span style="color:#f92672">.&lt;/span>write(response&lt;span style="color:#f92672">.&lt;/span>content)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></content></item><item><title>Netbox升级到v4.4版本后Racks视图空白问题</title><link>https://www.0niu.cn/posts/netbox-v4-racks-blank-screen/</link><pubDate>Fri, 17 Oct 2025 00:36:10 +0800</pubDate><guid>https://www.0niu.cn/posts/netbox-v4-racks-blank-screen/</guid><description>&lt;p>Netbox升级到4.4版本后，打开Racks视图，发现页面空白。打开页面控制台发现报错oobErrorNoTarget.查询资料发现，问题在于新引入的&amp;quot;HTMX Navigation&amp;quot;功能。临时方案为：打开用户设置，&amp;ldquo;HTMX Navigation&amp;quot;选项选择&amp;quot;Disabled&amp;rdquo;&lt;/p>
&lt;h4 id="资料">资料&lt;/h4>
&lt;p>&lt;a href="https://github.com/netbox-community/netbox/issues/20043">https://github.com/netbox-community/netbox/issues/20043&lt;/a>&lt;/p></description><content>&lt;p>Netbox升级到4.4版本后，打开Racks视图，发现页面空白。打开页面控制台发现报错oobErrorNoTarget.查询资料发现，问题在于新引入的&amp;quot;HTMX Navigation&amp;quot;功能。临时方案为：打开用户设置，&amp;ldquo;HTMX Navigation&amp;quot;选项选择&amp;quot;Disabled&amp;rdquo;&lt;/p>
&lt;h4 id="资料">资料&lt;/h4>
&lt;p>&lt;a href="https://github.com/netbox-community/netbox/issues/20043">https://github.com/netbox-community/netbox/issues/20043&lt;/a>&lt;/p></content></item><item><title>格式化ssh配置文件,空格替换为TAB</title><link>https://www.0niu.cn/posts/format_ssh_config/</link><pubDate>Mon, 29 Sep 2025 23:10:12 +0800</pubDate><guid>https://www.0niu.cn/posts/format_ssh_config/</guid><description>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>sed &amp;#39;s/[[:blank:]]\{2,\}/\t/g&amp;#39; config
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></description><content>&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>sed &amp;#39;s/[[:blank:]]\{2,\}/\t/g&amp;#39; config
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div></content></item></channel></rss>