第41篇:用 ACL 实现简单流量过滤
关键词:ACL、流量过滤、traffic-filter、接口应用、入方向、出方向、华为配置
一、引言
在上一篇中,我们学习了 ACL 的两种匹配顺序:配置顺序和自动排序。有了 ACL 规则的定义,下一步就是把这些规则"挂"到具体的接口上,实现对流量的实际拦截与放行。ACL 本身只是一组匹配条件,只有应用到接口方向上,才能对数据包产生真正的过滤效果。
华为设备上,ACL 流量过滤主要通过 traffic-filter 命令实现。本文将讲解 ACL 在接口上的应用方法、入方向与出方向的区别,以及常见的实战场景和故障排查思路。
二、核心概念
2.1 ACL 应用方式
| 应用方式 | 命令 | 说明 |
|---|---|---|
| 接口流量过滤 | traffic-filter | 在接口入/出方向直接丢弃匹配 deny 规则的流量 |
| 流策略(QoS) | traffic-policy | 配合 QoS 使用,可实现标记、限速、重定向等复杂操作 |
| 策略路由 | policy-based-route | 以 ACL 作匹配条件(if-match acl),实现不按路由表转发的场景 |
本文聚焦:接口级别的
traffic-filter简单流量过滤。
2.2 入方向 vs 出方向
| 方向 | 命令参数 | 过滤时机 | 适用场景 |
|---|---|---|---|
| 入方向(inbound) | inbound |
数据包进入接口后、查路由表前 | 尽早丢弃非法流量,节省设备资源 |
| 出方向(outbound) | outbound |
查路由表后、从接口发出前 | 控制设备转发出去的流量 |
2.3 traffic-filter 工作原理
当在接口上应用 traffic-filter 时,设备对每个经过的数据包执行以下流程:
- 提取数据包的五元组信息(源IP、目的IP、协议、源端口、目的端口)
- 按 ACL 规则顺序逐条匹配
- 匹配到 permit → 允许通过
- 匹配到 deny → 直接丢弃(不转发)
- 所有规则均未匹配 → 触发 ACL 末尾的隐式
deny any,丢弃
三、技术细节
3.1 基本 ACL 流量过滤
基本 ACL 只能匹配源 IP 地址,适用于按源地址做简单放行的场景。
# 场景:只允许 VLAN 10(192.168.10.0/24)访问 Internet,拒绝 VLAN 20
# 拓扑:PC(VLAN10) → Access交换机 → 核心交换机(Gateway) → 出口路由器
# Step 1: 定义基本 ACL
[HUAWEI] acl 2000
[HUAWEI-acl-basic-2000] rule 5 permit source 192.168.10.0 0.0.0.255
[HUAWEI-acl-basic-2000] rule 10 deny source 192.168.20.0 0.0.0.255
# 注意:基本 ACL 末尾有隐式 deny any,无需额外写
# Step 2: 将 ACL 应用到接口出方向
[HUAWEI] interface GigabitEthernet0/0/1
[HUAWEI-GigabitEthernet0/0/1] traffic-filter outbound acl 2000
# 注:
3.2 高级 ACL 流量过滤
高级 ACL 可匹配源/目的 IP、协议、端口,控制粒度更精细。
# 场景:VLAN 10 允许上网,但禁止访问 FTP 和 Telnet
[HUAWEI] acl 3000
# 禁止 FTP
[HUAWEI-acl-adv-3000] rule 5 deny tcp source 192.168.10.0 0.0.0.255 destination-port eq 21
# 禁止 Telnet
[HUAWEI-acl-adv-3000] rule 10 deny tcp source 192.168.10.0 0.0.0.255 destination-port eq 23
# 放行该网段的其他流量(含 HTTP/HTTPS)
[HUAWEI-acl-adv-3000] rule 15 permit ip source 192.168.10.0 0.0.0.255
# 顺序要点:精确的 deny 在前、宽泛的 permit 兜底在后;
# 若反过来先把 permit 放前面,后面的 deny 将永远不生效(见第40篇匹配顺序)
# 应用到 VLANIF 接口的入方向
# ——VLAN 10 内 PC 的上网流量是"进入"该 VLANIF 的方向,在这里检查;
# 若挂在 outbound,检查的是发往 VLAN 10 的下行流量,
# 目的端口 21/23 不会出现在回程方向,两条 deny 规则将无法命中
[HUAWEI] interface Vlanif10
[HUAWEI-Vlanif10] traffic-filter inbound acl 3000
3.3 入方向过滤与出方向过滤的对比
# ========== 入方向(inbound)过滤 ==========
# 数据包刚进入接口就检查,匹配 deny 直接丢弃
# 优点:不占用路由查找、转发等后续资源
# 部署位置建议:靠近流量源的入口接口
[HUAWEI] interface GigabitEthernet0/0/1
[HUAWEI-GigabitEthernet0/0/1] traffic-filter inbound acl 3000
# ========== 出方向(outbound)过滤 ==========
# 数据包完成路由查找、准备从接口发出时检查
# 优点:可以精确控制从哪个接口出去的流量
# 部署位置建议:出口接口
[HUAWEI] interface GigabitEthernet0/0/3
[HUAWEI-GigabitEthernet0/0/3] traffic-filter outbound acl 3000
3.4 查看 ACL 应用状态与统计
# 查看 ACL 规则及命中计数
# 注意:traffic-filter 属于转发面,转发流量需用 dataplane 统计查看硬件命中;
# display acl 只统计上送 CPU 的控制平面报文(见第39篇)
<HUAWEI> display acl 3000
Advanced ACL 3000, 3 rules
rule 5 deny tcp source 192.168.10.0 0.0.0.255 destination-port eq 21 (23 times matched) ← 拦截 FTP
rule 10 deny tcp source 192.168.10.0 0.0.0.255 destination-port eq 23 (0 times matched) ← 拦截 Telnet
rule 15 permit ip source 192.168.10.0 0.0.0.255 (5250 times matched) ← 放行其余
Total 5273 times matched.
# 命中为 0 时优先检查:流量是否经过该接口、应用方向、通配符掩码、规则顺序
# 查看接口上应用的 ACL(显示接口名、方向、ACL 编号,格式以设备版本为准)
<HUAWEI> display traffic-filter applied-record
-----------------------------------------------------------
Interface Direction AppliedRecord
-----------------------------------------------------------
GigabitEthernet0/0/3 outbound acl 3000
-----------------------------------------------------------
# 清除 ACL 计数(用户视图执行)
<HUAWEI> reset acl counter 3000
四、实战配置/案例分析
4.1 案例一:阻止特定网段访问公司外部资源
故障背景:某企业网络中,管理层发现财务部门(VLAN 20,10.1.20.0/24)的员工在工作时间频繁访问某外部地址段,影响了工作效率。要求在不影响财务部门正常业务(内网 OA/ERP、邮件)的前提下,阻止其访问该地址段。
# 方案:在出口路由器上应用高级 ACL
# 假设需要封禁的目标地址段为 203.0.113.0/24
[HUAWEI] acl 3100
# 允许财务访问公司内网 OA/ERP 服务器
[HUAWEI-acl-adv-3100] rule 5 permit ip source 10.1.20.0 0.0.0.255 destination 10.1.100.0 0.0.0.255
# 允许财务访问邮件服务器(SMTP/POP3/IMAP)
[HUAWEI-acl-adv-3100] rule 10 permit tcp source 10.1.20.0 0.0.0.255 destination-port eq 25
[HUAWEI-acl-adv-3100] rule 15 permit tcp source 10.1.20.0 0.0.0.255 destination-port eq 110
[HUAWEI-acl-adv-3100] rule 20 permit tcp source 10.1.20.0 0.0.0.255 destination-port eq 143
# 禁止访问目标地址段
[HUAWEI-acl-adv-3100] rule 25 deny ip source 10.1.20.0 0.0.0.255 destination 203.0.113.0 0.0.0.255
# 允许其他所有流量(兜底),若兜底规则限 source 10.1.20.0/24,其他网段的出站流量将全部落入隐式 deny any,导致其他部门断网
[HUAWEI-acl-adv-3100] rule 30 permit ip
# 应用到出接口
[HUAWEI] interface GigabitEthernet0/0/3
[HUAWEI-GigabitEthernet0/0/3] traffic-filter outbound acl 3100
4.2 案例二:ACL 未生效故障排查
故障现象:管理员在接口上配置了 ACL,但发现被拒绝的流量仍然可以通行。
# 排查步骤:
# Step 1: 确认 ACL 规则是否正确
<HUAWEI> display acl 3000
# 检查规则顺序是否正确,精确规则是否在前
# Step 2: 确认 ACL 是否真正应用在目标接口上
<HUAWEI> display current-configuration interface GigabitEthernet0/0/1
# 检查是否存在 traffic-filter 命令
# Step 3: 确认应用的方向是否正确(inbound vs outbound)
# 如果 ACL 应用在 inbound,但流量从其他接口进入,则不会生效
# 正确做法:在流量"进入设备"的第一个接口应用 inbound
# Step 4: 确认通配符掩码是否正确
<HUAWEI> display acl 3000
# 常见错误:把子网掩码当成了通配符掩码
# 如:想匹配 192.168.10.0/24
# 正确:source 192.168.10.0 0.0.0.255
# 错误:source 192.168.10.0 255.255.255.0(这是子网掩码!)
# Step 5: 查看转发面命中统计,确认流量是否真正匹配
<HUAWEI> display acl 3000
# 命中为 0 说明 ACL 未捕获任何流量,可能原因:
# ① 流量未经过该接口;② 应用方向不对;③ 通配符掩码或规则顺序错误
常见错误清单:
| 错误类型 | 现象 | 修复方法 |
|---|---|---|
| ACL 定义后未应用 | ACL 规则定义完整但未在接口上 traffic-filter | 在对应接口应用 traffic-filter inbound/outbound acl <编号> |
| 方向错误 | ACL 挂在 inbound,但流量从其他口入 | 改为出方向或在正确的入接口挂 |
| 通配符掩码写反 | 子网掩码当通配符用 | 0.0.0.255 而非 255.255.255.0 |
| 规则顺序错误 | 宽松规则在前,精确规则在后 | 调整规则顺序,精确在前 |
| 遗漏 permit | 只有 deny,没有 permit | 在 deny 后加 permit 放行合法流量 |
| ACL 编号不匹配 | traffic-filter 引用的 ACL 编号不存在 | 核对 ACL 编号 |
4.3 案例三:禁止 ICMP Ping 但允许其他业务
需求:出于安全考虑,禁止外部主机 Ping 内网服务器,但不影响正常的 HTTP/HTTPS/Web 服务。
[HUAWEI] acl 3200
# 拒绝 ICMP 回显请求(Ping)
[HUAWEI-acl-adv-3200] rule 5 deny icmp source any destination 192.168.100.0 0.0.0.255 icmp-type echo
# 允许 HTTP
[HUAWEI-acl-adv-3200] rule 10 permit tcp source any destination 192.168.100.0 0.0.0.255 destination-port eq 80
# 允许 HTTPS
[HUAWEI-acl-adv-3200] rule 15 permit tcp source any destination 192.168.100.0 0.0.0.255 destination-port eq 443
# 允许其他 TCP/UDP 业务
[HUAWEI-acl-adv-3200] rule 20 permit ip source any destination 192.168.100.0 0.0.0.255
# 应用到连接服务器的接口的**出方向**
# 外部主机的探测/访问流量,是路由器从该接口"发出"给服务器的方向;
# 若挂在 inbound,检查的是服务器发出的回包(源为服务器 IP 段),
# destination 192.168.100.0 0.0.0.255 永远匹配不上,ACL 不会生效
[HUAWEI] interface GigabitEthernet0/0/2
[HUAWEI-GigabitEthernet0/0/2] traffic-filter outbound acl 3200
# 验证:外部主机 ping 内网服务器 → 超时
# 验证:外部主机浏览器访问 http://192.168.100.10 → 正常
五、总结
| 对比维度 | 入方向过滤 | 出方向过滤 |
|---|---|---|
| 应用时机 | 数据包进入接口后 | 数据包从接口发出前 |
| 资源消耗 | 低(提前丢弃) | 高(已完成路由查找) |
| 适用场景 | 入口过滤、DDoS 防御 | 出口控制、策略执行 |
| 推荐 | ★★★★★ | 特定场景使用 |
| ACL 流量过滤最佳实践 | 说明 |
|---|---|
| 优先使用入方向过滤 | 尽早丢弃非法流量,减少设备负载 |
| 高级 ACL 优于基本 ACL | 匹配更精确,避免误伤 |
| 定期检查 ACL 计数 | 确认规则按预期命中 |
| 精确拒绝,宽松放行 | 精确的 deny/permit 在前,宽泛规则在后 |
| 避免在核心转发路径上应用过多 ACL | 影响转发性能 |
| 记录 ACL 变更日志 | 便于审计和回溯 |
思考
- 如果在路由器的入方向接口应用了
deny ip source any的规则,该接口还能转发流量吗?为什么? - 基本 ACL 建议部署在靠近目标的位置,而高级 ACL 建议部署在靠近源的位置,这背后的原因是什么?
- ACL 的隐式
deny any在什么情况下会造成意外断网?如何避免?
下篇预告:第42篇:NAT 基础:静态 NAT、动态 NAT、PAT