我已经工作了一个多星期,试图让出站数据包适合安全协会。
这是我的(示例)场景:
- 局域网: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
祝你好运。