news 2026/10/23 1:03:59

MSTP生成树协议原理与中兴交换机配置实战:消除环路实现链路负载均衡

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MSTP生成树协议原理与中兴交换机配置实战:消除环路实现链路负载均衡

先聊个很多网络工程师都纠结过的问题:为了可靠性给交换机之间加了两条链路,结果网络不仅没有更“稳”,反而隔三差五瘫痪。广播帧在物理环路里无限复制,交换机MAC地址表疯狂抖动,CPU被BPDU和广播包打满。平时看似人畜无害的接入层小环路,关键时刻能让整片业务网停摆。解决这一切的,就是STP这棵“逻辑树”。这篇内容我从原理讲到配置,再到中兴交换机上MSTP的完整落地过程,适合刚接触交换技术的初学者,也适合需要在生产网里做冗余改造、负载均衡的运维同学。看完你能明白为什么MSTP比STP聪明得多,也能直接抄一套能用的配置。

1. 环路并不是“多条路更稳”,而是灾难的起点

1.1 先看环路是怎么被“好心”制造出来的

做过网络的都知道,生产网里交换机之间几乎不可能只连一根线。常见的场景是:核心交换机A和B之间做堆叠或级联,接入交换机SW1为了冗余分别上联到A和B,或者两台接入交换机之间再互联一根线。物理拓扑就变成了一个“回”字或“口”字。从设计者的角度看,任何一台交换机的上行链路断开,业务还能从另一条链路绕过去,这确实是高可用。

但物理冗余有个容易被忽略的代价:以太网帧本身没有TTL,交换机对广播帧、组播帧、未知单播帧的处理原则是“收到就泛洪”。一旦二层拓扑存在环路,这些帧会在环路里像陀螺一样永不停歇地转发,每一台交换机都在重复复制和转发,最终耗尽所有链路带宽和交换芯片的转发能力。这就是广播风暴。不夸张地说,我在模拟环境里只搭了两台交换机、一条网线形成的环路,几秒钟内就能让思科、华为、中兴这些设备的CPU占用率达到百分百,Console口敲命令都卡。

1.2 MAC地址表漂移才是最先暴露的问题

环路初期不一定先表现为“完全瘫痪”,更多时候是网络时通时断、丢包严重。原因在于交换机需要做二层转发,它维护着一张MAC地址表,记录每个MAC地址从哪个端口学来。环路里同一个帧既可以从A口进来,也可以从B口进来,交换机会认为这个MAC地址在A口和B口之间来回“横跳”,于是一直刷新地址表,导致原本该走最优路径的帧被随机发往某个方向,实际效果就是丢包、延迟增大、业务间歇性不可用。

这个问题在做故障排查时非常典型:登录设备后执行MAC地址表查询,看到同一个VLAN下同一个MAC地址对应多个端口,并且这个对应关系实时变化,就可以基本判定二层存在环路。而STP/MSTP的存在,就是在物理上允许你保留冗余链路,逻辑上却把交换网络剪成一棵没有环的树——多余的那条链路被阻塞,只在主链路故障时才打开。

1.3 为什么不能靠手工断开一条线解决

有人问:既然环路这么恐怖,手工把冗余链路shutdown掉不就行了?当然可以,但这就等于放弃了冗余。真正的需求是:平时让一条路径工作、其他路径备份;工作路径挂了,备份路径自动顶上。这个“自动”就是生成树协议要干的活。所以STP真正解决的是两个问题:一是消除广播风暴和MAC漂移,二是提供链路故障时的自动切换能力。理解了这一点,你再去看STP每个参数和状态设计,会觉得一切都合理起来了。

2. STP、RSTP、MSTP:三代协议解决了什么问题

2.1 传统STP(802.1D)的看家本领

生成树协议的核心思想是:交换机之间通过交换网桥协议数据单元来协商,选出一台交换机作为根桥,然后计算出一棵以根桥为根的树状拓扑。不在树上的冗余端口被置为阻塞状态,既不转发数据帧,也不学习MAC地址,只监听BPDU。

