协议号在说什么
IP 头部有一个 8 位协议字段,标明上层承载的是什么:6 是 TCP、17 是 UDP、1 是 ICMP、58 是 ICMPv6。防火墙规则、抓包过滤、云安全组与设备访问控制,都用这些数字表达「放行哪一类流量」。
为什么值得记住几个
因为写规则时常常只能填数字:云安全组、部分硬件设备的访问控制、tcpdump 的过滤表达式都是如此。反过来,抓包看到 ip proto 47 却不知道那是 GRE,排查会直接卡住。
基本信息
| 字段位置 | IPv4 头部协议字段;IPv6 对应下一个头部字段 |
|---|---|
| 最常用 | 1 ICMP、6 TCP、17 UDP、58 ICMPv6 |
| 隧道与安全 | 41 IPv6-in-IPv4、47 GRE、50 ESP、51 AH |
| 本机查看 | Linux 上可用 /etc/protocols 查看名称与编号对照 |
典型使用场景
- 写云安全组或设备访问控制:为 GRE、IPsec 等按协议号放行
- 抓包过滤:只抓某一类协议,快速判断隧道是否建立
- 排查 IPsec 与 GRE 隧道:确认两端协议号规则一致
- 学习 IPv6:理解下一个头部字段与扩展头的关系
查看与过滤
查看与过滤
cat /etc/protocols | head # Linux 上的协议号清单
tcpdump -nn 'ip proto 47' -c 5 # 抓 GRE
tcpdump -nn 'icmp or icmp6' -c 10 # 同时抓 v4 与 v6 的 ICMP
tcpdump -nn 'ip proto 50' -c 5 # 抓 IPsec 的 ESP协议号速查
| 协议号 | 协议 | 用途 |
|---|---|---|
| 1 | ICMP | ping 与差错报告(IPv4) |
| 6 | TCP | 可靠传输 |
| 17 | UDP | 数据报传输 |
| 41 | IPv6-in-IPv4 | 6in4 隧道 |
| 47 | GRE | 隧道封装 |
| 50 与 51 | ESP 与 AH | IPsec |
| 58 | ICMPv6 | v6 差错与邻居发现 |
| 89 | OSPF | 路由协议 |
| 132 | SCTP | 电信与信令 |
IPv6 用下一个头部字段代替协议字段,扩展头会让链路更长更复杂。抓包时应区分主机层的下一个头部与扩展头中的值。
防火墙里写协议号 47 或 50 只是第一步:GRE 与 IPsec 还需放行对应地址,NAT 穿透场景还要额外放行 UDP 4500。
写规则时的要点
- 云安全组与设备访问控制通常要求显式选择协议:TCP、UDP 之外的协议需要用自定义协议号或「全部协议」表达
- 隧道与 IPsec 场景要同时放行协议号与两端地址,NAT 穿透还要放行对应的 UDP 端口
- 抓包过滤用 ip proto N 表达,IPv6 则对应 ip6 proto N,别把两者混着写
- 定位不通时先用抓包确认协议层流量是否已经到达设备,再去改规则
协议号是 IANA 统一维护的编号,同一编号在 IPv4 与 IPv6 下含义一致;差异只在报头字段的名称与位置,规则里的数字不必换算。