четверг, 2 апреля 2009 г.

VPN-подключение к Уфанет и локальные ресурсы через Ethernet

Примерно в середине февраля стало известно, что Уфанет плавно модернизирует свою сеть и теперь у некоторых абонентов локальные ресурсы стали доступны без VPN-подключения. По неофициальной информации от сотрудников Уфанет локальные ресурсы доступны без VPN-подключения тем абонентам, которые по DHCP получают адреса из диапазона 10.160.0.0-10.191.255.255 (10.160.0.0/11). Проверьте адрес, который вам выдаёт DHCP-сервер, возможно вы один из счастливчиков :)

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

Для настройки двух 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

Добавляем в файл конфигурации DHCP-клиента /etc/dhcp3/dhclient.conf новую секцию, связанную с интерфейсом eth0:
interface "eth0" {
  script "/root/bin/dhclient-ufanet";
}
Вам может понадобиться заменить в файлах инициализации интерфейс eth0 (выше он выделен жирным шрифтом) на тот, к которому подключен Ethernet-кабель Уфанет.

Копируем сценарий, выполняющийся по умолчанию, в каталог /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
  ip route add 81.30.176.0/20 via $router dev $interface src $new_ip_address table main
  ip route add 81.30.192.0/19 via $router dev $interface src $new_ip_address table main
  ip route add 89.189.128.0/19 via $router dev $interface src $new_ip_address table main
  ip route add 77.79.128.0/18 via $router dev $interface src $new_ip_address table main
  ip route add 92.50.128.0/18 via $router dev $interface src $new_ip_address table main
  ip route add 94.41.0.0/18 via $router dev $interface src $new_ip_address table main
  ip route add 94.41.128.0/21 via $router dev $interface src $new_ip_address table main
  ip route add 94.41.136.0/22 via $router dev $interface src $new_ip_address table main
  ip route add 94.41.140.0/23 via $router dev $interface src $new_ip_address table main
  ip route add 79.140.24.0/22 via $router dev $interface src $new_ip_address table main
  ip route add 79.140.16.0/21 via $router dev $interface src $new_ip_address table main
  ip route add 172.16.0.0/12 via $router dev $interface src $new_ip_address table main
  ip route add 10.0.0.0/8 via $router dev $interface src $new_ip_address table main

  ip route add default via $router dev $interface src $new_ip_address table lunlim
  ip rule add from $new_ip_address table lunlim
done
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
freedom_login      vpn.ufanet.ru   password   *
freedom_login - это логин на подключение по тарифу "Свобода".
password - это соответствующий пароль на подключение.

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

Файл /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/ip-up.d/route происходит добавление маршрутов маршрутов к нелокальным узлам на внешнем соединении.

/etc/ppp/ip-up.d/route:
#!/bin/sh

case "$PPP_IPPARAM" in
  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
  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 - отключить безлимитный интернет,

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

Ссылка на исходную статью: Два VPN-подключения к Уфанет

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

14 комментариев:

Анонимный комментирует...

Привет,ppp0 поднимается на локальные ресурсы заходит,а на внешку не пускает

Анонимный комментирует...

morbo,route выдает default eth0,вроде должно быть ppp0,ppp0 поднимается IP выдает но на внешку не пускает,на все локальные ресурсы заходит нормально,в скриптах слово lunlim наверно вообще можно удалить?

morbo комментирует...

Это могло произойти, если не сработал DHCP-сценарий.

Сейчас посмотрел и нашёл ошибку в статье, вместо команды

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

должна быть

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

Возможно дело в этом, если вы пунктуально настраивали всё буква в букву по статье.

Анонимный комментирует...

/root/bin/dhclient-ufanet это я сразу увидел сделал как нужно,все равно не срабатывет ,а /ip-up.d/route и /ip-down.d/route прописывает на ppp0,/root/bin/dhclient-ufanet все сделал как у вас ,не знаю куда залить тут выложу,может что не так сделал? :) вы его не утверждайте просто посмотрите :)
fi

