Добрый день, дорогие гости и читатели. Сегодня я публикую последнюю на ближайшее время статью на тему запуска своего VPN и эта статья о запуске собственного IKEv2 на Ubuntu 16.04.
Для выполнения задачи нам понадобится:
- VPS или выделенный сервер с установленной ОС Ubuntu 16.04 LTS и внешним IP адресом;
- Зарегистрированный и делегированный домен;
- Уметь добавлять записи в DNS вашего домена.
Напоминаю, что дешевые VPS во Франции для запуска своего VPN вы можете посмотреть здесь. Для примера, в статье я использую вымышленные данные: поддомен vpn.alexell.ru для подключения к VPN, внешний IP сервера 55.55.55.55 и почту на домене test@alexell.ru. При настройке своего IKEv2 на Ubuntu по этой статье, заменяйте эти значения на свои собственные.
Итак, если все из списка выше у вас имеется, тогда начнем приготовления:
- Добавляем A запись в DNS домена чтобы сопоставить поддомен vpn.alexell.ru с IP адресом сервера 55.55.55.55, на котором будем запускать VPN.
- Создаем почту в собственном домене, например test@alexell.ru;
- Определяемся с внутренней подсетью для клиентов. Для примера возьмем 10.10.1.0/24;
- Подключаемся по SSH к нашему VPS, например через PuTTY.
Настройки системы и фаервола
Открываем файл /etc/sysctl.conf и добавляем в самый конец следующие строки:
1 2 3 4 5 6 7 |
net.ipv4.ip_forward = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.icmp_ignore_bogus_error_responses = 1 |
Это активирует пересылку пакетов и отключит ICP-редиректы.
Стираем все правила фаервола командой iptables -F. Если у вас вдруг не установлен iptables, то просто установите его командой apt-get install iptables.
Узнайте название вашего сетевого интерфейса командой ifconfig. Запомните буквенный префикс, он может быть eth, ens или абсолютно другим. Например, если ваш интерфейс называется ens3, как было у меня, то при добавлении правил фаервола ниже, мы будем использовать обозначение ens+.
Для корректной работы NAT и протоколов IKE и ESP добавляем следующие правила:
1 2 3 4 |
iptables --append INPUT --protocol udp --destination-port 500 --jump ACCEPT iptables --append INPUT --protocol udp --destination-port 4500 --jump ACCEPT iptables --append INPUT --protocol esp --jump ACCEPT iptables -t nat -A POSTROUTING -j SNAT --to-source 55.55.55.55 -o ens+ |
Не забудьте заменить 55.55.55.55 на внешний IP вашего сервера.
Сохраняем правила NAT в файл командой:
1 |
iptables-save > /etc/iptables.conf |
Открываем файл /etc/network/interfaces и добавляем в конец файла строку:
1 |
pre-up /sbin/iptables-restore < /etc/iptables.conf |
Открываем файл /etc/rc.local и добавляем в конец файла, но до строки exit 0 следующую строку:
1 |
for vpn in /proc/sys/net/ipv4/conf/*; do echo 0 > $vpn/accept_redirects; echo 0 > $vpn/send_redirects; done |
Теперь можно перезагрузить сервер для применения всех изменений.
Получение SSL сертификата
Клиенты, подключающиеся к нашему IKEv2 будут проверять подлинность сервера, дабы исключить возможность того, что какой-то другой сервер «притворяется» нашим (атаки класса MITM). Получить SSL сертификат можно в любом действующем удостоверяющем центре за деньги, например GlobalSign и Comodo, но мы воспользуемся бесплатным Let’s Encrypt.
Установим пакет software-properties-common, который позволит подключать внешние репозитории:
1 |
apt-get install software-properties-common |
Установим утилиту certbot:
1 2 3 |
add-apt-repository ppa:certbot/certbot apt-get update apt-get install certbot |
Получаем сертификат следующей командой:
1 |
certbot certonly --standalone --agree-tos -m test@alexell.ru -d vpn.alexell.ru |
После окончания процедуры, в папке /etc/letsencrypt/live/vpn.alexell.ru появятся файлы: chain.pem - корневой и промежуточный сертификаты, cert.pem - сертификат сервера и privkey.pem - приватный ключ.
Установка и настройка IPsec
На этом шаге мы установим демон для работы IPsec и набор плагинов, в которых есть нужный нам EAP-MSCHAPv2 для аутентификации клиентов.
1 |
apt-get install strongswan libcharon-extra-plugins |
Теперь нам необходимо поместить полученные файлы сертификатов в директорию ipsec.d, внутри которой находятся cacerts (для корневых сертификатов), certs (для сертификатов X.509 и PGP) и private для приватных ключей.
Для этого выполним команды:
1 2 3 |
cp /etc/letsencrypt/live/vpn.alexell.ru/chain.pem /etc/ipsec.d/cacerts/ca.pem && chmod 644 /etc/ipsec.d/cacerts/ca.pem cp /etc/letsencrypt/live/vpn.alexell.ru/cert.pem /etc/ipsec.d/certs/certificate.pem && chmod 644 /etc/ipsec.d/certs/certificate.pem cp /etc/letsencrypt/live/vpn.alexell.ru/privkey.pem /etc/ipsec.d/private/key.pem && chmod 644 /etc/ipsec.d/private/key.pem |
Открываем файл /etc/ipsec.conf, стираем его содержимое и добавляем следующую конфигурацию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# ipsec.conf - strongSwan IPsec configuration file config setup # Allows few simultaneous connections with one user account. # By default only one active connection per user allowed. # This option also usefull if you have limited rightsourceip pool and want to kick your ghost connection while reconnecting. uniqueids=yes # Increase debug level #charondebug="ike 2, knl 2, cfg 2, net 2, esp 2, dmn 2, mgr 2" conn %default keyexchange=ikev2 # More advanced ciphers. Uncomment if you need it. # Default ciphers will works on most platforms. #ike=aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes256-aes128-sha256-sha1-modp2048-modp4096-modp1024,aes256-sha1-modp1024,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16-aes256gcm12-aes128gcm16-aes128gcm12-sha256-sha1-modp2048-modp4096-modp1024,3des-sha1-modp1024! #esp=aes128-aes256-sha1-sha256-modp2048-modp4096-modp1024,aes128-sha1,aes128-sha1-modp1024,aes128-sha1-modp1536,aes128-sha1-modp2048,aes128-sha256,aes128-sha256-ecp256,aes128-sha256-modp1024,aes128-sha256-modp1536,aes128-sha256-modp2048,aes128gcm12-aes128gcm16-aes256gcm12-aes256gcm16-modp2048-modp4096-modp1024,aes128gcm16,aes128gcm16-ecp256,aes256-sha1,aes256-sha256,aes256-sha256-modp1024,aes256-sha256-modp1536,aes256-sha256-modp2048,aes256-sha256-modp4096,aes256-sha384,aes256-sha384-ecp384,aes256-sha384-modp1024,aes256-sha384-modp1536,aes256-sha384-modp2048,aes256-sha384-modp4096,aes256gcm16,aes256gcm16-ecp384,3des-sha1! # Dead peer detection will ping clients and terminate sessions after timeout dpddelay=300s dpdtimeout=2000s dpdaction=clear # Left is a server side leftcert=certificate.pem leftsendcert=always # Routes pushed to clients. If you don't have ipv6 then remove ::/0 leftsubnet=0.0.0.0/0 #rekey=no #reauth=no auto=add fragmentation=yes #authby=pubkey #left=%any #leftid=vpn.alexell.ru #right=%any # Right is a remote client side rightsourceip=10.10.1.0/24 rightdns=8.8.8.8 eap_identity=%identity # All clients conn ikev2-mschapv2 leftid=vpn.alexell.ru rightauth=eap-mschapv2 |
Здесь leftcert - имя сертификата из /etc/ipsec.d/certs, leftid - ваш поддомен, на который был выдан сертификат, rightsourceip - пул внутренних IP адресов для клиентов, rightdns - DNS сервер, который будет использоваться при соединении через наш VPN.
Учетные записи для наших клиентов IKEv2 мы будем добавлять в файл /etc/ipsec.secrets, откройте его и замените содержимое на следующую конфигурацию:
1 2 3 4 5 6 7 |
include /var/lib/strongswan/ipsec.secrets.inc # This is private key located at /etc/ipsec.d/private/key.pem : RSA key.pem # Create VPN users accounts user : EAP "password" |
Здесь : RSA key.pem - имя файла приватного ключа из /etc/ipsec.d/private, user - имя пользователя, password - пароль. В будущем, учетные записи вы можете добавлять в этот файл по аналогии.
Перезапускаем демон:
1 |
ipsec restart |
Теперь можно проверить корректность подключения сертификатов. Для этого выполните команду ipsec listcerts. Результат выполнения команды будет примерно такой:
1 2 3 4 5 6 7 8 9 10 11 12 |
List of X.509 End Entity Certificates: altNames: vpn.alexell.ru subject: "CN=vpn.alexell.ru" issuer: "C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X3" serial: 03:ba:ba:68:d6:11:06:2d:69:e8:7e:f6:f9:05:cf:6a:27:29 validity: not before May 03 17:34:04 2018, ok not after Aug 01 17:34:04 2018, ok pubkey: RSA 2048 bits, has private key keyid: 59:d3:1c:bb:5a:bf:fd:e7:4b:0d:7d:dd:09:d8:74:69:73:e8:6a:1f subjkey: ee:3d:f6:f5:c6:11:1d:fa:3e:f2:e9:15:a9:52:ed:d1:cb:58:a8:63 authkey: a8:4a:6a:63:04:7d:dd:ba:e6:d1:39:b7:a6:45:65:ef:f3:a8:ec:a1 |
Обратите внимание, фраза has private key должна быть обязательно.
Получить информацию о загруженной конфигурации и текущем состоянии можно командой:
1 |
ipsec statusall |
Теперь можно подключиться к вашему новому VPN и убедиться что все работает. При подключении, выбирайте тип IKEv2, более подробные инструкции по подключению с разных устройств вы можете найти здесь.
Дополнительная информация об IKEv2 на Ubuntu
Авторизация и проблемы с подключением
При использовании приведенной конфигурации, клиент с одной учетной записью сможет иметь только одно открытое соединение с VPN одновременно, т.е. если под этим же логином произойдет второе подключение при активном первом - первое будет разъединено. Если вы хотите сделать одну общую учетную запись, например anonymous, то пропишите логин и пароль в ipsec.secrets, затем откройте ipsec.conf и измените uniqueids=yes на uniqueids=no.
Как я уже писал выше, инструкция по подключению с разных устройств находится здесь. Если у вас возникнут проблемы с подключением или вылетами на некоторых мобильных устройствах (вообще, эту конфигурацию я проверял только на Windows 7, 10 и iOS) или появится желание настроить свой IKEv2 на Ubuntu таким образом, чтобы под одной учетной записью можно было подключаться одновременно с одного мобильного устройства и с одного ПК, то в файле ipsec.conf замените единую секцию подключения на несколько секций под разные устройства (для лучшей совместимости).
Убираем эту секцию:
1 2 3 4 |
# All clients conn ikev2-mschapv2 leftid=vpn.alexell.ru rightauth=eap-mschapv2 |
Добавляем вместо нее 2 секции:
1 2 3 4 5 6 7 8 |
# BlackBerry, Windows, Android conn ikev2-mschapv2 rightauth=eap-mschapv2 # macOS, iOS conn ikev2-mschapv2-apple rightauth=eap-mschapv2 leftid=vpn.alexell.ru |
Можно еще попробовать такой вариант:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# IKEv2 conn ipsec-ikev2 keyexchange=ikev2 auto=add # BlackBerry, Windows, Android conn ipsec-ikev2-eap also="IPSec-IKEv2" rightauth=eap-mschapv2 # macOS, iOS conn ikev2-mschapv2-apple also="IPSec-IKEv2" rightauth=eap-mschapv2 leftid=vpn.alexell.ru |
Обновление сертификатов
Как известно, сертификаты Let’s Encrypt выдаются на 3 месяца, после чего их необходимо обновлять и снова копировать в директорию ipsec.d. Для автоматизации этого процесса можно сделать следующее:
Создаем в удобном для вас месте исполняемый файл. Для примера я создал его в корневой директории сервера и назвал updatecerts.sh. Заполняем его следующим образом:
1 2 3 4 5 |
#!/bin/bash cp /etc/letsencrypt/live/vpn.alexell.ru/chain.pem /etc/ipsec.d/cacerts/ca.pem && chmod 644 /etc/ipsec.d/cacerts/ca.pem cp /etc/letsencrypt/live/vpn.alexell.ru/cert.pem /etc/ipsec.d/certs/certificate.pem && chmod 644 /etc/ipsec.d/certs/certificate.pem cp /etc/letsencrypt/live/vpn.alexell.ru/privkey.pem /etc/ipsec.d/private/key.pem && chmod 644 /etc/ipsec.d/private/key.pem ipsec restart |
Как видите, это уже знакомая вам процедура копирования файлов сертификата и перезагрузка демона ipsec. Не забудьте исправить путь, откуда берутся сертификаты.
Теперь добавляем ежедневное ночное задание в etc/crontab:
1 |
0 3 * * * root certbot renew --noninteractive --renew-hook /updatecerts.sh |
Не забудьте изменить root на имя пользователя от которого хотите выполнять команду и путь к созданному скрипту.
Теперь каждую ночь будет выполняться "тихая" команда проверки обновления сертификата. В случае, если обновлений сертификата нет, она ничего не сделает, потому что renew-hook выполняется только при успешном обновлении сертификата. Если срок сертификата истек, то по этой команде сертификат обновится (будут получены новые файлы сертификата), после чего будет выполнен ваш скрипт, который все копирует куда нужно и перезапустит демон.
Хранение логов
Если вы не хотите хранить логи работы IKEv2 на Ubuntu и подключений клиентов, тогда можно писать их в /dev/null, для чего просто выполните команды:
1 2 |
sudo rm /var/log/syslog && sudo ln -s /dev/null /var/log/syslog sudo rm /var/log/auth.log && sudo ln -s /dev/null /var/log/auth.log |