Два VPN-подключения к Уфанет

В прошлом месяце (и году) пытался настроить два VPN-подключения к Уфанет. Одно подключение - по безлимитному тарифу, а другое подключение с бесплатной локалкой. От первого я бы получил минимум ограничений по направлению трафика, а от второго - высокую скорость при работе в локальной сети Уфанет. Настроил, поработал с недельку, а потом перешёл к обычной схеме с безлимитным интернетом, потому что два соединения работали довольно неустойчиво - виной тому были недостаточно хорошо проработанные скрипты. Решил отложить чистую настройку до тех пор пока не появится настроение. И вот позавчера вечером я наконец набросал желаемую схему, вчера её успешно испытал и сегодня хочу поделиться наработками, которые мне не стыдно показать (хотя доработать ещё кое-что можно).

Для настройки двух VPN-соединений нам понадобятся пакеты pptp-linux, resolvconf, iproute, ifupdown, bind9-host. Их можно установить командой:

# aptitude install pptp-linux resolvconf iproute bind9-host

ifupdown входит в минимальную поставку системы, поэтому в установке не нуждается.

1. Настроим сетевые интерфейсы.

Настроим локальный петлевой интерфейс, Ethernet-интерфейс Уфанет, и автоматическое подключение двух VPN-соединений.

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto iunlim
iface iunlim inet ppp
  provider iunlim

auto lunlim
iface lunlim inet ppp
  provider lunlim

Добавляем в файл конфигурации DHCP-клиента /etc/dhcp3/dhclient.conf новую секцию, связанную с интерфейсом eth0:

interface "eth0" {
  script "/root/bin/dhclient-ufanet";
}

Копируем сценарий, выполняющийся по умолчанию, в каталог /root/bin/ под именем dhclient-ufanet:

# mkdir /root/bin/
# cp /sbin/dhclient-script /root/bin/dhclient-ufanet

Заменяем в скопированном сценарии строчки следующего вида в двух местах:

for router in $new_routers; do
  route add default dev $interface gw $router $metric_arg
done

На строчки вида:

for router in $new_routers; do
  for dns in $new_domain_name_servers; do
    route add -host $dns dev $interface gw $router $metric_arg
    vpn=`host -t A vpn.ufanet.ru $dns | cut -d" " -f4`
    route add -host $vpn dev $interface gw $router $metric_arg
  done
done

Таким образом при получении настроек по DHCP мы не будем добавлять в систему маршрут по умолчанию, а добавим маршруты, необходимые для установки VPN-подключений: маршруты к VPN-серверу и маршруты к DNS-серверам (изменённый сценарий можно взять здесь: dhclient-ufanet).

Вам может понадобиться заменить в настройках интерфейс eth0 (выше он выделен жирным шрифтом) на тот, к которому подключен Ethernet-кабель Уфанет.

2. Настроим приоритеты DNS-серверов.

DNS-серверы на интерфейсах ppp должны быть приоритетнее DNS-серверов на интерфейсах Ethernet, поэтому в файле /etc/resolvconf/interface-order строчку ppp* поместим перед eth*.

/etc/resolvconf/interface-order:

# interface-order(5)
lo.inet*
lo.dnsmasq
lo.pdnsd
lo.!(pdns|pdns-recursor)
lo
tun*
tap*
ppp*
eth*
ath*
wlan*
*

3. Создадим таблицы маршрутизации.

Добавим две таблицы с именами lunlim и iunlim, которые будут содержать маршруты ответственные за работу ответного трафика соединений устанавливаемых снаружи.

/etc/iproute2/rt_tables:

#
# reserved values
#
255     local
254     main
253     default
0       unspec
#
# local
#
#1      inr.ruhep

201     iunlim
202     lunlim

4. Настроим VPN-соединения.

Зададим опции для PPP-соединений.

/etc/ppp/options:

asyncmap 0
auth
crtscts
lock
hide-password
modem
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
noipx
usepeerdns

Зададим опции для PPTP-соединений.

/etc/ppp/options.pptp:

lock
noauth
nobsdcomp
nodeflate
persist
maxfail 0

В файле /etc/ppp/chap-secrets пропишем логины и пароли на подключение к VPN-серверу Уфанет.

/etc/ppp/chap-secrets:

# Secrets for authentication using CHAP
# client           server          secret     IP addresses
main_login@local   vpn.ufanet.ru   password   *
freedom_login      vpn.ufanet.ru   password   *

Где:

Ваши логины необходимо прописать также в файлах /etc/ppp/peers/iunlim и /etc/ppp/peers/lunlim далее по тексту (они выделены жирным шрифтом).

