我在两个 Juniper SRX 路由器之间跨 NAT 建立了 IPsec VPN 隧道,NAT 由防火墙(Linux 服务器)执行。当尝试配置防火墙规则以允许 IPsec VPN 流量通过时,我发现虽然 IKE 协商成功完成,UDP 端口 500 和 4500 被允许,但 VPN 流量通信无法进行,除非添加规则以允许 ESP。
这是我在防火墙上应用的规则,但仅完成了 IKE 协商:
iptables -F
iptables -P FORWARD DROP
# Inbound
iptables -I FORWARD -s <External IP address> -d <Internal IP address> -p udp --sport 500 -j ACCEPT
iptables -I FORWARD -s <External IP address> -d <Internal IP address> -p udp --sport 4500 -j ACCEPT
# Outbound
iptables -I FORWARD -s <Internal IP address> -d <External IP address> -p udp --sport 500 -j ACCEPT
iptables -I FORWARD -s <Internal IP address> -d <External IP address> -p udp --sport 4500 -j ACCEPT
并且为了能够顺利的通过VPN隧道传输数据,还需要设置下面两个规则:
iptables -I FORWARD -s <External IP address> -d <Internal IP address> -p 50 -j ACCEPT
iptables -I FORWARD -s <Internal IP address> -d <External IP address> -p 50 -j ACCEPT
由于ESP数据被UDP报头封装(这里提供我的防火墙捕获的 VPN 通信数据包),为什么防火墙会在规则中不允许 ESP 的情况下阻止隧道流量? 按照我的预期,当防火墙看到数据包包含 UDP 端口 4500 标头时,它应该相应地接受该数据包。