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

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

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

这是我的(示例)场景:

  • 局域网: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'ed 数据包继续使用默认路由接口流动并且不会得到进入 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

这是我的 nat 规则pf.conf

nat on enc0 from 1.1.1.0/24 to 2.2.2.2/32 -> 3.3.3.3

这是我的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

我可以顺利地从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

并且 enc0 上没有看到任何流量。

另一种尝试是通过以下方式设置sysctl

net.inet.ipsec.filtertunnel=1

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

我见过很多人努力让这种自然现象发挥作用,但没有成功。

答案1

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

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

setkey -DP

并找到 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

在这种情况下: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;

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

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

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

参考:

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

祝你好运。

相关内容