Skip to content

10.1 IPsec 中的协议号与端口号 ​

1. 先建立一个坐标:数字写在哪一层 ​

IPsec 是"协议号与端口号"这个话题最好的入门案例,因为它同时用到了这两个概念:

  • 数据加密部分(AH / ESP)是网络层协议,在 IP 头里用 Protocol(协议号) 标识。
  • 密钥协商部分(IKE)跑在 传输层之上,在 UDP 头里用 端口号 标识。

先看它们在报文里的位置,理解"谁标识谁":

+----------------+------------------------------------------+
| IP Header      | Protocol = 50 (ESP) 或 51 (AH)           |  <- 协议号在这里
+----------------+------------------------------------------+
| ESP Header     | SPI + Sequence Number                    |
+----------------+------------------------------------------+
| Payload        | 加密后的原始数据(TCP/UDP/ICMP...)        |
+----------------+------------------------------------------+
| ESP Trailer    | Padding + Pad Length + Next Header       |  <- 原协议号藏在这里
+----------------+------------------------------------------+
| ESP Auth Data  | ICV(完整性校验值)                        |
+----------------+------------------------------------------+

而 IKE 的报文长这样:

+----------------+------------------------------------------+
| IP Header      | Protocol = 17 (UDP)                      |
+----------------+------------------------------------------+
| UDP Header     | Src Port / Dst Port = 500 或 4500         |  <- 端口号在这里
+----------------+------------------------------------------+
| IKE Payload    | 协商参数、密钥材料、身份信息...             |
+----------------+------------------------------------------+

记住这一句,后面全部内容都是它的推论:

协议号回答"IP 头后面装的是谁",端口号回答"这个包该交给哪个进程"。

2. IPsec 协议号与端口号总览 ​

这是本文最核心的一张表,建议对照实验逐行验证:

组件全称IP 协议号端口号作用是否加密
AHAuthentication Header51无认证 + 完整性保护(含 IP 头)❌ 不加密
ESPEncapsulating Security Payload50无加密 + 认证 + 完整性保护✅ 加密
IKE / ISAKMPInternet Key Exchange17(UDP)UDP 500主模式/野蛮模式/快速模式协商,建立 SA协商过程本身不加密
NAT-TNAT Traversal17(UDP)UDP 4500把 ESP 包进 UDP,穿透 NAT✅ 内部仍是 ESP 密文
NAT-T 探测NAT Discovery17(UDP)UDP 4500源/目的为 0.0.0.0:4500 的 NAT 检测与保活否

2.1 三个最容易踩的认知陷阱 ​

  1. ESP 和 AH 没有端口号。 它们不是 TCP/UDP 之上的应用,而是与 TCP、UDP 平级的网络层协议。看到"ESP 端口"这种说法,直接判定为错误说法。

  2. 协议号 50 和 51 是十进制,不是十六进制。 抓包里 IP 头的 Protocol 字段是 1 字节,十六进制显示为 0x32(50)和 0x33(51)。 注意别和 GRE 的 47(0x2F)、OSPF 的 89(0x59)混淆。

  3. IPsec 用了两个不同端口号,不是重复。 500 用于协商,4500 用于数据穿透 NAT 后的封装。两者分工不同,缺一不可。

3. 一次完整的 IPsec 会话,数字是怎么流动的 ​

以"总部 AR1 ↔ 分部 AR3,两端都位于 NAT 设备之后"为例:

  AR1 (总部)          NAT 1              NAT 2          AR3 (分部)
      |                  |                  |                |
      |  第一阶段:IKE 协商(UDP 500)                        |
      |---- IKE_SA_INIT (UDP 500) ------------------------>|
      |<--- IKE_SA_INIT 响应 (UDP 500) --------------------|
      |---- IKE_AUTH    (UDP 500) ------------------------>|
      |<--- IKE_AUTH 响应 (UDP 500) -----------------------|
      |                  |                  |                |
      |  第二阶段:NAT 探测(UDP 4500)                       |
      |---- NAT-D 探测 (UDP 4500, 源 0.0.0.0:4500) ------->|
      |<--- NAT-D 响应 (UDP 4500) -------------------------|
      |                  |                  |                |
      |  第三阶段:ESP 加密数据传输                           |
      |---- ESP in UDP 4500 (外层协议号 17,内含 50) ------>|
      |<--- ESP in UDP 4500 (外层协议号 17,内含 50) -------|
      |                  |                  |                |

