IPSec VPN для OS X і iOS. Без болю

VPN (англ. Virtual Private Network — віртуальна приватна мережа) — узагальнена назва технологій, що дозволяють забезпечити одне або кілька мережних з'єднань (логічну мережу) поверх іншої мережі (наприклад, Інтернет).
© Вікіпедія


VPN використовується для віддаленого підключення до робочого місця, для захисту даних, для обходу фільтрів і блокувань, для видачі себе за громадянина іншої країни і взагалі — штука незамінна. Практично повсюдно в якості простого засобу для організації інтерфейсу VPN використовується всім відомий OpenVPN, який використовував і я. Рівно до тих пір, поки у мене не з'явився Macbook і OS X на додачу. З-за того, що підхід Apple до конфігурації DNS сильно відрізняється від підходу інших *nix-систем, кидок DNS через VPN нормально не працював.

Після деяких досліджень у мене вийшло два варіанти:
— Використання DNS «повз» VPN, що дуже небезпечно, але вирішує проблему.
— Використання нативних для OS X VPN-протоколів: PPTP і сімейства IPSec.
Зрозуміло, я вибрав друге і зрозуміло — IPSec, а не застарілий PPTP.

TL;DR;Налаштування Linux ( в моєму випадку — Arch Linux )

#!/bin/bash
MYIP="1.2.3.4" # IP-адресу сервера
# Установка софта ( для Arch Linux )
pacman -S --noconfirm ipsec-tools pwgen
# Готова конфігурація
wget https://gist.githubusercontent.com/kreon/e8d12dbfc4cd2c711c11588b4388afd4/raw/0929a169dde09ae3f041f4da4bf161614501d62c/racoon.conf \
-O /etc/racoon.conf
sed -i "s/0.0.0.0/$MYIP/g". /etc/racoon.conf
# Генерація групи і psk
mkdir -p /etc/racoon/ && echo $(pwgen -s 8 1) $(pwgen -s 64 1) > /etc/racoon/psk.key && \
chmod 0400 /etc/racoon/psk.key
# Додавання групи для VPN
groupadd vpn
# Запуск racoon
systemctl enable racoon && systemctl start racoon
# Створення користувача для VPN і завдання йому пароля
useradd -s /bin/nologin -G vpn -g vpn -M -N -d / vpn_user && \
passwd vpn_user
# Додавання правил для filter + nat
iptables -t filter -I INPUT -p esp -j ACCEPT
iptables -t filter -I INPUT -p udp --dport 500 -j ACCEPT
iptables -t filter -I INPUT -p udp --dport 4500 -j ACCEPT
iptables -t filter -I FORWARD -s 192.168.100.0/24 -j ACCEPT
iptables -t filter -I FORWARD -d 192.168.100.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
iptables-save > /etc/iptables/iptables.rules
# Включення форвардингу
echo net.ipv4.ip_forward=1 > /etc/sysctl.d/10-ip_fowrard.conf
sysctl -p /etc/sysctl.d/10-ip_fowrard.conf


Налаштування OS X

  1. Відкрити Установки → Мережа
  2. Натиснути (+) і вибрати VPN/Cisco IPSec
  3. Заповнити основну інформацію ( адресу, ім'я користувача і пароль )
  4. Виберіть «Настройки аутентифікації» і вказати групу і PSK ( з файлу /etc/racoon/psk.key )
  5. Підключитися


OS X і IPSec
IPSec це не один протокол, а набір протоколів і стандартів, кожен з яких має купу варіантів і опцій. OS X підтримує три види IPSec VPN:
— IPSec/L2TP
— IKEv2
— Cisco VPN

Перший варіант надмірний — який сенс прокидати ethernet-пакети для VPN?
Другий — вимагає сертифікатів і сильно складної настройки на стороні клієнта, що теж недобре.
Залишається третій, який називається «Cisco», а насправді — XAuth+PSK. Його і будемо використовувати.

Препарація OS X
Після деяких невдалих спроб налаштувати VPN на OS X, я поліз вивчати систему на предмет того, як же саме там працює VPN.
Недовгий пошук дав мені файлик /private/etc/racoon/racoon.conf, в якому була рядок include "/var/run/racoon/*.conf";.
Після цього все стало зрозуміло: при натисканні кнопки OS X генерує конфіг для racoon і кладе його в /var/run/racoon/, після закінчення з'єднання — видаляє. Залишилося тільки отримати конфіг, що я і зробив, запустивши скрипт перед з'єднанням.
while true; for I in *.conf; do CP $I $HOME/$I; exit 0; done; done

Всередині я знайшов саме ту інформацію, якої мені не вистачало для налаштування сервера: IPSec proposals. Це списки підтримуваних клієнтом і сервером ) режимів аутентифікації, шифрування і підпису, при неспівпаданні яких з'єднання не може бути встановлено.
Підсумковий proposal для OS X 10.11 і iOS 9.3 вийшов таким:
encryption_algorithm aes 256;
 
hash_algorithm sha256;
 
authentication_method xauth_psk_server;
 
dh_group 14;
 


Вибір VDS і налаштування VPN
Для VPN-сервера я вибрав VDS від OVH, оскільки вони дають повноцінну віртуалізацію з можливістю ставити будь-ядро з будь-якими модулями. Це дуже важливо, оскільки ipsec працює на рівні ядра, а не користувача, як OpenVPN.
Режим «Cisco VPN» (XAuth + PSK) передбачає двоетапну перевірку:
— Використовуючи ім'я групи і PSK для неї ( етап 1 )
— Використовуючи ім'я користувача та пароль ( етап 2 )

