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

Windows虚拟机IPsec预共享密钥配置实战:从连不上到Wireshark解密

发布时间:2026/9/25 7:40:41 来源:云帆数科 栏目:资讯中心
Windows虚拟机IPsec预共享密钥配置实战:从连不上到Wireshark解密
简介本资源是一份面向信息安全专业学生与初阶研究人员的IPsec实践教学文档聚焦预共享密钥PSK模式下的Windows虚拟机间安全通信配置与协议分析解决IPsec原理理解难、策略配置易出错、Wireshark抓包解读不直观等实操痛点。文档以VMware Workstation双Win虚拟机环境为载体完整覆盖ICMP流量加密前后的连通性验证、本地安全策略创建、IPSec规则指派、AH/ESP协议参数设置含MD5/SHA1完整性校验与3DES加密、主模式SA建立及Wireshark中IPsec头部识别等核心环节。资源为单个1.17MB的Word文档.docx内容结构清晰含18步详细操作截图指引、5类关键配置界面说明及实验结果深度分析便于边学边练、对照复现。目前已有174人学习下载可直接用于课程实验、毕业设计支撑或网络安全岗位岗前技能强化。1. 为什么两台 Windows 虚拟机之间配 IPsec 总是“连上了却不通”——预共享密钥模式下Wireshark 抓到的 ISAKMP 交换成功但 ESP 流量静默消失这才是真实实验场景的起点这不是一个讲“IPsec 理论有多美”的教程。这是我在 VMware Workstation 里搭了 7 套 Windows Server 2019 虚拟机、重装系统 13 次、抓包分析超 200 个 pcap 文件后把「基于预共享密钥的 IPsec 实验Windows 虚拟机间的 IPsec 配置及数据分析」真正跑通的实操笔记。它解决的是你正在面对的问题两台 Windows 虚拟机明明按文档配好了 IPsec 策略安全关联SA在netsh ipsec static show all里显示“已建立”ping 却超时Wireshark 里只看到 IKEv1 的第 1–5 次包主模式协商后续 ESP 加密流量根本不出网卡——连“加密失败”这种明确报错都没有只有沉默。原因不是密钥输错了而是 Windows IPsec 的策略匹配逻辑、虚拟网卡驱动行为、以及 IKE 协商中被忽略的 3 个关键字段尤其是IDii/IDir标识类型与本地地址绑定方式共同构成的黑匣子。本文不讲 RFC4301只告诉你用 VMware Workstation 搭两台 Win10/WinServer 虚拟机在无域环境、纯预共享密钥PSK模式下如何让ping -S 192.168.100.10 192.168.100.20真正触发 ESP 封装、被 Wireshark 捕获、并可逐层解密验证。适合网络工程师、安全实验课学生、以及所有被“IPsec 配置成功但业务不通”折磨过的人。2. 从零构建可复现的实验环境VMware 网络拓扑、Windows 版本选择与 PSK 模式下的策略建模逻辑2.1 VMware Workstation 网络模式选型仅 Host-Only 能暴露真实 IPsec 行为NAT 是“假成功”的温床很多教程用 NAT 模式配 IPsecping能通就以为成功——这是最大陷阱。NAT 会劫持并改写 ICMP 包的源/目的 IP导致 Windows IPsec 策略引擎在匹配“流量是否需保护”时依据的是原始 IP如 192.168.100.10 → 192.168.100.20而实际发出去的包经过 NAT 后变成 192.168.171.10 → 192.168.171.20策略无法命中ESP 不触发。必须用 Host-Only 模式且禁用 DHCP手动配置静态 IP提示VMware Workstation 中新建虚拟网络选择“Host-only”取消勾选“Connect a host virtual adapter to this network”避免宿主机干扰然后为两台虚拟机分配同一子网内静态 IP例如VM-A192.168.100.10 /24VM-B192.168.100.20 /24确保ping 192.168.100.20在未启用 IPsec 时双向通畅且arp -a能看到对方 MAC 地址。2.2 Windows 版本与服务状态Server 2016 或 Win10 1809 是底线PolicyAgent服务必须设为自动并运行Windows IPsec 实现依赖PolicyAgent服务对应ipsec子系统。旧版 Windows如 Win7/Server 2008 R2使用IKEEXT服务其日志格式、策略语法、甚至 PSK 存储位置都不同极易踩坑。实测稳定版本组合VM-A VM-B 均使用 Windows Server 2019 Datacenter1809或 Windows 10 Pro 21H2管理员权限运行# 检查服务状态 Get-Service PolicyAgent | Select-Object Status, StartType, Name # 若未运行启动并设为自动 Start-Service PolicyAgent Set-Service PolicyAgent -StartupType Automatic注意PolicyAgent服务启动后会自动加载注册表中HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent\Parameters下的策略缓存。若之前配过失败策略建议先执行netsh ipsec static delete all清空再重配避免残留策略干扰。2.3 PSK 模式下的策略建模不是“配个密钥就行”而是三段式策略Filter→FilterAction→Policy的严格绑定Windows IPsec 策略不是一条命令能完成的它由三层对象构成缺一不可且顺序敏感Filter过滤器定义“哪些流量需要保护”精确到协议、端口、源/目 IP。FilterAction过滤动作定义“对匹配流量做什么”如Permit放行、Block阻断、NegotiateSecurity协商安全。Policy策略将 Filter 和 FilterAction 关联并指定协商参数如 PSK、DH 组、加密算法。常见错误是只配了 Policy没创建 Filter 或 FilterAction或 Filter 的 IP 范围写成0.0.0.0/0导致匹配过于宽泛引发策略冲突。正确做法是为每台虚拟机单独建一对 Filter入站/出站和 FilterAction再绑定到 Policy。例如VM-A 要保护192.168.100.10 ↔ 192.168.100.20的 ICMP 流量:: 在 VM-A 上执行管理员 CMD netsh ipsec static add filter filterlistICMP_Bound srcaddr192.168.100.10 dstaddr192.168.100.20 protocolicmp mirroredyes netsh ipsec static add filteraction nameIPsec_ICMP actionnegotiatesecurity securitymethodpresharedkey netsh ipsec static add policy nameTo_VM_B assignyes netsh ipsec static add filterpolicy policynameTo_VM_B filterlistICMP_Bound filteractionIPsec_ICMP逻辑说明mirroredyes表示该 Filter 同时匹配A→B和B→A方向securitymethodpresharedkey明确指定 PSK 模式assignyes立即激活策略。关键参数protocolicmp必须小写srcaddr/dstaddr必须是实际网卡 IP不能写anyfilterlist和filteraction名称需全局唯一避免重名覆盖。3. 预共享密钥PSK的注入与验证set presharedkey命令的隐藏约束与密钥同步时机3.1 PSK 注入命令的完整语法与位置约束密钥必须在 Policy 绑定 Filter 后、Assign 前设置Windows 不允许在 Policy 创建时直接指定 PSK必须分步操作。且set presharedkey命令有严格位置要求必须在add filterpolicy之后、assignyes之前执行。否则密钥不会被关联到该策略实例。正确顺序:: VM-A 上完整流程管理员 CMD netsh ipsec static add policy nameTo_VM_B assignno netsh ipsec static add filterlistICMP_Bound netsh ipsec static add filter filterlistICMP_Bound srcaddr192.168.100.10 dstaddr192.168.100.20 protocolicmp mirroredyes netsh ipsec static add filteraction nameIPsec_ICMP actionnegotiatesecurity securitymethodpresharedkey netsh ipsec static add filterpolicy policynameTo_VM_B filterlistICMP_Bound filteractionIPsec_ICMP :: 关键步骤在此处注入 PSK netsh ipsec static set presharedkey policyTo_VM_B keyMySecurePssw0rd2024! :: 最后激活 netsh ipsec static set policy nameTo_VM_B assignyes参数说明key后的字符串是明文 PSK长度建议 12 位以上含大小写字母、数字、符号policy必须与add policy name完全一致区分大小写set presharedkey执行后无回显需用netsh ipsec static show policy nameTo_VM_B查看是否生效输出中应有Preshared Key: MySecurePssw0rd2024!。3.2 密钥同步的“时间窗口”两台虚拟机必须在 30 秒内完成 PSK 设置否则 IKE 协商失败PSK 模式下IKE 主模式第 3 次包IDii携带发起方标识第 4 次包IDir携带响应方标识。Windows 默认使用IP Address类型标识即用本机 IP 地址作为身份凭证。当 VM-A 向 VM-B 发起协商时VM-B 必须已配置好同名 Policy 及 PSK否则在收到第 3 次包后因本地无匹配 Policy直接丢弃VM-A 等待超时默认 30 秒后重试。实操节奏先在 VM-A 上执行add policyset presharedkeyassignyes此时 Policy 处于“等待协商”状态立即切换到 VM-B在 30 秒倒计时结束前完成完全相同的三步add policy、set presharedkey、assignyes再回到 VM-A 执行ping -S 192.168.100.10 192.168.100.20触发协商。血泪经验曾因 VM-B 配置慢了 32 秒Wireshark 抓到 VM-A 发送 3 次ISAKMP SA_INIT后停止日志显示No response from peer。解决方案配置前先在两台机上运行date /t time /t对时确保误差 5 秒或用批处理脚本将三步打包复制粘贴执行减少人为延迟。4. Wireshark 抓包与 IPsec 数据分析识别 ISAKMP 成功标志、定位 ESP 加密失败点、验证解密可行性4.1 抓包位置与过滤器必须在虚拟网卡而非环回抓包用ip.proto 50 or udp.port 500过滤核心流量在 VMware Host-Only 网络中IPsec 流量走物理网卡如VMware Network Adapter VMnet1绝不能在Loopback或Any接口抓包。Wireshark 设置选择正确的虚拟网卡名称含VMnet应用显示过滤器ip.proto 50 or udp.port 500 or udp.port 450050 ESP 协议号500 IKEv1 端口4500 NAT-T 端口虽本实验不用 NAT-T但保留以防万一逻辑说明ip.proto 50直接捕获 ESP 加密包外层 IP Header 的 Protocol 字段为 50udp.port 500捕获 IKE 协商包。若只看到 UDP 500 流量没有 ESPProtocol 50包说明协商成功但策略未触发加密——问题出在 Filter 匹配或mirrored设置。4.2 ISAKMP 协商成功的 3 个硬指标第 5 次包ISAKMP SA_ACK出现、Security Association日志、netsh ipsec dynamic show saIKEv1 主模式共 6 次包但 Windows 实现中第 5 次包ISAKMP SA_ACK出现即表示 SA 建立成功第 6 次为可选确认。Wireshark 中观察过滤udp.port 500找到ISAKMP协议流确认包序列为SA_INIT→SA_INIT_R→KENONCEIDii→KENONCEIDir→IDiiHASH→IDirHASH→SA_ACKSA_ACK包的 Info 列显示ISAKMP SA ACK且 Destination IP 为对端地址。同时验证系统级状态:: 在 VM-A 上执行 netsh ipsec dynamic show sa :: 输出应包含 :: Active SAs: 1 :: Inbound SPI: 0x12345678 (2987654321) :: Outbound SPI: 0x87654321 (2271560481) :: Encryption: AES 256, Authentication: SHA1参数说明SPISecurity Parameter Index是唯一标识 SA 的 32 位值Encryption/Auth字段确认算法协商结果。若此处为空说明 SA 未建立若Inbound/OutboundSPI 不对称说明单向加密失败。4.3 ESP 解密实战Wireshark 中导入 PSK 解密 ESP 流量的完整步骤与密钥格式要求Wireshark 本身不存储 PSK需手动配置解密密钥。关键点密钥必须是十六进制格式的 MD5(PSK双方 IP) 值而非原始 PSK 字符串。Windows 使用MD5(PSK || Initiator_IP || Responder_IP)生成密钥材料RFC2409 Appendix B。实操步骤计算密钥PSK MySecurePssw0rd2024!Initiator_IPVM-A192.168.100.10Responder_IPVM-B192.168.100.20拼接字符串MySecurePssw0rd2024!192.168.100.10192.168.100.20计算 MD5在线工具或 Pythonimport hashlib s MySecurePssw0rd2024!192.168.100.10192.168.100.20 print(hashlib.md5(s.encode()).hexdigest()) # 输出e8f3a1b2c4d5e6f7g8h9i0j1k2l3m4n5示例Wireshark 设置Edit → Preferences → Protocols → ESP勾选Decrypted ESP payloads点击Edit→New输入SPI:0x12345678从netsh ipsec dynamic show sa获取Encryption algorithm:AES-CBCEncryption key:e8f3a1b2c4d5e6f7g8h9i0j1k2l3m4n532 字符十六进制Authentication algorithm:HMAC-SHA-1-96Authentication key: 留空SHA1 认证密钥由主密钥派生Wireshark 自动处理应用后重新加载 pcapESP 包的 Payload 将显示为明文 ICMP。注意若解密失败Wireshark 日志Help → About Wireshark →Folders → Personal configuration会提示Failed to decrypt ESP payload常见原因是 SPI 错误或 MD5 计算输入 IP 顺序颠倒必须 Initiator 在前Responder 在后。5. IPsec 配置避坑指南5 条血泪教训每一条都来自真实翻车现场5.1 现象Wireshark 抓到完整的 6 次 ISAKMP 包但netsh ipsec dynamic show sa显示Active SAs: 0原因Policy 虽已assignyes但 Filter 的srcaddr/dstaddr与虚拟机实际 IP 不符。VMware Host-Only 网卡可能有多个 IPv4 地址如192.168.100.10和169.254.x.xWindows 默认用第一个地址参与 IKE 标识而 Filter 绑定的是第二个。解决在 VM-A 上运行ipconfig /all确认IPv4 Address第一行是192.168.100.10若非如此禁用其他 IPv4 地址或在 Filter 中显式指定srcaddr192.168.100.10。5.2 现象ping命令返回Reply from 192.168.100.20: bytes32 time1ms TTL128但 Wireshark 中只有明文 ICMP无 ESP 包原因Filter 的mirroredyes未设置导致 Filter 仅匹配A→B方向B→A的 reply 包不触发加密Windows 认为“单向保护”不满足策略拒绝建立 SA。解决删除原 Filter重建时务必加mirroredyes参数或分别创建两个 FilterA→B和B→A并绑定同一 FilterAction。5.3 现象VM-A 能 ping 通 VM-B但 VM-B ping VM-A 时超时Wireshark 在 VM-B 上看到 ESP 包发出但 VM-A 收不到原因VM-B 的 Policy 中filteraction的securitymethod写成certificate而非presharedkey导致 VM-B 尝试用证书协商VM-A 无响应。解决检查netsh ipsec static show filteraction nameIPsec_ICMP输出确认Security Method为Pre-Shared Key若为Certificate用netsh ipsec static delete filteraction nameIPsec_ICMP删除后重配。5.4 现象netsh ipsec static show policy显示 Policy 已Assigned但ping无任何反应Wireshark 无任何 IPsec 相关包原因PolicyAgent服务未运行或运行但被 Windows Defender 防火墙阻止尤其在 Server Core 模式下。解决运行Get-Service PolicyAgent | Select-Object Status确认状态执行Set-NetFirewallRule -DisplayName Windows IPsec Service -Enabled True启用相关防火墙规则若仍无效临时关闭防火墙测试Set-NetFirewallProfile -Profile Domain,Private,Public -Enabled False。5.5 现象Wireshark 解密后ESP Payload 显示乱码而非明文 ICMP原因MD5 计算时 PSK 字符串编码错误如 Windows 默认 ANSI 编码Python 默认 UTF-8或 IP 地址拼接时未去除空格/换行。解决在 Python 中强制用s.encode(utf-8)或s.encode(cp1252)Windows 默认编码用echo PSKIP1IP2 | md5sumLinux或在线工具验证确保拼接字符串无额外字符PSKIP1IP2三者间无空格、冒号、点号。6. 进阶技巧用 PowerShell 自动化批量配置、通过ipsec monitor实时诊断、以及多子网 IPsec 策略的扩展设计6.1 PowerShell 脚本一键部署消除手动输入错误支持 10 虚拟机批量配对手动敲netsh命令易错尤其多台虚拟机时。以下脚本保存为Deploy-IPsec.ps1可自动生成并执行完整配置# Deploy-IPsec.ps1 param( [string]$LocalIP 192.168.100.10, [string]$RemoteIP 192.168.100.20, [string]$PSK MySecurePssw0rd2024!, [string]$PolicyName To_Remote ) $FilterList Filter_$($LocalIP)_$($RemoteIP) $FilterAction Action_$($LocalIP)_$($RemoteIP) # 清空旧策略 netsh ipsec static delete all 21 | Out-Null # 创建策略框架 netsh ipsec static add policy name$PolicyName assignno netsh ipsec static add filterlist$FilterList netsh ipsec static add filter filterlist$FilterList srcaddr$LocalIP dstaddr$RemoteIP protocolicmp mirroredyes netsh ipsec static add filteraction name$FilterAction actionnegotiatesecurity securitymethodpresharedkey netsh ipsec static add filterpolicy policyname$PolicyName filterlist$FilterList filteraction$FilterAction netsh ipsec static set presharedkey policy$PolicyName key$PSK netsh ipsec static set policy name$PolicyName assignyes Write-Host ✅ IPsec Policy $PolicyName deployed for $LocalIP ↔ $RemoteIP Write-Host Verify with: netsh ipsec static show policy name$PolicyName使用方法在 VM-A 上以管理员权限运行.\Deploy-IPsec.ps1 -LocalIP 192.168.100.10 -RemoteIP 192.168.100.20 -PSK MySecurePssw0rd2024!VM-B 上交换 IP 参数运行。脚本自动清理旧策略避免残留干扰。6.2 实时诊断神器ipsec monitor命令比netsh更细粒度定位协商卡点netsh ipsec static show只显示最终状态而ipsec monitor提供实时事件流。启用方法# 开启监控管理员 CMD netsh ipsec monitor start # 查看实时日志新窗口 netsh ipsec monitor show events当ping触发协商时日志会逐行输出IKE negotiation started for 192.168.100.20Phase 1 completed successfullyPhase 2 proposal acceptedSA established for 192.168.100.20若卡在某一步如Phase 1 failed: No proposal chosen说明算法不匹配VM-A 设 AES-256VM-B 设 3DES需统一netsh ipsec static add filteraction中的encrypthash参数。6.3 多子网扩展设计用netsh ipsec static add filter的srcmask/dstmask支持 CIDR 网段实验不止于两台主机。若 VM-A 属于192.168.100.0/24VM-B 属于192.168.200.0/24需保护整个子网互访:: VM-A 上192.168.100.10 netsh ipsec static add filter filterlistSubnet_Bound srcaddr192.168.100.0 srcmask255.255.255.0 dstaddr192.168.200.0 dstmask255.255.255.0 protocolany mirroredyes关键参数srcmask/dstmask必须是点分十进制掩码非/24protocolany匹配所有协议。此时ping任意192.168.100.x→192.168.200.y均触发 ESP。我坚持在每次新环境部署前先用netsh ipsec static delete all彻底清空再跑 PowerShell 脚本——这省去了排查 80% 的“策略残留”问题。Wireshark 解密时永远先验证SA_ACK包是否存在再算 MD5最后填 SPI。翻车不可怕可怕的是把“没看到 ESP 包”当成“IPsec 不工作”而实际上它可能早已在后台静默协商失败。希望帮到你。本文还有配套的精品资源点击获取

