在 FreeBSD 11 和 StrongSwan x FortiGATE 上使用 pf 的 NAT 出站 IPSEC 数据包

Tia*_*aio 6 freebsd ipsec pf strongswan

我已经工作了一个多星期,试图让出站数据包符合安全协会的要求。

这是我的(示例)场景:

  • 局域网:1.1.1.0/24
  • FreeBSD 接口:xn0(Amazon EC2 实例)
  • 虚拟地址到 nat 流量来自:2.2.2.2/32
  • 到达目的地:3.3.3.3/32

问题描述

尽管事实上我已经在 FreeBSD Box 中启动并运行了所有 SA,但尝试使用 pf 或 ipfw 对数据包进行 nat 处理是行不通的,nat 的数据包使用默认路由接口继续流动并且没有得到进入ipsec隧道。

这是一个示例 SA,使用:

$ ipsec status vpn
vpn{1}:  INSTALLED, TUNNEL, reqid 1, ESP in UDP SPIs: cca608fa_i d74355dc_o vpn{1}:  AES_CBC_256/HMAC_SHA2_256_128, 2688 bytes_i (32 pkts, 32s ago), 4992 bytes_o (32 pkts, 32s ago), rekeying in 43 minutes vpn{1}:   2.2.2.2/32 === 3.3.3.3/32
Run Code Online (Sandbox Code Playgroud)

这是我的 nat 规则pf.conf

nat on enc0 from 1.1.1.0/24 to 2.2.2.2/32 -> 3.3.3.3
Run Code Online (Sandbox Code Playgroud)

这是我的ipsec0 interface status

ipsec0:  flags=8011<UP,POINTOPOINT,MULTICAST> metric 0 mtu 1400     inet 3.3.3.3/32 --> 2.2.2.2/32 netmask 0xffffffff options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>     reqid: 0    groups: ipsec
Run Code Online (Sandbox Code Playgroud)

我可以从 3.3.3.3 顺利到达 2.2.2.2。

这是 xn0(物理接口)上的简单数据包捕获:

$ tcpdump -i xn0 -n -vvv host 2.2.2.2
1.1.1.10 > 2.2.2.2: ICMP echo request, id 15745, seq 818, length 64
Run Code Online (Sandbox Code Playgroud)

并且在 enc0 上看不到流量。

另一种尝试是通过设置sysctl

net.inet.ipsec.filtertunnel=1
Run Code Online (Sandbox Code Playgroud)

但我不完全确定这个选项到底是做什么的。

我见过很多人努力让这种 nat 工作而没有成功。

Tia*_*aio 4

经过几天的努力,我已经能够通过执行以下步骤来处理此问题,并将在此发布解决方案以帮助其他人

获取您想要将源连接到的所需 SA 的唯一 ID,例如:

setkey -DP
Run Code Online (Sandbox Code Playgroud)

并找到 SA 唯一 ID:

3.3.3.3[any] 2.2.2.2[any] any
    out ipsec
    esp/tunnel/REALIPLOCAL-REALIPREMOTE/unique:1
    created: Jul 22 22:29:34 2018  lastused: Jul 22 22:29:34 2018
    lifetime: 9223372036854775807(s) validtime: 0(s)
    spid=2715 seq=0 pid=13358 scope=global
    refcnt=1
Run Code Online (Sandbox Code Playgroud)

在这种情况下:1

添加新政策:

setkey -v -c
spdadd -4 1.1.1.0/24 2.2.2.2/32 any -P out ipsec esp/tunnel/REALLOCALIP-REALREMOTEIP/unique:1;
Run Code Online (Sandbox Code Playgroud)

这应该足以在隧道内路由数据包并使它们匹配实际安装的 SA。

请记住,此唯一 ID 必须与安装的 SA 匹配,如果您更改 StrongSwan 中 SA 安装的顺序,则必须更改此策略以适应新的 UniqueID。

nat 规则必须应用于 enc0 接口。

参考:

https://github.com/opnsense/core/issues/440

祝你好运。