Файл /etc/ppp/peers/iunlim задаёт настройки подключения по безлимитному тарифу "Свобода" и привязывает его к интерфейсу ppp0.

/etc/ppp/peers/iunlim:

pty "pptp vpn.ufanet.ru --nolaunchpppd"
name freedom_login
remotename vpn.ufanet.ru
file /etc/ppp/options.pptp
ipparam iunlim
unit 0

Файл /etc/ppp/peers/lunlim задаёт настройки подключения по основному тарифу и привязывает его к интерфейсу ppp1.

/etc/ppp/peers/lunlim:

pty "pptp vpn.ufanet.ru --nolaunchpppd"
name main_login@local
remotename vpn.ufanet.ru
file /etc/ppp/options.pptp
ipparam lunlim
unit 1

В скрипте /etc/ppp/ip-up.d/route происходит добавление маршрутов к локальным подсетям Уфанет на локальном соединении и добавление маршрутов к нелокальным узлам на внешнем соединении.

/etc/ppp/ip-up.d/route:

#!/bin/sh

case "$PPP_IPPARAM" in
  lunlim)
    ip route add 81.30.176.0/20 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add 81.30.192.0/19 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add 89.189.128.0/19 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add 77.79.128.0/18 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add 92.50.128.0/18 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add 94.41.0.0/18 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add 94.41.128.0/21 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add 94.41.136.0/22 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add 94.41.140.0/23 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add 79.140.24.0/22 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add 79.140.16.0/21 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add 172.16.0.0/12 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add 10.0.0.0/8 dev $PPP_IFACE src $PPP_LOCAL table main

    ip route add default dev $PPP_IFACE src $PPP_LOCAL table lunlim
    ip rule add from $PPP_LOCAL table lunlim
    ;;
  iunlim)
    ip route add 81.30.199.50 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add 81.30.199.69 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add 81.30.199.238 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add 81.30.197.10 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route add default dev $PPP_IFACE src $PPP_LOCAL table main

    ip route add default dev $PPP_IFACE src $PPP_LOCAL table iunlim
    ip rule add from $PPP_LOCAL table iunlim
    ;;
  *)
    echo "No PPP_IPPARAM defined"
    ;;
esac

Не забудьте сделать скрипт исполняемым, например командой:

# chmod +x /etc/ppp/ip-up.d/route

В скрипте /etc/ppp/ip-down.d/route происходит удаление маршрутов к локальным подсетям Уфанет на локальном соединении и удаление маршрутов к нелокальным узлам на внешнем соединении.

/etc/ppp/ip-down.d/route:

#!/bin/sh

case "$PPP_IPPARAM" in
  lunlim)
    ip route del 81.30.176.0/20 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del 81.30.192.0/19 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del 89.189.128.0/19 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del 77.79.128.0/18 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del 92.50.128.0/18 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del 94.41.0.0/18 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del 94.41.128.0/21 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del 94.41.136.0/22 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del 94.41.140.0/23 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del 79.140.24.0/22 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del 79.140.16.0/21 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del 172.16.0.0/12 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del 10.0.0.0/8 dev $PPP_IFACE src $PPP_LOCAL table main

    ip route del default dev $PPP_IFACE src $PPP_LOCAL table lunlim
    ip rule del from $PPP_LOCAL table lunlim
    ;;
  iunlim)
    ip route del 81.30.199.50 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del 81.30.199.69 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del 81.30.199.238 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del 81.30.197.10 dev $PPP_IFACE src $PPP_LOCAL table main
    ip route del default dev $PPP_IFACE src $PPP_LOCAL table main

    ip route del default dev $PPP_IFACE src $PPP_LOCAL table iunlim
    ip rule del from $PPP_LOCAL table iunlim
    ;;
  *)
    echo "No PPP_IPPARAM defined"
    ;;
esac

Не забудьте сделать скрипт исполняемым, например командой:

# chmod +x /etc/ppp/ip-down.d/route

Для ручного включения и отключения соединений можно пользоваться командами:

В файле /etc/network/interfaces настроена автоматическая установка обоих VPN-соединений. Можете изменить настройки в этом файле по своему желанию - оставить оба соединения, только одно из них или отключить оба. При этом вы всегда сможете установить или разорвать любое из соединений вручную, командами описанными выше.

Для настройки этого хозяйства воспользовался своими изысканиями в соответствующих областях (1, 2, 4) и официальной информацией (3):

  1. Настраиваем VPN-соединение с Уфанетом в Debian
  2. Кое-что об Ufanet
  3. Официальная страница Уфанет со списком локальных подсетей
  4. DNAT и Policy Based Routing (portmapping и два канала)

Обновлено 23 февраля 2009 года.

Обновлено 6 апреля 2009 года.

Написать автору