VPN сервер L2TP на Ubuntu
Про технологию VPN сейчас не знает наверно только самый ленивый. VPN позволяет объединять несколько частных сетей в одну используя Internet. В этой статье расскажу как настроить VPN сервер L2TP на Ubuntu.
Технология VPN (Virtual Private Network) – в переводе виртуальная частная сеть. VPN можно реализовать с использованием разных протоколов и способов шифрования. В этой статье рассмотрим протокол L2TP по причине его массовости. Клиент подключения L2TP есть в большинстве операционных систем от настольных до мобильных.
Протокол L2TP является вторым по популярности и простоте подключения. Первый был PPTP, но после того как его взломали, использовать PPTP не безопасно. Перед настройкой определим порты которые необходимо будет открыть в брандмауэре.
Используемые порты
- L2TP – 1701/UDP
- IPSEC – 500/UDP
- IPSEC NAT-T – 4500/UDP
Открывать порты в брандмауэре мы будем ближе к концу статьи. Однако нужно учесть тот факт что в случае если у вас VPN сервер стоит за NAT порты придется прокидывать. Как прокидывать порты это уже зависит от вашего роутера смотрящего в интернет.
Настройка системы
Начнем с предварительной настройки системы. Наша задача настроить брандмауэр и включить пересылку пакетов для доступа к локальной сети и в интернет. Перед началом работы войдем в режим суперпользователя, чтобы не писать постоянно sudo
sudo su
Включение IP Forwarding
Для маршрутизации пакетов через наш VPN сервер необходимо включить IP Forwarding, по умолчанию он выключен. Откроем на редактирование файл
nano /etc/sysctl.conf
Необходимо найти строку net.ipv4.ip_forward=1 и убрать вначале строки знак #. Значение 1 означает что пересылка пакетов включена.
Применим настройки перечитав конфигурационный файл
sysctl -p
Настройка брандмауэра
Если вы знакомы с IPtables и работали с ним просто добавьте следующее правило
iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth0 -j MASQUERADE
Этим правилом мы разрешаем маскарад (подмену) ip адреса клиента на внешний адрес сервера для сети 10.10.0.0/24. В качестве сетевого адаптера у меня выступает eth0, если у вас другой подставьте его имя. Список сетевых интерфейсов можно увидеть командой ip a
В случае когда вы не знакомы с брандмауэром, настроим правила iptables и добавим скрип в автозагрузку.
Создание файла с правилами iptables
nano /etc/iptables.rules
Добавим правила разрешающие доступ к серверу по SSH, маскарад и еще некоторые правила необходимые для нормальной работы VPN сервера. Все остальные порты закрываем.
#!/bin/sh
iptables -F
iptables -X
iptables -A INPUT -i eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i eth0 -m conntrack --ctstate INVALID -j DROP
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -o eth0 -j MASQUERADE
iptables -A INPUT -i eth0 -p udp --dport 500 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -i eth0 -p 50 -j ACCEPT
iptables -A INPUT -i eth0 -p 51 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT
iptables -A INPUT -i eth0 -j DROP
Сохраним файл и сделаем его исполняемым
chmod +x /etc/iptables.rules
Запуская данный скрипт будут активированы правила iptables. Нам необходимо чтобы правила применялись автоматически после включения сервера.
Создадим systemd юнит
nano /etc/systemd/system/ipt.service
Добавим в файл следующий текст
[Unit]
Description=Iptables service
After=network.target
[Service]
Type=notify
ExecStart=/etc/iptables.rules
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
Включим в автозагрузку созданный сервис ipt
systemctl enable ipt
Теперь после загрузки сервера будут срабатывать наши правила. Будьте осторожны с закрытием портов, ошибка в написании правил закроет доступ к серверу.
Установка ipsec
Для настройки ipsec будем использовать Strongswan.
Установка пакета strongswan
apt install strongswan
Основные настройки strongswan хранит в файле /etc/ipsec.conf , откроем его в редакторе nano и внесем изменения.
nano /etc/ipsec.conf
Файл состоит из базовой конфигурации для всех соединений config setup и описания каждого соединения. Форма описания настроек конкретного VPN соединеyия имеет вид: conn имя-соединения.
В раздел config setup добавим следующие строки
config setup
charondebug="ike 2, knl 3, cfg 0"
uniqueids=no
В строке charondebug описываются разрешенные протоколы. Ранее в некоторых моделях iPhone соединение VPN работало только по протоколу ike v1. Если у вас будут наблюдаться проблемы с подключением, добавьте в charondebug еще одно значение ike 1
Спустимся в самый конец файла и добавим своё VPN соединение
conn l2tp-vpn
type=transport
authby=secret
pfs=no
rekey=no
keyingtries=2
left=%any
leftid=@srvl2tp
right=%any
auto=add
После внесения изменения в файл сохраним его, клавиша F2. Давайте пробежимся по настройкам:
Название | Возможное значение | Описание |
---|---|---|
type | tunnel, transport, transport_proxy, passthrough | Тип используемого соединения. Возможные значения: tunnel – соединение межу узлами: точка-точка, точка-подсеть, подсеть-подсеть; transport – транспортный режим между узлами; transport_proxy – специальный режим мобильного транспортного прокси-сервера IPv6; passthrough – в данном режиме обработка IPSec не выполняется |
authby | secret (или psk), pubkey, rsasig (или ecdsasig) | Способ аутентификации между двумя шлюзами. Перечислим их: secret – кодовое слово, pubkey – публичный ключ, используется по умолчанию. rsasig – для цифровой подписи RSA, ecdsasig – используется подпись формата Elliptic Curve DSA. |
pfs | yes, no | Включить полную секретность ключей при передачи по каналу обмена ключами |
rekey | yes, no | Пересматривать ли условия подключения когда время соединения заканчивается |
keyingtries | Целое число или % для бесконечности | Количество попыток для согласования соединения |
left, right | ip адрес, fqdn имя, %any, range, subnet | left – адрес сервера, возможные значения: ip адрес, fqdn – полное имя, %any – любой адрес, range – диапазон адресов, subnet – подсеть right – адрес клиента. Может принимать все те же значения что и сервер (left) |
leftid | id сервера | leftid – имя vpn сервера |
Необходимо создать секретный ключ PSK (pre-shared key). Откроем файл /etc/ipsec.secrets и добавим ключ
nano /etc/ipsec.secrets
В конец файла добавим строку следующего содержания:
%any : PSK "super-mega-pass"
где %any – IP адрес для которого мы устанавливаем PSK ключ, в нашем случае любой адрес; PSK – тип ключа, и в кавычках сам ключ.
Перезапустим демон strongswan для того чтобы перечитать конфиги
systemctl restart strongswan-starter
После перезапуска сервиса проверим что он запущен и работает
systemctl status strongswan-starter

