Настройка VPN (протокол L2TP) на примере провайдера Корбина Телеком
Для установки соединения с провайдером нам понадобится демон xl2tpd. Устанавливаем:
# aptitude 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
/etc/network/interfaces
Все описанное выше предполагает, что для инициализации интерфейса eth0, вы не используете что-то типа Network-Manager. Без него /etc/network/interfaces выглядит так:
auto lo eth0 iface lo inet loopback iface eth0 inet dhcp
В Debian настроить VPN PPTP/L2TP можно также с помощью графической утилиты vpnpptp: http://code.google.com/p/vpnpptp/
Раздача интернета на домашнюю сеть (вторую сетевую карту) CategoryNetwork