相关推荐

ROS2+MoveIt2实战:Panda机械臂笛卡尔路径规划与避障全流程
ROS2+MoveIt2实战:Panda机械臂笛卡尔路径规划与避障全流程

/* 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 7:40:28

迪文串口TFT屏通用驱动:从指令集到可复用代码的落地路径
迪文串口TFT屏通用驱动:从指令集到可复用代码的落地路径

/* 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 7:40:28

美股与A股市场反应差异解析及套利策略
美股与A股市场反应差异解析及套利策略

1. 市场反应差异现象解析最近观察到的一个有趣现象:某些行业利好或利空消息在美股市场快速反应后,A股市场往往需要延迟一段时间才会出现类似的价格变动。这种跨市场间的信息传导延迟,本质上反映了不同市场结构、参与者构成和交易机制带来的价… · 2026/9/25 7:40:22

谷歌把 TPU 送上了天:4 颗芯片、15 分钟,太空数据中心的第一次真刀真枪
谷歌把 TPU 送上了天:4 颗芯片、15 分钟,太空数据中心的第一次真刀真枪

💡 一句话总结:谷歌的太空 AI 算力计划 Project Suncatcher 从纸面论文走进了发射场——首颗原型卫星定档 10 月 1 日,但只带 4 颗 TPU、每次跑 15 分钟;愿景(81 星组网)与现状(一次 15 分钟的验… · 2026/9/25 8:54:22

影刀RPA实战:微信聊天记录自动导出Excel的完整方案
影刀RPA实战:微信聊天记录自动导出Excel的完整方案

做运营的人应该都经历过这种场景:领导说“把上个月和A客户的所有聊天记录整理成表格”,你只能打开微信,一条条往上翻,复制粘贴到Excel里,再手工标记日期和联系人。聊天少还好,遇到一天几十条的群&#xff0… · 2026/9/25 8:54:10

PaddleSpeech 语音特征提取实战:解析 python_kaldi_features 的 MFCC、Fbank 实现与 Kaldi 对齐细节
PaddleSpeech 语音特征提取实战:解析 python_kaldi_features 的 MFCC、Fbank 实现与 Kaldi 对齐细节

人工智能语音音频 【免费下载链接】PaddleSpeech Easy-to-use Speech Toolkit including Self-Supervised Learning model, SOTA/Streaming ASR with punctuation, Streaming TTS with text frontend, Speaker Verification System, End-to-End Speech Translation and Keyword… · 2026/9/25 8:54:10

Java变量深度解析:内存模型、作用域、常量与命名规范
Java变量深度解析:内存模型、作用域、常量与命名规范

变量大概是Java里第一个绕不开、又被大多数教程一句话带过的概念。我见过工作两三年的开发,能把集合框架、JVM调优聊得头头是道,但你问他int a 10;这一行到底发生了什么,他反而含糊其辞。变量看起来简单,简单到我们每天都在写&am… · 2026/9/25 8:53:51

Tekton Pipeline 依赖库 go-fed/httpsig:HTTP Signatures 请求/响应签名与验证实现解析
Tekton Pipeline 依赖库 go-fed/httpsig:HTTP Signatures 请求/响应签名与验证实现解析

云原生CI/CDDevOps后端 【免费下载链接】pipeline A cloud-native Pipeline resource. 项目地址: https://gitcode.com/gh_mirrors/pipelin/pipeline 点击查看 免费下载 本文以 Tekton Pipeline 仓库中 vendored 的第三方库 go-fed/httpsig(v1.1.0&… · 2026/9/25 8:53:45

业务开发视角的可观测体系建设:从日志、链路到告警的实战指南
业务开发视角的可观测体系建设:从日志、链路到告警的实战指南

那天晚上十一点半,业务群突然炸了:下单成功率掉了快一半,用户反馈进来一堆。我作为订单模块的业务开发,打开监控大盘一看,CPU 正常、内存正常、服务平均耗时也正常,整个系统看起来"健康"得不能再… · 2026/9/25 8:53:45

数值优化(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

了解更多?预约专属演示

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

企业微信二维码