главная - Статьи - Удаленный доступ (VPN)
Установка IPSEC соединения между компьютерами Linux (FreeS/WAN) и Windows в Transport Mode c использованием PSK
Дата обновления: 05.03.2020Оригинал: www.ezh.msk.ru
Автор: Алексей Аксенов
Начнем с отвлеченных рассуждений о соединении IPSEC, его пользе и применении. Обратите внимание, что в названии статьи стоит transport mode (транспортный режим), кроме transport mode есть другой режим работы IPSEC, называемый tunnel mode (туннельный режим). В чем их отличие? Как правило, туннельный режим предполагает шифрование всего пакета, включая заголовок сетевого уровня. Туннельный режим применяется в случае необходимости скрытия информационного обмена организации с внешним миром. Например, нам нужно соединить две сети, имеющих доступ к агрессивной информационной среде (Интернету) - туннельный режим идеально подходит для решения подобных задач. При этом, адресные поля заголовка сетевого уровня пакета, использующего туннельный режим, заполняются межсетевым экраном организации и не содержат информации о конкретном отправителе пакета. При передаче информации из внешнего мира в локальную сеть организации в качестве адреса назначения используется сетевой адрес межсетевого экрана. После расшифровки межсетевым экраном начального заголовка сетевого уровня пакет направляется получателю. Транспортный же режим используется для шифрования поля данных IP пакета, содержащего протоколы транспортного уровня (TCP, UDP, ICMP), которое, в свою очередь, содержит информацию прикладных служб. Примером применения транспортного режима является установка шифрованных соединений по вышеперечисленным протоколам между двумя хостами. Для аутентификации соединения мы используем PSK (publicly shared key) - публичный общий ключ.
Оглавление
- Часть сугубо философская о смысле жизни, в которой Вини-Пух. то есть, нет, Eжик! рассуждает о смысле жизни и IPSEC.
- Часть практическая linux'овая, в которой мы устанавливаем FreeS/WAN v1.99 в gentoo linux, а некоторые, особо смелые, делают небольшой, но очень симпатичный финт ушами под чутким руководством Ежа.
- Часть практическая windows'овая, в которой мы ничего не делаем, кроме настройки IPSEC соединения.
- Часть кульминационная, в которой мы запускаем IPSEC соединение.
- Часть заключительная, в которой мы рассуждаем о том, что еще хорошо бы сделать для сохранности нашего бочонка с медом.
Часть сугубо философская о смысле жизни, в которой Вини-Пух. то есть, нет, Eжик! рассуждает о смысле жизни и IPSEC.
Установка связи c использованием IPSEC в транспортном режиме между двумя машинами, одна из которых работает с использованием операционной системы windows 2к и выше, а другая, под управлением ОС Linux и является целью этой статьи. Причем нам не важно, стоят ли эти машины рядом, или находятся в различных подсетях, на значительном расстоянии друг от друга. Надо только помнить, что между машинами не должно быть NAT'a и неправильно настроенных фаерволов. Пример использования транспортного режима: на машине с windows установлена MSSQL и машина под Linux'ом должна получать c нее данные или на машине с linux крутится Oracle или Postgres, или Mysql (или что-либо еще на ваше усмотрение, так как если нигде ничего не крутится, то зачем вообще заставлять себя читать этот текст?) и с windows машины мы должны получать доступ к этим СУБД. Короче есть работающие сервисы, которые не шифруют (или шифруют, но не так, как нам нравится) трафик, а мы должны сделать так, что добрый хакер(advanced user/super advanced lamer) не узнал наши секретные секреты. Все это нам обеспечит IPSEC.
Данное описание подразумевает, что у нас будет работать только протокол ESP (Encapsulating Security Payload) с использованием MD5 хеша и шифрования 3DES. Просьба помнить, что в транспортном режиме ESP шифрует и хеширует только полезные данные, а не весь пакет, как это происходит при инкапсуляции в туннельном режиме, поэтому злоумышленник может спокойно изменить заголовок. Однако это очень страшный и редкий злоумышленник, занесенный в красную книгу, работающий за очень приличные деньги. Для пресечения этого безобразия крутите AH(Authentication Header). Вообще-то в FreeS/Wan, начиная с версии 2.05, отказались от AH совсем, так как два хороших человека Niels Ferguson и Bruce Schneier привели пару аргументов в документе "A Cryptographic Evaluation of IPsec" (pdf еще можно найти в сети, например, здесь, на момент последней редакции сайт https://www.schneier.com не откликался), суть которых в том, что совместное использование AH и ESP, как ни парадоксально, только увеличивает вероятность взлома. Cам по себе AH обеспечивает только целостность информации за счет создания хеша пакета (включая заголовок), не обеспечивая конфиденциальности (IMHO необходимость обеспечивать целостность такого рода без шифрования передаваемых данных мало кому нужна).
У кого-нибудь может возникнуть вопрос, а почему бы для обеспечения безопасности просто не использовать stunnel например или ssh и не заморачиваться с IPSEC? Ответ прост - дело личных предпочтений =). Лично для меня что ssh, что stunnel - времянки. К тому же программы stunnel и ssh не входят в стандартную поставку windows, то есть их нужно скачать, настроить, запустить (IPSEC нужно только настроить и запустить), а в процессе настройки нужно будет прописывать правила для каждого типа соединений, причем защищаемые сервисы должны работать, используя TCP(мы, конечно же, можем инкапсулировать UDP в TCP используя netcat. Вы себя еще нормально чувствуете? Описываемые кошмары нормально воспринимаются?). Конечно, сервисов на каждом сервере у нас достаточно, как и самих серверов, так что скоро приходится запускать по паре stunnel на серверах (один в режиме server, другой в режиме client) или десяток другой ssh сессий. Вообщем, нас спасет IPSEC, который шифрует весь трафик (хотя можно и не весь - это как вы фильтры настроите). Вот как. Надеюсь, что IPSEC может помочь с решением пары ситуаций, убедил? Если нет, тогда настраивайте, пробуйте, а там сами решите - не нужно оно вам или все-таки нужно. (Конечно, читая данный абзац, можно вспомнить и о PPTP, и о L2TP и вообще, о чем-то своем родном и близком, но мы все же возьмем себя в руки и продолжим нашу кровавую дедективу)
Часть практическая linux'овая, в которой мы устанавливаем FreeS/WAN v1.99 в gentoo linux, а некоторые, особо смелые, делают небольшой, но очень симпатичный финт ушами под чутким руководством Ежа.
- (Если у нас vanillia-sources) Распаковываем дистрибутив freeswan куда-нибудь в укромное место, где он может лежать и никому не мешать. Заходим в каталог с исходниками и даем команду make insert(патчим ядро на предмет добавления модуля ipsec)
- Компилируем ядро с модулем IPSEC
- emerge freeswan
Далее проверяем работоспособность FreeS/WAN и, если все хорошо, редактируем ipsec.conf и ipsec.secrets.
ipsec.conf
# basic configuration
config setup
interfaces="ipsec0=<интерфейс>"
klipsdebug=none
plutodebug=none
plutoload=%search
plutostart=%search
uniqueids=yes
conn lin-win
left=<linux_ip>
right=<windows_ip>
type=transport
pfs=no
auth=esp
auto=start
Где <интерфейс> это ваш интерфейс, например eth0 (причем у меня это был 802.1d бридж, состоящий из двух физических интерфейсов eth2 и eth3, созданный соответственно с помощью bridge-utils), <linux_ip> - IP адрес интерфейса, <windows_ip> - IP адрес windows машины.ipsec.secrets
<linux_ip> <windows_ip>: PSK "<key>"
Где <key> это ваше секретное слово (PSK - publicly shared key), <linux_ip> - IP адрес интерфейса, <windows_ip> - IP адрес windows машины(можно указать %any для всех машин).
echo "0" > /proc/sys/net/ipv4/conf/<интерфейс>/rp_filter
или
sysctl -w 'net.ipv4.conf.<интерфейс>.rp_filter=0'
это у нас отключает так называемый Reverse Path Filtering или как его еще называют "Back Route Verify ". Принцип действия этого механизма: фильтр проверяет адрес источника пакета, пришедшего на сетевой интерфейс, просматривая таблицы маршрутизации, и если для отправки ответа на этот пакет роутер должен будет использовать другой интерфейс - пакет отбрасывается, т.к. фильтр считает, что происходит ip spoofing. То есть rp_filter будет отбрасывать корректные пакеты в среде, содержащей ассиметричный роутинг. Мы эту штуку отключаем, что в принципе иногда ужасает некоторых товарищей, хотя ничего страшного нет.
Что бы все было нормально нужно:
- при настройке внимательно читать документацию
- устанавливать политики IPSEC Require! чтоб незашифрованный трафик был просто-напросто запрещен
- использовать такую замечательную вещь как iptables, которая умеет выбирать пакеты не только по портам и адресам, но и по протоколам! (и я надеюсь, вы обычно настраиваете защиту от IP Spoofing)
- использовать еще более замечательную вещь - голову =) эта вещь даже круче iptables! Пользуйтесь!
iptables -t mangle -A PREROUTING -i <внешний интефейс> -j MARK --set-mark 1
ip rule add fwmark 1 table 100
ip route add table 100 dev <interface>
, где <interface> - интерфейс, на который вешали ipsec и <внешний интефейс> - это интерфейс подключенный к другим сетям. (в моем случае такими интерфейсами являлись eth0, eth1 и все ppp - ppp+ )
Часть практическая windows'овая, в которой мы ничего не делаем, кроме настройки IPSEC соединения.
Создаем политику безопасности IPSEC
Добавляем правило безопасности в нашу политику.
Добавляем фильтр для трафика, который будем шифровать.
Добавляем фильтр действий (Filter Action).
Заключительная настройка IPSEC.
Часть кульминационная, в которой мы запускаем IPSEC соединение.
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 <linux_ip>/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 <linux_ip>
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 <windows_ip>: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
19:39:03.810739 <windows_ip> > <linux_ip>: ESP(spi=0x356646be,seq=0xd4c) (DF)
19:39:03.811865 <linux_ip> > <windows_ip>: ESP(spi=0x110d41a7,seq=0xde0) (DF) [tos 0x10]
19:39:03.811839 <windows_ip> > <linux_ip>: ESP(spi=0x356646be,seq=0xd4d) (DF)
19:39:03.812325 <windows_ip> > <linux_ip>: ESP(spi=0x356646be,seq=0xd4e) (DF)
ipsec look
obelisk Fri Feb 13 12:56:31 MSK 2004
<linux_ip>/32 -> <windows_ip>/32 => esp0x25e409d0@<windows_ip> (0)
ipsec0->homelan mtu=16260(1500)->1500
esp0x25e409d0@<windows_ip> ESP_3DES_HMAC_MD5: dir=out src=<linux_ip> iv_bits=64bits iv=0x51fd9266fb73823c ooowin=64 alen=128 aklen=128 eklen=192 life(c,s,h)=addtime(436,0,0)
esp0x722533e4@<windows_ip> ESP_3DES_HMAC_MD5: dir=out src=<linux_ip> iv_bits=64bits iv=0xe9fbc10da8750ac4 ooowin=64 alen=128 aklen=128 eklen=192 life(c,s,h)=addtime(440,0,0)
esp0x72bdf8a9@<linux_ip> ESP_3DES_HMAC_MD5: dir=in src=<windows_ip> 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@<linux_ip> ESP_3DES_HMAC_MD5: dir=in src=<windows_ip> 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
<nat_ip> 0.0.0.0 255.255.255.0 U 0 0 0 homelan
<net_ip> 0.0.0.0 255.255.255.0 U 0 0 0 ipsec0
<windows_ip> <windows_ip> 255.255.255.255 UGH 0 0 0 ipsec0
Часть заключительная, в которой мы рассуждаем о том, что еще хорошо бы сделать для сохранности нашего бочонка с медом.
iptables -A INPUT -p udp -i <интерфейс> -s <windows_ip> --sport 500 --dport 500 -j ACCEPT
iptables -A OUTPUT -p udp -o <интерфейс> -d <windows_ip> --sport 500 --dport 500 -j ACCEPT
iptables -A INPUT -p esp -i <интерфейс> -s <windows_ip> -j ACCEPT
iptables -A OUTPUT -p esp -o <интерфейс> -d <windows_ip> -j ACCEPT
iptables -A INPUT -i <интерфейс> -s <windows_ip> -j DROP
iptables -A OUTPUT -o <интерфейс> -d <windows_ip> -j DROP
iptables -A INPUT -p ah -i <интерфейс> -s <windows_ip> -j ACCEPT
iptables -A OUTPUT -p ah -o <интерфейс> -d <windows_ip> -j ACCEPT
Авторизуйтесь для добавления комментариев!