Налаштування racoon
racoon — демон, який займається керуванням ключами ( IKE ). Саме він дає ядру дозвіл на провешивание тунелю після того, як аутентифікує клієнта і узгодить всі деталі протоколу ( aka proposal ). racoon входить в стандартний пакет ipsec-tools і є практично в будь-якому дистрибутиві Linux «з коробки».

Конфігурація racoon
/etc/racoon.conf# шлях до файлу з pre-shared-key. Права повинні бути 0400
path pre_shared_key "./etc/racoon/psk.key";
# вказівку зовнішнього ip-адреси обов'язково, 0.0.0.0 не працює!
listen {
isakmp 1.2.3.4 [500];
isakmp_natt 1.2.3.4 [4500];
}

# anonymous aka road warrior — клієнт з невідомим зовнішнім адресою
remote anonymous {
# passive — режим "чекати вхідного"
passive on;
# передача конфігурації клієнта
mode_cfg on;
# взято з racoon.conf для os x
exchange_mode main,aggressive;
ike_frag on;
verify_cert off;
verify_identifier off;
# ім'я сервера
my_identifier fqdn "vpn.server";
# генерувати одноразові політики ( spd ) автоматично
# ще їх можна генерувати руками, але не потрібно
generate_policy on;
# режим проходу через NAT
nat_traversal on;
# мертві клієнти відвалюються через 5 хвилин
dpd_delay 300;
# proposal — набір протоколів для клієнта
# взято з racoon.conf для os x
proposal {
encryption_algorithm aes 256;
hash_algorithm sha256;
authentication_method xauth_psk_server;
dh_group 14;
}
}

mode_cfg {
# аутентифікація по unix-користувачам
auth_source system;
#… і unix-групам
group_source system;
#… і пускати тільки членів груп vpn
auth_groups "vpn";
#… дозволити клієнту зберігати пароль
save_passwd on;
# брати конфігурацію з конфига ( а не з radius наприклад )
conf_source local;
# початковий адресу пулу
network4 192.168.100.100;
# маска пулу
netmask4 255.255.255.0;
# dns-сервер
dns4 8.8.8.8;
# розмір ділянки
pool_size 50;
}

# параметри шифрування
sainfo anonymous {
encryption_algorithm aes;
authentication_algorithm hmac_sha1;
compression_algorithm deflate;
}



Конфігурація psk-файлу

/etc/racoon/psk.keyВикористовуючи випадкові 64 біта групи і 512 біт ключа, я отримую досить варіантів, щоб зробити перебір безглуздим.

# group key
z1x7VZto IgYLrXQdsTFPWKpH7DrV6H06GnbQGl1jleslzbj6hzi7bieulk1mf3yqkqagdwvm
U8WLLyuk so70ums1VqrCilBvEBEUTDN9kripEd8l5pyqhwf8pnmmnvdv4uquuedlhhsnpk5c
4eU8rxhB TublZZd0K03REBdRe8BmkGuuOqNOnsW5d26bbtisv4x0m1xlzwdjwhcjt3qyg1rc
L2rSlX01 IaXcgzUNVCMkf2BFGcHR14s4rLLbA9Zckqg0h5vnqlwmh4g2tsba807y2fmhxpxy
2QkqRbEv GnClE7m3Aq2HrXa6vhSubxNc6ZnY7LSWafqmasgi5pqthzwmvqy0vonabaxypbk4
2mC1aO86 Dmmmty5rbaOZY0Uh0PGIcVYOLTI8fYlGwjcjfhhzsyxtdztsc7qhnj75vfapju2c
kotVQ8eN 31cRpnVpEzkrrm58gWuiaCeOvYLwJYy42dgla3ihsuykfter5tmljbtv5vwktlzx
YXQX4YSm 74f2RND10NIDaRk2bQtuPEjgJWXxeZdD7kobdybzdiq053pnzlnvdqdfn1taa6zv
4ZwwJuMP 1xNyfGJSYvDRX7MgId9AgmwygqVFiOJDet2oflvjkooukufbt3iin2pksxftyin2
t9D9S59q euDKjEM73eONU8hmbPGm3mtnyz3h66AY3thwo5wjobtm7pulc1tlvxeogwoiuapm


Налаштування Linux


— Необхідно дозволити маршрутизацію: sysctl net.ipv4.ip_forward=1
— Необхідно вирішити протокол ESP і вхідні з'єднання на порти 500/udp і 4500/udp: iptables -t filter -I INPUT -p esp -j ACCEPT; iptables -t filter -I INPUT -p udp --dport 500 -j ACCEPT; iptables -t filter -I INPUT -p udp --dport 4500 -j ACCEPT
— Необхідно включити NAT для нашої мережі: iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j MASQUERADE
— Необхідно створити групу і створити/додати туди користувачів: groupadd vpn та useradd -G vpn vpn_user
— Необхідно запустити racoon: racoon -vF

Налаштування OS X
OS X в картинкахУстановки → Мережа


Вибрати (+) → VPN → Cisco IPSec → придумати назву


Вибрати з'єднання → ввести адресу сервера, ім'я користувача і пароль


Вибрати «Налаштування аутентифікації» → ввести ім'я групи і ключ ( саме в такому порядку )


З'єднатися.


Налаштування iOS
iOS в картинкахНалаштування → Основні → VPN → Додати конфігурацію VPN.

Заповнити форму за аналогією, підключитися.



<<<EOF
Спасибі за увагу, шифруйте свій трафік!
EOF;

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.