Пользователь
0,0
рейтинг
24 октября 2012 в 13:18

Разработка → VPN для iPhone из песочницы

Организация VPN сервера для использования с iOS устройствами



Прочитав статью Теплый и ламповый интернет озаботился проблемой поднятия VPN сервера, которым можно пользоваться с iOS устройств.

Для использования OpenVPN нужен Jailbreak. Этот вариант мной не рассматривался.

iOS поддерживает L2TP, PPTP, Cisco IPSec.

Cisco IPSec работает с соответствующим оборудованием. PPTP иногда режется сотовыми операторами. Исходя из этого был выбран L2TP.

У меня уже был VQ7 сервер от Hetzner с установленной Ubuntu 12.04 32 bit, поэтому все эксперименты проводились на данном сервере.

Установка IPSec

Устанавливается OpenSwan
sudo aptitude install openswan

При установке будет предложено создать сертификат x509. Это не обязательно, так как доступ будет использоваться по ключевой фразе.

Настройка IPSec:

sudo nano /etc/ipsec.conf

Конфигурация выглядит следующим образом:
version 2.0
config setup
    nat_traversal=yes # Позволяет подключаться клиентам расположенным за NAT
    virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
    oe=off
    protostack=netkey

conn L2TP-PSK-NAT
    rightsubnet=vhost:%priv
    also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
    authby=secret
    pfs=no
    auto=add
    keyingtries=3
    rekey=no
    ikelifetime=8h
    keylife=1h
    type=transport
    left=YOUR.SERVER.IP.ADDRESS
    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any

Конфигурируем доступ к серверу по IPSec:
sudo nano /etc/ipsec.secrets

Файл должен содержать одну строчку:
YOUR.SERVER.IP.ADDRESS   %any:  PSK "YourSharedSecret"

Ссылка на pre-shared ключ должна быть удалена, иначе IPSec не сможет инициализироваться.
YOUR.SERVER.IP.ADDRESS в обоих файлах — IP адрес вашего сервера.
%any в /etc/ipsec.secrets определяет с каких адресов может быть доступ. В данном случае разрешается доступ со всех адресов.
YourSharedSecret — ключ, который будет использоваться для доступа по IPSec.

Для того, чтобы IPSec нормально работал, делаются дополнительные настройки:
sudo nano /root/ipsec

Содержимое:
iptables --table nat --append POSTROUTING --jump MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward

