有些朋友可能听过一句话,叫“华为数通里,同网段互访的权限控制,十个有九个会配错”。这话有点标题党,但我接过的排障求助里,确实见过太多类似案例:需求很明确,就是同一个VLAN里,某台终端不能访问某台服务器/打印机/摄像头,结果ACL加了不少,要么完全没生效,要么整个VLAN都不通了,最后只能默默删掉配置。
其实问题不在ACL本身,而在对“同网段互访流量到底走哪条路径”的理解。再加上华为交换机的Hybrid接口本身就比Access/Trunk灵活,用好了可以做很多精准控制,用不好就变成连环坑。这篇文章我把这个场景从头到尾拆一遍,把为什么容易配错、ACL该放在哪、Hybrid怎么配合、以及排障思路一次讲清楚。
1. 先看翻车现场:同网段互访为什么这么难管
1.1 一个典型的“禁访服务器”需求
假设你有一台服务器,IP是192.168.1.200,接在交换机G0/0/20口;同一VLAN 10下有三台员工电脑,IP分别是192.168.1.100、192.168.1.101、192.168.1.102。领导要求:只允许192.168.1.100访问服务器,其他电脑不能访问,但各电脑之间的正常办公互访不能受影响。
这个需求在网络工程师看来非常简单,但实际操作中翻车率非常高。为什么?因为这里有一个隐藏条件:服务器和电脑都在VLAN 10,IP都在192.168.1.0/24网段,也就是说它们之间是同网段二层互访。
同网段互访的流量不会去找网关,不会经过VLANIF三层接口,交换机直接在二层就把报文从入口端口转发到了出口端口。这个特性决定了你配置ACL的位置和方向,必须完全按照“二层交换路径”来设计,而不是按“跨网段三层路由”的思路来。
1.2 我见过最多的两种错配方式
第一种是把ACL下在VLANIF接口上。比如:
interface Vlanif10 traffic-filter inbound acl 3001配置完一测,发现该不通的还在通。原因是VLANIF接口只处理“进入三层路由的流量”,同VLAN主机之间的二层互访报文根本不会上送到VLANIF,ACL自然匹配不到。
第二种是把ACL下在物理接口上,但方向理解反了。比如在服务器接口G0/0/20上配置了inbound方向的ACL,想拦“其他终端访问服务器”的流量,结果发现某些情况下能拦,某些情况又拦不干净,或者服务器自身的正常访问也被阻断。原因是方向到底匹配的是哪个方向的报文、源IP和目的IP分别是谁,很多人没想清楚。
所以,要配对这个场景,必须先弄明白两件事:Hybrid接口的报文标签行为是什么,以及ACL在物理接口上的匹配路径是什么。
2. 搞懂Hybrid:它比Access/Trunk灵活在哪
2.1 PVID、untagged、tagged到底在干嘛
华为交换机的端口链路类型默认就是Hybrid,很多刚接触华为设备的人甚至会忽略这一点。简单来说,Hybrid接口一个端口可以同时属于多个VLAN,但对外发送报文时,你可以决定哪些VLAN的报文保留标签,哪些VLAN的报文剥掉标签。
三个关键参数:
- PVID:端口的默认VLAN,收到不带标签的帧时,交换机会给这个帧打上PVID对应的VLAN标签。
- untagged VLAN列表:这些VLAN的报文从该接口发出时,会被剥掉标签,以无标签形式发送。
- tagged VLAN列表:这些VLAN的报文从该接口发出时,保留原标签。
举个例子:
interface GigabitEthernet0/0/1 port link-type hybrid port hybrid pvid vlan 10 port hybrid untagged vlan 10 20 port hybrid tagged vlan 30这个端口的PVID是10,收到无标签帧会归到VLAN 10;发出VLAN 10和VLAN 20的报文时不带标签,发出VLAN 30的报文时带标签。一个端口同时放通了3个VLAN,这在Access或Trunk上实现起来都比较别扭。
2.2 同网段互访场景下,Hybrid能干什么
在同网段互访控制这个场景里,Hybrid最常见的用法是作为接入端口,配置成和Access类似的效果:PVID=10,untagged vlan 10。此时它和Access口的唯一区别就是“可以额外放通其他VLAN”,这正是后面进阶玩法的基础。
如果只是控制同一个VLAN内终端访问服务器,其实Access口也能做,用不上Hybrid的特殊能力。但为什么业界总把“Hybrid + ACL”放在一起说?因为很多实际组网里,同一个IP网段的主机由于历史原因被分在了不同VLAN,或者接入交换机上联口需要同时透传多个VLAN,这时候Hybrid的“一个端口同时untagged多个VLAN”的能力就派上用场了。它能让你把原本隔离在不同VLAN里的“同IP网段”主机,重新“拉回”同一个二层广播域,然后再用ACL做精细化权限收敛。
所以Hybrid在这个方案里的角色不是“必须”,而是“让组网更灵活、让ACL有地方可以精准下发”。理解了这一点,后面看配置就不会觉得命令很玄乎。
3. ACL要放在“流量真正走的路径”上
3.1 二层互访的流量路径
先画一条最简单的路径:PC_A(192.168.1.101)访问Server(192.168.1.200),两台设备都接在同一台交换机上,属于VLAN 10。
PC_A发出一个目的MAC为Server MAC的以太网帧,进入交换机G0/0/12口。交换机查MAC地址表,知道Server的MAC对应G0/0/20口,于是将这个帧从G0/0/20口转发出去。整个过程MAC表就够了,不需要查路由表,不需要涉及VLANIF,也不会把报文送CPU处理。
ACL要想拦住这个流量,必须作用在“从G0/0/12进”或者“从G0/0/20出”这两个方向上。华为交换机物理接口下的traffic-filter就是干这个的。
有人会问:能不能在交换机全局或者VLAN下配置ACL?华为确实有基于VLAN的ACL绑定方式,但老款设备上行为比较难统一,而且可读性差。对于绝大多数场景,直接在物理接口上配traffic-filter最直观,也最好排障。
3.2 inbound和outbound方向怎么选
接口下的traffic-filter有两个方向:
- inbound:匹配“从这个接口接收进来”的报文。
- outbound:匹配“从这个接口发送出去”的报文。
对于PC_A访问Server的场景:
- 在PC_A接入接口G0/0/12上配置inbound方向,匹配到的报文源IP是192.168.1.101,目的IP是192.168.1.200。
- 在Server接入接口G0/0/20上配置outbound方向,匹配到的报文源IP依然是192.168.1.101,目的IP是192.168.1.200。
这两种做法都能拦住PC_A到Server的流量,但维护习惯不同。我个人的建议是:如果只控制少数几台终端,就在终端接口inbound方向配;如果有多台终端要访问同一个服务器/资源,就在服务器接口outbound方向配,这样ACL只需要维护在服务器侧一个端口下,后续加终端规则只动这个ACL即可。
注意:方向一定不能想当然。很多人以为服务器接口上配置inbound方向,就能“拦别人访问服务器”,其实inbound匹配的是“进入交换机服务器的这个接口”的报文,也就是从服务器发出来的报文,方向完全反了。想拦外部访问服务器的流量,必须用outbound方向。这是高频翻车点。
4. 实操:同一VLAN内“精准禁访”一台服务器
4.1 组网与需求
为了把配置讲清楚,我给一个可以直接抄作业的组网:
- 交换机:华为S5700系列(其他S系列也大同小异)
- VLAN 10:业务网段192.168.1.0/24
- Server:192.168.1.200,接在G0/0/20
- PC_101:192.168.1.101,接在G0/0/12,要求禁止访问Server
- PC_100:192.168.1.100,接在G0/0/11,允许访问Server
- PC_102:192.168.1.102,接在G0/0/13,允许访问Server
- 所有终端都需要能互相访问,不能因为加了限制影响办公
4.2 完整配置
先规划VLAN和端口:
vlan batch 10PC接入端口配置为Hybrid,PVID和untagged都设为VLAN 10,这一步其实和Access效果一样,但为了后面可能扩展,我习惯直接用Hybrid。
interface GigabitEthernet0/0/11 port link-type hybrid port hybrid pvid vlan 10 port hybrid untagged vlan 10 quit interface GigabitEthernet0/0/12 port link-type hybrid port hybrid pvid vlan 10 port hybrid untagged vlan 10 quit interface GigabitEthernet0/0/13 port link-type hybrid port hybrid pvid vlan 10 port hybrid untagged vlan 10 quit interface GigabitEthernet0/0/20 port link-type hybrid port hybrid pvid vlan 10 port hybrid untagged vlan 10 quit然后在PC_101的接入接口G0/0/12上配置ACL,并调用traffic-filter:
acl number 3001 rule 5 deny ip source 192.168.1.101 0 destination 192.168.1.200 0 rule 10 permit ip quit interface GigabitEthernet0/0/12 traffic-filter inbound acl 3001 quit这里“source 192.168.1.101 0”的0是华为ACL的通配符写法,写成0表示精确匹配这个IP地址。如果你希望匹配整个网段,可以写成source 192.168.1.0 0.0.0.255。
关键的一点:deny规则后面必须跟一条permit ip。否则这个接口下所有来源的IP报文都会被末尾隐含的deny any丢弃,结果就是PC_101不仅访问不了Server,连和其他电脑通信也会全部中断。
4.3 为什么这样配就能生效
现在PC_101访问Server时,报文从G0/0/12进入交换机,traffic-filter inbound会先检查这个报文。ACL规则从上往下匹配,rule 5明确匹配了源IP为192.168.1.101、目的IP为192.168.1.200的报文,直接丢弃。PC_101访问PC_100时,源IP是192.168.1.101,但目的IP不是192.168.1.200,所以rule 5不命中,继续匹配rule 10 permit ip,放行。
PC_100和PC_102的接入接口没有调用ACL,完全不受影响。
如果希望把所有“非授权终端访问Server”的流量全部集中在服务器接口下管理,也可以改成在G0/0/20上配置outbound方向的ACL:
acl number 3002 rule 5 deny ip source 192.168.1.101 0 destination 192.168.1.200 0 rule 10 permit ip quit interface GigabitEthernet0/0/20 traffic-filter outbound acl 3002 quit此时PC_101发往Server的报文从交换机向G0/0/20口发送时,方向是outbound,源IP是192.168.1.101,目的IP是192.168.1.200,同样命中rule 5被丢弃。
我实际更推荐第二种方式,因为当服务器不止一个时,你可以在服务器侧的接口上统一维护所有终端IP和权限,新增一台无权限终端时,只需要改一个ACL,不必跑到对应终端口上去加配置。
5. 进阶:Hybrid让“跨VLAN同网段”也能互相管控
5.1 跨VLAN同网段的尴尬
有一种历史遗留组网特别让人头疼:终端A在VLAN 10,IP是192.168.1.10;终端B在VLAN 20,IP也是192.168.1.20。两个VLAN的IP网段相同,都是192.168.1.0/24,但业务上需要A和B能互访。
这里的问题在于:不同VLAN之间本来要靠三层路由互通,但3层设备上如果同时存在VLANIF 10和VLANIF 20,这两个三层接口都会处于192.168.1.0/24网段。这样路由表会有冲突,ARP表项也会互相覆盖,终端A访问终端B时,网关根本不知道该把报文转给谁,整个通信会乱成一团。
老工程师遇到这种局,通常的办法就是改IP地址重新规划,但很多时候业务不能停、地址不能动。这时Hybrid接口就是救场选手。
5.2 Hybrid“合并广播域”的做法
思路很简单:既然三层路由走不通,那就绕过三层,让它们在二层直接互访。Hybrid接口允许一个物理接口同时untagged多个VLAN,这意味着交换机可以把VLAN 10和VLAN 20的报文都从同一个口剥掉标签发出去。
举个例子,一台汇聚交换机下连两台接入交换机。汇聚交换机的下联口G0/0/1连接接入交换机A(终端在VLAN 10),G0/0/2连接接入交换机B(终端在VLAN 20)。现在希望两边192.168.1.0/24网段的终端能够二层互访。
在汇聚交换机上可以这样配:
vlan batch 10 20 interface GigabitEthernet0/0/1 port link-type hybrid port hybrid pvid vlan 10 port hybrid untagged vlan 10 20 port hybrid tagged vlan 10 20 quit interface GigabitEthernet0/0/2 port link-type hybrid port hybrid pvid vlan 20 port hybrid untagged vlan 10 20 port hybrid tagged vlan 10 20 quit如果接入交换机上送到汇聚时打的trunk带标签,那么汇聚下联口只需要允许对应VLAN通过即可,Hybrid可以根据需要保留或剥掉标签。这里的关键是:当VLAN 10的报文从G0/0/1进入汇聚交换机,在向G0/0/2转发时,由于G0/0/2同时放通了VLAN 10和VLAN 20,并且对VLAN 10是允许通过的,报文就能从G0/0/2转发出去。两个VLAN在汇聚交换机这个层面实现了二层互通。
5.3 配合ACL做权限收敛
“合并广播域”是把双刃剑。它解决了同网段互访问题,但打破了VLAN原有的隔离。如果不做任何控制,VLAN 10和VLAN 20里所有终端都能互相访问,广播报文也会在两个VLAN之间泛洪,存在安全和性能隐患。
所以正当的用法永远是:让Hybrid在二层打通通路,再用ACL在物理接口上把不需要的互访关系“掐掉”。
比如要求:192.168.1.10(VLAN 10)可以访问192.168.1.20(VLAN 20),但192.168.1.11(VLAN 10)不能访问192.168.1.20。那么可以在汇聚交换机G0/0/2接口的inbound方向下发ACL:
acl number 3003 rule 5 deny ip source 192.168.1.11 0 destination 192.168.1.20 0 rule 10 permit ip quit interface GigabitEthernet0/0/2 traffic-filter inbound acl 3003 quit这样从接入交换机B进来的所有流量,只要匹配源IP 192.168.1.11、目的IP 192.168.1.20,就被汇聚交换机在入口方向丢弃。其他流量正常放行。
这个场景中,如果没有Hybrid的“多VLAN untagged”能力,VLAN 10和VLAN 20在二层就是隔离的,ACL配置得再对也没有意义,因为流量根本不会经过同一个接口。
注意:这种做法适合小型网络、临时改造或业务割接过渡期使用。如果网络规模很大,不建议长期把多个VLAN的广播域合并,否则排障和安全性都会变得很痛苦。能用正规三层路由+VLANIF方案解决的话,还是优先改规划。
6. 常见问题与排查实录
6.1 现象与原因对照表
我做了一个速查表,基本覆盖了日常能碰到的大部分问题。
| 现象 | 最可能的原因 | 解决方法 |
|---|---|---|
| 在VLANIF下配了ACL,同网段互访没被拦 | VLANIF只处理三层流量,同VLAN二层互访不经过它 | 把ACL下发到对应物理接口,用traffic-filter |
| 终端口开了inbound ACL后,所有访问都不通了 | deny规则后面没有permit ip | 补一条rule 10 permit ip |
| 服务器口outbound ACL配置了,但终端还能访问服务器 | ACL规则里源IP和目的IP写反了 | 确认方向:outbound匹配从接口发出的报文,源是终端IP,目的是服务器IP |
| 在服务器口用了inbound方向拦“别人访问服务器”,拦截不彻底 | 方向理解错误,inbound匹配的是服务器发出的报文 | 改成outbound方向,或改到终端接入口的inbound方向 |
| ACL已经配置,display acl也能看到规则,但计数不增加 | 流量没有经过该接口,或ACL绑错了接口 | 检查接口编号,确认终端接在哪个口 |
| 终端ping服务器不通,但ARP表项里能学到对方MAC | ACL只拦了IP报文,ARP协议报文不受IP ACL影响 | 属于正常现象,不用处理 |
| 跨VLAN同网段用Hybrid后,广播报文变多了,个别人还能绕过ACL互访 | 广播域扩大,VLAN隔离被Hybrid打破 | 细化ACL规则,控制互访范围;尽量避免长期使用该方案 |
6.2 排查命令与思路
遇到“ACL存在但没生效”的故障,我有几个固定的排查习惯。
先用display acl all看规则和命中计数。规则里有matched字段,如果一直是0,说明报文根本没匹配到这条规则。这时候先别怀疑硬件,先看接口有没有绑对、方向有没有选对。
display acl all然后看接口下的traffic-filter应用记录,确认ACL到底绑在哪个接口、哪个方向:
display traffic-filter applied-record如果ACL规则计数在增长,但业务看起来还是通的,那要确认是不是有其他放行策略优先级更高。华为设备上,如果同时配置了MQC流策略、端口隔离、traffic-filter等,生效顺序可能因为设备型号不同而有差异。我一般建议不要在一个接口同时叠多种过滤方式,能合并到同一个ACL里就合并,否则排障时会非常痛苦。
再看接口的VLAN信息,确认Hybrid配置是否符合预期:
display port vlan这条命令可以清楚看到每个接口的link-type、PVID、untagged VLAN和tagged VLAN,排查“报文带不带标签”“VLAN放通状态”非常有用。
如果还解决不了,就把问题拆成两步:先单独验证ACL,比如临时写一条permit/deny所有IP的规则,确认接口方向有没有绑错;再验证Hybrid,把两个终端分别接入,用抓包或display mac-address看MAC表项,确认二层转发路径。网络问题只要能把“路径”和“过滤点”对齐,九成都能解决。
7. 写在最后:一些经验和小技巧
我在实际项目里用这套组合踩过不少坑,也有几个习惯可以分享。
第一,同网段互访控制优先在“被访问资源侧”的接口做outbound过滤。比如控制员工访问服务器,就在服务器的接入接口上统一挂ACL,这样权限规则集中在一处,后续新增终端、调整权限都好维护。如果网络里服务器不止一台,可以每台服务器按需挂,或者在服务器接入的上联口统一管控。
第二,明确“ACL可以拦IP,但拦不住ARP”。很多人用ping测试不通,就以为ACL全部生效了,其实ARP请求是二层广播报文,IP ACL对ARP不生效。所以你会发现,即使ping不通,ARP表项还是能学到。这不是配置错误,而是协议特性,别浪费时间在这个点上。
第三,Hybrid非常灵活,但不要滥用。华为端口默认就是Hybrid,很多人在没有任何意识的情况下就用了它。对于普通接入端口,PVID、untagged VLAN列表和tagged VLAN列表最好保持简洁,能一眼看出端口属于哪个VLAN。只有在需要“同VLAN内精准控制”或“跨VLAN同网段互通”的场景,才把Hybrid的多VLAN能力拉出来用,配合ACL收口。
第四,如果业务要求只是“某些端口之间完全隔离、同VLAN内不通信”,用端口隔离port-isolate比ACL更省事。但端口隔离是一刀切,无法做到“特定终端不能访问服务器、但还能访问其他终端”。你能接受这种粒度,就直接用隔离;不行的话,还是老老实实Hybrid+ACL。
最后再分享一个实用小技巧:在ACL里写规则时,建议给后续扩展预留编号空间。华为默认步长是5,你写了rule 5、rule 10,以后想在中间插入一条规则,可以用rule 6或者rule 8,不用重新改编号。别一上来就把10、20、30用满。我见过很多同事在规则中间想插一句,结果只能全部删除重建,都是编号规划不好惹的祸。
华为数通这套东西,命令本身不算难,难的是把流量路径和过滤逻辑理解透。只要记住“同网段互访走二层,ACL就下到物理接口;Hybrid负责让流量按你的预期走,ACL负责把不该通的流量悄悄扔掉”,以后再遇到类似的权限控制需求,基本就不会配错了。