在这个体系里有两个关键概念:第一,根桥的选举。每个交换机启动时都认为自己是根桥,向外发送携带自身桥ID的BPDU,桥ID由优先级和MAC地址组成,优先级数值越小越优先。通过比较,最终全网只有一个根桥。第二,端口角色的确定。根端口是向根桥方向最优的端口,指定端口是每条网段上离根桥最近的端口,其余端口就是阻塞端口。为了收敛拓扑,STP端口状态要经历禁用、阻塞、监听、学习、转发五个阶段,默认Forward Delay为15秒,从阻塞到转发通常要经过两个Forward Delay,也就是约30秒。

这个30秒在现在的业务网络里是不可忍受的。我见过一台S9300老设备因上游链路切换导致全网OSPF邻居全震荡的案例,根本原因就是STP收敛太慢,VLAN接口状态一直起不来。所以后来就有了快速生成树。

2.2 RSTP(802.1w)到底快在哪里

RSTP对STP做的最重要改进是把端口角色细化为根端口、指定端口、备份端口、替换端口,并且引入了提议—同意机制。上游端口发出提议BPDU,下游端口直接回应同意,新链路可以在一个握手周期内进入转发状态,不再依赖漫长的Forward Delay倒计时。此外RSTP还允许配置边缘端口,接PC和服务器这类不会产生环路的端口可以立即进入转发状态,省去30秒等待。

在RSTP下,链路切换的收敛时间通常能压到1秒以内,取决于设备转发能力和拓扑复杂度。相对STP,RSTP已经是质变。但它依然是单实例生成树,也就是说整个交换网络不管有多少个VLAN,都共用一棵树。这带来两个问题:第一,流量必须走根桥所在的那条路径,另一条冗余链路始终闲置,没法负载分担;第二,某个端口为了破环被阻塞,那这个端口对应的所有VLAN都被阻塞,哪怕这个VLAN其实不需要从这里走。

2.3 MSTP(802.1s)是多棵树的“平行宇宙”

MSTP的出现就是为了解决RSTP不能负载均衡的问题。它的思路是:把交换网络划分成多个生成树实例,每个实例拥有独立的生成树计算过程,然后让不同VLAN映射到不同实例。实例1生成的树可以走链路A,实例2生成的树可以走链路B,两者互不干扰。对用户而言,不同VLAN的流量各走各的路径,冗余链路全部被利用起来。

形象一点说,RSTP像整座城市只有一条主干道,堵车就只能等;MSTP像是给不同方向的车流分别规划了高架桥,各走各的路,互相不添堵。当然,这也意味着配置复杂度上了一个台阶。你要设计实例,要划分VLAN映射,还要保证同一MST区域里的交换机配置一致,这也就引出了下一章要讲的三个核心概念。

表:三代生成树协议核心能力对比

协议标准收敛速度支持多实例多VLAN负载均衡配置复杂度
STP 802.1D秒级(30s+)否否低
RSTP 802.1w秒级以内否否低
MSTP 802.1s秒级以内是是中高

3. MSTP最核心的三个概念:实例、VLAN映射和生成树区域

3.1 实例:逻辑上的一棵独立生成树

MSTP中的“实例”就是一个生成树计算单元,它的编号从0开始。实例0是IST,必须存在,所有没有显式映射到其他实例的VLAN都归属实例0。剩下的实例编号可以自定义,比如在中兴交换机上,你可以把实例1、实例2、实例3创建出来,每个实例都独立运行生成树算法,各自选举根桥、计算最优路径。

要特别提醒的是:每个实例的根桥是可以独立指定的。这是做负载均衡的关键操作。传统RSTP只有一个根桥,所有VLAN的数据平面都向根桥汇聚。MSTP里你完全可以让实例1的根桥是核心交换机A,实例2的根桥是核心交换机B,这样VLAN 10的流量以A为根,VLAN 20的流量以B为根,两根上行链路都被用上,没有一条是闲置的。

3.2 VLAN映射表:决定哪个VLAN走哪棵树

