Назад | Перейти на главную страницу

Туннель IPsec между 2 удаленными хостами

Я использую mininet, я создал туннель ESP между двумя машинами, так что если я пингую с одной машины на другую, я вижу пакеты ESP, и все работает нормально. Вот используемые команды:

M1 ip xfrm policy add dir out src 2001:0:0:1c::2 dst 2001:0:0:1c::1 tmpl proto esp mode transport
M1 ip xfrm state add src 2001:0:0:1c::2 dst 2001:0:0:1c::1 proto esp spi 1 enc 'cbc(aes)' 0x3ed0af408cf5dcbf5d5d9a5fa806b224 mode transport

M2 ip xfrm policy add dir in src 2001:0:0:1c::2 dst 2001:0:0:1c::1 tmpl proto esp mode transport
M2 ip xfrm state add src 2001:0:0:1c::2 dst 2001:0:0:1c::1 proto esp spi 1 enc 'cbc(aes)' 0x3ed0af408cf5dcbf5d5d9a5fa806b224 mode transport

Теперь я пытаюсь сделать следующее:

У меня есть 2 машины, скажем, M1 и M3, которые являются удаленными (или smt, например M1 -> M2 -> M3), и я просто меняю соответствующие src и dst с помощью адреса ipv6, но в этом случае туннель больше не работает, я имею в виду, что при просмотре пакетов на wirehark заголовок ESP отсутствует. Даже если я оставлю код, как указано выше, пакеты между M1 и M2 все еще без заголовка ESP.

Моя цель состоит в том, чтобы установить связь IPsec между M1 и M3, поэтому, если я отправлю эхо-запрос от M1 к M3, будут пакеты ESP между M1 и M3 и пакет между MC2 и MC3. Как я могу это реализовать? Любая помощь приветствуется, заранее спасибо.

Сначала оговорка: установка ключей шифрования вручную идеально подходит для демонстрационных целей, но и АЙК демон как сильный сделает это лучше и не сложнее настроить.

Команды, которые вы использовали в своем вопросе, подразумевают, что:

  • вы настраиваете шифрование только в одном направлении (M1 -> M2). Пакеты ESP, которые вы видите с WireShark, выходят из M1 в M2. Ответ на пинг не зашифрован,
  • вы используете только шифрование без аутентификации, поэтому вы не можете определить, были ли ваши пакеты изменены (например, усечены) при передаче,
  • ты используешь транспорт режим, поэтому вы можете использовать зашифрованный канал для отправки пакетов от M1 к M2, но не дальше.
  • вы, вероятно, всегда используете spi из 1. Это номер, который отправляется с каждым пакетом ESP и позволяет ядру различать зашифрованные каналы.

Поэтому, если вы хотите установить двунаправленный зашифрованный канал, вам необходимо создать spi и ключ шифрования для обоих направлений:

host1="2001:0:0:1c::2"
host2="2001:0:0:1c::1"
key12=0x$(xxd -c 32 -l 32 -ps /dev/random)
key21=0x$(xxd -c 32 -l 32 -ps /dev/random)
spi12=0x$(xxd -c 4 -l 4 -ps /dev/random)
spi21=0x$(xxd -c 4 -l 4 -ps /dev/random)

Затем вам необходимо установить ключи шифрования на оба хоста:

ip xfrm state add src $host1 dst $host2 proto esp spi $spi12 enc 'cbc(aes)' $key12 mode transport
ip xfrm state add src $host2 dst $host1 proto esp spi $spi21 enc 'cbc(aes)' $key21 mode transport

После установки ключей вы можете добавить политики, чтобы Linux начал шифрование данных. Инструкции различаются для разных хостов (очевидно), потому что направления в и вне разные. На M1 нужно использовать:

ip xfrm policy add dir out src $host1 dst $host2 tmpl proto esp mode transport
ip xfrm policy add dir in src $host2 dst $host1 tmpl proto esp mode transport

на М2:

ip xfrm policy add dir in src $host1 dst $host2 tmpl proto esp mode transport
ip xfrm policy add dir out src $host2 dst $host1 tmpl proto esp mode transport

Теперь ядро ​​начнет шифрование исходящих пакетов и отбрасывает незашифрованные входящие пакеты.

Если что-то не работает, проверьте, пропускают ли брандмауэры ESP.

PS: Вы можете найти более полное решение на блог Валднера.