在网络运维的日常工作中,尤其是在设备割接上线或进行故障排查时,几乎每个工程师都遇到过这个经典难题:业务端口是通的,服务也能正常访问,但偏偏 ping 命令就是不通,tracert(路由追踪)的结果更是一串令人困惑的星号 *。
今天,我们就从根上把这个问题讲清楚。文章会遵循“先懂原理,再配策略”的逻辑,结合华为防火墙的安全模型,一步步带你配置出能同时兼容 ping 和 tracert 的放行策略。即使你是网络新手,也能照着步骤“抄作业”,彻底搞定这个顽疾。
一、核心原理:Ping 到底是如何工作的?
Ping 是我们最常用的网络连通性测试工具,它的底层完全依赖于 ICMP 协议。其核心机制是两种特定 ICMP 报文的双向“问答”交互。

图:Ping 命令的核心工作流程
- 源主机向目标设备发送一个 ICMP 回显请求报文,其类型字段固定为
8。
- 目标设备收到此请求后,会立刻回复一个 ICMP 回显应答报文,其类型字段固定为
0。
- 如果这一来一回的报文都能顺利穿过途中的防火墙等网络设备,
ping 测试就显示成功。
- 如果任何一个方向的报文被拦截,
ping 就会超时,提示目标不可达。
核心结论:Ping 能否成功,本质上取决于网络路径上的安全设备是否允许 ICMP 类型 8(请求)和类型 0(应答) 报文通过。
二、深入原理:为什么 Tracert 比 Ping 更难通?
Tracert 是用于追踪数据包传输路径、定位网络中断点的关键工具。它的工作机制比 Ping 复杂得多,这也是它更容易出现“全星号”问题的根本原因,而且不同操作系统的实现方式还有差异。

图:Tracert 命令的核心工作原理
Tracert 利用 TTL(生存时间) 字段进行逐跳探测,整个过程会用到至少三种 ICMP 报文:
- Echo Request (类型 8)
- Echo Reply (类型 0)
- Time Exceeded (类型 11,TTL 超时报文)
其工作流程如下:
- 源端发送第一个探测包,并将 TTL 值设为
1。
- 该数据包到达路径上的第一台路由器或防火墙时,设备会将 TTL 减
1,结果变为 0。
- 设备丢弃该 TTL=0 的数据包,同时向源端返回一个 ICMP TTL 超时报文(类型 11)。源端由此得知第一跳设备的地址。
- 源端接着发送 TTL=
2 的探测包,重复上述过程,直到数据包到达最终目标。
- 目标主机收到探测包后,返回 ICMP 回显应答报文(类型 0),整个追踪过程完成。

图:不同系统的 Tracert 实现存在关键差异
这里有一个至关重要的差异:
- Windows 系统:默认使用 ICMP 报文 进行
tracert 探测,完全依赖上述 ICMP 交互。
- Linux/Unix 系统及华为网络设备:默认使用 UDP 报文 进行探测,目标端口号通常在
33434 到 33534 这个区间内。当探测包到达最终目标时,目标主机会回复一个 ICMP 端口不可达报文(类型 3) 作为结束信号。