实例本身没有意义,只有和VLAN映射绑定后,它才算承载了实际业务。映射的规则很简单:一条命令里把VLAN列表和实例编号绑定。中兴设备通常使用instance instance-id vlan vlan-list这种形式配置,比如instance 1 vlan 10,就意味着VLAN 10的BPDU参与实例1的生成树计算,VLAN 10的数据转发路径完全由实例1的树形拓扑决定。

这里最容易踩坑的是映射遗漏。我见过有人在核心设备上把VLAN 10映射到了实例1,但接入交换机上忘记给VLAN 10做映射,结果VLAN 10在MSTP网络的某个区域里走了实例0的默认拓扑,和预期路径完全不一致。更严重的是,如果两端VLAN映射不一致,交换机之间的MST配置握手会失败,生成树会被迫落在CIST上,整个MSTP区域内的隔离和负载分担全部失效。

3.3 生成树区域:MSTP的“行政区划”

生成树区域是MSTP引入的一个非常独特的概念。所谓MST区域,是指一组有着相同MST配置的设备集合,这个配置包括区域名称、修订级别,以及VLAN和实例的映射关系。只有这三者完全一致的交换机,才算处于同一个MST区域中。

如果两台交换机名字相同、修订号相同,但VLAN映射表不同,它们会被视为不同区域,区域之间的互联链路会成为CIST或MSTI的边界。这个边界一旦出现,跨区域的VLAN流量很容易出现路径绕远、甚至阻塞端口选择错误的情况。所以MSTP的配置必须做到全网一视同仁,别想着只在核心上配一下,接入层随便写写就行。每台设备的配置都需要完整对齐。

中兴交换机上区域配置通常集中在一个配置视图里,类似:

stp region-configuration region-name MNG-REGION revision-level 1 instance 1 vlan 10 instance 2 vlan 20 active region-configuration

需要注意一定要执行激活操作,否则区域配置只是改了缓冲区,没有被生成树协议真正采用。这点和VLAN配置要先创建再应用到端口是一样的道理。

4. 中兴交换机MSTP配置实战:从规划到命令行

4.1 需求规划:一个让大家抄作业的拓扑

为了把配置讲明白,我构建一个常见的中型网络。核心层有两台交换机,代号Core-A和Core-B,之间用两条链路做聚合或互联;接入层有两台交换机,代号SW1和SW2,各自双上联到两台核心。业务方面,VLAN 10承载办公网段,VLAN 20承载服务器管理网段。要求网络无环路冗余,同时对两根上行链路做负载分担,VLAN 10优先走Core-A,VLAN 20优先走Core-B,其中任意链路故障后能自动切换。

这个需求在实际项目里非常典型。如果使用RSTP,两台核心之间必须阻塞一条链路,而且SW1、SW2上只有一条上行链路处于转发状态,另一条永远空闲,带宽白白浪费。用MSTP就能让两条链路同时工作。

4.2 全局启用MSTP并配置区域

中兴交换机的命令行风格简洁,进入系统视图后,第一步是设置生成树模式为MSTP。命令大致如下:

system-view stp mode mstp

有了这个全局模式后,继续配置区域。所有参与MSTP的交换机,区域名称、修订级别、实例映射必须完全一致。这里我建议区域名称不要随便用,最好和网络业务区划挂钩。比如某公司项目使用编号,我会命名为统一的业务编码,好处是未来跨厂家调试时能快速判断对方区域配置是否正确。

在两台核心和两台接入交换机上,统一执行以下配置:

stp region-configuration region-name MNG-REGION revision-level 1 instance 1 vlan 10 instance 2 vlan 20 active region-configuration

这样的话,实例1负责VLAN 10,实例2负责VLAN 20,其余未映射的VLAN默认属于实例0。所以如果网络里还有其他管理VLAN,建议显式给它一个归宿,比如instance 0 vlan 1,避免管理流量意外走了一条不可控的路径,也别让它默认落在某个未知的实例上。

4.3 指定各实例的根桥和备份根桥

