Ipsec windows to linux

Содержание
  1. Установка IPSEC соединения между компьютерами Linux (FreeS/WAN) и Windows в Transport Mode c использованием PSK.
  2. Оглавление
  3. Часть сугубо философская о смысле жизни, в которой Вини-Пух. то есть, нет, Eжик! рассуждает о смысле жизни и IPSEC.
  4. Часть практическая linux’овая, в которой мы устанавливаем FreeS/WAN v1.99 в gentoo linux, а некоторые, особо смелые, делают небольшой, но очень симпатичный финт ушами под чутким руководством Ежа.
  5. Часть практическая windows’овая, в которой мы ничего не делаем, кроме настройки IPSEC соединения.
  6. Создаем политику безопасности IPSEC
  7. Добавляем правило безопасности в нашу политику.
  8. Добавляем фильтр для трафика, который будем шифровать.
  9. Добавляем фильтр действий (Filter Action).
  10. Заключительная настройка IPSEC.
  11. Часть кульминационная, в которой мы запускаем IPSEC соединение.
  12. Часть заключительная, в которой мы рассуждаем о том, что еще хорошо бы сделать для сохранности нашего бочонка с медом.
  13. Компы и автомобили
  14. Вводная часть
  15. Процесс настройки.

Установка IPSEC соединения между компьютерами Linux (FreeS/WAN) и Windows в Transport Mode c использованием PSK.

Оглавление

Часть сугубо философская о смысле жизни, в которой Вини-Пух. то есть, нет, Eжик! рассуждает о смысле жизни и IPSEC.

Часть практическая linux’овая, в которой мы устанавливаем FreeS/WAN v1.99 в gentoo linux, а некоторые, особо смелые, делают небольшой, но очень симпатичный финт ушами под чутким руководством Ежа.

  • (Если у нас vanillia-sources) Распаковываем дистрибутив freeswan куда-нибудь в укромное место, где он может лежать и никому не мешать. Заходим в каталог с исходниками и даем команду make insert(патчим ядро на предмет добавления модуля ipsec)
  • Компилируем ядро с модулем IPSEC
  • emerge freeswan

FreeS/WAN установлен =)

Далее проверяем работоспособность FreeS/WAN и, если все хорошо, редактируем ipsec.conf и ipsec.secrets. Где это ваш интерфейс, например eth0 (причем у меня это был 802.1d бридж, состоящий из двух физических интерфейсов eth2 и eth3, созданный соответственно с помощью bridge-utils),
— IP адрес интерфейса, — IP адрес windows машины.