图:Tracert 结果全星号的核心原因分析
所以,Ping 通但 Tracert 全是 *,本质上是两个问题的叠加:
- 防火墙只放行了
ping 所需的 ICMP 0/8 报文,但没有放行 Tracert 必需的 TTL 超时(类型 11) 和 端口不可达(类型 3) 报文。
- 华为防火墙基于安全考虑,默认不主动发送 ICMP 超时报文和端口不可达报文。这意味着即使你配置了放行策略,防火墙也不会回应探测请求,导致
tracert 结果无显示。
三、华为防火墙的默认安全机制
遇到 ping/tracert 不通,很多时候并非网络物理故障,而是由华为防火墙严谨的默认安全设计导致的。理解以下四点,你就掌握了问题的钥匙:
- 域间默认拒绝所有:这是最基本的原则。华为防火墙任何两个安全区域之间的流量,默认策略都是
deny all。任何跨区域的访问,都必须显式配置安全策略来放行。
- ICMP 严格管控:ICMP 协议常被用于网络探测,但也容易被攻击者利用进行拓扑扫描或发起泛洪攻击。因此,防火墙默认对其采取严格管控。
- 访问本机需走 Local 域:当你
ping 或 tracert 防火墙自身的接口 IP 或管理 IP 时,流量目的地是防火墙本身(Local 区域)。这时,配置普通的域间(如 trust 到 untrust)策略是无效的,必须专门配置指向 Local 区域的安全策略。
- 默认关闭探测报文发送:为了提高设备隐蔽性和安全性,防火墙默认不发送 ICMP TTL 超时报文和端口不可达报文。需要手动开启相关功能,它才会回应
tracert 的探测。
四、实战配置一:内网访问外网(Trust ↔ Untrust)
这是最常见的场景:内网用户(Trust 区域)需要测试到互联网某个地址(Untrust 区域)的连通性。以下配置命令可以直接复制到防火墙命令行执行,能同时满足 Windows 和 Linux 系统的探测需求。
步骤 1:配置域间安全策略,放行探测流量
首先,我们需要创建两条安全策略,一条放行内到外的探测请求,另一条放行外到内的回包。
system-view
# 进入安全策略配置视图
security-policy
# 策略1:内网→外网,放行ICMP(用于Ping和Windows Tracert)及UDP探测端口(用于Linux Tracert)
rule name Trust_to_Untrust_Ping_Tracert
source-zone trust
destination-zone untrust
source-address 192.168.1.0 24 # 请替换为实际的内网地址段
service icmp udpTracert # ‘udpTracert’是一个需要预定义的服务对象,仅包含33434-33534端口范围
action permit
# 策略2:外网→内网,放行ICMP回包,确保双向通信
rule name Untrust_to_Trust_ICMP_Back
source-zone untrust
destination-zone trust
destination-address 192.168.1.0 24 # 请替换为实际的内网地址段
service icmp
action permit
注意:命令中的 udpTracert 是一个自定义服务,你需要在防火墙中提前定义它,指定协议为 UDP,目的端口范围为 33434 到 33534。
步骤 2:开启关键功能,让 Tracert 显示路由信息
仅仅配置安全策略,tracert 可能仍然显示星号。我们必须让防火墙“开口说话”,即主动发送探测回应报文,并关闭可能干扰探测的防护功能。
# 允许防火墙发送ICMP TTL超时报文(对应Tracert的中间跳)
icmp ttl-exceeded send
# 允许防火墙发送ICMP端口不可达报文(对应Linux Tracert的最终跳)
icmp host-unreachable send
# 关闭tracert攻击防范功能,避免探测流量被误判为攻击而拦截
undo firewall defend tracert enable
完成以上两步,内网访问外网的 ping 和 tracert 应该就能正常工作了。这是一个非常典型的运维与测试场景配置。
五、实战配置二:Ping/Tracert 防火墙自身接口
有时我们需要直接测试到达防火墙某个接口或管理 IP 的连通性。这时,普通的域间策略无效,必须使用 Local 区域。
步骤 1:配置 Local 域安全策略
我们需要创建一条从源区域(如 trust)到目标区域 local 的策略。
system-view
# 进入安全策略配置视图
security-policy
# 内网→防火墙Local域:放行ICMP探测流量
rule name Trust_to_Local_Ping_Tracert
source-zone trust
destination-zone local
source-address 192.168.1.0 24 # 替换为实际有权限管理防火墙的内网地址段
service icmp
action permit
步骤 2:在接口上开启管理权限
即使有了安全策略,默认情况下防火墙接口也不响应 ping。需要在对应接口视图下显式开启管理服务权限。
# 进入需要被探测的物理接口(此处以GigabitEthernet 1/0/1为例,请替换为实际接口)
interface GigabitEthernet 1/0/1
# 开启该接口的Ping管理权限
service-manage ping permit
# 如果也需要通过此接口Tracert防火墙,可以开启所有管理权限(请根据安全要求谨慎选择)
service-manage all permit

完成上述配置后,你对防火墙的探测应该就能顺利进行了。希望这篇从原理到实战的指南,能帮你彻底理清华为防火墙下 ping 和 tracert 的配置逻辑。如果在实际网络配置中遇到其他棘手问题,欢迎到 云栈社区 的技术板块交流讨论,那里有许多同行分享的经验和解决方案,或许能给你新的启发。