三个阶段对应三组数字:

阶段用途外层协议号外层端口
第一阶段(IKE SA)协商加密算法、交换密钥、身份认证17 (UDP)500
NAT 探测检测链路中是否存在 NAT17 (UDP)4500
第二阶段(IPsec SA)+ 数据传输建立数据加密通道并传输业务17 (UDP) → 内层 504500

4. NAT-T:为什么需要 UDP 4500 ​

4.1 问题的本质:ESP 没有端口号 ​

NAT 设备要做的核心工作是 PAT(端口地址转换):把多个内网地址复用一个公网地址,靠端口号区分不同的会话,并据此维护转换表。

于是问题来了:

  • IKE (UDP 500):有端口号,NAT 能正常建表转发,这一步通常没问题。
  • ESP (协议号 50):根本没有端口号,NAT 无法为它建立"地址 + 端口"的转换表项,只能按"地址对地址"处理。

后果有两个:

  1. 多台内网设备同时建 IPsec 隧道时,NAT 无法区分它们,转换表项互相覆盖。
  2. NAT 会话老化后,外网回来的 ESP 包找不到对应表项,被直接丢弃。

4.2 解决方案:给 ESP 套一个 UDP 外壳 ​

NAT-T(NAT Traversal,RFC 3947 / 3948) 的做法非常朴素——既然 NAT 只认端口号,那就给 ESP 加一个 UDP 头:

正常 ESP:                           NAT-T 封装后:
+----------------+                   +----------------+
| IP (Proto=50)  |                   | IP (Proto=17)  |  <- UDP
+----------------+                   +----------------+
| ESP Header     |                   | UDP 4500       |  <- 有端口号了,NAT 可建表
+----------------+                   +----------------+
| Encrypted Data |                   | ESP (Proto=50) |  <- 原样保留,密文不变
+----------------+                   +----------------+
                                     | Encrypted Data |
                                     +----------------+

关键点:

  • 外层是 UDP 4500,NAT 设备"看得懂",能正常做 PAT。
  • 内层还是完整的 ESP(协议号 50),加密内容一字未改,安全性不受影响。
  • 这套封装由隧道两端自动协商启用(检测到 NAT 后才用),不需要手工配置。

⚠️ 常见误区

"NAT-T 会降低安全性"——不会。UDP 头只是传输外壳,ESP 的加密与认证完整保留,中间设备依然看不到任何明文。

4.3 为什么用 4500 这个数字 ​

IANA 将 UDP 4500 同时分配给 IPsec NAT-T 与 IKEv2,原因很实际:

  • IKEv2 允许直接使用 4500 发起协商(RFC 7296),省去"先 500 后 4500"的切换;
  • NAT-T 的保活报文(Keepalive) 就发往 对端:4500,用于刷新 NAT 会话表——所以设备上 display ike sa 常能看到"NAT-T keepalive"的计数。

5. ESP 的 Next Header 字段:被藏起来的协议号 ​

ESP 的尾部有一个 Next Header(下一个头) 字段,它记录的是原始载荷的协议号。这是排错时极有价值的信息:

内层原始载荷ESP Next Header 值
TCP6
UDP17
ICMP1
GRE47
IPv641

所以观察一个 ESP 包,可以读出两层协议号:

IP Header: Protocol = 50  (ESP)          <- 外层:加密通道
    ESP Trailer: Next Header = 6 (TCP)   <- 内层:被加密的是 TCP 流量

