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

Обучение

Настраиваем 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.