Настройка VPN сервера IKEv2 на Ubuntu 16.04 LTS + iPhone

Сегодня покажу как на VPS сервере с Ubuntu 16.04 настроить VPN сервер с протоколом IKEv2  и подключим к нему IPhone через заранее созданный конфигурационный файл. Подготовка

sudo echo "deb http://ftp.debian.org/debian wheezy-backports main" > /etc/apt/sources.list.d/wheezy-backports.list
sudo gpg --keyserver pgpkeys.mit.edu --recv-key  8B48AD6246925553
sudo gpg -a --export 8B48AD6246925553 | sudo apt-key add -
sudo gpg --keyserver pgpkeys.mit.edu --recv-key 7638D0442B90D010
sudo gpg -a --export 7638D0442B90D010 | sudo apt-key add -
sudo apt-get -y update && sudo apt-get upgrade -y

Шаг 1: Установка Strongswan Package

sudo apt-get -y install strongswan strongswan-plugin-openssl strongswan-plugin-eap-mschapv2

Шаг 2: Редактируем strongswan.conf

Для быстрой очистки файла делаем

echo "" > /etc/strongswan.conf

И вставляем следующий текст

charon {
	load_modular = yes
  dns1 = 8.8.8.8
  dns2 = 8.8.4.4
	plugins {
		include strongswan.d/charon/*.conf
	}
}

include strongswan.d/*.conf

Вы можете заменить Google DNS на любые другие.

Шаг 3: Редактируем ipsec.conf

Чистим файл аналогичным способом

echo "" > /etc/ipsec.conf

Копируем следующие настройки.

config setup
 strictcrlpolicy=no
 uniqueids = no

conn %default
 mobike=yes
 dpdaction=clear
 dpddelay=35s
 dpdtimeout=200s
 fragmentation=yes

conn iOS-IKEV2
 auto=add
 keyexchange=ikev2
 eap_identity=%any
 left=%any
 leftsubnet=0.0.0.0/0
 rightsubnet=10.99.1.0/24
 leftauth=psk
 leftid=%any
 right=%any
 rightsourceip=10.99.1.0/24
 rightauth=eap-mschapv2
 rightid=%any

Шаг 4: Редактируем ipsec.secrets (логины и пароли пользователей)

Чистим файл

sudo echo "" > /etc/ipsec.secrets

Вставляем

include /var/lib/strongswan/ipsec.secrets.inc

# logins
 : PSK "SEXapPAm5x5OXktAzes9nxE3NvilpmIH1orpE2cIzgfWRZgQDYZ1Wm3thlfXXwn"
myusername : EAP "hSyeI1H8Wsybb5qDk5abBrJ7LCu3bPbJrax9aFG77FiiJZu3eUepLwvg9pjjEL3"

PSK — вводите любую последовательность символов. Можно сгенерировать тут:

http://darkvoice.dyndns.org/wlankeygen/

myusername — логин и дальше в кавычках идет пароль.

Шаг 5: Правила iptables

Нужно узнать основной сетевой интерефейс. Обычно это eth0, но лучше проверить

ifconfig
ens3      Link encap:Ethernet  HWaddr 52:54:00:c2:c2:ad  
          inet addr:194.67.209.155  Bcast:194.67.223.255  Mask:255.255.240.0
          inet6 addr: fe80::5054:ff:fec2:c2ad/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5483341 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5128498 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1830663175 (1.8 GB)  TX bytes:2754986719 (2.7 GB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:94940 errors:0 dropped:0 overruns:0 frame:0
          TX packets:94940 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:12680067 (12.6 MB)  TX bytes:12680067 (12.6 MB)

Как видим интерфейс у нас ens3.

Теперь подставляя нужный интерфейс вводим следующее

sudo iptables -t nat -A POSTROUTING -s 10.99.1.0/24 -o ens3 -j MASQUERADE
sudo iptables -A FORWARD -s 10.99.1.0/24 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 500 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 4500 -j ACCEPT

Теперь нужно включить IP forwarding

echo 1 > /proc/sys/net/ipv4/ip_forward

И чтобы не делать это после каждой перезагрузки, добавьте следующую строку в файл /etc/sysctl.conf

net.ipv4.ip_forward=1

Затем перезагрузить его введя

sudo sysctl -p

И перезагружаем ipsec

ipsec restart

Шаг 6: Создать файл конфигурации для телефона

Создаем файл с именем myusername.mobileconfig и загружаем его на сервер в публичный доступ. Затем заходим с телефона по адресу и скачиваем файл — iPhone предложит установить конфигурацию.

Где написано @@Заменить …@@ заменяем целиком с @@.

uuidgen — запускаем в консоли в linux

# uuidgen
346c8e7e-68d3-4518-a28d-96cc9084f4ad

Вывод команды пишем в файл. В каждую строку — разное значение.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
 <dict>
 <key>PayloadContent</key>
 <array>
 <dict>
 <key>IKEv2</key>
 <dict>
 <key>AuthName</key>
 <string>@@Заменить именем пользователя из /etc/ipsec.secrets@@</string>
 <key>AuthPassword</key>
 <string>@@Заменить паролем из /etc/ipsec.secrets@@</string>
 <key>AuthenticationMethod</key>
 <string>SharedSecret</string>
 <key>ChildSecurityAssociationParameters</key>
 <dict>
 <key>DiffieHellmanGroup</key>
 <integer>2</integer>
 <key>EncryptionAlgorithm</key>
 <string>AES-128</string>
 <key>IntegrityAlgorithm</key>
 <string>SHA1-96</string>
 <key>LifeTimeInMinutes</key>
 <integer>1440</integer>
 </dict>
 <key>DeadPeerDetectionRate</key>
 <string>Medium</string>
 <key>DisableMOBIKE</key>
 <integer>0</integer>
 <key>DisableRedirect</key>
 <integer>0</integer>
 <key>EnableCertificateRevocationCheck</key>
 <integer>0</integer>
 <key>EnablePFS</key>
 <integer>0</integer>
 <key>ExtendedAuthEnabled</key>
 <true/>
 <key>IKESecurityAssociationParameters</key>
 <dict>
 <key>DiffieHellmanGroup</key>
 <integer>2</integer>
 <key>EncryptionAlgorithm</key>
 <string>AES-128</string>
 <key>IntegrityAlgorithm</key>
 <string>SHA1-96</string>
 <key>LifeTimeInMinutes</key>
 <integer>1440</integer>
 </dict>
 <key>LocalIdentifier</key>
 <string>myserver.com.client</string>
 <key>RemoteAddress</key>
 <string>@@Заменить IP адресом сервера или доменом@@</string>
 <key>RemoteIdentifier</key>
 <string>myserver.com.server</string>
 <key>SharedSecret</key>
 <string>@@Заменить своим PSK из /etc/ipsec.secrets@@</string>
 <key>UseConfigurationAttributeInternalIPSubnet</key>
 <integer>0</integer>
 </dict>
 <key>IPv4</key>
 <dict>
 <key>OverridePrimary</key>
 <integer>1</integer>
 </dict>
 <key>PayloadDescription</key>
 <string>Configures VPN settings for iphone</string>
 <key>PayloadDisplayName</key>
 <string>TutorialVPN</string>
 <key>PayloadIdentifier</key>
 <string>com.apple.vpn.managed.@@Заменить выводом uuidgen@@</string>
 <key>PayloadType</key>
 <string>com.apple.vpn.managed</string>
 <key>PayloadUUID</key>
 <string>@@Заменить выводом uuidgen@@</string>
 <key>PayloadVersion</key>
 <real>1</real>
 <key>Proxies</key>
 <dict>
 <key>HTTPEnable</key>
 <integer>0</integer>
 <key>HTTPSEnable</key>
 <integer>0</integer>
 <key>ProxyAutoConfigEnable</key>
 <integer>0</integer>
 <key>ProxyAutoDiscoveryEnable</key>
 <integer>0</integer>
 </dict>
 <key>UserDefinedName</key>
 <string>@@My VPN Connection Name@@</string>
 <key>VPNType</key>
 <string>IKEv2</string>
 <key>VendorConfig</key>
 <dict/>
 </dict>
 </array>
 <key>PayloadDisplayName</key>
 <string>IKEv2</string>
 <key>PayloadIdentifier</key>
 <string>@@Заменить выводом uuidgen@@</string>
 <key>PayloadRemovalDisallowed</key>
 <false/>
 <key>PayloadType</key>
 <string>Configuration</string>
 <key>PayloadUUID</key>
 <string>@@Заменить выводом uuidgen@@</string>
 <key>PayloadVersion</key>
 <integer>1</integer>
 </dict>
</plist>

Шаг 7: Настраиваем IPhone

После того как в браузере ввели адрес файла с конфигом — устанавливаем конфигурацию. Ничего сложного нет, ниже скриншоты.




После установки заходим в Настройки и включаем VPN. Если что-то пошло не так, смотрите логи и разбираетесь, либо пишите в комментариях — я помогу.

Логи подключений пишутся в /var/log/syslog

Загруженные плагины можно посмотреть командой

ipsec listplugins

 

12 комментариев

  • Юрок

    05.06.2017

    Я начинающий линуксойд, но уже могу с нуля многое поднять. Не так давно заинтересовался VPN и никак не могу понять. VPN можно поставить на чистую (к примеру) Ubuntu или нужно чтоб на ней был шлюз и внешний IP у меня динамический, он должен обязательно быть статичесиким…?

    Reply
    • nlinberg

      21.08.2017

      Для VPN важно, чтобы к нему могли подключится Ваши клиенты. Если клиенты это телефоны с подключением по 3G\LTE, то нужен белый IP (статический или динамический — тут зависит от реализации, можно dyndns задействовать к примеру). А если клиенты это устройства, подключаемые по локальной сети через wi-fi, то тут уже не важен IP белый или NAT.
      Все зависит от ваших целей, а дальше смотрите какие варианты достижения ваших целей существуют.

      Reply
  • Дмитрий

    29.01.2018

    Не подскажете, а такое подключение подойдет для iphone 4 с iOS 7.1.2 ?
    Или это только на более поздних айфонах возможно?

    Reply
    • nlinberg

      29.01.2018

      Скорее всего возможно. Нужно пробовать

      Reply
  • Павел

    20.04.2018

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

    Reply
  • Виктор

    20.04.2018

    Подскажите, как настроить данное соединение в windows?

    Reply
  • xakup_elliot

    20.04.2018

    Спасибо за мануал! Всё работает.

    Reply
  • Vladimir

    29.04.2018

    С уcтройства, подключенного к VPN нет выхода в интернет.

    Reply
  • Бобёр

    05.06.2018

    Спасибо, все работает, только поправь плз в конфиге что надо указывать не сам пароль, а его хеш. Так будет понятнее.
    Удачи!

    Reply
  • Os_gs

    18.06.2018

    Добрый день! Вы можете настроить авторизацию по сертификатам и по ipsec в чистом ввиде. Нужно чтоб работало на iPhone. Готов оплатить ваш труд.

    Reply
  • Maks

    01.10.2018

    Подскажите по следующему вопросу:
    Собрал все строго по инструкции, все работает.
    Добавил учетные данные для второго устройства, как только подключаюсь с планшета — телефон теряет связь с инетом, но VPN поднят.
    В логах ошибка :
    12[IKE] no virtual IP found for %any6 requested by
    Как правильно настроить по данной инструкции для двух устройств?

    Reply
    • nlinberg

      02.10.2018

      Если быть честным, у меня тоже были проблемы с добавлением второго устройства. Я разбираться не стал, а просто открыл тот же файл и на втором телефоне.

      Reply

Добавить комментарий для Os_gs Отменить ответ