Zabbix 模板实战:用 CheckPoint FW-1 Interfaces 模板监控 Checkpoint 防火墙接口与包过滤统计
【免费下载链接】community-templatesZabbix Community Templates repository项目地址https://gitcode.com/gh_mirrors/co/community-templates点击查看免费下载本指南围绕 Zabbix Community Templates 仓库中的template_checkpoint_fw-1_interfaces模板展开讲解如何通过「外部脚本发现 SNMP 采集」的组合方式对 CheckpointCheck Point防火墙的接口级包过滤统计Accept / Drop / Reject进行自动化监控。读完本文你将掌握该模板的完整部署前置条件、发现规则与监控项原型的底层原理并能结合仓库源码文件XML / YAML独立完成导入、配置与验证。模板定位专注接口层包过滤统计CheckPoint FW-1 Interfaces模板的核心用途用模板自身的 Overview 一句话概括就是Use this template to monitor Checkpoint firewalls interfaces and packet filtering.见 5.4/6.0 版 README。它不监控 CPU、内存或 HA 状态——那是同目录下 CheckPoint FW-1 模板 的职责该模板采集svnVersion、fwModuleState、fwInstallTime、haWorkMode、fwNumConn、内存及多核 CPU 时间等。本模板只做一件事通过低级别发现LLD自动枚举防火墙上的所有接口并为每个接口采集 8 个包过滤计数器从而回答流量被接受了多少、被丢弃了多少、被拒绝了多少这类防火墙日常运维的核心问题。模板位于仓库的Network_Devices/Checkpoint/分类下提供三个 Zabbix 版本的导入文件Zabbix 版本导入文件格式仓库路径5.0XMLtemplate_checkpoint_fw-1_interfaces.xml5.4YAMLtemplate_checkpoint_fw-1_interfaces.yaml6.0YAMLtemplate_checkpoint_fw-1_interfaces.yaml三个版本的逻辑完全一致5.4 与 6.0 的 YAML 文件在 5.4 版模板定义 与 6.0 版模板定义 中逐项对应仅序列化格式不同。工作原理外部脚本发现 SNMP 原型采集整个模板只包含一条发现规则和 8 个监控项原型但它的数据链路却涉及三个层次外部脚本发现External checkZabbix Server 周期调用advsnmp.discovery外部脚本对防火墙执行 SNMP 遍历输出 JSON 格式的 LLD 数据发现哪些接口SNMP 原型采集SNMP agent对每个被发现的接口根据原型定义用 CHECKPOINT-MIB 中的 OID 轮询对应计数器预处理CHANGE_PER_SECOND将 SNMP 返回的累计计数器转换为每秒变化率速率再送入图形展示。其中advsnmp.discovery是本模板以及同目录多数 Checkpoint 模板共用的外部脚本其出处记录在 5.0 版 additional_info.txt 中Simon Kowallik 的 Zabbix-Addons 项目需自行下载部署到 Zabbix Server 的 ExternalScripts 目录。该脚本的存在意义在于Checkpoint 的接口表索引并非普通ifIndex无法用 Zabbix 内置 SNMP LLD 规则直接解析必须借助这个专门的外部脚本把 OID 索引拆解成多个宏{#ADVSNMPVALUE}、{#ADVSNMPINDEX1}、{#ADVSNMPINDEX2}等模板再基于这些宏生成监控项原型。发现规则Interfaces Discovery模板中唯一的发现规则定义如下来自 5.0 README 与 5.0 XML属性值名称Interfaces Discovery类型External checkKeyadvsnmp.discovery[{HOSTNAME},-v2c -c{$SNMP_COMMUNITY},1.3.6.1.4.1.2620.1.1.25.5.1.2,1.3]更新间隔900 秒15 分钟Key 的四个参数逐一拆解{HOSTNAME}Zabbix 自动替换为当前主机的名称脚本据此定位目标防火墙-v2c -c{$SNMP_COMMUNITY}传给底层 SNMP 工具的选项-v2c表示 SNMPv2c-c{$SNMP_COMMUNITY}使用主机级用户宏{$SNMP_COMMUNITY}作为团体字符串Zabbix 内置同名宏默认值为public可在主机或模板上覆盖1.3.6.1.4.1.2620.1.1.25.5.1.2要遍历的 OID。1.3.6.1.4.1.2620是 Check Point 的私有企业号前缀.1.1.25.5.1.2落在 fw1 产品分支下的接口统计表区域即防火墙接口级计数器表1.3索引拆分定义。从 5.0 XML 的snmp_oid使用{#ADVSNMPINDEX2}可以推断脚本按该参数把完整 OID 索引拆成两段{#ADVSNMPINDEX1}1 个子标识符与{#ADVSNMPINDEX2}3 个子标识符后者被模板用作原型 SNMP OID 的索引部分。发现出的每个接口同时产出{#ADVSNMPVALUE}完整索引后缀与{#ADVSNMPINDEX2}3 段子索引分别服务于监控项命名和 OID 构造。部署前置条件在导入模板之前需要依次满足以下条件均来自模板 Overview 与仓库文件1. 防火墙侧开启 SNMP在 Check Point GAiA / SmartConsole 中启用 SNMP 代理并配置与{$SNMP_COMMUNITY}一致的团体字符串默认模板期望为public生产环境建议自定义并在 Zabbix 主机宏中覆盖。2. Zabbix Server 安装 CHECKPOINT-MIB模板中的 SNMP 监控项直接引用CHECKPOINT-MIB::fwAcceptBytesIn这类符号 OID见 5.0 XML因此CHECKPOINT-MIBchkpnt.mib必须正确安装到 Zabbix Server 的 MIB 目录Overview 中明确说明。安装后可借助snmpwalk手工验证例如snmpwalk -v2c -c public -m CHECKPOINT-MIB 防火墙IP 1.3.6.1.4.1.2620.1.1.25.5.1.23. 部署 advsnmp.discovery 外部脚本将advsnmp.discovery脚本放入 Zabbix Server 配置的 ExternalScripts 目录并保证运行 Zabbix Server 的系统用户有执行权限。部署完成后可在服务器本机做一次冒烟测试advsnmp.discovery 防火墙主机名 -v2c -c public 1.3.6.1.4.1.2620.1.1.25.5.1.2 1.3正常输出应为 JSON 数组每个元素包含{#ADVSNMPVALUE}、{#ADVSNMPINDEX1}、{#ADVSNMPINDEX2}等字段。4. 创建值映射 Checkpoint standard statusCheckpoint 模板集合要求预先创建名为Checkpoint standard status的值映射映射关系固定为原始值映射显示值0OK1Warning2Error在 Zabbix 前端「管理 → 一般 → 值映射」中创建即可。虽然本模板自身的监控项未直接使用该映射README 中 Macros used 与 Template links 均为空但它属于整个 Checkpoint 模板集如template_checkpoint_fw-1的 HA/状态类监控项的公共依赖。5. 导入模板并关联主机Zabbix 5.0导入 5.0/XMLZabbix 5.4 / 6.0分别导入 5.4/YAML 或 6.0/YAML。导入后把模板链接到代表防火墙的主机确认主机上配置了 SNMP 接口IP/端口 161以及正确的{$SNMP_COMMUNITY}宏值。模板归属Templates组监控项归属应用ApplicationCheckpoint FW-15.0 XML 中以applications声明5.4/6.0 YAML 中以标签Application: Checkpoint FW-1体现。监控项原型8 个接口级计数器发现规则生成接口后每个接口自动实例化 8 个监控项README 的 Items collected 表与 5.0 XML 的item_prototypes完全一致监控项名称KeySNMP OID类型更新间隔Interface {#ADVSNMPVALUE} fwAcceptBytesInfwAcceptBytesIn[{#ADVSNMPVALUE}]CHECKPOINT-MIB::fwAcceptBytesIn.{#ADVSNMPINDEX2}SNMP agent120sInterface {#ADVSNMPVALUE} fwAcceptBytesOutfwAcceptBytesOut[{#ADVSNMPVALUE}]CHECKPOINT-MIB::fwAcceptBytesOut.{#ADVSNMPINDEX2}SNMP agent120sInterface {#ADVSNMPVALUE} fwAcceptPcktsInfwAcceptPcktsIn[{#ADVSNMPVALUE}]CHECKPOINT-MIB::fwAcceptPcktsIn.{#ADVSNMPINDEX2}SNMP agent120sInterface {#ADVSNMPVALUE} fwAcceptPcktsOutfwAcceptPcktsOut[{#ADVSNMPVALUE}]CHECKPOINT-MIB::fwAcceptPcktsOut.{#ADVSNMPINDEX2}SNMP agent120sInterface {#ADVSNMPVALUE} fwDropPcktsInfwDropPcktsIn[{#ADVSNMPVALUE}]CHECKPOINT-MIB::fwDropPcktsIn.{#ADVSNMPINDEX2}SNMP agent120sInterface {#ADVSNMPVALUE} fwDropPcktsOutfwDropPcktsOut[{#ADVSNMPVALUE}]CHECKPOINT-MIB::fwDropPcktsOut.{#ADVSNMPINDEX2}SNMP agent120sInterface {#ADVSNMPVALUE} fwRejectPcktsInfwRejectPcktsIn[{#ADVSNMPVALUE}]CHECKPOINT-MIB::fwRejectPcktsIn.{#ADVSNMPINDEX2}SNMP agent120sInterface {#ADVSNMPVALUE} fwRejectPcktsOutfwRejectPcktsOut[{#ADVSNMPVALUE}]CHECKPOINT-MIB::fwRejectPcktsOut.{#ADVSNMPINDEX2}SNMP agent120s计数器语义从命名可以清晰对应 Checkpoint 包过滤的三种处置结果均为入站In/出站Out双向Accept被防火墙策略接受并放行的流量——fwAcceptBytesIn/Out是字节计数fwAcceptPcktsIn/Out是包计数Drop被防火墙静默丢弃的包不回复任何报文fwDropPcktsIn/OutReject被防火墙拒绝并主动回复 RST/ICMP 的包fwRejectPcktsIn/Out。其中Drop与Reject的比值是判断防火墙是否在拦截异常流量、策略是否过严的常用观察点。关键实现细节源码级对照 5.0 XML5.4/6.0 YAML 中逐项相同可以看到每个原型共有的三处实现值类型为 FLOAT8 个原型的value_type均为FLOAT为后续做速率计算预留数值精度预处理 CHANGE_PER_SECOND每个原型都挂载了preprocessingsteptypeCHANGE_PER_SECOND/type/step/preprocessing。SNMP 返回的字节/包计数是自设备启动以来持续累加的计数器该步骤把两次取值之差/时间差换算为每秒速率因此图形和告警表达式拿到的直接就是 bps / pps 量纲OID 引用 {#ADVSNMPINDEX2}原型 OID 形如CHECKPOINT-MIB::fwAcceptBytesIn.{#ADVSNMPINDEX2}接口索引由发现脚本按1.3拆分规则注入从而保证每个接口实例指向正确的表行。轮询间隔 120 秒发现间隔 900 秒——后者是前者整数倍符合 Zabbix 对 LLD 与实例采集节奏的常规搭配。图形原型Filtering for interface每个被发现的接口还会自动生成一张名为Filtering for interface {#ADVSNMPVALUE}的图形graph prototype把 8 个计数器按流量方向与处置结果分组展示。5.0 XML / 5.4 / 6.0 YAML 中定义的样式如下图形项线型drawtype颜色坐标轴fwAcceptBytesInGRADIENT_LINE00AA00右轴fwAcceptBytesOutGRADIENT_LINE9999FF右轴fwAcceptPcktsInBOLD_LINE00AAAA左轴fwAcceptPcktsOut普通线C8C800左轴fwDropPcktsInBOLD_LINECC0000左轴fwDropPcktsOut普通线C8C8C8左轴fwRejectPcktsInBOLD_LINE666666左轴fwRejectPcktsOut普通线960000左轴设计上有两个值得注意的点双 Y 轴两个字节速率项fwAcceptBytesIn/Out被分配到右侧 Y 轴包速率项在左侧 Y 轴。字节速率数值量级通常远大于包速率如 Mbps 级 vs pps 级分开量程可避免图形被某一类曲线压扁颜色即语义Accept 系用绿色/蓝色系00AA00、9999FF、00AAAADrop 系用红色/灰色系CC0000、C8C8C8Reject 系用深灰/暗红系666666、960000Drop 与 Reject 的入站方向用 BOLD_LINE 加粗强调便于在告警时第一时间识别异常方向。宏、模板链接与触发器空白的取舍README 中明确列出三处空白Macros used本模板没有定义模板级宏SNMP 团体字符串完全依赖 Zabbix 内置用户宏{$SNMP_COMMUNITY}在主机级配置Template links不链接其他模板可独立使用也可与 CheckPoint FW-1 模板 同时挂载形成完整监控面后者负责 CPU/内存/HA本模板负责接口包过滤Triggers模板未内置触发器即采集但不告警。实践中建议用户基于这些监控项自行补充触发器例如对每个接口计算丢弃率(丢弃入站包速率 阈值) 且 (接受包速率正常) → 疑似异常流量Zabbix 5.4 中可写为last(/CheckPoint FW-1 Interfaces/fwDropPcktsIn[{#ADVSNMPVALUE}],5m) X之类的表达式在 5.0 中对应last(host/key,300)语法并注意{#ADVSNMPVALUE}需通过 LLD 触发器原型trigger prototype引用才能对每个接口生效。验证与排障部署完成后按以下顺序自检LLD 是否产出数据进入「监测 → 发现」查看Interfaces Discovery最近执行状态正常应每 900 秒成功一次且最新数据为 JSON监控项是否实例化在最新数据中搜索Interface前缀的监控项若防火墙有 4 个接口应看到 4×832 个实例化监控项数值是否合理CHANGE_PER_SECOND 处理后字节项应呈现稳定的速率而非无限增长的累计值若出现not supported优先检查团体字符串、MIB 安装位置、以及外部脚本在 ExternalScripts 目录中的可执行权限MIB 符号解析SNMP OID 采用CHECKPOINT-MIB::符号名若 Zabbix Server 上 MIB 缺失原型会因 OID 无法解析而直接 unsupported。小结CheckPoint FW-1 Interfaces是一个小而专的 Zabbix 社区模板它用一条advsnmp.discovery外部发现规则解决 Checkpoint 私有接口表的枚举难题用 8 个 SNMP 原型 CHANGE_PER_SECOND 预处理输出接口级 Accept/Drop/Reject 的字节与包速率再通过双轴图形原型让运维人员一眼看清每块接口的过滤行为。配合 CheckPoint FW-1 模板 使用即可覆盖一台 Checkpoint 防火墙从系统资源到接口流量过滤的完整可观测面。赞分享【免费下载链接】community-templatesZabbix Community Templates repository项目地址https://gitcode.com/gh_mirrors/co/community-templates点击查看免费下载相关推荐CheckPoint FW-1 接口监控模板实战用 Zabbix 6.0 采集防火墙接口包过滤统计CheckPoint FW 1 接口监控模板实战用 Zabbix 6.0 采集防火墙接口包过滤统计 本文围绕 Zabbix Community TemplatZabbix 监控 Check Point FW-1 防火墙接口与包过滤CheckPoint FW-1 Interfaces 模板解析与部署指南Zabbix 监控 Check Point FW 1 防火墙接口与包过滤CheckPoint FW 1 Interfaces 模板解析与部署指南 导读 本文基awesome-free-saas学生党清单学习、论文、协作必备的10个免费工具awesome free saas学生党清单学习、论文、协作必备的10个免费工具 还在为写论文、做小组作业而焦虑吗 awesome free saas ht上一篇3款聚合工具颠覆体验Simple Live让多平台直播观看效率提升200%下一篇3个颠覆认知的教育资源获取技巧让优质学习资料触手可及创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Hancitor木马脱壳修复与动态分析实战:从OEP定位到C2追踪

