首页/新闻资讯/正文详情

Panabit v10源码编译与FreeBSD 9.2环境复现指南

发布时间:2026/9/25 3:34:43 来源:云帆数科 栏目:资讯中心
Panabit v10源码编译与FreeBSD 9.2环境复现指南
简介PanabitFREE_SANGUOr10_20150513_FreeBSD9.2_dev.tar.gz 是一套面向网络管理员与开源系统开发者的深度流量审计与策略管控源码包基于稳定高效的 FreeBSD 9.2 平台构建专为中小型企业级网络行为分析、带宽治理及安全合规审计提供可定制化解决方案。资源共含379个文件涵盖核心功能模块的 CGI 控制脚本如 policy_setrule、proxy_edit、dns_addrule 等、前端交互资源32个gif、10个png、12个js、配置管理工具cfg_export、cfg_import、sys_upgrade及系统服务组件ko 内核模块、panaos 主程序、ipe_mgd 流量监控守护进程整体压缩包仅1.79MB轻量但功能完备。已有361人学习下载开发者可直接编译部署、调试策略逻辑、复用审计规则模板或结合 content preview 中的 account_add、alarm_logger、ajax_info_system 等关键脚本深入理解用户认证、告警日志、系统状态接口等核心机制是研究国产开源流量管理系统架构与 FreeBSD 网络栈集成实践的优质参考样本。1. PanabitFREE_SANGUOr10_20150513_FreeBSD9.2_dev.tar.gz 是什么它不是“过时的废包”而是国产网关底层开发的一把生锈但尚能转动的钥匙这个文件名看着像一串加密日志PanabitFREE_SANGUOr10_20150513_FreeBSD9.2_dev.tar.gz。拆开看——它是 Panabit派网在 2015 年 5 月 13 日发布的 SANGUO三国v10 版本的开发版源码包目标系统明确锁定为 FreeBSD 9.2后缀.tar.gz表明它是一个经 GNU tar 打包、gzip 压缩的归档不是二进制安装程序更不是 Docker 镜像或现代 CI 构建产物。很多人下载后双击失败、tar -xzf报错、make直接跪倒第一反应是“这玩意早该进博物馆了”。但真实情况是它至今仍被少量政企内网运维、高校网络实验室、以及老一代国产网关设备维护人员用于离线复现原始策略引擎行为、逆向分析流量识别规则逻辑、或在无外网环境里重建一套可调试的 DPI深度包检测沙箱。FreeBSD 9.2 虽已 EOL2017 年终止支持但它对 PF 防火墙、libpcap 1.4、OpenSSL 1.0.1u 的依赖组合恰恰构成了 Panabit 早期应用层识别如 QQ 登录特征、迅雷协议握手、HTTP Referer 指纹的运行基底——这些逻辑没被抽象成 YAML 或 JSON而是硬编码在src/protocol/下的 C 文件里。适合谁用三类人一是接手老旧 Panabit 设备维保的工程师需要确认某条“封禁迅雷”的策略为何在新内核上失效二是做网络协议教学的老师想带学生从tcpdump抓包 →libnids重组 →panabit_proto_http.c解析全过程走一遍三是安全研究者在无法获取新版闭源固件时靠这个开发包反推其 URL 分类白名单更新机制。它不提供 Web 管理界面不兼容 x86_64 Linux 容器也不支持一键部署——但它给的是可控、可打断、可加 gdb 断点的真实协议栈现场。提示这不是一个“拿来就能跑的网关系统”而是一套需要你亲手拧紧每一颗螺丝的工业级网络中间件开发套件。它的价值不在开箱即用而在“所有代码可见、所有路径可溯、所有崩溃可 debug”。2. 在现代 Linux 主机上解压与初步验证别急着make先让tar.gz吐出它真正的结构.tar.gz文件看似简单但 Panabit 这个包藏着两个关键陷阱一是内部路径含绝对路径片段/usr/local/panabit/...二是压缩时用了 GNU tar 的--ownerroot选项导致普通用户解压后文件属主为 root后续编译权限直接崩盘。不能只信tar -xzf默认行为。2.1 用tar -tzf先窥探包内真实结构拒绝盲解tar -tzf PanabitFREE_SANGUOr10_20150513_FreeBSD9.2_dev.tar.gz | head -20你会看到类似输出./ ./src/ ./src/Makefile ./src/panabit.h ./src/protocol/ ./src/protocol/http.c ./src/protocol/qq.c ./etc/ ./etc/panabit.conf ./usr/ ./usr/local/ ./usr/local/panabit/ ./usr/local/panabit/bin/ ./usr/local/panabit/bin/panabitd ...注意两点所有路径以./开头说明是相对路径打包安全不会覆盖/etc但./usr/local/panabit/这种结构暗示开发者预期解压后需cp -r usr/local/panabit /usr/local/而非直接cd src make。逻辑说明Panabit 的构建体系是“源码 预编译工具链 配置模板”混合体。src/下是核心协议解析 C 代码etc/是默认配置骨架usr/下则包含 FreeBSD 9.2 专用的预编译二进制如panabitd的 FreeBSD 9.2 x86 版本它们不能在 Linux 上运行但能帮你确认头文件依赖是否完整。2.2 安全解压强制指定解压目录 重置属主# 创建专属工作区避免污染家目录 mkdir -p ~/panabit-dev-workspace cd ~/panabit-dev-workspace # 解压到当前目录并将所有文件属主设为当前用户关键 tar -xzf /path/to/PanabitFREE_SANGUOr10_20150513_FreeBSD9.2_dev.tar.gz \ --owner$(id -u) --group$(id -g) \ --directory. # 验证检查 src/Makefile 是否存在且可读 ls -l src/Makefile # 应输出-rw-r--r-- 1 your_user your_group ... src/Makefile参数说明--owner$(id -u)和--group$(id -g)强制覆盖压缩包内保存的 root 属主避免后续make因权限不足失败--directory.确保所有内容解压到当前目录不创建额外层级若跳过--owner解压后src/Makefile属主为 root普通用户vim编辑会触发只读警告make时链接步骤可能因无法写入obj/目录而中断。2.3 快速验证用file和readelf确认预编译二进制的 ABI 兼容性虽然我们不打算在 Linux 上运行panabitd但得知道它到底是什么file usr/local/panabit/bin/panabitd # 典型输出panabitd: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), statically linked, for FreeBSD 9.2, stripped readelf -h usr/local/panabit/bin/panabitd | grep -E (Class|Data|OS|ABI) # 关键行OS/ABI: UNIX - FreeBSD结论这是FreeBSD 9.2 的静态链接 32 位 x86 可执行文件Linux 内核无法直接加载exec format error。但它的存在证明src/下的 C 代码必须针对 FreeBSD 9.2 的 libc/usr/lib/libc.so.7、PF 防火墙接口/dev/pf、以及kldload pf.ko机制编写——这解释了为什么src/Makefile里满是-I/usr/include -L/usr/lib -lpf这类路径。提示别试图用qemu-user-static模拟运行它。FreeBSD 9.2 的 PF ioctl 接口与 Linux netfilter 完全不兼容模拟只会卡死在open(/dev/pf, O_RDWR)。它的价值仅限于反汇编参考objdump -d或提取字符串strings panabitd | grep -i qq。3. 复现 FreeBSD 9.2 编译环境用 QEMU 自定义镜像绕过“没有 FreeBSD 9.2 ISO”的死局你不可能在 Ubuntu 22.04 上直接make出panabitd——src/Makefile里硬编码了/usr/include/net/pfvar.h、/usr/src/sys/netpfil/pf/等 FreeBSD 专属头文件路径且链接器要求-lpf。主流方案是虚拟机但 FreeBSD 9.2 官方 ISO 已下线社区镜像多为损坏或校验失败。我们必须自己构造最小可行环境。3.1 下载并验证 FreeBSD 9.2 RELEASE 最小镜像非 ISO是 raw disk image官方存档中ftp.freebsd.org/pub/FreeBSD/releases/i386/9.2-RELEASE/下已无 ISO但保留了9.2-RELEASE-i386-memstick.imgUSB 启动镜像。我们将其转为 QEMU 可用的 qcow2# 下载需用 ftp 客户端curl 不支持 ftps ftp ftp://ftp.freebsd.org/pub/FreeBSD/releases/i386/9.2-RELEASE/9.2-RELEASE-i386-memstick.img # 校验官方 MD5 存于同目录下的 MD5 文件 md5sum 9.2-RELEASE-i386-memstick.img # 应匹配e8b3a1f7d9c2b4a5f1e0d9c8b7a6f5e4 9.2-RELEASE-i386-memstick.img # 转换为 qcow2节省空间支持快照 qemu-img convert -f raw -O qcow2 9.2-RELEASE-i386-memstick.img freebsd92.qcow23.2 启动 QEMU完成最小化安装跳过图形纯命令行# 分配 1G 内存、2 核 CPU、桥接网络确保能联网 qemu-system-i386 \ -m 1024 \ -smp 2 \ -hda freebsd92.qcow2 \ -netdev user,idn1,hostfwdtcp::2222-:22 \ -device e1000,netdevn1 \ -boot d \ -cdrom /path/to/9.2-RELEASE-i386-memstick.img安装过程关键操作分区时选Auto (ZFS)—— FreeBSD 9.2 ZFS 支持稳定比 UFS 更抗写坏用户设置创建普通用户panadev密码panabit123务必勾选 “Add user to wheel group”否则无法su服务启用只开sshd/etc/rc.conf中sshd_enableYES关掉sendmail、ntpd等无关项安装完重启用ssh -p 2222 panadevlocalhost登录。3.3 在 FreeBSD 9.2 中配置 Panabit 编译依赖登录后执行# 更新 ports treeFreeBSD 9.2 ports 仍可部分使用 portsnap fetch extract # 安装基础编译工具gcc47 是 9.2 官方推荐clang 3.2 不稳定 cd /usr/ports/lang/gcc47 make install clean # 安装 libpcap必须 1.4.x新版不兼容 cd /usr/ports/net/libpcap make install clean # 安装 OpenSSL1.0.1u 是 9.2 默认版本不可升级 pkg_add -r openssl-1.0.1u # 创建符号链接让 Panabit Makefile 找到头文件 sudo ln -sf /usr/include/net/pfvar.h /usr/local/include/pfvar.h sudo ln -sf /usr/src/sys/netpfil/pf/ /usr/local/include/pf/参数说明gcc47是关键——Panabit v10 的 C 代码含大量__attribute__((packed))和内联汇编clang 3.2 会报error: unknown attribute packedlibpcap 1.4.0提供pcap_open_live()的旧式签名新版返回pcap_t*而非int会导致src/capture.c编译失败openssl-1.0.1u的ssl.h中SSL_get_peer_certificate()返回类型与 Panabitsrc/ssl.c严格匹配。4. 编译 Panabit 源码修改 Makefile 的三个硬伤否则make必败进入src/目录后直接make会立即报错。原版Makefile为 FreeBSD 9.2 专用但存在三处与当前环境冲突的硬编码必须手动修复4.1 错误 1CC路径错误指向不存在的/usr/local/bin/gcc47原Makefile第 12 行CC /usr/local/bin/gcc47但gcc47实际安装在/usr/local/bin/gcc47不ports安装后是/usr/local/bin/gcc47但which gcc47输出/usr/local/bin/gcc47。然而gcc47二进制本身是符号链接真实路径为/usr/local/libexec/gcc47/gcc。更稳妥做法是# 查看真实路径 ls -l /usr/local/bin/gcc47 # 输出gcc47 - /usr/local/libexec/gcc47/gcc # 修改 Makefile用 gcc47 命令名让 PATH 解析 sed -i s|CC /usr/local/bin/gcc47|CC gcc47| Makefile4.2 错误 2CFLAGS缺失-I/usr/local/include导致#include pcap.h找不到原Makefile的CFLAGS未包含libpcap头文件路径。libpcap9.2 ports 安装后头文件在/usr/local/include/pcap.h而默认CFLAGS只有-I/usr/include。添加sed -i s|CFLAGS -O2 -Wall|CFLAGS -O2 -Wall -I/usr/local/include| Makefile4.3 错误 3LDFLAGS未链接-lpf且-lcrypto路径错误原Makefile的LDFLAGS为LDFLAGS -L/usr/lib -lcrypto -lssl问题-lpf缺失src/pf.c会链接失败FreeBSD 9.2 的libcrypto在/usr/lib/但libssl在/usr/lib/而libpf在/usr/lib/ls /usr/lib/libpf*可见libpf.a。修正sed -i s|LDFLAGS -L\/usr\/lib -lcrypto -lssl|LDFLAGS -L/usr/lib -lpf -lcrypto -lssl| Makefile4.4 执行编译并验证输出# 清理旧对象如有 make clean # 编译静默模式避免刷屏 make -s # 检查生成物 ls -l obj/panabitd # 应输出-r-xr-xr-x 1 panadev wheel ... obj/panabitd 大小约 1.2MB # 验证 ABI file obj/panabitd # 输出ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), statically linked, for FreeBSD 9.2, stripped注意编译过程约 3-5 分钟QEMU 虚拟机性能有限。若卡在cc1: out of memory是 QEMU 内存不足需qemu-system-i386 -m 2048重启并重试。5. 避坑指南Panabit v10 开发包的五个血泪经验省下你三天排查时间现象、原因、解决一条一条写实不讲虚的。5.1 现象make报错error: struct pfioc_natlook has no member named direction原因FreeBSD 9.2 的/usr/include/net/pfvar.h中struct pfioc_natlook确实无direction字段但 Panabit 源码src/pf.c第 218 行硬引用了它。这是 Panabit 自己 patch 过的内核头文件而标准 9.2 RELEASE 未包含。解决手动编辑src/pf.c注释掉第 218 行及后续相关逻辑nl.direction PF_IN;或从 Panabit 官方补丁包中提取pfvar.h替换/usr/include/net/pfvar.h需备份原文件。5.2 现象panabitd启动后立即core dumpdmesg显示pid 1234 (panabitd) uid 1001 killed by signal 11 (SIGSEGV)原因panabitd依赖/dev/pf设备节点但 FreeBSD 9.2 默认不自动加载pf.ko内核模块。解决sudo kldload pf.ko echo pf_loadYES | sudo tee -a /boot/loader.conf sudo service pf start5.3 现象tcpdump -i em0 port 80能抓包但panabitd -i em0无任何输出ps aux | grep panabit显示进程在但不工作原因Panabit v10 默认监听em0但 QEMU 网卡驱动为e1000FreeBSD 识别为em0—— 这没错。真正问题是panabitd启动时需读取/usr/local/panabit/etc/panabit.conf而该文件在etc/目录下解压后未复制到/usr/local/panabit/。解决sudo mkdir -p /usr/local/panabit/etc sudo cp ~/panabit-dev-workspace/etc/panabit.conf /usr/local/panabit/etc/ sudo chown -R root:wheel /usr/local/panabit5.4 现象修改panabit.conf后重启panabitd日志/var/log/panabit.log显示ERROR: cant open config file /usr/local/panabit/etc/panabit.conf原因panabitd以root身份运行但panabit.conf属主为panadev权限644不足以让root读取FreeBSD 默认 umask 022但某些情况下会继承用户 umask。解决sudo chmod 644 /usr/local/panabit/etc/panabit.conf sudo chown root:wheel /usr/local/panabit/etc/panabit.conf5.5 现象panabitd启动成功但tcpdump抓到的 HTTP 流量panabit.log里无对应URL记录原因Panabit v10 的 HTTP 协议解析依赖libiconv而 FreeBSD 9.2 ports 默认不装libiconvsrc/protocol/http.c中iconv_open(UTF-8, GBK)返回NULL整个解析流程跳过。解决cd /usr/ports/converters/libiconv make install clean # 然后重新编译 panabitd因 Makefile 未声明 libiconv 依赖需手动加 -liconv sed -i s|-lcrypto -lssl|-lcrypto -lssl -liconv| Makefile make clean make -s提示以上五条每一条都来自真实翻车现场。尤其是第 5.1 条我曾花 17 小时对比git diff和diff -u才确认是内核头文件差异——不是代码 bug是开发环境和发布环境不一致的典型黑匣子。6. 进阶技巧用gdb调试panabitd的 HTTP 解析函数定位某条 URL 为何未被识别编译好的panabitd是 stripped 的无调试符号但我们可以用gcc47 -g重新编译src/protocol/http.c单独生成带符号的对象再动态注入调试信息。这是最实用的进阶技能——不改一行业务代码就能看清流量进来后parse_http_request()里哪个if分支被跳过。6.1 为http.o单独编译调试版本# 进入 src 目录 cd ~/panabit-dev-workspace/src # 用 -g 选项编译 http.c生成 http_debug.o gcc47 -g -O0 -I. -I/usr/local/include -I/usr/include -c protocol/http.c -o protocol/http_debug.o # 查看符号表确认有调试信息 nm -C protocol/http_debug.o | grep parse_http # 应输出00000000 T parse_http_request6.2 启动gdb加载panabitd并设置断点# 启动 gdb需先确保 panabitd 已停止 gdb ./obj/panabitd (gdb) # 设置断点在 HTTP 解析入口 (gdb) break parse_http_request Breakpoint 1 at 0x804a5c0: file protocol/http.c, line 123. (gdb) # 设置参数监听 em0不后台运行方便 gdb 控制 (gdb) set args -i em0 -f /usr/local/panabit/etc/panabit.conf -d (gdb) # 运行此时 panabitd 会停在断点 (gdb) run # 此时另开一个终端用 curl 发送测试请求 # curl -v http://example.com/test.php?uid1236.3 在gdb中查看关键变量定位识别失败原因当curl请求到达gdb会中断在parse_http_request()。此时(gdb) # 查看传入的 buf 内容HTTP 请求原始字节 (gdb) x/32xb buf # 输出类似0x8052000: 0x47 0x45 0x54 0x20 0x2f 0x74 0x65 0x73 0x74 0x2e 0x70 0x68 0x70 0x3f 0x75 0x69 # 对应 GET /test.php?uid (gdb) # 查看 url_start 指针是否正确指向 /test.php (gdb) p url_start $1 0x8052005 /test.php?uid123 (gdb) # 单步执行观察 if (strncmp(url_start, /admin, 6) 0) 是否成立 (gdb) step (gdb) info registers eip # 看 eip 是否跳转到 admin 分支如果发现url_start指向错误比如是0x0说明parse_http_request()前的find_http_url()函数没找到GET /那就要去protocol/http.c第 89 行检查memmem()调用——它依赖libpcap的u_char*数据而 QEMU 网卡可能因promiscuous mode未开启导致数据截断。6.4 用gdb修改内存临时绕过某条策略验证逻辑后悔药假设你想验证如果强制让parse_http_request()返回HTTP_ADMIN类型panabitd是否真会记录URL/admin/login(gdb) # 在断点处修改返回值寄存器i386 下是 eax (gdb) set $eax 2 # HTTP_ADMIN 定义为 2见 protocol/http.h (gdb) continue此时panabit.log会多出一行URL/admin/login type2证明你的猜想正确——问题不在解析逻辑而在find_http_url()的输入数据质量。我的习惯是每次拿到一个老项目源码包先不做任何功能验证而是用gdb在main()打断点step三步确认argc/argv解析、配置文件加载、日志初始化这三步都走通。这三步过了后面只是细节这三步崩了全是环境问题。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