ipsec.secrets

  • : PSK » »

    Где это ваше секретное слово (PSK — publicly shared key),

  • — IP адрес интерфейса, — IP адрес windows машины(можно указать %any для всех машин).

    Часть практическая windows’овая, в которой мы ничего не делаем, кроме настройки IPSEC соединения.

    Создаем политику безопасности IPSEC

    Добавляем правило безопасности в нашу политику.

    Добавляем фильтр для трафика, который будем шифровать.

    Добавляем фильтр действий (Filter Action).

    Заключительная настройка IPSEC.

    Часть кульминационная, в которой мы запускаем IPSEC соединение.

    Выдержка из message.log

    Feb 13 12:49:05 obelisk ipsec_setup: Starting FreeS/WAN IPsec 1.99.
    Feb 13 12:49:05 obelisk ipsec_setup: Using /lib/modules/2.4.24/kernel/net/ipsec/ipsec.o
    Feb 13 12:49:05 obelisk klips_info:ipsec_init: KLIPS startup, FreeS/WAN IPSec version: 1.99
    Feb 13 12:49:05 obelisk ipsec_setup: KLIPS debug `none’
    Feb 13 12:49:05 obelisk ipsec_setup: KLIPS ipsec0 on homelan

  • /255.255.255.0 broadcast 10.255.255.255
    Feb 13 12:49:05 obelisk ipsec__plutorun: Starting Pluto subsystem.
    Feb 13 12:49:05 obelisk ipsec_setup: . FreeS/WAN IPsec started
    Feb 13 12:49:05 obelisk pluto[17066]: Starting Pluto (FreeS/WAN Version 1.99)
    Feb 13 12:49:05 obelisk pluto[17066]: added connection description «win-lin»
    Feb 13 12:49:05 obelisk pluto[17066]: listening for IKE messages
    Feb 13 12:49:05 obelisk pluto[17066]: adding interface ipsec0/homelan
  • Feb 13 12:49:05 obelisk pluto[17066]: loading secrets from «/etc/ipsec.secrets»
    Feb 13 12:49:05 obelisk pluto[17066]: «win-lin» #1: initiating Main Mode
    Feb 13 12:49:11 obelisk pluto[17066]: packet from :500: ignoring Vendor ID payload
    Feb 13 12:49:11 obelisk pluto[17066]: «win-lin» #2: responding to Main Mode
    Feb 13 12:49:11 obelisk pluto[17066]: «win-lin» #2: sent MR3, ISAKMP SA established
    Feb 13 12:49:11 obelisk pluto[17066]: «win-lin» #3: responding to Quick Mode
    Feb 13 12:49:11 obelisk pluto[17066]: «win-lin» #3: IPsec SA established
    Feb 13 12:49:15 obelisk pluto[17066]: «win-lin» #1: ignoring Vendor ID payload
    Feb 13 12:49:15 obelisk pluto[17066]: «win-lin» #1: ISAKMP SA established
    Feb 13 12:49:15 obelisk pluto[17066]: «win-lin» #4: initiating Quick Mode PSK+ENCRYPT+DISABLEARRIVALCHECK
    Feb 13 12:49:15 obelisk pluto[17066]: «win-lin» #4: IKE message has the Commit Flag set but Pluto doesn’t implement this feature; ignoring flag
    Feb 13 12:49:15 obelisk pluto[17066]: «win-lin» #4: ignoring informational payload, type IPSEC_RESPONDER_LIFETIME
    Feb 13 12:49:15 obelisk pluto[17066]: «win-lin» #4: sent QI2, IPsec SA established
    Feb 13 12:49:15 obelisk pluto[17066]: «win-lin» #4: IKE message has the Commit Flag set but Pluto doesn’t implement this feature; ignoring flag
    Feb 13 12:49:15 obelisk pluto[17066]: «win-lin» #4: message ignored because it contains an payload type (ISAKMP_NEXT_HASH) unexpected in this message
    Feb 13 12:49:15 obelisk pluto[17066]: «win-lin» #2: ignoring Delete SA payload
    Feb 13 12:49:15 obelisk pluto[17066]: «win-lin» #2: received and ignored informational message
    Feb 13 12:49:15 obelisk ipsec__plutorun: 104 «win-lin» #1: STATE_MAIN_I1: initiate
    Feb 13 12:49:15 obelisk ipsec__plutorun: 010 «win-lin» #1: STATE_MAIN_I1: retransmission; will wait 20s for response
    Feb 13 12:49:15 obelisk ipsec__plutorun: 003 «win-lin» #1: ignoring Vendor ID payload
    Feb 13 12:49:15 obelisk ipsec__plutorun: 106 «win-lin» #1: STATE_MAIN_I2: sent MI2, expecting MR2
    Feb 13 12:49:15 obelisk ipsec__plutorun: 108 «win-lin» #1: STATE_MAIN_I3: sent MI3, expecting MR3
    Feb 13 12:49:15 obelisk ipsec__plutorun: 004 «win-lin» #1: STATE_MAIN_I4: ISAKMP SA established
    Feb 13 12:49:15 obelisk ipsec__plutorun: 112 «win-lin» #4: STATE_QUICK_I1: initiate
    Feb 13 12:49:15 obelisk ipsec__plutorun: 003 «win-lin» #4: ignoring informational payload, type IPSEC_RESPONDER_LIFETIME
    Feb 13 12:49:15 obelisk ipsec__plutorun: 004 «win-lin» #4: STATE_QUICK_I2: sent QI2, IPsec SA established

    Читайте также:  Windows 10 завершение сеанса пользователя при простое

    19:39:03.810739 >

  • : ESP(spi=0x356646be,seq=0xd4c) (DF)
    19:39:03.811865
  • > : ESP(spi=0x110d41a7,seq=0xde0) (DF) [tos 0x10]
    19:39:03.811839 >
  • : ESP(spi=0x356646be,seq=0xd4d) (DF)
    19:39:03.812325 >
  • : ESP(spi=0x356646be,seq=0xd4e) (DF)

    Вывод ipsec look:

    ipsec look
    obelisk Fri Feb 13 12:56:31 MSK 2004

  • /32 -> /32 => esp0x25e409d0@ (0)
    ipsec0->homelan mtu=16260(1500)->1500
    esp0x25e409d0@ ESP_3DES_HMAC_MD5: dir=out src=
  • iv_bits=64bits iv=0x51fd9266fb73823c ooowin=64 alen=128 aklen=128 eklen=192 life(c,s,h)=addtime(436,0,0)
    esp0x722533e4@ ESP_3DES_HMAC_MD5: dir=out src=
  • iv_bits=64bits iv=0xe9fbc10da8750ac4 ooowin=64 alen=128 aklen=128 eklen=192 life(c,s,h)=addtime(440,0,0)
    esp0x72bdf8a9@
  • ESP_3DES_HMAC_MD5: dir=in src= iv_bits=64bits iv=0xffda9d19aae5b094 ooowin=64 seq=75 bit=0xffffffffffffffff alen=128 aklen=128 eklen=192 life(c,s,h)=bytes(4350,0,0)addtime(440,0,0)usetime(440,0,0)packets(75,0,0) idle=436
    esp0x72bdf8aa@
  • ESP_3DES_HMAC_MD5: dir=in src= iv_bits=64bits iv=0x9f82063ca057de6e ooowin=64 seq=7162 bit=0xffffffffffffffff max_seq_diff=1 alen=128 aklen=128 eklen=192 life(c,s,h)=bytes(445730,0,0)addtime(436,0,0)usetime(436,0,0)packets(7162,0,0) idle=0
    Destination Gateway Genmask Flags MSS Window irtt Iface
    0.0.0.0 255.255.255.0 U 0 0 0 homelan
    0.0.0.0 255.255.255.0 U 0 0 0 ipsec0
    255.255.255.255 UGH 0 0 0 ipsec0

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

    Для начала давайте посмотрим, что сделано и что мы должны были сделать. Мы установили IPSEC соединение, обеспечивающие шифрование между двумя нашими компьютерами. Вроде бы мы добились своей цели, однако все зависит от ситуации. Для уменьшения нештатных ситуаций (это когда все куда-то бегут и отовсюду слышится: «хакают! хакают!», хотя большинство спортсменов-бегунов имеют об этом весьма туманные представления) необходимо обязательно установить защиту от IP спуфинга на интерфейсах с выключенными rp_filter’ми. Потом мы должны быть уверенны, что наши сервера будут взаимодействовать только средствами IPSEC. В windows это может быть обеспечено отключением опции Allow unsecured communication with non-IPSec-aware computer и Accept unsecured communication, but always respond using IPSec в политике безопасности IPSEC. В linux это обеспечивается опцией auto=start, которая автоматически запускает шифрованный туннель и фильтрацией трафика с помощью iptables, разрешая взаимодействие только с помощью IPSEC, отбрасывая нешифрованный трафик:

    Читайте также:  Комбинация клавиш безопасный режим windows

    iptables -A INPUT -p udp -i -s —sport 500 —dport 500 -j ACCEPT
    iptables -A OUTPUT -p udp -o -d —sport 500 —dport 500 -j ACCEPT

    iptables -A INPUT -p esp -i -s -j ACCEPT
    iptables -A OUTPUT -p esp -o -d -j ACCEPT

    iptables -A INPUT -i -s -j DROP
    iptables -A OUTPUT -o -d -j DROP

    Если необходимо, то можно добавить:

    iptables -A INPUT -p ah -i -s -j ACCEPT
    iptables -A OUTPUT -p ah -o -d -j ACCEPT

    Компы и автомобили

    Вводная часть

    Есть такая клёвая штука, называется Seafile. Это «облачное хранилище», с возможностью развёртывания на своих серверах. Реально функциональная и удобная вещь. Позволяет шарить папки/файлы, как на определённый, так и неопределённый круг пользователей. Позволяет расшарить папку для аплоада, причём содержимое пользователям видно не будет, можно только заливать файлы. Есть клиенты Seafile под винду, линукс и макось. И самое клёвое — серверная часть работает под FreeBSD 🙂 Домашнее облачко перевёл с Owncloud/Netxtcloud на Seafile.

    Развернули в конторе для внутренних нужд Seafile, правда, не на фре, а на CentOS. Я начал настраивать авторизацию пользователей Seafile в AD через LDAP, и напоролся на граблю. По LDAP авторизация идёт, а по LDAPS — нет. А это неправильно, когда пароли по сетке ходят в открытом виде — всё-таки у нас тут инфобез, и всё такое, и по локальной сетке наши пентестеры шарятся тоже только в путь. Начал копать, как же дальше жить, в свете открывшихся фактов. Оказалось, я в этой проблеме не одинок, и существует она (применительно к версии Seafile 6 и CentOS 7) ажно с марта месяца. Нашёл на профильном форуме обсуждение. Если резюмировать, то суть там сводится к тому, что «да, LDAPS сломан, потому что несовместимы либы, которые есть в системе, и которыми пользуется Seafile. Можете попробовать закостылить путём переноса части сиафайловских библиотек в отдельный каталожек и перезапуска сервиса, чтобы Seafile стал использовать системные библиотеки». Но в моём случае это не прокатило. И у народа с форума тоже. По итогам вялого обсуждения разработчики обещали пересобрать Seafile под центось. 23-го июня, на вопрос: «чуваки, ну когда же?!» от разработчиков был получен ответ: «Сорян, пацаны, времени ваще нет!».

    В общем, стало понятно, что милостей от природы ждать не стоит, и нужно думать, что делать. Основная задача — зашифровать трафик между сервером Seafile и контроллерами домена. Т. е. нужен туннель. Мы же серьёзная контора, поэтому и туннель у нас должен быть серьёзный. Не какой-нибудь жалкий PPTP/L2TP, или OpenVPN, прости-господи, а самый что ни на есть IPsec. Для разнообразия — не в туннельном, а в транспортном режиме. Так как скрывать IP-адреса нам не нужно, и достаточно только шифрования data payload, то транспортный.

    Процесс настройки.

    Итак, в красном углу ринга у нас CentOS 7. В синем — её соперник, Windows 2012 R2. Если с настройкой IPsec в винде вопросов особо не возникло — там это делается с помощью Windows Firewall, то с линуксом пришлось пое. эээ. поекспериментировать 🙂 И после каких-то жалких 4-х дней непрерывной возни, с помощью гугла, профильных сообществ и такой-то матери удалось поднять IPsec транспорт между CentOS (IP 192.168.100.15) и Windows 2012 R2 (192.168.170.10).

    Читайте также:  Reset windows password passcape software reset windows password

    Изначально проблема была в том, что не устанавливалась фаза 1. Несмотря на совпадающие параметры, соединение не поднималось и SA не создавались. В дампе это выглядело так:

    Т. е. инициирующий пакет с центоси улетает, винда на него отвечает, но центось больше ничего не предпринимает. И так продолжалось по кругу. В логах при этом было следующее:

    Т. е. центось считала, что винда ей не отвечает. Несмотря на многочисленные попытки, побороться с этим не удалось.

    В процессе чтения мудрых указаний партии документации с сайта Strongswan сниошло озарение, что теперь, оказывается, есть две схемы конфигурации и запуска IPsec. Первый — это по старинке, через демон strongswan и настройками в файле ipsec.conf. Именно этот способ и был изначально использован. Но суровая практическая реальность показала, что при этом как минимум не идёт логирование событий IPsec, настраиваемое в файле /etc/strongswan/strongswand.d/charon-logging.conf.

    И есть более стильный-модный-молодёжный способ — это настройка через конфиг /etc/strongswan/swanctl/swanctl.conf и последующий запуск с помощью сервиса strongswan-swanctl. Это два взаимоисключающих способа настройки и использования Strongswan. В итоге после долгих и бесплодных попыток запустить Strongswan с конфигом из ipsec.conf было принято волевое решение перенести настройки в swanctl.conf.

    Форматы файлов разные, минимум необходимых настроек неизвестен, поэтому на конвертацию потребовалось также немало времени. Документация, описывающая параметры, есть, но нет ни примеров, ни указания, какие параметры являются обязательным. В итоге получился такой конфиг:

    Перезапускаем сервис strongswan-swanctl, иии. Ничего. Туннель не поднимается. Начинаем запускать его руками: swanctl —load-all:

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

    Есть контакт. Проверяем, создались ли SA-шки (в фоне постоянно висит пинг на соседа по туннелю):

    Ответ отрицательный. И пинги уходят по чистому каналу, как показывает tcpdump. Иными словами — соединение загрузилось, но не активировалось. Пробуем запустить руками:

    Проверяем, установились ли SA-шки:

    Работает. Т. е. руками туннель запускается, а при перезапуске сервиса он не грузится, и не активируется. Начинаем копать, в чём тут дело. Перезапуск сервиса с последующим анализом /var/log/messages приносит следующие новости:

    То есть, swanctl, запускаемый с правами рута из-под systemd не получает доступа к каталогам и конфигу swanctl.conf. Лихо, что сказать. Вот за такие вещи я и «люблю» Linux. 🙂

    Права на каталоги и файлы выставлены следующим образом:

    Добавил права на чтение swanctl.conf для others. Не помогло — всё равно жалуется, что нет доступа. Полез смотреть логи SELinux. В них тоже чисто. Опять было достал бубен, но потом вспомнил, что есть категории событий, которые блокируются по-тихому, и в /var/log/audit/audit.log не попадают. Включаем логирование всех событий:

    После перезапуска сервиса смотрим в логи. Ну точно! Опять проклятый SELinux:

    И начинается кропотливый процесс докидывания разрешений в политиках SELinux. Итоговый файл политик получился такой:

    Применяем всю эту красоту:

    После этого перезапускаем сервис и смотрим в логи:

  • Оцените статью