Добавим strongswan в автозагрузку
systemctl enable strongswan-starter
Установка L2TP
Устанавливаем сервер L2TP
apt install xl2tpd
Откроем конфигурационный файл xl2tpd.conf
nano /etc/xl2tpd/xl2tpd.conf
В файл необходимо внести изменения. Содержимое файла это список всех настроек с комментариями. На начальном этапе для наглядности можете оставить все как есть и просто раскомментировать необходимую настройку с внесением изменений. В дальнейшем конечно удобнее удалить все лишнее и оставить только необходимое. Внесем следующие изменения:
[global]
port = 1701
auth file = /etc/ppp/chap-secrets
access control = no
[lns default]
exclusive = no
ip range = 10.10.0.10-10.10.0.20
hidden bit = no
local ip = 192.168.20.104
length bit = yes
require chap = yes
refuse pap = yes
require authentication = yes
name = srvl2tp
pppoptfile = /etc/ppp/options.xl2tpd
flow bit = yes
Секция [global]
- port – используемый порт. Протокол UDP. Указанный порт используется по умолчанию.
- auth file – путь к файлу где хранятся учетные данные пользователей
- access control – в случае значения yes будет принимать соединения только от клиентов с указанными IP адресами. По умолчанию стоит no
Секция [lns default]
- exclusive – разрешить множественные подключения клиента. Если поставить yes будет разрешено только одно подключение для одной учетной записи.
- ip range – диапазон ip адресов выдаваемых клиентам при подключении
- hidden bit – скрыть AVP или нет.
- local ip – локальный ip адрес VPN сервера
- length bit – включение бита длины для указания полезной нагрузки пакета L2TP
- require chap – использовать CHAP авторизацию клиентов
- refuse pap – отключить PAP авторизацию
- require authentication – включить авторизацию клиентов
- name – имя сервера
- pppoptfile – файл с настройками PPP
- flow bit – включение порядковых номеров в пакетах
После внесённых изменений сохраним файл. Перезапустим демон для принятия изменений
systemctl restart xl2tpd
После перезапуска проверим статус сервиса
systemctl status xl2tpd