区域配置完成后,接下来是让每个实例有不同的根桥。我希望Core-A成为实例1的根桥,Core-B成为实例2的根桥,同时互为主备。在中兴设备上,可以通过stp instance instance-id priority命令调整桥优先级,数值越小优先级越高。默认优先级为32768,把Core-A的实例1优先级设为4096,它就会胜过其他设备,成为实例1的根桥。Core-B的实例2同理。同时为了备用根桥,可以给Core-A再设实例2的优先级为8192,Core-B设实例1优先级为8192。这样一台核心失效时,另一台能立刻顶上实例根桥的位置。

Core-A: stp instance 1 priority 4096 stp instance 2 priority 8192 Core-B: stp instance 1 priority 8192 stp instance 2 priority 4096

对于接入交换机SW1、SW2,为了保证收敛时不会跳变,它们不用配置特别低的优先级,维持默认即可。这里还要注意,根桥的优先级配置是针对实例而言的,不要写成全局的stp priority,那样会导致两个实例的根桥都是同一台设备,负载均衡就白做了。

4.4 端口角色优化与边缘端口配置

MSTP计算完成后,交换机之间的互联端口会自动形成根端口、指定端口、备份端口等角色,一般不需要手工干预。但为了让接入层到核心的路径符合预期,建议在上联端口上明确设置路径开销的标准或使用默认值。如果设备或链路速率不同,默认开销计算方式会有差异,比如1G口开销是20000,10G口开销是2000,此时生成树会天然优先选10G路径,这是合理的。没有特殊需求建议不要手工篡改路径开销,避免拓扑不符合直觉。

与PC、服务器、AP对接的端口则需要配置为边缘端口。边缘端口不参与生成树计算,直接进入转发状态,终端接入后不会经历STP的收敛等待。中兴设备下通常这样配置:

interface gigabitethernet1/0/1 stp edged-port enable quit

也可以选择在接口下使用stp disable彻底关闭STP,但我不推荐。因为一旦这个端口被人误插网线连到另一台交换机上,就会形成环路且没有任何保护。边缘端口虽然跳过生成树计算,但收到BPDU后依然会触发STP处理逻辑,这是比直接关闭STP稳妥得多的做法。

表:配置操作对应目标速查

操作对象目的关键命令或参数
全局模式启用MSTPstp mode mstp
区域配置形成统一MST域区域名称、修订号、实例映射一致
核心A实例1主根stp instance 1 priority 4096
核心B实例2主根stp instance 2 priority 4096
终端端口免收敛直通stp edged-port enable

4.5 完整的例行配置脚本

把上述配置拼在一起,以Core-A为例,完整脚本大致是这样:

system-view stp mode mstp stp region-configuration region-name MNG-REGION revision-level 1 instance 1 vlan 10 instance 2 vlan 20 active region-configuration quit stp instance 1 priority 4096 stp instance 2 priority 8192 interface gigabitethernet1/0/1 stp edged-port enable quit

接入交换机SW1的脚本除了根桥优先级不同外,基本一样。需要注意,中兴一些型号还提供了stp enable全局开关,如果你发现设备默认关闭生成树,需要先执行这个命令开启。我记得在部分低端交换机的默认配置里STP是关闭的,必须要显式开启,这个步骤经常被漏掉,导致前面所有配置全部无效,却怎么查都查不出原因。

5. 验证与排错:别等网络断了才看日志

5.1 必须掌握的查看命令

配置完成后,第一步要确认STP模式确实是MSTP而不是停留在默认模式。在中兴设备上执行display stp可以查看全局生成树状态,输出信息里会包含运行模式、当前角色、桥优先级等关键值。如果显示MSTP正常启用,再进一步用display stp instance 1查看实例1的根桥、根端口、指定端口信息。

举一个典型的验证过程:我在一台接入交换机SW1上执行display stp instance 1,返回结果里如果根桥ID显示为Core-A的桥MAC和优先级,说明实例1的根桥选举成功;然后查看SW1各端口的角色,上联到Core-A的端口应该是“根端口”或“指定端口”,另一个上联到Core-B的端口则根据拓扑可能是备份或替换端口。再执行display stp instance 2,此时根桥应该变成Core-B。如果两个实例的根桥都是同一台设备,问题基本出在优先级配置没生效,或者实例映射错乱。

