Linux 上的 Racoon - 初始数据包丢失

Linux 上的 Racoon - 初始数据包丢失

我已配置了两个 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).

虽然我还没弄清楚如何用浣熊做同样的事情,但我猜也应该有类似的东西。

相关内容