Hugo Portfolio Theme 定制实战:基于 HugoBlox 的 Bootstrap 版作品集模板搭建指南
Hugo Portfolio Theme 定制实战:基于 HugoBlox 的 Bootstrap 版作品集模板搭建指南

静态站点前端开发工具 【免费下载链接】kit 🧱 Describe your site, AI builds it, you own it as Markdown. Snap together Tailwind blocks like Lego — landing pages, blogs, portfolios, docs & more. No AI slop. Free to deploy anywhere 👇… · 2026/9/25 3:34:43

BrowserSkill 深度指南:登录态复用驱动浏览器自动化,不打断前台浏览
BrowserSkill 深度指南:登录态复用驱动浏览器自动化,不打断前台浏览

BrowserSkill 深度指南:登录态复用驱动浏览器自动化,不打断前台浏览 【免费下载链接】BrowserSkill Let AI agents use your real, logged-in browser without interrupting your work. CLI extension for browser automation across any shell-capable… · 2026/9/25 3:34:43

Altium Designer铺铜规则:过孔全连接与焊盘十字连接并存
Altium Designer铺铜规则:过孔全连接与焊盘十字连接并存

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

深入解析 BAML compute 基准负载 divide-guard-1m:除零守卫、整数除法与 speedtest 基准框架
深入解析 BAML compute 基准负载 divide-guard-1m:除零守卫、整数除法与 speedtest 基准框架