Hancitor木马脱壳修复与动态分析实战:从OEP定位到C2追踪

1. 样本信息与整体分析思路1.1 Hancitor木马是什么,这次分析的切入点在哪里Hancitor(有些安全厂商也标记为 Chanitor 或 Downloader)是一种长期活跃的恶意软件家族,主要功能是从远程服务器拉取下一阶段载荷,典型后续包…

2026/10/17 6:15:35 阅读更多 →
Raspberry Pi Pico UF2 固件烧写:把文件拖进 U 盘的完整指南

Raspberry Pi Pico UF2 固件烧写:把文件拖进 U 盘的完整指南

Raspberry Pi Pico UF2 固件烧写:把文件拖进 U 盘的完整指南 【免费下载链接】pico-sdk 项目地址: https://gitcode.com/GitHub_Trending/pi/pico-sdk 当你按住 Pico 板上的 BOOTSEL 按键再插上 USB,电脑里会弹出新的 U 盘;把一个 .u…

2026/10/17 6:15:35 阅读更多 →
ELK与Docker容器化部署实战:从组件原理到端到端验证

ELK与Docker容器化部署实战:从组件原理到端到端验证

我先把这个项目拆开看了一遍。ELK加Docker,说到底是两件事的叠加:ELK这套日志分析组合怎么组件化部署,以及容器化之后如何解决传统安装的依赖繁琐、环境耦合问题。现在网上资料很多,但大多数是直接贴几条命令,跑起来之…