for each in /proc/sys/net/ipv4/conf/*
do
    echo 0 > $each/accept_redirects
    echo 0 > $each/send_redirects
done
/etc/init.d/ipsec restart

Первые две строчки на самом деле используются для L2TP

Делаем скрипт исполняемым:
sudo chmod +x /root/ipsec

Добавляем его в rc.local

Установка L2TP:

Устанавливается xl2tpd:
sudo aptitude install xl2tpd

Настройка L2TP:

sudo nano /etc/xl2tpd/xl2tpd.conf

Содержимое:
[global]
ipsec saref = yes

[lns default]
ip range = 10.1.2.2-10.1.2.255
local ip = 10.1.2.1
refuse chap = yes
refuse pap = yes
require authentication = yes # во время теста можно отключить, тогда все кто пройдет верификация ключом IPSec будут иметь доступ
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

Дополнительные настройки:
sudo nano /etc/ppp/options.xl2tpd

Содержимое:
require-mschap-v2
ms-dns 8.8.8.8 # Публичный DNS Google
ms-dns 8.8.4.4 # Публичный DNS Google
asyncmap 0
auth
crtscts
lock
hide-password
modem
debug
name l2tpd # Имя сервиса, используется в настройках
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4

Добавление пользователей:
sudo nano /etc/ppp/chap-secrets

Формат файла
# user      server      password            ip
test        l2tpd       testpassword        *

test — имя пользователя
l2tpd — имя сервиса из /etc/ppp/options.xl2tpd
testpassword — пароль для пользователя
* — диапазон разрешенных адресов для логина данного пользователя (формат 10.254.253.128/25)

После этого рестарт IPSec и L2TPD должны активировать всю систему:
sudo /etc/init.d/ipsec restart
sudo /etc/init.d/xl2tpd restart

Настройка iPhone:

Настройки > Основные > VPN > Добавить конфигурацию VPN.



Описание — Имя подключения
Сервер — IP адрес вашего сервера
Учетная запись — это user из файла /etc/ppp/chap-secrets
Пароль password из /etc/ppp/chap-secrets
Общий ключYourSharedSecret из /etc/ipsec.secrets



После этого в меню Настройки и в меню Настройки > Основные > VPN появляется возможность включить VPN. Если все пройдет успешно, то появится соответствующий значок.





VPN надо будет включать вручную, при каждом использовании.

Настройка подключения в Windows 7


В центре управления сетями и общим доступом, установка нового подключения к сети создание нового подключения:



Создаете новое VPN подключение:



В поле “интернет адрес” вводите IP вашего сервера. Не подключаетесь сразу.



После этого заходите в свойства нового подключения и в настройках указываете использование L2TP, вводите ключ YourSharedSecret из /etc/ipsec.secrets



При подключении указываете логин и пароль из /etc/ppp/chap-secrets.

При написании статьи были использованы материалы ссылка1, ссылка2
Александр Гришин @Nixi
карма
8,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (43)

  • 0
    Круто! Спасибо.
  • 0
    Какая у вас iOS? Или вы изменили значок VPN в статусбаре? Вроде он был не такой…
    • +1
      На iOS6 значок точно такой же.
      • 0
        Да, все правильно, у меня iOS6.
    • 0
      Всегда такой был, сколько помню его.
  • 0
    Спасибо.
    а если сервер не имеет статического ip-адреса?
    но, допустим, подключен один из сервисов dyndns?
    • 0
      По идее Вы можете прописать DNS адрес своего сервера во все места где это требуется (для сервера в /etc/ipsec.conf, /etc/ipsec.secrets и соответственно в настройках iOS или Win).
    • 0
      Сервер не должен быть за NAT, ipsec _очень_ плохо работает с NAT и вообще не работает через 2 NAT.

      У меня есть аналогичная статья, но про racoon+xl2tpd libc6.org/page/l2tp-ipsec-server-howto

      И ещё, VPN должна иметь сеть отличающуюся от локальной сети. Типа 10.178.59.0/24
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Все работает корректно. Одновременно работали два подключения с телефона и компьютера. Оба были подключены к одному роутеру. Подключались под разными учетными записями, использовать одно и то же имя и пароль я не пробовал.
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          Нет, не наблюдалось. Из-за специфики iOS подключение к VPN постоянно разрывается, а на компьютере оно висит постоянно.

          Через 3G сеть от Мегафона подключается тоже без проблем.
  • 0
    Жаль яблоки не хотят openvpn подписать(
    • НЛО прилетело и опубликовало эту надпись здесь
  • НЛО прилетело и опубликовало эту надпись здесь
    • НЛО прилетело и опубликовало эту надпись здесь
    • +1
      Подтверждаю, завести «Cisco IPSec» можно едва ли не проще. Для затравки, конфиг racoon:

      path pre_shared_key "/etc/racoon/psk.txt";
      path certificate "/etc/racoon/certs";
      
      listen {
      	isakmp #{src_ip} [500];
      	isakmp_natt #{src_ip} [4500];
      }
      
      remote anonymous {
      	proposal_check obey;
      	passive on;
      	exchange_mode main,aggressive;
      	my_identifier fqdn "#{host_fqdn}";
      	mode_cfg on;
      	verify_cert off;
      	ike_frag on;
      	generate_policy on;
      	nat_traversal on;
      	dpd_delay 20;
      	proposal {
      		encryption_algorithm aes;
      		hash_algorithm sha1;
      		authentication_method xauth_psk_server;
      		dh_group 2;
      	}
      }
      
      mode_cfg {
      	conf_source local;
      
      	auth_source system;
      	save_passwd on;
      	
      	dns4 8.8.8.8;
      	network4 10.0.0.1;
      	pool_size 255;
      }
      
      sainfo anonymous {
      	encryption_algorithm aes;
      	authentication_algorithm hmac_sha1;
      	compression_algorithm deflate;
      }
      


      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          Не нужно, из-за этого снижается безопасность соединения.
          • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        Видимо я чего-то недопонял, когда разбирался с Cisco IPSec. Попробую чуть позже посмотреть, сейчас особо нет времени разбираться.
  • +1
    Напрягает его постоянно включать а айфоне после разблокировки.
    • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        А он будет включаться только при просмотре сайтов или при инициации иных приложений тоже? В данный момент у меня висит еще и VNC сервер. Сейчас я включаю VPN и после этого запускаю VNC клиент на телефоне и подключаюсь уже через VPN, шифруя соединение VNC (590x порты закрыты для и настроено так что к VNC серверу можно подключиться только из подсети 10.1.2.0/24). При включении On-Demand можно будет просто включать VNC клиент и VPN автоматически запустится?
        • НЛО прилетело и опубликовало эту надпись здесь
      • 0
        Не мой случай, как простого пользователя, к сожалению. :)
      • 0
        Maximus43, расскажи как заставить айфон авторизироваться по сертификату? Бьюсь головой об конфиг racoon уже который день, всё равно упорно продолжает спрашивать логин и пароль.
        • 0
          iPhone Configuration Utility
          www.apple.com/ru/support/iphone/enterprise/
        • НЛО прилетело и опубликовало эту надпись здесь
          • 0
            Есть. И «save_passwd on», и пользователь в Configuration Utility записан. Внешне всё хорошо, но айфон упорно хочет имя пользователя и пароль каждый раз, когда поднимает VPN. Собственно, вот конфиг:

            log debug;
            path certificate "/etc/racoon/certs";
            listen {
                isakmp ip.add.re.ss [500];
                isakmp_natt ip.add.re.ss [4500];
            }
            
            remote anonymous {
                lifetime time 24 hour;
                proposal_check obey;
                passive on;
                exchange_mode aggressive,main;
                my_identifier asn1dn;
                peers_identifier asn1dn;
                verify_identifier on;
                certificate_type x509 "server.crt" "server.key";
                ca_type x509 "ca.crt";
                mode_cfg on;
                verify_cert on;
                ike_frag on;
                generate_policy on;
                nat_traversal on;
                dpd_delay 20;
                proposal {
                    encryption_algorithm aes;
                    hash_algorithm sha1;
                    authentication_method xauth_rsa_server;
                    dh_group modp1024;
                }
            }
            
            mode_cfg {
                conf_source local;
            
                auth_source system;
                auth_throttle 3;
                save_passwd on;
            
                dns4 8.8.8.8;
                network4 10.9.8.1;
                netmask4 255.255.255.0;
                pool_size 128;
            }
            
            sainfo anonymous {
                pfs_group 2;
                lifetime time 3600 sec;
                encryption_algorithm aes;
                authentication_algorithm hmac_sha1;
                compression_algorithm deflate;
            }
            
            • НЛО прилетело и опубликовало эту надпись здесь
              • 0
                Да, после ввода соединение устанавливается, это без проблем вообще. Пересоздать подключение попробую позже, спасибо.

                Что касается «auth_source system» — это значит, что надо использовать системных пользователей. Наличие пути для PSK не обязательно, если PSK не используется.
                • НЛО прилетело и опубликовало эту надпись здесь
              • 0
                Пристальное изучение лога айфона показало:

                Oct 30 22:42:41 iPhone racoon[151] <Notice>: IPSec Extended Authentication Passed.
                Oct 30 22:42:41 iPhone racoon[151] <Notice>: IPSec Network Configuration requested.
                Oct 30 22:42:41 iPhone racoon[151] <Warning>: Ignored attribute APPLICATION_VERSION
                Oct 30 22:42:41 iPhone racoon[151] <Warning>: Ignored short attribute UNITY_SAVE_PASSWD
                Oct 30 22:42:41 iPhone racoon[151] <Notice>: IPSec Network Configuration established.
                Oct 30 22:42:41 iPhone racoon[151] <Notice>: >>>>> phase change status = phase 1 established
                


                Вот это вот «Ignored short attribute UNITY_SAVE_PASSWD» меня очень смущает. Для чистоты эксперимента даже перезагрузил айфон после удаления профиля. Что-то там нечисто.
  • 0
    Если честно, очень интересует на сколько хватает телефона при работе через VPN.(естественно при включенном пуше и т.д.)
    • 0
      Думается не на много меньше чем без него, но для себя я отметил такой плюс — при подключении по VPN и использовании кеширующего прокси сервера (например squid) использование интернета от сотового оператора становится приятнее в связи с заметно возросшей скоростью загрузки страниц. Интернет на прокси сервере гораздо быстрей 3G и т.п. что в свою очередь избавляет телефон от ожидания соединения с сайтами и ожидания загрузки различных ресурсов типа картинок, css, js (они подгружаются на прокси сервере и в телефон поступают на максимально возможной скорости и без задержек).
    • 0
      Особой разницы я не заметил. Я думаю что основное потребление энергии идет от 3G или Wi-Fi модуля, а дополнительные затраты на шифрование не особо должны быть заметны.
  • 0
    А какие провайдеры блокируют PPTP? Я ни разу не сталкивался. У меня PPTP до домашнего роутера поднимается. И Cisco IPSec до работы. Ни разу не испытывал проблем с неработоспособностью ни того ни другого.
    • 0
      Когда разбирался, видел относительно много постов о том, что сотовые операторы могут резать GRE пакеты нужные для PPTP. Сам лично с таким не сталкивался и решил, что лучше сразу настроить IPSec, чтобы не столкнуться с этой проблемой в командировке или отпуске.
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          Вы правы. В случае iOS порт, в настройках изменить нельзя. Поэтому да, если зарежут, то будет печально. Единственное решение, которое я вижу — это сменить телефон на Андроид)
  • 0
    Так-то оно все, конечно, круто, но ничего не получилось :-( Хостинг тот же, все по инструкции, а в итоге в логе подключения (стандартный клиент Mac OS X 10.8):

    pppd[10746]: IPSec connection started
    racoon[1193]: Connecting.
    racoon[1193]: IPSec Phase1 started (Initiated by me).
    racoon[1193]: IKE Packet: transmit success. (Initiator, Main-Mode message 1).
    racoon[1193]: IKE Packet: transmit success. (Phase1 Retransmit).
    --- last message repeated 2 times ---
    pppd[10746]: IPSec connection failed
    


    Что может быть неправильно?
    • 0
      А, все, разобрался по ссылке внизу. Прошу прощения.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.