Если сервис запущен и нет ошибок добавим его в автозагрузку
systemctl enable xl2tpd
Настройка Point-to-Point Protocol (PPP)
Создадим файл конфигурации с настройками подключения PPP
nano /etc/ppp/options.xl2tpd
Добавим в него текст следующего содержания:
noccp
auth
mtu 1410
mru 1410
nodefaultroute
noproxyarp
silent
asyncmap 0
hide-password
require-mschap-v2
ms-dns 8.8.8.8
ms-dns 8.8.4.4
logfile /var/log/xl2tpd/xl2tpd.log
debug
Сохраним изменения. Журналирование подключений будет происходить в файле /var/log/xl2tpd/xl2tpd.log, в случае проблем подключения нужно читать лог. Заключительным этапом настроим учетные данные пользователей VPN сервера. Для этого внесем изменения в файл /etc/ppp/chap-secrets
nano /etc/ppp/chap-secrets
Добавим в конец файла учетные данные пользователей:
"vasya" srvl2tp "x2BnoPdfj" *
"igor" srvl2tp "mS3KlfiB2Z" *
Пользователей может быть сколько угодно, для теста я добавил двух, разберем параметры файла:
- vasya – логин пользователя
- srvl2tp – название VPN сервера
- x2BnoPdfj – пароль пользователя vasya
- * – любой IP адрес который будет присвоен пользователю из диапазона указанного ранее. Вместо * можно указать постоянный IP адрес пользователю.
В данной статье мы рассмотрели как настроить VPN сервер L2TP на Ubuntu.
Приветствую!
Готов купить ваш сайт newadmin.ru, в том числе по цене выше рыночной.
Меня зовут Дмитрий Купрацевич. В теме сайтов более 5 лет. Занимался улучшением более 50 проектов. Ищу качественные проекты, как ваш, чтобы продолжить их развитие.
Связь через Телеграм kupratsevich, почту kuprdimasites@gmail.com, whatsapp (+79959176538).
Доброго дня, на пункте где необходимо добавить сервис в автозапуск командой
systemctl enable xl2tpd
происходит следующая неприятность – xl2tpd.service is not a native service, redirecting to systemd-sysv-install.Executing: /lib/systemd/systemd-sysv-install enable xl2tpd
Написано же что делать )
/lib/systemd/systemd-sysv-install enable xl2tpd
Здравствуйте.
После настройки vpn канал к сожалению не поднимается.
Порты 1701, 500, 4500 доступны, пакетики на них летают.
Похоже проблема со strongswan
Mar 01 01:44:05 ioann-kz charon[4926]: 13[IKE] IKE_SA (unnamed)[7] state change: CREATED => CONNECTING
Mar 01 01:44:05 ioann-kz charon[4926]: 13[IKE] no proposal found
Не подскажете что предпринять?
Добрый, Не совпадают proposals для фазы 2 проверяйте настройки параметров шифрования
Порты забыл открыть, “ближе к концу статьи”
а как открыть порты? подключаюсь по виндоус пишет ошибку закрытых портов
не работает скорее всего эта инструкция как то все путанно и куча недосказанностей
Здраствуйте, все понимается, работает, подключается, но в инет не пускает команда для IPtables не помогает, подскажите где искать?
Не удавалось настроить заново с чистого листа сервере. Подключение есть, а в интернет не пускает. Единственная статья где указано, что надо раскомментировать в файле строку и сразу все заработало))
автору респект
Спасибо за мануал все четко и понятно
чтобы заработало на андроиде добавить в ipsec.conf
ike=aes256-sha256-modp1024,aes256-sha256-modp2048,3des-sha1-modp2048,aes256-sha1-modp2048!
esp=aes256-sha256,3des-sha1,aes256-sha1!