2026/10/17 6:15:35 阅读更多 →

最新新闻

AI辅助科研:赋能学术创新与高效科研成果产出的新路径探索

AI辅助科研:赋能学术创新与高效科研成果产出的新路径探索

很多2026级新生刚入学或刚转博,就被开题报告这四个字整得心力交瘁。最崩溃的不是写不出来,而是你辛辛苦苦熬夜半个月翻出来的创新点,导师看一眼就冷冷地抛回一句:这个方向十年前就有人做透了,前沿性在哪?或…

2026/10/17 6:55:01 阅读更多 →
大模型推理过程故事化透明呈现:原理、实现与落地指南

大模型推理过程故事化透明呈现:原理、实现与落地指南

AI能给出答案,却说不出自己为什么这么想。这句话几乎可以概括过去几年里我跟多数做AI落地朋友共同的痛点。模型输出越强,它内部的推理过程反而越像个黑盒;我们拿到了准确率,却拿不到一条能说给人听的、带逻辑链条的解释。最近某顶…

2026/10/17 6:55:01 阅读更多 →
7131、6293、4762、1579:同一份稿子在四个编辑器里的四个长度

7131、6293、4762、1579:同一份稿子在四个编辑器里的四个长度

7131、6293、4762、1579:同一份稿子在四个编辑器里的四个长度 昨晚我发一篇稿子,脚本的日志里跳出来四个数字。 源文件 7131 博客园 7131 简书 6293(DOM)/ 8779(服务端) 知乎…