实战意义:当 IPsec 隧道建立成功(SA 为 Up)但业务不通时,看 ESP 的内层 Next Header 就能快速判断——加密的到底是不是你期望的那类流量。如果 ACL 匹配的是 TCP 80,而 Next Header 显示为 1(ICMP),说明感兴趣流(interesting traffic)配置错了。

6. 配置实例:华为设备上的 IPsec ​

6.1 实验拓扑 ​

[PC1]---[AR1]=========[Internet]=========[AR3]---[PC2]
 192.168.1.0/24  |                       |  192.168.2.0/24
              12.1.1.1                 23.1.1.3

6.2 第一步:ACL 定义感兴趣流 ​

ACL 的作用是告诉设备哪些流量需要被 IPsec 加密。注意这里的写法仍然使用协议号与端口号:

Router Console (AR1)
# 用协议号和端口号精确描述感兴趣流:只加密 ICMP 和 TCP 80
[AR1] acl number 3000
[AR1-acl-adv-3000] rule 5 permit icmp source 192.168.1.0 0.0.0.255 destination 192.168.2.0 0.0.0.255
[AR1-acl-adv-3000] rule 10 permit tcp source 192.168.1.0 0.0.0.255 destination 192.168.2.0 0.0.0.255 destination-port eq 80
[AR1-acl-adv-3000] quit

💡 关键点

ACL 里的 icmp、tcp、destination-port eq 80 就是本文主题的直接应用。ACL 写不对,IPsec 隧道能起来但业务不通——这是最常见的排错场景。

6.3 第二步:配置 IKE(第一阶段) ​

Router Console (AR1)
[AR1] ike proposal 10
[AR1-ike-proposal-10] encryption-algorithm aes-256
[AR1-ike-proposal-10] authentication-algorithm sha2-256
[AR1-ike-proposal-10] dh group14
[AR1-ike-proposal-10] quit

[AR1] ike peer AR3 v2 [AR1-ike-peer-AR3] pre-shared-key cipher Huawei@123 [AR1-ike-peer-AR3] remote-address 23.1.1.3 [AR1-ike-peer-AR3] ike-proposal 10 [AR1-ike-peer-AR3] quit

6.4 第三步:配置 IPsec(第二阶段) ​

Router Console (AR1)
[AR1] ipsec proposal tran1
[AR1-ipsec-proposal-tran1] esp authentication-algorithm sha2-256
[AR1-ipsec-proposal-tran1] esp encryption-algorithm aes-256
[AR1-ipsec-proposal-tran1] quit

[AR1] ipsec policy map1 10 isakmp [AR1-ipsec-policy-isakmp-map1-10] security acl 3000 [AR1-ipsec-policy-isakmp-map1-10] ike-peer AR3 [AR1-ipsec-policy-isakmp-map1-10] proposal tran1 [AR1-ipsec-policy-isakmp-map1-10] quit

6.5 第四步:应用到出接口 ​

Router Console (AR1)
[AR1] interface GigabitEthernet 0/0/0
[AR1-GigabitEthernet0/0/0] ip address 12.1.1.1 24
[AR1-GigabitEthernet0/0/0] ipsec policy map1
[AR1-GigabitEthernet0/0/0] quit

6.6 IPsec 与 GRE 的协议号叠加 ​

如果采用 GRE over IPsec(先用 GRE 封装,再用 IPsec 加密整个 GRE 包),协议号会出现两层嵌套:

+----------------+  IP  Proto = 50 (ESP)
+----------------+  ESP Header
+----------------+  IP    Proto = 47 (GRE)     <- 内层:被加密的 GRE 包
+----------------+  GRE Header
+----------------+  IP(原始私网包)
+----------------+  真实业务数据

这正是 VPN 与 GRE 中提到的方案——加密后 GRE 的协议号 47 被"藏"在 ESP 里的原因。

7. 验证与排错 ​

7.1 常用验证命令 ​

