我已配置了两个 Linux 机器,这样它们在需要通信时就会自动使用传输级 IPSec 连接。配置基于 Racoon,使用 X509 身份验证并将选项bundle_complex
设置为on
,以及要求两个机器之间同时使用 ESP 和 AH 的策略。
虽然配置有效,但一般来说,前几个数据包总会丢失,例如:
$ ping -c 3 A.B.C.D
PING A.B.C.D (A.B.C.D) 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
64 bytes from A.B.C.D: icmp_req=3 ttl=64 time=0.497 ms
有没有什么方法可以防止这种情况,例如通过“延迟”数据包直到 IPSec 传输协商完成?
答案1
第一个数据包(以及协商完成之前的所有其他数据包)总是被丢弃。
我接触过的每个 ISAKMP 实现都是如此。我不认为有必要不能缓冲被丢弃的数据包;相反,它不应该。
这是整个互联网路由基础设施中使用的有意识设计决策的延伸:不要扣留包裹。
当互联网上的路由系统无法(几乎)立即路由数据包时,它们将始终丢弃数据包而不是延迟它。只需将数据包保留在缓冲中直到有空间,整个互联网上的数据包丢失就可以轻松降低到更低的水平。但是,问题就在这里;一个超载的路由器在先进先出队列中落后 200 毫秒,每个数据包都会延迟这 200 毫秒。
回到 ISAKMP 的情况;保持几次 ping 直到路径准备好承载它们,这很好,但如果是数十万个 UDP 数据包的持续流怎么办?如果远程系统无法访问,ISAKMP 会在那里等待 ISAKMP 协商消息 2 60 秒怎么办?
虽然这些并不是难以克服的工程问题,但互联网工程界的传统观点是,让客户端系统自己处理数据包丢失问题要简单得多,也容易得多,主要是通过使用 TCP 等容忍丢失的协议。
答案2
您可以在任何流量开始流动之前自动启动 IPSEC 隧道(通常那些最先丢弃的数据包会启动 IKE 协商)。以下是使用 StrongSwan 执行此操作的方法:
auto = ignore | add | route | start
what operation, if any, should be done automatically at IPsec
startup; currently-accepted values are add, route, start and
ignore (the default). add loads a connection without starting
it. route loads a connection and installs kernel traps. If
traffic is detected between leftsubnet and rightsubnet , a con‐
nection is established. start loads a connection and brings it
up immediatly. ignore ignores the connection. This is equal to
delete a connection from the config file. Relevant only
locally, other end need not agree on it (but in general, for an
intended-to-be-permanent connection, both ends should use
auto=start to ensure that any reboot causes immediate renegotia‐
tion).
虽然我还没弄清楚如何用浣熊做同样的事情,但我猜也应该有类似的东西。