Яндекс.Метрика

    Обучение

    Настраиваем VPN L2TP-сервер на Ubuntu

    Цензура-цензура-цензура. Кровавый режим закрывает один ресурс за другим под предлогом детской порнографии, авторских прав или что там сейчас в тренде. Ну а мы с вами настроим на подходящем сервере с Ubuntu VPN-сервер over L2TP и будем сидеть в Сети через него. С AES-шифрованием и няшками. Вы можете спросить «почему не PPTP?». Потому что никакого шифрования.

    Итак, заходим в консоль нашего сервера с рутовой учётки (или sudo -i, кому как нравится)
    Сначала ставить XL2TPD и OpenSwan, это l2tp– и ipsec– сервера соответственно.
    apt-get install xl2tpd openswan --yes

    Настраиваем IPSEC-тунели

    Правим /etc/ipsec.conf и добавляем в конец

    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
            # Apple iOS doesn't send delete notify so we need dead peer detection
            # to detect vanishing clients
            dpddelay=30
            dpdtimeout=120
            dpdaction=clear
            # Set ikelifetime and keylife to same defaults windows has
            ikelifetime=8h
            keylife=1h
            type=transport
            # Replace IP address with your local IP (private, behind NAT IP is okay as well)
            left=88.0.0.1
            # For updated Windows 2000/XP clients,
            # to support old clients as well, use leftprotoport=17/%any
            leftprotoport=17/1701
            right=%any
            rightprotoport=17/%any
            #force all to be nat'ed. because of iOS
            forceencaps=yes

    Само собой, IP-адрес 88.0.0.1 нужно поменять на внешний IP вашего сервера. Также можно раскомментировать строку plutostderrlog, чтобы OpenSwan не гадил в /var/log/syslog. Теперь ставим shared-пароль на ipsec-туннель, для этого правим файл /etc/ipsec.secrets

    YOUR.VPS.IP.ADDRESS %any: PSK "YourSharedSecret"
    Значения отбиваем табами, а не пробелами как в примере. Shared ключ так и идёт — в кавычках. YourSharedSecret это тот ключ, который в Windows называется дополнительным, в Андроидах — shared. 

    Настраиваем XL2TPD, сервис для L2TP

    Меняем /etc/xl2tpd/xl2tpd.conf


    [global]
    ipsec saref = no

    [lns default]
    ip range = 192.168.95.32-192.168.95.254 ; подсеть для наших клиентов, эти адреса будут раздаваться внутри сети
    local ip = 192.168.95.1 ; IP-адрес этого сервера в этих условиях
    require authentication = yes
    ppp debug = yes ; пишем в syslog много ужасного и ненужного дампа
    pppoptfile = /etc/ppp/options.xl2tpd
    length bit = yes
    refuse chap = yes ; выключаем chap
    refuse pap = yes ; выключаем допотопный pap

     

    Внимание, комментарии в примере даны только для примера, пожалуйста, удалите их в конечном файле, если не хотите, что xl2tpd не включился, а вы не получили ошибку подключения 809. Правим файл /etc/ppp/options.xl2tpd, отвечающий за подключение IPSec, полностью заменив его содержимое на 

    # Выключаем пародию на протоколы аутентификации

    refuse-pap

    refuse-chap

    refuse-mschap

    # Выставляем dns

    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
    name l2tpd
    proxyarp
    lcp-echo-interval 30
    lcp-echo-failure 4

    # Дебажим xl2tpd
    debug
    logfile /var/log/xl2tpd.log


    Теперь редактируем файл с паролями пользователей /etc/ppp/chap-secrets и добавляем записи вида
    username * password *
    Например
    swarog * q1w2e3 *
    Опять же, отбиваем табами. Помните, что на одного пользователя позволяется не более одного одновременного подключения. Другими словами, если вы хотите подключаться более чем с одного устройста, сделайте несколько логинов.

    Настраиваем даэмон для запуска всего этого безобразия /etc/init.d/ipsec.vpn

     



    #!/bin/bash

    case "$1" in
    start)
    echo "Starting my Ipsec VPN"

     

    # Включаем маскардинг
    iptables -t nat -A POSTROUTING -o eth0 -s 192.168.95.0/24 -j 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 start
    /etc/init.d/xl2tpd start
    ;;
    stop)
    echo "Stopping my Ipsec VPN"
    iptables --table nat --flush
    echo 0 > /proc/sys/net/ipv4/ip_forward
    /etc/init.d/xl2tpd stop
    /etc/init.d/ipsec stop
    ;;
    restart)
    /etc/init.d/ipsec.vpn stop
    /etc/init.d/ipsec.vpn start
    ;;
    *)
    echo "Usage: /etc/init.d/ipsec.vpn {start|stop|restart}"
    exit 1
    ;;
    esac

     

    Выключаем старые автозагрузки и включаем новую

    update-rc.d -f ipsec remove

    update-rc.d -f xl2tpd remove

    update-rc.d ipsec.vpn defaults

    Теперь перезагружаем сервисы

    /etc/init.d/ipsec.vpn restart

    Запускаем ipsec verify и смотрим на вывод. Могут быть ворнинги из-за /bin/sh и Opportunistic Encryption Support, также может не быть поддержки SAref в ядре. Это нормально. Больше ворнингов быть не должно.

    Теперь создаём VPN-подключение в Windows. Интернет адрес — IP вашего сервера, название любое. Логин/пароль из файла chap-secrets, например, swaroq и q1w2e3, домен оставляете пустым. Потом правите свойства этого подключения (нажам на иконку компьютера в трее, можно открыть список подключений, включая наше новое). Вкладка Безопасность, тип VPN "L2TP IPSec VPN", разрешить следующие протоколы: только MS-CHAP v2, остальные выключайте; Шифрование данных: "самое стойкое, отключиться, если нет шифрования" (насколько я заметил, если не ставить самое стойкое, у нас будет шифрование AES128, а так — AES256); дополнительные параметры: для проверки использовать ключ YourSharedSecret, который мы берём из /etc/ipsec.secrets. Клацаем ok. Пробуем подключиться. Если подключились, проверяйте свой IP, пингуйте 192.168.95.1 и радуйтесь жизни. 

    Исправляем ошибки подключения

    • Если у вас на Windows ошибка подключения 809 — не удаётся установить VPN-соединение — скорее всего ваш родной компьютер находится за NAT'ом и не имеет белого IP-адреса, в этом случае делаем так как описано в официальном мануале от Microsoft, обязательно перезагружаем компьютер и пробуем подключиться ещё раз. Если вы не находились за NAT'ом или проблема не исчерпана, проверьте работает ли xl2tpd, он поднимает udp-порт 1701. Возможно, он не загрузился по какой-то причине. Вообще, ошибка 809 свидетельствует о том, IPsec-удался (в ipsec.log будет запись «IPsec SA established transport mode»), а l2tp-подключение не поднимается.
    • Если 4500 и 500 udp-порты вообще закрыты (то есть не включился даже Openswan), у вас будет ошибка подключения 789 "попытка l2tp-подключения не удалась", в этом случае копайте в сторону ipsec-даэмона или неправильного shared-пароля. Если вы ошиблись shared-паролем, в ipsec.log будет «sending notification PAYLOAD_MALFORMED».
    • Если вы правильно ввели shared-пароль, но ошиблись логином/паролем пользователя, вы получите ошибку подключения 734 или просьбу ввести логин и пароль ещё раз. Заметьте, сначала проверяется ipsec, уже потом l2tp. 
    • Ошибка 812 свидетельствует о проблеме с протоколами аутентификации. У вас и на сервере выставлены протоколы, которые не пересекаются между собой
    • Скорее всего, вы не сможете подключиться через Android 4.0.* — баг #23124, который приводит к «malformed payload in packet», правьте бинарники на свой страх и риск с лишением гарантии на телефон.

    В составлении этого мануала хочу выразить отдельную благодарность help.ubuntu.com за общие принципы настройки и Curu Wong за пояснение про NAT.