管理VLAN或调度VLAN的默认实例也需要验证,执行display stp brief能快速看到所有VLAN端口的状态和角色。我习惯配置完所有步骤后,把这个列表打印出来,对照设计拓扑核对每一处转发和阻塞是否与预期一致。

5.2 端口状态停留在“监听/学习”不动——常见原因

配置完发现交换机的某个端口状态一直停留在监听或学习状态,没有转转发。这种情况多半和边缘端口配置缺失或故障链路倒换有关。先看这个端口是否连接到终端设备,如果是PC或服务器,必须确认边缘端口是否已经配置。如果已经配了边缘端口,但端口收发了BPDU,设备会把这个端口自动转换为非边缘端口,重新经历生成树收敛,这时候网络会有几十秒的断流,排查时可以通过抓包看端口是否持续收到BPDU。

另外,如果两台交换机之间既配置了Eth-Trunk/聚合又配置了STP,要注意聚合成员端口必须处于统一状态,否则每个成员端口会作为独立物理端口参与生成树计算,导致环路判断错乱。中兴设备上建议先创建聚合口,把STP配置应用在聚合逻辑口上,物理成员口不要单独配置。

5.3 BPDU收发不正常的排查思路

MSTP的实例状态依赖BPDU的交互。如果display stp中显示某端口BPDU收发计数持续为0,说明该链路可能没有收到任何生成树帧。这时检查物理链路、接口是否为Access口或Trunk口,并确认对端设备MSTP已开启。Trunk端口在MSTP里的正常工作没有问题,但要注意本端Trunk允许的VLAN列表必须包含相应VLAN,否则即使STP在工作,业务VLAN也无法在该链路上转发。

还有一个容易漏的点是,MSTP区域间的互联不会完全隔离,它们之间走的是CIST路径。如果跨区域业务不通,不要急着怀疑路由或防火墙,先检查区域配置是否正确。我曾经遇到一个两栋楼互联的MSTP配置,楼A区域名称是“MNG”,楼B区域名称是“MNG-1”,两边看着都差不多,但就是VLAN间二三层都通不了,最后核对才发现区域名称一个字符之差,导致所有VLAN的生成树计算全部错误。这种问题用display stp region-configuration逐台比对配置是最快的解决方式。

5.4 故障切换效果如何验证

配置完成后一定要做故障演练,不要只依赖理论判断。我常用的做法是在接入交换机的两个上联端口中,临时手动shutdown主用端口。切换应该在秒级完成,观察Ping业务IP的丢包数不超过几个包,或者干脆用快速Ping测试每秒发包量观测断流窗口。恢复主用端口时,链路重新协商和端口角色变更同样需要时间,测试业务是否回切也至关重要。

如果切换时业务中断太久,优先看根桥是否发生了重新选举。正常优先级配置下,故障切换只会影响端口角色变化,根桥不应变化。如果日志里出现根桥漂移或TC事件频繁触发,就要慎重检查是否存在环路或优先级配置未生效。

6. 我在生产网上配置MSTP踩过的坑

6.1 坑一:全局STP没开启,所有配置“白做了”

有一类问题很隐蔽:设备上配置了MSTP模式、配置了区域、配置了实例映射,所有命令都敲进去了,但上联端口依然处于转发状态,怎么看都不符合树形拓扑。排查到最后发现这台设备的全局STP默认没有启用,需要执行stp enable开启。中兴部分型号在出场配置里STP默认关闭,有些型号默认开启,同一厂商不同产品线也有差异。我的经验是配置前先执行一遍display stp看全局状态,如果显示Disabled,就先行开启再进入后续配置。这一步写在前头,能省掉后面一整轮排错。

6.2 坑二:接入层和核心层的VLAN映射表不一致

