Настраиваем VPN связь посредством l2tp + ipsec c использованием в качестве сервера OpenVZ контейнер

    Здравствуйте,

    не так давно командой OpenVZ было выпущено новое ядро с поддержкой ipsec внутри контейнера. Давно хотелось отказаться от стороннего ПО на локальной Windows машине и использовать возможность настройки защищенного VPN канала силами самой системы. В качестве сервера будем использовать Debian 7 контейнер на OpenVZ. В качестве клиента — стандартный VPN клиент Windows. В качестве авторизации — авторизацию по PSK ( по ключу ).


    Прежде всего активируем возможность net_admin для контейнера и дадим контейнеру ppp устройство для работы, как указано в подсказке от разработчиков:
    vzctl set CTID --capability net_admin:on --save
    vzctl set CTID --devices c:108:0:rw --save
    vzctl restart CTID
    


    Внутри контейнера создаем ppp устройство и выставляет корректные права доступа к нему:
    mknod /dev/ppp c 108 0
    chmod 600 /dev/ppp
    


    загрузим на HN нужные модули через modprobe:
    modprobe ppp_async 
    modprobe pppol2tp
    modprobe xfrm4_mode_transport
    modprobe xfrm4_mode_tunnel
    modprobe xfrm_ipcomp 
    modprobe esp4
    


    Внутри контейнера в качестве ipsec демона будем использовать openswan, а в качестве l2tp сервера стандартный xl2tpd из репозиториев:
    apt-get install openswan xl2tpd
    


    Далее настроим форвардинг и остальную часть сетевой подсистемы для корректной работы с NAT и VPN:
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source <main IP of server>
    iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT
    iptables -A FORWARD -d 10.0.0.0/24 -j ACCEPT
    iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
    for each in /proc/sys/net/ipv4/conf/*; do echo 0 > $each/accept_redirects; echo 0 > $each/send_redirects; done
    


    Приступим к настройке ipsec демона.

    Приведем конфиг /etc/ipsec.conf к виду:
    config setup
      protostack=netkey
      nat_traversal=yes                          # Enables NAT traversal
      virtual_private=%v4:192.168.1.0/8          # with this option you can add your local IP in NAT
    conn L2TP-PSK-NAT
      rightsubnet=vhost:%priv
      also=L2TP-PSK-noNAT
    conn L2TP-PSK-noNAT
      authby=secret                              # Auth with PSK ( preshared key )
      pfs=no
      auto=add                                   
      keyingtries=3
      rekey=no
      ikelifetime=8h
      salifetime=10m
      type=tunnel                                # type of l2tp connection ( tunnel / transport )
      left=11.11.11.11                         # left - is internet IP of l2tp server
      leftprotoport=17/1701
      right=%any                                 # right - is IP of client ( if client NATed , that IP of client is IP in NAT )
      rightprotoport=17/1701
    

    Наиболее важные моменты конфига прокомментированы. Также следует не забыть составить конфиг именно таким образом, как указано выше, то есть с сохранением пробелов в начале строки у тех команд, у которых они указаны, так как отступ команды демоном привязывается к блоку, определяемому безотступным «conn».

    Теперь зададим авторизацию для работы с ipsec. Существует два метода авторизации — по сертификату и по ключу ( PSK ). В данном примере мы настроим авторизацию по ключу в файле /etc/ipsec.secrets:

    11.11.11.11 %any: PSK "mykey"
    


    11.11.11.11 — это внешний IP адрес нашего сервера
    %any — это встроенная переменная обозначающая любой IP адрес
    PSK — метод авторизации ( может быть RSA )
    «mykey» — секретный ключ для авторизации, который потребуется передать клиенту.

    Теперь пришло время настроить l2tp сервер. Он будет работать через протокол ppp.

    Приводим конфиг /etc/xl2tpd/xl2tpd.conf к виду:
    [global]
    port = 1701
    auth file = /etc/xl2tpd/l2tp-secrets        # auth file with pars login/password for l2tp auth
    [lns default]
    ip range = 10.0.0.2-10.0.0.200              # range of IP's , that give to clients when auth is good
    local ip = 10.0.0.1                        
    refuse chap = yes
    refuse pap = yes
    require authentication = yes
    ppp debug = no                                        # debug mode
    pppoptfile = /etc/ppp/options.xl2tpd        #  this is ppp options config file
    length bit = yes
    exclusive = no
    assign ip = yes
    name = VPN-Server
    

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

    Настраиваем файл авторизации l2tp — /etc/xl2tpd/l2tp-secrets. В файле позволим подключаться всем, так как у нас l2tp работает через ppp, то и использовать будем именно ppp авторизацию.

    # Secrets for authenticating l2tp tunnels
    # us    them    secret
    # *             marko blah2
    # zeus          marko   blah
    # *     *       interop
    *       *       *   # let all , because we use auth with ppp
    


    Далее настраиваем конфиг ppp, который запрашивается нашим l2tp демоном ( /etc/ppp/options.xl2tpd ):
    refuse-mschap-v2
    refuse-mschap
    ms-dns 8.8.8.8
    ms-dns 8.8.4.4
    asyncmap 0
    auth
    crtscts
    idle 1800
    mtu 1200
    mru 1200
    lock
    hide-password
    local
    #debug
    name l2tpd
    proxyarp
    lcp-echo-interval 30
    lcp-echo-failure 4
    


    В случае возникновения проблем со связью или с подключением для дебага работы l2tp просто раскомментируем "#debug" и смотрим в системный лог /var/log/syslog на наличие ошибок.

    Настраиваем авторизацию в ppp ( /etc/ppp/chap-secrets ):
    # Secrets for authentication using CHAP
    # client        server  secret                  IP addresses
    test2   l2tpd   test    *
    


    Логин — test2
    Сервер, для которого валидна эта пара для авторизации — l2tpd
    Пароль — test
    Подключаться с этим паролем могут клиенты со всех IP адресов — *

    Рестартим оба сервиса:
    /etc/init.d/ipsec restart
    /etc/init.d/xl2tpd restart
    


    Теперь проверим корректность работы модулей самого ipsec внутри контейнера:
    ipsec verify

    выводом работоспособного ipsec будет нечто подобное:
    root@XXX:~# ipsec verify
    Checking your system to see if IPsec got installed and started correctly:
    Version check and ipsec on-path                                 [OK]
    Linux Openswan U2.6.37-g955aaafb-dirty/K2.6.32-042stab084.10 (netkey)
    Checking for IPsec support in kernel                            [OK]
     SAref kernel support                                           [N/A]
     NETKEY:  Testing XFRM related proc values                      [OK]
            [OK]
            [OK]
    Checking that pluto is running                                  [OK]
     Pluto listening for IKE on udp 500                             [OK]
     Pluto listening for NAT-T on udp 4500                          [OK]
    Checking for 'ip' command                                       [OK]
    Checking /bin/sh is not /bin/dash                               [WARNING]
    Checking for 'iptables' command                                 [OK]
    Opportunistic Encryption Support    
    


    Теперь настроим в Windows 7 клиент для подключения к нашему VPN l2tp с шифрованием по ipsec.

    Для начала создадим новое VPN подключение
    Всё стандартно
    Пуск — Панель управления — Центр управления сетями и общим доступом — Настройка нового подключения или сети — Подключение к рабочему месту — Использовать мое подключение к интернету ( VPN )

    Далее указываем IP адрес или FQDN имя l2tp сервера
    Подсказка
    image

    Вписываем логин и пароль от l2tp
    Подсказка


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


    Идем в свойства нашего нового подключения и проверяем еще раз корректность ввода адреса сервера ( вкладка Общие )
    Подсказка


    Во вкладке «Безопасность» выставляем верный тип нашего соединения ( l2tp over ipsec ) и разрешаем авторизацию по протоколу CHAP. В дополнительных настройках l2tp выбираем авторизацию по ключу и вписываем наш PSK от IPsec
    Подсказка




    Настройка окончена. Теперь Вы можете использовать новое подключение к VPN.

    Спасибо за внимание

    Ваганов Николай, старший системный администратор FastVPS LLC

    UPD На данный момент, ядро, указанное в статье, является нестабильным и на наших нодах не установлено. Думаю, в течение пары недель разработчики ядра включат его в стабильную ветку.
    Метки:
    FASTVPS LLC 30,43
    Хостинг Вашего Успеха с 2006 года.
    Поделиться публикацией
    Комментарии 15
    • 0
      Не работает на Fast Private Servers?
      • 0
        К сожалению, на FPS тарифах. на данный момент. не предоставляем NAT, поэтому не поднять.
        • 0
          Также всем владельцам тарифов FPS мы можем дать OVZ со скидкой 20 % отдельно под VPN :)
      • 0
        Работает стабильно? Потеря скорости большая? Года два назад пробовал все варианты: ipsec, racoon, openswan. Приемлемого результата не удалось добиться. Постоянно были проблемы со стабильностью и скоростью. Сервером был Debian 6 в Xen PV.
        Решил в итоге покупкой хардварного роутера с ipsec\l2tp.
        • 0
          По стабильности проблем нет, у меня около 3-4 суток был подключен фуллтайм и со связью проблем не наблюдалось.

          По скорости да, потери есть. Сейчас при скорости скачивании на самом контейнере под лимит канала ( 10МБ/сек ) добился скорости по VPN около 3-4МБ/сек
          • 0
            А если канал не очень стабильный и имеют место потери пакетов? Пробовал поднимать xl2tpd+openswan на амазоне — тоннель иногда падает.
            • +2
              l2tp работает на UDP, поэтому о контроле целостности данных не может быть и речи. С другой стороны тот же самый OpenVPN умеет и работать как на udp, так и на tcp и если потери небольшие, то он их компенсирует.

              Фактически, данная связка не «улучшает» свойства канала ( скорость, потери, пинг ), а позволяет стать ему защищенным за счет шифрования.
        • +2
          Вы не указали примера настройки для хранения PSK.
          Необходимо в файле "/etc/ipsec.secrets" написать следующее:
          : PSK "mykey"
          • +2
            Спасибо, совсем забыл написать. Дополнил статью.
          • 0
            Вот инструкции для подключения по Mac OS X и Windows XP.
            Правда там надо пропустить несколько первых пунктов, так как они описывают процедуру получения аутентификационной информации у VPN провайдера.
            • 0
              Если есть tun/tap то можно же и OpenVPN настроить внутри OpenVZ, он дает в общем более интересные показатели и более прост в настройке.
              Вопрос к администрации: у вас в FVPS на контейнерах стоит capability net_admin?
              • 0
                OpenVPN тоже поднять можно без проблем, но хотелось настроить VPN именно под штатный клиент от WIndows. не устанавливая и запуская отдельное приложение. При этом, насколько я помню, установка OpenVPN на Windows 7 x64 нетривиальна.

                На FPS тарифах, на данный момент, отсутствует возможность организовать nat, к сожалению.
                • 0
                  OpenVPN на win7x64 у меня встал без всяких плясок, ничего не понадобилось пилить. Но да, это лишние телодвижения.
              • 0
                Если клиент — Linux, то можно подключаться, используя l2tp плагин к NetworkManager
                • 0
                  Кстати, OpenVZ с поддержкой этой фичи уже вышло :)

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

                  Самое читаемое