Racoon на Linux - начальная потеря пакетов

Я настроил два блока 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?

2 ответа

Решение

Первый пакет (и все остальные до завершения согласования) всегда отбрасывается.

Это верно для каждой реализации ISAKMP, с которой я имел дело. Я не верю, что есть какая-то причина, по которой он не может буферизовать отбрасываемые пакеты; скорее, не должно.

Это расширение осознанного проектного решения, которое используется во всей инфраструктуре маршрутизации Интернета: не удерживайте пакеты.

Системы маршрутизации в Интернете всегда отбрасывают пакет, а не задерживают его, когда они не могут (почти) немедленно направить его. Потери пакетов в Интернете в целом можно легко снизить до гораздо более низких уровней, просто храня пакет в буфере до тех пор, пока для него не останется места. Но в этом и заключается проблема; перегруженный маршрутизатор, работающий на 200 мс в очереди "первым пришел - первым вышел", задержал бы каждый отдельный пакет на эти 200 мс.

Возвращение к ситуации ISAKMP; удерживать пару пингов до тех пор, пока путь не будет готов к их переносу - это прекрасно, но что если это постоянный поток из сотен тысяч пакетов UDP? А что, если удаленная система недоступна, поэтому ISAKMP сидит и ждет сообщения согласования ISAKMP 2 в течение 60 секунд?

Хотя они не являются непреодолимыми инженерными проблемами, общепринятым мнением в интернет-сообществе инженеров является то, что клиентским системам гораздо проще и проще самим решать проблемы с потерей пакетов, в основном за счет использования устойчивых к потерям протоколов, таких как TCP.

Вы можете автоматически запустить туннель 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).

Хотя я до сих пор не понял, как сделать то же самое с енотом, но, думаю, должно быть что-то подобное.

Другие вопросы по тегам