VLAN映射表不一致的杀伤力,我前面提过一次,但它的隐蔽性值得我再强调。假设核心交换机上实例1映射VLAN 10,实例2映射VLAN 20,接入交换机上因为配置更新漏了,只给实例1映射了VLAN 10,VLAN 20没写,那么VLAN 20会落到实例0的默认树里。这时VLAN 20的两条上联路径变得不可预测,可能长期走备份端口,也可能跨区域绕行。更糟的是,两台设备对MST配置的理解不一致,会认为它们不在同一个MST区域,导致CIST和MSTI之间相互影响,VLAN 10也可能跟着遭殃。

我现在的习惯是在所有设备上执行同一份区域配置模板,并且在版本发布单里明确要求配置比对。新上线设备直接用脚本生成配置,杜绝手敲遗漏。

6.3 坑三:边缘端口裸奔,环路隐患被“埋在地底下”

边缘端口如果配置不当,网络短时间看不出问题,但一旦有人误操作就出大事。可以这样操作,比如在某个接入端口同时连接了一台PC和一台普通交换机,而这个端口被配置成边缘端口,PC上联的这条链路如果和对端交换机的另一条链路构成环路,生成树因为边缘端口不参与计算,不会去阻塞任何端口,广播风暴会直接爆发。

所以在设计阶段必须明确哪些端口会连接终端,且只连接终端。如果接入的是带网管功能的IP电话或者AP,它们后面可能还串联着终端设备,这就要评估是否真的可以安全配置边缘端口。中兴交换机上边缘端口可以加stp edged-port enable,但并没能彻底隔绝BPDU。收到BPDU后边缘端口会自动转为普通端口,这一点是设备保护机制,不能省。

6.4 坑四:跨厂商对接时,MSTP参数差异

在实际网络中完全避不开跨厂商互联的场景。MSTP虽然遵循IEEE 802.1s标准,但不同厂商在实现细节上仍有差异。中兴设备和另一厂商设备互联,最常见的问题是Bridge ID中MAC地址的排序方式不同,或者MSTP域配置格式不同。比如有的厂商区域配置要求必须定义格式选择符,默认是0,中兴设备不显示这个参数,但交互时仍然会携带。双方配置看似正确,但区域不一定能建立成功。

遇到这种情况,我建议摒弃MSTP的思路,退回到RSTP作为跨厂商互联的兜底方案,在边界交换机上使用RSTP与对端互通,内部保留MSTP。虽然损失了跨厂商的负载均衡,但换来了稳定性和可排查性。如果必须全链路MSTP,那么一定要找双方技术手册彻底核对区域配置参数的每一个字段,包括区域名称、修订级别、VLAN映射表以及格式选择符。

6.5 最后分享一个排查清单

每次配置完MSTP,我都会按这个顺序自检一遍,这个习惯帮我避过很多雷:先看所有设备STP是否全局开启,再看区域配置是否完全一致并把实例映射核对三遍,然后确认核心交换机的实例优先级是否按规划配置,接着用display stp和display stp instance 1确认实际根桥和端口角色,随后做一次主备切换演练记录业务断流窗口,最后把边缘端口列表和物理端口规划表对一遍,确保没有误配和遗漏。把这几步走完,MSTP在网络上基本就是“隐形”的,平时你不会感受到它的存在,但关键时刻它能把冗余链路的价值真正发挥出来。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 1:03:01

MCP接入IoT Power功耗计:串口转AI工具的服务端开发实战

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

作者头像 李华
网站建设 2026/10/23 1:02:03

【ROS】ROS(九):坐标系统tf

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

作者头像 李华
网站建设 2026/10/23 1:01:46

【opencv】OpenCV一些函数的简单笔记

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

作者头像 李华
网站建设 2026/10/23 1:01:36

【c++】C++:boost::bind的一些用法

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

作者头像 李华
网站建设 2026/10/23 1:01:20

【android】Application.mk的文件梳理

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

作者头像 李华
网站建设 2026/10/22 23:59:19

SSRF服务端请求伪造:原理、利用与防御实践

先说一个我自己的经历。某次线上排查,发现一台业务服务器在半夜不断向内网发起非常规的请求,抓包一看,目标端口从 3306 扫到 6379,再扫到 11211。顺着调用链往上追,问题落在了我们自己做的一个“URL预览”功能上——前…

作者头像 李华