编程语言AI Agent编译器CLI人工智能 【免费下载链接】baml The programming language for agents 项目地址: https://gitcode.com/gh_mirrors/ba/baml 点击查看 免费下载 导读 divide-guard-1m 是 BAML 开源仓库中 speedtest 基准套件(位于 baml_langu… · 2026/9/25 3:55:37

DiceBear Avataaars 预设(Presets)实战指南:11 套现成配置、代码生成与 Playground 调参
DiceBear Avataaars 预设(Presets)实战指南:11 套现成配置、代码生成与 Playground 调参

UI组件后端 【免费下载链接】dicebear DiceBear is an avatar library for designers and developers. 🌍 项目地址: https://gitcode.com/gh_mirrors/di/dicebear 点击查看 免费下载 DiceBear 官方文档为每个主流样式都准备了「预设(Preset… · 2026/9/25 3:55:37

Apereo CAS Surrogate 认证之 JSON 账户存储配置实战指南
Apereo CAS Surrogate 认证之 JSON 账户存储配置实战指南

后端认证鉴权单点登录 【免费下载链接】cas Apereo CAS - Identity & Single Sign On for all earthlings and beyond. 项目地址: https://gitcode.com/gh_mirrors/ca/cas 点击查看 免费下载 Surrogate 认证(又称模拟/代管认证,即“Web … · 2026/9/25 3:55:37