for router in $new_routers; do
ip route add 81.30.176.0/20 via $router dev $interface src $new_ip_address table main
ip route add 81.30.192.0/19 via $router dev $interface src $new_ip_address table main
ip route add 89.189.128.0/19 via $router dev $interface src $new_ip_address table main
ip route add 77.79.128.0/18 via $router dev $interface src $new_ip_address table main
ip route add 92.50.128.0/18 via $router dev $interface src $new_ip_address table main
ip route add 94.41.0.0/18 via $router dev $interface src $new_ip_address table main
ip route add 94.41.128.0/21 via $router dev $interface src $new_ip_address table main
ip route add 94.41.136.0/22 via $router dev $interface src $new_ip_address table main
ip route add 94.41.140.0/23 via $router dev $interface src $new_ip_address table main
ip route add 79.140.24.0/22 via $router dev $interface src $new_ip_address table main
ip route add 79.140.16.0/21 via $router dev $interface src $new_ip_address table main
ip route add 172.16.0.0/12 via $router dev $interface src $new_ip_address table main
ip route add 10.0.0.0/8 via $router dev $interface src $new_ip_address table main

ip route add default via $router dev $interface src $new_ip_address table lunlim
ip rule add from $new_ip_address table lunlim
done
fi

if [ "$new_ip_address" != "$alias_ip_address" -a -n "$alias_ip_address" ];
then
ifconfig $interface:0- inet 0
ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg
route add -host $alias_ip_address $interface:0
fi

make_resolv_conf

;;

EXPIRE|FAIL|RELEASE|STOP)
if [ -n "$alias_ip_address" ]; then
# Turn off alias interface.
ifconfig $interface:0- inet 0
fi

if [ -n "$old_ip_address" ]; then
# Shut down interface, which will delete routes and clear arp cache.
ifconfig $interface inet 0
fi

if [ -n "$alias_ip_address" ]; then
ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg
route add -host $alias_ip_address $interface:0
fi

;;

TIMEOUT)
if [ -n "$alias_ip_address" ]; then
ifconfig $interface:0- inet 0
fi

ifconfig $interface inet $new_ip_address $new_subnet_arg \
$new_broadcast_arg $mtu_arg

set -- $new_routers
first_router="$1"

if [ -z "$first_router" ] || ping -q -c 1 $first_router; then
if [ "$new_ip_address" != "$alias_ip_address" -a \
-n "$alias_ip_address" ]; then
ifconfig $interface:0 inet $alias_ip_address $alias_subnet_arg
route add -host $alias_ip_address dev $interface:0
fi

for router in $new_routers; do
ip route add 81.30.176.0/20 via $router dev $interface src $new_ip_address table main
ip route add 81.30.192.0/19 via $router dev $interface src $new_ip_address table main
ip route add 89.189.128.0/19 via $router dev $interface src $new_ip_address table main
ip route add 77.79.128.0/18 via $router dev $interface src $new_ip_address table main
ip route add 92.50.128.0/18 via $router dev $interface src $new_ip_address table main
ip route add 94.41.0.0/18 via $router dev $interface src $new_ip_address table main
ip route add 94.41.128.0/21 via $router dev $interface src $new_ip_address table main
ip route add 94.41.136.0/22 via $router dev $interface src $new_ip_address table main
ip route add 94.41.140.0/23 via $router dev $interface src $new_ip_address table main
ip route add 79.140.24.0/22 via $router dev $interface src $new_ip_address table main
ip route add 79.140.16.0/21 via $router dev $interface src $new_ip_address table main
ip route add 172.16.0.0/12 via $router dev $interface src $new_ip_address table main
ip route add 10.0.0.0/8 via $router dev $interface src $new_ip_address table main

ip route add default via $router dev $interface src $new_ip_address table lunlim
ip rule add from $new_ip_address table lunlim
done

make_resolv_conf
else
# Changed from 'ifconfig $interface inet 0 down' - see Debian bug #144666
ifconfig $interface inet 0
exit_with_hooks 2 "$@"
fi

;;
esac

exit_with_hooks 0

и /etc/dhcp3/dhclient.conf я просто вставил вот так
#
interface "eth0" {
script "/root/bin/dhclient-ufanet";
}
#
option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;

#send host-name "andare.fugue.com";
спасибо :)

morbo комментирует...

А после настройки dhcp перезапускали сеть?

Например так:

/etc/init.d/networking restart

Или так:

ifdown eth0
ifup eth0

Или просто перезагрузкой компьютера.

Если не применить настройки к интерфейсу eth0, то сценарий /root/bin/dhclient-script не сработает.

Анонимный комментирует...

Привет
перезапускал и перезагружал,на внешку не пускает
route выдает
default 10.162.x.x 0.0.0.0 UG 0 0 0 eth0 ---наверно должно быть ppp0 все дело в этом

Анонимный комментирует...

добавил в /root/bin/dhclient-ufanet в двух местах
route add default ppp0 все заработало:) так можно или это не правильно?

morbo комментирует...

>добавил в /root/bin/dhclient-ufanet в двух местах
>route add default ppp0 все заработало:) так можно или это не правильно?

Это правило должно добавляться через сценарий /etc/ppp/ip-up.d/route вот этой строчкой:

ip route add default dev $PPP_IFACE src $PPP_LOCAL table main

Анонимный комментирует...

morbo,сейчас удалил из /root/bin/dhclient-ufanet строки ip route add default ppp0,перезапустил dhcp и все заработало,странно это все :)
default * 0.0.0.0 U 0 0 0 ppp0

ваш man 100% рабочий
вопрос настроил iptables, на ufadeb.homelinux.org не заходит,на другие www нормально
TCP DROP: IN=eth0 OUT= MAC=:14:08:00 SRC=172.x.x.x72 DST=10.16.x.x LEN=60 TOS=0x00 PREC=0x00 TTL=60 ID=0 DF PROTO=TCP SPT=80 DPT=57902 WINDOW=5632 RES=0x00 ACK SYN URGP=0
правило у меня есть $IPT -A INPUT -p tcp -m tcp -m multiport --dport 1024:65535 -j ACCEPT --sports 80
может из за флага ACK SYN ?
комментарии можно удалять,а то понаписали за день :)
спасибо за помощь

morbo комментирует...

>вопрос настроил iptables, на ufadeb.homelinux.org не заходит,на другие www нормально
>TCP DROP: IN=eth0 OUT= MAC=:14:08:00 SRC=172.x.x.x72 DST=10.16.x.x LEN=60 TOS=0x00 PREC=0x00 TTL=60 ID=0 DF PROTO=TCP SPT=80 DPT=57902 WINDOW=5632 RES=0x00 ACK SYN URGP=0

У меня с сервером всё в порядке, проверил только что. Без правил iptables к ufadeb.homelinux.org подключается нормально?

>правило у меня есть $IPT -A INPUT -p tcp -m tcp -m multiport --dport 1024:65535 -j ACCEPT --sports 80

Освойте модуль conntrack, с его помощью не придётся прописывать обратные разрешающие правила. Тогда в цепочке INPUT у вас будут только правила, разрешающие подключения к ВАШЕМУ компьютеру (если вы запустили на своём компьютере какие-либо сервисы), а в цепочке OUTPUT ОТ ВАШЕГО (если вы хотите защититься от троянов или вирусов, рассылающих спам).

>может из за флага ACK SYN ?

(пожимает плечами) Может быть, а может быть из-за чего-то ещё. Нужно вооружаться tcpdump-ом, хорошим знанием iptables и принципов работы необходимых сервисов - www, ftp, smtp и т.п. :)

>комментарии можно удалять,а то понаписали за день :)

Пусть остаются. Может у кого-то возникнут похожие проблемы, почитают комментарии и может что-то поймут.

keeper комментирует...

Доброго времени суток!
спасибо за мануал, меня очень интересует настройка Билайн+Уфанет (уфанет используется только для локала, без впн)
если что то не описал мыло: keeper0null@gmail.com

morbo комментирует...

>меня очень интересует настройка Билайн+Уфанет (уфанет используется только для локала, без впн)

У меня нет Билайна, поэтому описать такую конфигурацию я не смогу, да и она мне не интересна. Можете попробовать настроить по аналогии.

Анонимный комментирует...

после вашец настройки у меня не запускается сеть. прописываю sudo ifconfig eth0 up и ничего не происходит

morbo комментирует...

>прописываю sudo ifconfig eth0 up и ничего не происходит

А что должно произойти?