2026/10/17 6:55:01 阅读更多 →
Java 转 Python 后端 04: GIL 机制、单线程事件循环与异步并发实战

Java 转 Python 后端 04: GIL 机制、单线程事件循环与异步并发实战

第 5 章 并发体系、异步编程与 Agent 后端实战 5.1 并发基石:GIL 机制与并发选型矩阵 Java 工程师非常熟悉 JVM 内存模型(JMM)、内核线程与 JUC 线程池,在 Java 里多线程可以轻松打满多核 CPU。而在 Python 中,首先需要…

2026/10/17 6:55:01 阅读更多 →
Python集成学习实战:从Bagging手写到LightGBM时序CV与Stacking元特征

Python集成学习实战:从Bagging手写到LightGBM时序CV与Stacking元特征

简介:这是一本面向Python开发者与机器学习实践者的集成学习速成指南,适合已掌握基础Python、NumPy及scikit-learn的中初级学习者,旨在7天内系统掌握装袋、随机森林、AdaBoost、梯度提升、投票与堆叠六大主流集成方法,解决单一模型…

2026/10/17 6:55:01 阅读更多 →
Harbor私有镜像仓库部署与运维实践:从架构到避坑指南

Harbor私有镜像仓库部署与运维实践:从架构到避坑指南

一套业务系统跑了一两年,环境中几十上百个容器,镜像分散在各台机器甚至每个人电脑里,等到要统一发版、回滚版本的时候,才发现连一个准确的镜像清单都凑不出来。这种场景我想很多团队都经历过。所以当我的某位合作伙伴第一次提出“…

2026/10/17 6:54:01 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →