Настройка VPN L2TP

Материал из База знаний проекта Russian Fedora

Перейти к: навигация, поиск

В RFRemix настроить VPN L2TP можно с помощью плагина к NetworkManager или графической утилиты vpnpptp, либо вручную.

Содержание

Настройка VPN (протокол L2TP) на примере провайдера Корбина Телеком

Для установки соединения с провайдером нам понадобится демон xl2tpd. Устанавливаем:

# yum install xl2tpd

Конфиги

# vim /etc/xl2tpd/xl2tpd.conf

[global]
access control = yes
[lac corbina]
lns = tp.corbina.net
redial = yes
redial timeout = 10
require chap = yes
require authentication = no
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
require pap = no
autodial = yes
name = login
# vim /etc/ppp/options.xl2tpd

unit 0
remotename l2tp
ipparam corbina
connect /bin/true
mru 1460
mtu 1460
nodeflate
nobsdcomp
persist
maxfail 0
nopcomp
noaccomp
noauth
defaultroute
replacedefaultroute
name login
# vim /etc/ppp/chap-secrets

login l2tp password

Подробности обо всех параметрах в конфигах, вы можете найти в man xl2tpd.conf и /etc/ppp/options

/etc/ppp/ip-up.d/corbinavpn

Причина создания этого файла, на прямую связана с общей недоработкой ppp-клиента в линуксе.

Так выгляит моя таблица маршрутизации до поднятия VPN (маршруты локальных ресурсов, получаемые по DHCP, я удалил, чтобы не мешали вникать в суть дела):

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.227.168.0    0.0.0.0         255.255.248.0   U     0      0        0 eth0
0.0.0.0         10.227.168.1    0.0.0.0         UG    0      0        0 eth0

Первая строчка означает, что со всеми компьютерами в пределах моей подсети (10.227.168.0/21), мой компьютер общается на прямую, через устройство eth0.

Вторая строчка - это маршрут по умолчанию. Со всеми компьютерами за пределами подсети 10.227.168.0/21, компьютер общается через шлюз 10.227.168.1. Заметим, что DNS(213.234.192.8, 85.21.192.3) и VPN (85.21.0.0/24 для Москвы) сервера не из нашей подсети. И пока существует маршрут по умолчанию, мы можем с ними общаться. Но что произойдет когда мы поднимем VPN?

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
85.21.0.254     0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
10.227.168.0    0.0.0.0         255.255.248.0   U     0      0        0 eth0
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 ppp0

Система больше ничего не знает о существовании шлюза 10.227.168.1. Существование и смысл маршрута 85.21.0.254 (на VPN-сервер), мне к примеру вообще непонятны. Эта строчка в таблице маршрутизации гласит о том, что система общается с VPN-сервером через устройство ppp0. Какой смысл, если она не знает о том, что это надо делать через шлюз? Да и вообще, зачем ей общаться с VPN-сервером, через VPN-тунель? По умолчанию мы общаемся через устройство ppp0, так что подключение у нас просто упадет и работать ничего не будет

Итак, в файле /etc/ppp/ip-up.d/corbinavpn мы обьясним системе, что с VPN и DNS серверами она должна общаться через наш локальный шлюз.

Маршруты на DNS:

for i in $(grep "^nameserver" /etc/resolv.conf | awk '{print $2}') ; do
        route add -host $i gw шлюз
done

Удаляем маршрут-паразит. Переменные $1 и $5 задаются самим ppp-клиентом:

route del $5 dev $1

Маршрут на VPN-сервер:

route add -host $5 gw шлюз

В принципе в большинстве случаев этого достаточно, но у Корбины много серверов. И после установки соединения с 81.21.0.249, система может решить, что адрес сервера 81.21.0.255 хотя подключена к 249. И здесь опять будут проблемы. Поэтому лучше всего прописать маршрут на всю подсеть с VPN-серверами:

route add -net 85.21.0.0/24 gw шлюз

Окончательный вид файла corbinavpn (в моём случае):

# vim /etc/ppp/ip-up.d/corbinavpn

#!/bin/sh

[ $6 = "corbina" ] || exit 0

export GATEWAY=10.227.168.1

for i in $(grep "^nameserver" /etc/resolv.conf | awk '{print $2}') ; do
        route add -host $i gw шлюз
done
route del $5 dev $1
route add -net 85.21.0.0/24 gw $GATEWAY

Файлу надо дать исполняемый бит

chmod +x /etc/ppp/ip-up.d/corbinavpn


После поднятия VPN, таблица маршрутизации должна выглядить примерно так:

85.21.192.3     10.227.168.1    255.255.255.255 UGH   0      0        0 eth0
213.234.192.8   10.227.168.1    255.255.255.255 UGH   0      0        0 eth0
85.21.0.0       10.227.168.1    255.255.255.0   UG    0      0        0 eth0
233.32.240.0    10.227.169.6    255.255.255.0   UG    0      0        0 eth0
172.16.16.0     10.227.168.1    255.255.255.0   UG    0      0        0 eth0
10.227.168.0    0.0.0.0         255.255.248.0   U     0      0        0 eth0
10.0.0.0        10.227.168.1    255.0.0.0       UG    0      0        0 eth0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 ppp0

Первые две строчки адреса на DNS, чтобы наш компьютер не пытался общаться с ними через VPN туннель. Третья: общаемся с VPN сервером через наш районный шлюз. 4-5 - IPTV, с мультикастом (233.32.240.0) общаемся через интерфейс eth0, 10.227.169.6 - это мой ip. 6 - моя подсеть. 7 - юзеры за пределом моей подсети. 8 - локальное кольцо. 9 - маршрут по умолчанию (все что не описано выше, идет через этот маршрут).

Диагностика проблем

В первую очередь нужно обратить внимание на таблицу маршрутизации. Проверить доступность VPN-сервера (ping tp.corbina.net). Попробовать запустить xl2tpd с ключём -D.

Иногда к примеру демон ругается на отсутствие каталога /var/run/xl2tpd или файла /var/run/xl2tpd/l2tp-control. В таком случае в файле /etc/init.d/xl2tpd нужно прописать:

if !([ -f /var/run/xl2tpd/l2tp-control ]) ; then
     mkdir -p /var/run/xl2tpd
     touch /var/run/xl2tpd/l2tp-control
fi

Только не в секцию start (как это указано в некоторых руководствах), а где-то между DESC=xl2tpd и case "$1" in.

Так-же не забываем о syslog:

grep -E 'pppd|xl2tpd' /var/log/messages