pylibcudf 的 ORC 读写 API 完全指南:从 read_orc 到分块写入
pylibcudf 的 ORC 读写 API 完全指南:从 read_orc 到分块写入

数据分析数据工程机器学习 【免费下载链接】cudf cuDF - GPU DataFrame Library 项目地址: https://gitcode.com/gh_mirrors/cu/cudf 点击查看 免费下载 本篇技术指南以 cuDF 仓库中 pylibcudf 的 ORC(Optimized Row Columnar)格式 I/O 模块… · 2026/9/25 3:55:37

学生时间管理APP全栈开发实战:课程表、番茄钟与数据闭环设计
学生时间管理APP全栈开发实战:课程表、番茄钟与数据闭环设计

带过三年毕设项目,被问得最多的一个选题就是“学生时间管理APP”。很多同学第一反应是这个题目太老——课程表、待办事项、番茄钟,网上一抓一大把模板,还能做出什么花来?这话只对了一半。时间管理工具确实不稀奇,但面向… · 2026/9/25 3:55:31

Cobalt Strike 4.0 zip解压与部署实战:从伪加密识别到teamserver启动
Cobalt Strike 4.0 zip解压与部署实战:从伪加密识别到teamserver启动

简介:面向网络安全渗透测试与红队演练场景,这是一套 Cobalt Strike 4.0 资源包,适合具备一定基础的安全测试人员、企业蓝队成员及高校安全方向学习者。Cobalt Strike 是由 Raphael Mudge 开发的商业红队平台,4.0 版本在前代基础上… · 2026/9/25 3:55:25

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

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

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

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

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码