什么是 ICMP 响应限速
net.ipv4.icmp_ratelimit 与 net.ipv4.icmp_msgs_per_sec 一起限制内核向外发送 ICMP 响应的速率:前者设定同一目标地址两次响应之间的最小间隔(毫秒,默认 1000),后者设定每秒最多发送的 ICMP 报文数(默认 1000)。它同时约束目标不可达、超时等差错报文,用于抑制 ICMP 被放大滥用以及报文风暴。副作用是网络诊断工具在高频探测时读数会失真。
基本信息
| 参数路径 | net.ipv4.icmp_ratelimit / net.ipv4.icmp_msgs_per_sec |
|---|---|
| 默认值 | 1000(毫秒)/ 1000(每秒报文数) |
| 约束对象 | 内核发出的 ICMP 差错与响应报文 |
| 易受影响 | ping、traceroute、路径 MTU 探测的观测结果 |
| 相关项 | icmp_echo_ignore_all、icmp_echo_ignore_broadcasts |
| 生效范围 | 内核全局 |
典型使用场景
- 大批量 ping 探测出现丢包,确认是否为内核限速导致
- traceroute 中间跳显示不完整时排除限速因素
- 安全加固:抑制 ICMP 放大与滥用带来的带宽消耗
- 丢包排查时避免把限速造成的丢包误判为链路故障
- 与其他 ICMP 开关一起核对,确认整体行为符合基线
查看与调整
查看与调整
sysctl net.ipv4.icmp_ratelimit net.ipv4.icmp_msgs_per_sec
sysctl net.ipv4.icmp_echo_ignore_all net.ipv4.icmp_echo_ignore_broadcasts
ping -c 20 -i 0.2 <目标> # 高频探测观察是否大量丢失
ping -c 20 -i 1 <目标> # 放慢间隔对照结果
traceroute -n <目标> | head -10 # 中间跳是否有响应
# 排查期临时放宽(记录原值):sysctl -w net.ipv4.icmp_ratelimit=0现象归因
| 现象 | 可能原因 | 验证方式 |
|---|---|---|
| 高频 ping 大量丢包 | 触发内核限速 | 放慢间隔或临时放宽后复测 |
| traceroute 中间跳缺失 | 中间设备或本机限速 | 换协议探测、对比不同目标 |
| 只有某类目标不可达 | 限速与目标地址相关 | 核对 ratelimit 与目标对应关系 |
| 探测结果稳定丢同比例 | 限速统一丢包 | 看是否与速率成正比 |
排障期间临时把 icmp_ratelimit 设为 0 会关闭该限速,属于临时手段;记录原始值并在排查结束后恢复,否则会把诊断噪声留在生产配置里。
限速过严会让网络诊断工具读数失真:把限速造成的丢包当成链路故障,可能触发不必要的设备更换或链路调整。