|
Два VPN-подключения к Уфанет (Debian)
(c) http://vladimir-stupin.blogspot.com/2009/01/vpn.html
В прошлом месяце (и году) пытался настроить два VPN-подключения к Уфанет. Одно подключение - по безлимитному тарифу, а другое подключение с бесплатной локалкой. От первого я бы получил минимум ограничений по направлению трафика, а от второго - высокую скорость при работе в локальной сети Уфанет. Настроил, поработал с недельку, а потом перешёл к обычной схеме с безлимитным интернетом, потому что два соединения работали довольно неустойчиво - виной тому были недостаточно хорошо проработанные скрипты. Решил отложить чистую настройку до тех пор пока не появится настроение. И вот позавчера вечером я наконец набросал желаемую схему, вчера её успешно испытал и сегодня хочу поделиться наработками, которые мне не стыдно показать (хотя доработать ещё кое-что можно).
Для настройки двух VPN-соединений нам понадобятся пакеты pptp-linux, resolvconf, iproute, ifupdown, traceroute. Их можно установить командой:
aptitude install pptp-linux resolvconf iproute traceroute
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
Создадим скрипт, который создаст маршруты до VPN и DNS-серверов, необходимые для установки VPN-соединений и удалит маршрут по умолчанию через Ethernet-сеть.
/etc/network/if-up.d/ufanet:
#!/bin/sh
case $IFACE in
eth0)
VPN_DEV=$IFACE
VPN_NAME=vpn.ufanet.ru
DNS_IP=`/bin/grep nameserver /etc/resolvconf/run/interface/$VPN_DEV | cut -d" " -f2`
DNS_GW=`/usr/sbin/traceroute -n $DNS_IP 2>&1 | /usr/bin/head -n2 | /usr/bin/tail -n1 | /bin/grep -oE "([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}"`
/sbin/ip route add $DNS_IP via $DNS_GW dev $VPN_DEV
VPN_IP=`/usr/bin/host $VPN_NAME | cut -d" " -f4`
VPN_GW=`/usr/sbin/traceroute -n $VPN_IP 2>&1 | /usr/bin/head -n2 | /usr/bin/tail -n1 | /bin/grep -oE "([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}"`
/sbin/ip route add $VPN_IP via $VPN_GW dev $VPN_DEV
/sbin/ip route del default via $VPN_GW dev $VPN_DEV
;;
*)
;;
esac
Вам может понадобиться заменить в скрипте интерфейс eth0 (он выделен жирным шрифтом) на тот, к которому подключен Ethernet-кабель Уфанет.
Не забудьте сделать скрипт исполняемым, например командой:
chmod +x /etc/network/if-up.d/ufanet
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 *
main_login - это логин на подключение по основному тарифу.
freedom_login - это логин на подключение по тарифу "Свобода".
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
Для ручного включения и отключения соединений можно пользоваться командами:
pon iunlim - включить безлимитный интернет,
poff iunlim - отключить безлимитный интернет,
pon lunlim - включить безлимитную локалку,
poff lunlim - отключить безлимитную локалку.
В файле /etc/network/interfaces настроена автоматическая установка обоих VPN-соединений. Можете изменить настройки в этом файле по своему желанию - оставить оба соединения, только одно из них или отключить оба. При этом вы всегда сможете установить или разорвать любое из соединений вручную, командами описанными выше.
Для настройки этого хозяйства воспользовался своими изысканиями в соответствующих областях (1, 2, 4) и официальной информацией (3):
1. Настраиваем VPN-соединение с Уфанетом в Debian
2. Кое-что об Ufanet - трафик внешний
3. DNAT и Policy Based Routing (portmapping и два канала) - трафик внешний
|