Router Console (AR1)
# 查看第一阶段(IKE SA)状态,可看到协商使用的 UDP 500/4500
[AR1] display ike sa

# 查看第二阶段(IPsec SA),确认协议号 50/51 与 SPI [AR1] display ipsec sa

# 查看会话与 SA 对应关系,确认业务流量确实命中了隧道 [AR1] display ipsec sa brief

7.2 抓包过滤器写法对照 ​

Wireshark 的过滤器直接使用协议号与端口号,是验证本文内容的最直接手段:

想看什么Wireshark 过滤器
所有 ESP 包(协议号 50)ip.proto == 50
所有 AH 包(协议号 51)ip.proto == 51
IKE 协商过程udp.port == 500
NAT-T 封装后的 ESPudp.port == 4500
隧道内承载的 TCP 流量(需密钥解密)esp && ip.proto == 50 解密后 tcp

在设备侧,华为 VRP 的 ACL 同样可以直接匹配协议号:

Router Console
# 方式一:用关键字匹配(推荐,可读性好)
[AR1] acl number 3001
[AR1-acl-adv-3001] rule 5 permit esp

# 方式二:用数字协议号匹配(等价写法) [AR1] acl number 3002 [AR1-acl-adv-3002] rule 5 permit 50

7.3 排错决策表 ​

现象最可能的原因验证方法
display ike sa 无任何表项UDP 500 被中间设备/ACL 拦截抓包看是否有 UDP 500 交互
IKE 第一阶段成功,第二阶段失败IPsec proposal 两端不一致;感兴趣流不匹配核对两端 proposal 与 ACL
隧道 Up 但 ping 不通ACL 未匹配实际流量(协议号/端口号写错)检查 ESP 的 Next Header;display ipsec sa 看加解密计数
隧道建立后间歇性中断NAT 会话老化,保活未生效抓包确认是否有 UDP 4500 保活报文
有 NAT 环境下隧道无法建立NAT-T 未启用或被拒绝确认 UDP 4500 可达
抓包只看到 ESP,看不到内层正常现象(已加密)导入密钥解密,或看 ESP 的 Next Header 字段

8. 拓展:与之相邻的常见协议号 ​

把 IPsec 放进整张"协议号地图"里,记忆会更牢固:

协议协议号端口号备注
ICMP1—Ping / Tracert
IGMP2—组播成员管理
TCP6—端口号在 TCP 头中
UDP17—端口号在 UDP 头中
GRE47—通用封装,不加密
ESP50—IPsec 加密
AH51—IPsec 认证
ICMPv658—IPv6 的 NDP 依赖它
OSPF89—直接封装在 IP 之上
VRRP112—直接封装在 IP 之上
L2TP115UDP 1701配合 IPsec 常用于远程接入
ISAKMP / IKE17 (UDP)500 / 4500密钥协商与 NAT-T

9. 总结 ​

三句话记住 IPsec 的数字:

  1. 加密用 50,认证用 51——它们是网络层协议,没有端口号。
  2. 协商用 UDP 500,IKE 建立和管理 SA。
  3. 穿 NAT 用 UDP 4500,把 ESP 装进 UDP 外壳,数据照样是密文。

再往上一层总结,本章真正要建立的认知是:

协议号定位"上层是什么协议",端口号定位"是哪个应用"。 NAT、ACL、防火墙策略、抓包过滤器——所有"放行/加密/统计"动作,最终都落在这两个数字上。

10. 思考题 ​

  1. 为什么 ESP 过不了 PAT,而 IKE 可以?
  2. 如果两端设备之间是普通路由器(无 NAT),还需要 UDP 4500 吗?为什么?
  3. 某 IPsec 隧道 display ipsec sa 显示 Up,但 TCP 80 业务不通、ICMP 可以通。最可能的原因是什么?
  4. ip.proto == 50 && udp.port == 4500 这个过滤器能同时命中包吗?为什么?
真人撰写written by human