воскресенье, 4 января 2009 г.

Два 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-серверам (изменённый сценарий можно взять здесь: http://stupin.su/files/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   *
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. Официальная страница Уфанет со списком локальных подсетей
  4. DNAT и Policy Based Routing (portmapping и два канала)
Обновлено 23 февраля 2009 года.

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

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

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

Не пашет, при команде ifconfig пишет:
ppp0: error fetching interface information: Device not found
(Ось Linux Mint 6 x64 Felicia RC1)

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

Странно. По команде ifconfig должен был отобразиться список всех активных интерфейсов, при этом явно не было бы попытки отобразить конкретно ppp0, если он не активен.

По команде ifconfig ppp0 это могло произойти если связь не была установлена.

Попробуйте для начала команду "pon iunlim", чтобы поднять соответствующее соединение. Затем, если не получится, попробуйте перезапустить "/etc/init.d/networking restart".

Возможно вы не редактировали конфиги, а заменили их новыми. Тогда нужно внимательно посмотреть права, выставленные на доступ к файлам.

Возможно также, что проблема специфична для используемого вами дистрибутива.

Леонид комментирует...

Уважаемый Автор!
У меня просто нет слов, чтобы выразить восторг и восхищение от Вашей работы. Я не так давно перешел на linux и до сих пор не умею самостоятельно писать скрипты даже... поэтому для решения столь насущного вопроса воспользовался Вашим рецептом. Все великолепно работает без нареканий. СПАСИБО!!! Дай Бог здоровья!

От эмоций к делу ;)

А почему бы не разместить эту статью на ufaman.ru ? ведь те инструкции, которые выложены там сейчас - никуда не годятся, а Ваша заметка, сколь бы замечательной не была - находится на внешке...

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

Я не думаю, что кто-то из Уфанета согласится разместить на официальном сайте именно эту статью.

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

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

Спасибо огромное автору за сей труд!

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

Ваши настройки вызвали форк-бомбу.

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

>Ваши настройки вызвали форк-бомбу.

Обосновать не затруднит? У меня эти настройки работают. Вон у Леонида получилось.

Конкретно опишите: какой скрипт вызывает сам себя или вызывает сам себя через несколько промежуточных скриптов?

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

Ок, попробую. Делал все по инструкции. В линухе сижу месяца 2-3, где и какие логи смотреть пока не знаю. Система debian lenny 5.0
ifconfig показывал только eth0 и lo.
Вывод ps aux тут.
http://rapid.ufanet.ru/do/?upload_id=552eac1e644297ba8a50f99d0fbcbc72

Долго сидел, эксперементировал, заменил /etc/ppp/pees/ilocal (и lunlim)на следущее
unit 0
pty "pptp 10.8.0.1 --nolaunchpppd"
user 12345
password "Rlk48uj45nj"
lock
noauth
persist
debug
nobsdcomp
nodeflate
lcp-echo-failure 36
lcp-echo-interval 5
lcp-max-failure 0
ipparam iunlim
unit 0

После этого заработало. Но явно где-то баги какие-то.

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

Похоже ты пропустил опцию file /etc/ppp/options.pptp

А вообще, если что-то меняешь (имя peer'а например) - прежде всего стоит проверить себя.

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

Не, не пропускал. Делал все копируя из твоей статьи. Там похоже траблы с файлом /etc/ppp/chap-secrets. Год назад, когда в самый первый раз установил линух, месяца два парился из-за того что в этом файле между логином и паролем поставил пробелы, а надо было символы табуляции или что-то в этом духе.
Получается, что пароль не подходил, а комп плодил процессы, пытаясь подрубиться? Или я опять неправильно понимаю?

cat /var/log/messages полон строчками типа
Jan 23 17:27:00 debian pppd[2117]: Using interface ppp0
Jan 23 17:27:00 debian pppd[2117]: Connect: ppp0 <--> /dev/pts/1
Jan 23 17:27:00 debian pppd[2117]: Modem hangup
Jan 23 17:27:00 debian pppd[2117]: Connection terminated.
Jan 23 17:27:00 debian pppd[2166]: Using interface ppp1
Jan 23 17:27:00 debian pppd[2166]: Connect: ppp1 <--> /dev/pts/0
Jan 23 17:27:00 debian pppd[2166]: Modem hangup
Jan 23 17:27:00 debian pppd[2166]: Connection terminated.
ps aux
root 12486 0.0 0.0 0 0 ? Z 17:19 0:00 [pptp] < defunct >
root 12488 0.0 0.0 0 0 ? Z 17:19 0:00 [pptp] < defunct >
root 12509 0.0 0.0 0 0 ? Z 17:19 0:00 [pptp] < defunct >

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

>Год назад, когда в самый первый раз установил линух, месяца два парился из-за того что в этом файле между логином и паролем поставил пробелы, а надо было символы табуляции или что-то в этом духе.

Их можно разделять любым количеством пробелов и табуляций, насколько я знаю. Там только важно чтобы права доступа к файлу правильно были выставлены - нельзя читать и писать никому кроме root.

>Получается, что пароль не подходил, а комп плодил процессы, пытаясь подрубиться? Или я опять неправильно понимаю?

Нет, здесь похоже что-то посерьёзнее. Например нет маршрута до DNS- или VPN-сервера.

Обычно при переподключении тот же самый процесс pptp остаётся. Если плодятся процессы pptp - значит дело серьёзнее.

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

Нашел нужный лог. Вот. За минуту 18 секунд машина форкнулась.
/var/log/syslog
Jan 23 17:27:00 debian kernel: imklog 3.18.6, log source = /proc/kmsg started.
Jan 23 17:27:00 debian kernel: [ 0.000000] Initializing cgroup subsys cpuset
Jan 23 17:27:00 debian kernel: [ 0.000000] Initializing cgroup subsys cpu
Jan 23 17:27:00 debian kernel: [ 0.000000] Linux version 2.6.26-1-amd64 (Debian 2.6.26-12) (waldi@debian.org) (gcc version 4.1.3 20080704 (prerelease) (Debian 4.1.2-24)) #1 SMP Mon Dec 15 17:25:36 UTC 2008
......
Jan 23 17:27:00 debian kernel: [ 19.531708] lo: Disabled Privacy Extensions
Jan 23 17:27:00 debian kernel: [ 29.937592] PPP generic driver version 2.4.2
Jan 23 17:27:00 debian kernel: [ 30.472019] eth0: no IPv6 routers present
Jan 23 17:27:00 debian rsyslogd: [origin software="rsyslogd" swVersion="3.18.6" x-pid="2702" x-info="http://www.rsyslog.com"] restart
Jan 23 17:27:00 debian pppd[2117]: Failed to set PPP kernel option flags: Inappropriate ioctl for device
Jan 23 17:27:00 debian pppd[2117]: Using interface ppp0
Jan 23 17:27:00 debian pppd[2117]: Connect: ppp0 <--> /dev/pts/1
Jan 23 17:27:00 debian pppd[2117]: Modem hangup
Jan 23 17:27:00 debian pppd[2117]: Connection terminated.
Jan 23 17:27:00 debian pptp[2717]: anon fatal[get_ip_address:pptp.c:430]: gethostbyname 'vpn.ufanet.ru': HOST NOT FOUND
Jan 23 17:27:00 debian pppd[2166]: Failed to set PPP kernel option flags: Inappropriate ioctl for device
Jan 23 17:27:00 debian pppd[2166]: Using interface ppp1
Jan 23 17:27:00 debian pppd[2166]: Connect: ppp1 <--> /dev/pts/0
Jan 23 17:27:00 debian pppd[2166]: Modem hangup
Jan 23 17:27:00 debian pppd[2166]: Connection terminated.
Jan 23 17:27:00 debian pptp[2732]: anon fatal[get_ip_address:pptp.c:430]: gethostbyname 'vpn.ufanet.ru': HOST NOT FOUND
......
Jan 23 17:27:00 debian pppd[2166]: Couldn't get channel number: Input/output error
Jan 23 17:27:00 debian pptp[2972]: anon fatal[get_ip_address:pptp.c:430]: gethostbyname 'vpn.ufanet.ru': HOST NOT FOUND
Jan 23 17:27:00 debian pppd[2166]: Couldn't get channel number: Input/output error
Jan 23 17:27:00 debian pptp[2973]: anon fatal[get_ip_address:pptp.c:430]: gethostbyname 'vpn.ufanet.ru': HOST NOT FOUND
Jan 23 17:27:00 debian pppd[2166]: Couldn't get channel number: Input/output error
......
Jan 23 17:28:18 debian pppd[2117]: Couldn't get channel number: Input/output error
Jan 23 17:28:18 debian pptp[19644]: anon fatal[get_ip_address:pptp.c:430]: gethostbyname 'vpn.ufanet.ru': HOST NOT FOUND
Jan 23 17:28:18 debian pppd[2166]: Couldn't get channel number: Input/output error
Jan 23 17:28:18 debian pptp[19645]: anon fatal[get_ip_address:pptp.c:430]: gethostbyname 'vpn.ufanet.ru': HOST NOT FOUND
Jan 23 17:28:18 debian pppd[2117]: Couldn't get channel number: Input/output error
Jan 23 17:28:18 debian pptp[19646]: anon fatal[get_ip_address:pptp.c:430]: gethostbyname 'vpn.ufanet.ru': HOST NOT FOUND
Jan 23 17:28:18 debian pppd[2166]: Couldn't get channel number: Input/output error
Jan 23 17:28:18 debian pptp[19647]: anon fatal[get_ip_address:pptp.c:430]: gethostbyname 'vpn.ufanet.ru': HOST NOT FOUND
Jan 23 17:28:18 debian pppd[2117]: Couldn't get channel number: Input/output error
Jan 23 17:28:18 debian pppd[2117]: fork failed: Resource temporarily unavailable
Jan 23 17:28:18 debian pppd[2117]: Failed to create child process: Resource temporarily unavailable
Jan 23 17:28:18 debian pppd[2117]: fork failed: Resource temporarily unavailable
Jan 23 17:28:18 debian pppd[2117]: Failed to create child process: Resource temporarily unavailable

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

Вот это

>Jan 23 17:28:18 debian pptp[19647]: anon fatal[get_ip_address:pptp.c:430]: gethostbyname 'vpn.ufanet.ru': HOST NOT FOUND

говорит о том, что у Вас есть проблемы с DNS. Проверьте, что при получении настроек сети по DHCP маршрут до DNS-сервера прописывается в таблицу маршрутизации:

netstat -rn

там должна быть такая строчка:
10.8.3.1 10.64.62.1 255.255.255.255 UGH 0 0 0 eth0

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

С поправкой на то, что 10.64.62.1 - это IP-адрес моего шлюза. У Вас может быть другой.

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

Есть строчка.
10.8.0.1 10.65.158.1 255.255.255.255 UGH 0 0 0 eth0
Впрочем после того, как я поменял в конфиге файлы lunlim iunlim все прекрасно работает. Видимо рыть в этом направлении надо. Но методом тыка сидеть и искать я уже устал и не хочу, а понять что происходит, не хватает знаний. Надеюсь, что в дальнейшем будет все фурычить. Спасибо вам за консультацию и за мануал, инет подключать/отключать стало теперь гораздо удобнее.(раньше подключал, запуская косячненький самописный скрипт, сделанный по иструкции с уфанетовского сайта+роутинг стянутый уже не помню откуда) Отключался так.
ps aux | grep [p]ppd | awk '{print $2}'|xargs kill

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

>10.8.0.1 10.65.158.1 255.255.255.255 UGH 0 0 0 eth0

Это маршрут до VPN-сервера, а должен быть ещё до DNS-сервера, такой как я указал выше: до адреса 10.8.3.1.

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

> Я не думаю, что кто-то из Уфанета согласится разместить на официальном сайте именно эту статью.

категорично. =) если вы не против - мы можем её разместить на http://ufaman.ru/help/internet/.


>>Jan 23 17:28:18 debian pptp[19647]: anon fatal[get_ip_address:pptp.c:430]: gethostbyname 'vpn.ufanet.ru': HOST NOT FOUND

> говорит о том, что у Вас есть проблемы с DNS.

можно указать адрес vpn-сервера сразу по ip, он никогда не изменится, использовать тут dns нет необходимости.

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

>категорично. =) если вы не против - мы можем её разместить на http://ufaman.ru/help/internet/.

Конечно я не против. Можете разместить ещё и вторую (точнее - первую) http://vladimir-stupin.blogspot.com/2008/10/vpn-debian.html

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

>>>Jan 23 17:28:18 debian pptp[19647]: anon fatal[get_ip_address:pptp.c:430]: gethostbyname 'vpn.ufanet.ru': HOST NOT FOUND

>> говорит о том, что у Вас есть проблемы с DNS.

>можно указать адрес vpn-сервера сразу по ip, он никогда не изменится, использовать тут dns нет необходимости.

Я не работаю в Уфанете и следовательно таких тонкостей не знаю, поэтому писал в расчёте на наиболее общий случай, когда мне неизвестны конкретные IP-адреса.

Кстати, недавно тоже поймал у себя этот глюк с DNS-сервером: после перезагрузки система не добавила маршрут до DNS-серверу и соответственно не смогла подключиться. Просто при отладке я делал /etc/init.d/networking restart от root'а и все необходимые пути к командам легко находились, а при перезагрузке не нашлись, т.к. скрипты выполнялись с пустым окружением и переменной PATH в этом окружении не было. Пока что прописал в скрипте /etc/network/if-up.d/ufanet полные пути к каждой из команд. Тестировать пока не пробовал.

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

> Конечно я не против. Можете разместить ещё и вторую (точнее - первую) http://vladimir-stupin.blogspot.com/2008/10/vpn-debian.html

ок, прорулим.

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

ничего подобного. текущая схема организация полосы пропускания просто не позволяет отдельно шейпить траффик на одни сети и отдельно на другие.

> Я не работаю в Уфанете и следовательно таких тонкостей не знаю, поэтому писал в расчёте на наиболее общий случай, когда мне неизвестны конкретные IP-адреса.

некоторые тонкости могу поведать, разумеется не подпадающие под ИДСП.

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

>текущая схема организация полосы пропускания просто не позволяет отдельно шейпить траффик на одни сети и отдельно на другие.

Неужели mpd + ng_car? ;)

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

Большое спасибо за информацию.

Разместил здесь:

http://ufaman.ru/help/internet/debian2.shtml
http://ufaman.ru/help/internet/debian2.shtml

Прошу утвердить форму представления материала :)

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

nPuBuDeHuE, ответил Вам письмом на gmail (нашёл адрес в Вашем профиле blogger).

пРиВиДеНиЕ комментирует...

Владимир, вот здесь http://www.ufaman.ru/help/internet/debian2.shtml

подправил это /etc/ppp/ip-up.d/route и это /etc/network/if-up.d/ufanet

Проверяйте :)

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

Ещё нужно подправить скрипт /etc/ppp/ip-down.d/route и убрать примечание к 3 пункту в конце статьи.

пРиВиДеНиЕ комментирует...

исправил. выкладываем?

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

пРиВиДеНиЕ пишет...

>исправил. выкладываем?

Можно выкладывать!

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

автор!

огромное вам спасибо! работает!

правда, я не понимаю протокол работы...

если вы знаете какой-нибудь внятный мануал на русском, который поясняет совместную работу этих скриптов, дайте, пожалуйста, линк

ещё раз спасибо.


taticoma

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

>правда, я не понимаю протокол работы...

>если вы знаете какой-нибудь внятный мануал на русском, который поясняет совместную работу этих скриптов, дайте, пожалуйста, линк

Эмм... Для начала прочитайте системные мануалы: resolvconf, interface-order, ip, traceroute, host, pppd, pptp, ifup/ifdown, pon/poff, interfaces, grep. Потом - книжки по программированию на shell. Это не достаточно, но необходимо, чтобы понять как это работает.

в общих чертах всё работает примерно так:
1. Процесс init запускает сценарий настройки сети /etc/init.d/networking
2. Сценарий читает настройки сетевых интерфейсов из файла /etc/network/interfaces.
3. Сценарий запускает dhcp-клиента, который получает по сети настройки сетевого интерфейса eth0 и запускает сценарий /sbin/dhclient-script для его настройки
3. После поднятия интерфейса вызывается сценарий /etc/network/if-up.d/ufanet, который заменяет маршрут по умолчанию, полученный dhcp-клиентом, на два статических маршрута к DNS-серверу и VPN-серверу.
4. Сценарий /etc/init.d/networking переходит к настройке интерфейса lunlim и запускает для этого pppd
5. pppd запускает pptp, который устанавливает канал связи между pppd и VPN-сервером провайдера.
6. pppd согласует настройки с VPN-сервером, предоставляет имя и пароль и устанавливает сеанс связи. Создаётся интерфейс ppp0, соответсвующий этому сеансу.
7. pppd запускает сценарий /etc/ppp/ip-up.d/ufanet, который добавляет в систему необходимые маршруты и правила выбора таблицы маршрутизации
8. Сценарий /etc/init.d/networking переходит к настройке интерфейса iunlim и запускает для этого pppd, шаги 5-7 повторяются для этого подключения.

Отключение происходит в обратной последовательности. Примерно так.

Чтобы понять всё во всех подробностях, придётся потратить очень много времени и сил, т.к. тут задействовано очень много различных областей: протоколы DNS, DHCP, PPP (и довольно много подпротоколов), GRE, IP (и маршрутизация), PPTP, программы работающие с этими протоколами (выше я указал маны этих программ), программирование на shell, подсистема текстовых терминалов Unix/Linux (и даже последовательные порты, в том числе способы управления потоком передачи, способы синхронизации приёмника и передатчика, микросхемы UART!).

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

Статья была доработана. Убран сценарий /etc/network/if-up.d/ufanet, добавлен сценарий /root/bin/dhclient-ufanet.

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

ubuntu 8.0.4 никак не получается завести. все настройки делал в mc под root'ом. можно чуть подробнее про права. может где-то не нужен был root?

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

>ubuntu 8.0.4 никак не получается завести. все настройки делал в mc под root'ом. можно чуть подробнее про права. может где-то не нужен был root?

Слишком мало информации. Что конкретно не получается?

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

>Слишком мало информации. Что конкретно не получается?

предыдущая редакция с уфанета работает, но не всегда а здесь вот что пишет:

sudo /etc/init.d/networking restart
* Reconfiguring network interfaces... There is already a pid file /var/run/dhclient.eth0.pid with pid 7443
killed old client process, removed PID file
Internet Systems Consortium DHCP Client V3.0.6
Copyright 2004-2007 Internet Systems Consortium.
All rights reserved.
For info, please visit http://www.isc.org/sw/dhcp/

Listening on LPF/eth0/00:16:d4:54:2a:3f
Sending on LPF/eth0/00:16:d4:54:2a:3f
Sending on Socket/fallback
DHCPRELEASE on eth0 to 10.68.62.1 port 67
SIOCSIFADDR: Permission denied
SIOCSIFFLAGS: Permission denied
There is already a pid file /var/run/dhclient.eth0.pid with pid 134519072
Internet Systems Consortium DHCP Client V3.0.6
Copyright 2004-2007 Internet Systems Consortium.
All rights reserved.
For info, please visit http://www.isc.org/sw/dhcp/

SIOCSIFADDR: Permission denied
SIOCSIFFLAGS: Permission denied
SIOCSIFFLAGS: Permission denied
Listening on LPF/eth0/00:16:d4:54:2a:3f
Sending on LPF/eth0/00:16:d4:54:2a:3f
Sending on Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 5
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 9
DHCPOFFER of 10.68.62.168 from 10.64.62.1
DHCPREQUEST of 10.68.62.168 on eth0 to 255.255.255.255 port 67
DHCPACK of 10.68.62.168 from 10.64.62.1
SIOCSIFADDR: Permission denied
SIOCSIFFLAGS: Permission denied
SIOCSIFNETMASK: Permission denied
SIOCSIFBRDADDR: Permission denied
SIOCSIFFLAGS: Permission denied
SIOCADDRT: Operation not permitted
out;: Unknown host
/sbin/resolvconf: line 77: eth0_new.32131: Permission denied
bound to 10.68.62.168 -- renewal in 1393 seconds.
iunlim: ERROR while getting interface flags: No such device
lunlim: ERROR while getting interface flags: No such device

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

>предыдущая редакция с уфанета работает, >но не всегда а здесь вот что пишет:

Для начала попробуйте перерзагрузить компьютер.

Если не получится, возможно нужно поступить так, как написано здесь в самом последнем сообщении: https://bugs.launchpad.net/ubuntu/+source/dhcp3/+bug/19740

sudo dpkg --configure dhcp3-common
sudo dpkg --configure dhcp3-client

Если и это не помогает, то я затрудняюсь вам помочь: похоже эта проблема касается только Ubuntu.

Сергей комментирует...

Не работает у меня.
Стоит Ubuntu 9.0.4.

/var/log/ppp-connect-errors

anon fatal[main:pptp.c:322]: Cannot bind GRE socket, aborting.
anon warn[pptp_gre_bind:pptp_gre.c:100]: connect: Network is unreachable
anon fatal[main:pptp.c:322]: Cannot bind GRE socket, aborting.
anon warn[pptp_gre_bind:pptp_gre.c:100]: connect: Network is unreachable
anon fatal[main:pptp.c:322]: Cannot bind GRE socket, aborting.
anon warn[pptp_gre_bind:pptp_gre.c:100]: connect: Network is unreachable
anon fatal[main:pptp.c:322]: Cannot bind GRE socket, aborting.
...

netstat -rn
Таблица маршутизации ядра протокола IP
Destination Gateway Genmask Flags MSS Window irtt Iface
10.8.0.8 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
10.96.23.0 0.0.0.0 255.255.255.192 U 0 0 0 eth0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 ppp0

С линуксом только начал работать. Куда копать не знаю. Помогите.

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

>Не работает у меня. Стоит Ubuntu 9.0.4.

>С линуксом только начал работать. Куда копать не знаю. Помогите.

Судя по таблице маршрутизации по какой-то причине не срабатывает сценарий dhclient-ufanet.

Попробуйте перезапустить настройку сети:
/etc/init.d/networking restart

Если не сработает - ещё раз сверьтесь со статьёй и проверьте, чтобы все сценарии имели бит исполнимости.

Вообще мне ещё не сообщали об успешном использовании статьи для Debian-образных дистрибутивов, отличных от самого Debian. Возможно что-то в статье не сработает в Ubuntu.

Сергей комментирует...

>Судя по таблице маршрутизации по какой-то причине не срабатывает сценарий dhclient-ufanet.

>Если не сработает - ещё раз сверьтесь со статьёй и проверьте, чтобы все сценарии имели бит исполнимости.

Всё проверил не один раз. Но теперь буду пробовать с dhclient-ufanet

Сергей комментирует...

Попробовал ещё раз запустить 2 соединения. Не получилось. Вот мои логи http://rapid.ufanet.ru/9962609. Может кто нибудь посмотрит и сможет разобраться в чем проблема?

P.S. В стать е есть опечатка написано cp /sbin/dhclient-script /root/bin/dhclient/ufanet, а как я понимаю должно быть cp /sbin/dhclient-script /root/bin/dhclient-ufanet
Не dhclient/ufanet а dhclient-ufanet.

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

>Попробовал ещё раз запустить 2 соединения. Не получилось. Вот мои логи

Во-первых, непонятно зачем вы поставили BIND (named). Если он нужен - настройте его соответствующим образом.

Ещё при загрузке системы выдаётся такое предупреждение:
[ 21.481499] type=1503 audit(1242920830.899:11): operation="inode_permission" requested_mask="x::" denied_mask="x::" fsuid=0 name="/root/bin/dhclient-ufanet" pid=2044 profile="/sbin/dhclient3"

Я поискал об этом информацию - это сообщение выдаёт система безопасности AppArmor. Может быть несколько решений:
1. отключить эту систему,
2. добавить в AppArmor правило, разрешающее запуск /root/bin/dhclient-ufanet,
3. попробовать переместить скрипт туда, откуда он запустится.

Про AppArmor подробнее написано здесь - https://help.ubuntu.com/community/AppArmor, правда на английском.

The W комментирует...

Всётаки смог настроить интернет по данному мануалу. Автору большая благодарность.

ОС: Linux Mint 7 RC1

В файле /root/bin/dhclient-ufanet пришлось явно прописать IP адреса DNS и VPN серверов (как в приаттаченом примере где оно почему-то закомментировано), так же и в /etc/network/if-up.d/ufanet

По поводу последнего, при рестарте сети получаю:
...
Error: an inet address is expected rather than "dev".
Error: an inet address is expected rather than "dev".
Error: an inet address is expected rather than "dev".
run-parts: /etc/network/if-up.d/ufanet exited with return code 1
...

Но всё вроде бы работает... Моск отключается, давно не спал, ухожу в hibernate

W.

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

>Всётаки смог настроить интернет по данному мануалу. Автору большая благодарность.

>ОС: Linux Mint 7 RC1

И Вам спасибо за ценную информацию, что мануал с некоторыми доработками применим в Linux Mint.

>В файле /root/bin/dhclient-ufanet пришлось явно прописать IP адреса DNS и VPN серверов (как в приаттаченом примере где оно почему-то закомментировано), так же и в /etc/network/if-up.d/ufanet

Сценарий /etc/network/if-up.d/ufanet больше не нужен, с тех пор как появился /root/bin/dhclient-ufanet. Явное прописывание IP работает, но я стремился сделать сценарий универсальным настолько, чтобы он срабатывал даже если вдруг изменятся настройки выдаваемые по DHCP и изменится IP-адрес VPN-сервера.

>По поводу последнего, при рестарте сети получаю:
>...

Удалите его, он уже не нужен.

The W комментирует...

Сегодня буду делать переразбивку HDD и переустановку системы. Буду поднимать всё с нуля, со свежей головой. Об успехах/неудачах отпишу.

Ещё, как автору статьи на ufaman.ru, я бы посоветовал связатся с ребятами из Ufanet и попросить разместить (!)прямо на ufaman.ru нужные пакеты. Я не единственный кто столкнулся с рекурсией вида "чтобы подключится к интернет нужно скачать пакет из интернет" =) Было бы просто замечательно и универсально.

>Явное прописывание IP работает, но я стремился сделать сценарий универсальным настолько, чтобы он срабатывал даже если вдруг изменятся настройки выдаваемые по DHCP и изменится IP-адрес VPN-сервера.
>можно указать адрес vpn-сервера сразу по ip, он никогда не изменится, использовать тут dns нет необходимости.

Стабильнее и быстрее =)

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

>Сегодня буду делать переразбивку HDD и переустановку системы. Буду поднимать всё с нуля, со свежей головой. Об успехах/неудачах отпишу.

Ок.

>Ещё, как автору статьи на ufaman.ru, я бы посоветовал связатся с ребятами из Ufanet и попросить разместить (!)прямо на ufaman.ru нужные пакеты.

Нужные пакеты должны быть на установочном диске. Если же настолько хочется всё-таки скачать, то скачать их можно с моего зеркала репозиториев Debian, который я содержу специально для пользователей Уфанета http://ufadeb.homelinux.org/debian/pool/

>Я не единственный кто столкнулся с рекурсией вида "чтобы подключится к интернет нужно скачать пакет из интернет" =) Было бы просто замечательно и универсально.

И ещё это полезно для создания из системы помойки: в дистрибутиве Linux Mint ставить пакеты из дистрибутива Debian GNU/Linux.

>можно указать адрес vpn-сервера сразу по ip, он никогда не изменится, использовать тут dns нет необходимости.

>Стабильнее и быстрее =)

Знаем мы эту стабильность. До 1 июня ничто не предвещало смены форума в Уфанет, а тут бац - и поменяли. Можете делать как считаете нужным, я хозяин только в своей системе и в чужие не лезу :P

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

Случайно промахнулся кнопкой и отклонил сообщение от The W. Исправляю свою ошибку и копипащу его комментарий:

Система удачно переставлена, и уже не RC а релиз. Всё работает хорошо, при правильном использовании. Так же, как и раньше, пришлось в файле /root/bin/dhclient-ufanet явно прописать IP адреса DNS и VPN серверов. Без этого сетевой интерфейс почемуто не поднялся вообще (копать не стал).

Т.к. работает на Linux Mint 7 Gloria, с вероятностью в 99% можно сказать что будет работать на Ubuntu 9.04 Jaunty Jackalope

Неприятный момент возникает при повторной попытке подключения уже подключенного соединения. Подключение зацикливается с "CHAP authentication failed: Login incorrect", отключение сопровождается реальным отключением запущенного и отваливанием второго (в ifconfig интерфейс остаётся, он был локалкой, пинг ufanet.ru давал unknown host). Лечится kiilall pppd. Разбиратся нет настроения, да и опыта... (хотя под руководством автора можно покопать, если ему это интересно)

А так всё стабильно работает.
Автору ещё раз благодарность и удачь в делах.

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

Для Ubuntu, похоже, без доработки напильником не работает. Судя по отзывам - AppArmor блокирует выполнение сценария /root/bin/dhclient-ufanet.

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

Спасибо за отзыв, удачи.

Анвар комментирует...

Добрый день! У меня Ubuntu 9.0.4 Проделал все настройки. По началу пропало Eth0, оказалось для Нефекамска (где я живу), DHCP не каканает, нужно ip прописывать в настройках сетевого подключения. В конфиге убрал DHCP автоматом и все заработало. Но только безлимитный локальный поднялся VPN, внешний анлим не идет. Можно поджнять тока свтроенными в ОС утилитами. Помогите разобраться

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

>Добрый день! У меня Ubuntu 9.0.4 Проделал все настройки. По началу пропало Eth0, оказалось для Нефекамска (где я живу), DHCP не каканает, нужно ip прописывать в настройках сетевого подключения.

В Linux как таковом нет никаких "настроек сетевого подключения". Если Вы пользуетесь NetworkManager или wicd, то с их помощью настроить два VPN-подключения Вам скорее всего не удастся. Эти программы предназначены для настройки сети только в типовых случаях.

>В конфиге убрал DHCP автоматом и все заработало.

В /etc/network/interfaces?

>Но только безлимитный локальный поднялся VPN, внешний анлим не идет. Можно поджнять тока свтроенными в ОС утилитами. Помогите разобраться

Если у Вас в сети нет DHCP-сервера (в чём я всё-таки сомневаюсь - проверьте!), тогда в конфиг /etc/init.d/interfaces нужно прописать статические настройки:

auto eth0
iface eth0 inet static
address ваш_IP
netmask ваша_маска
up route add dns/32 gw gate
up route add vpn/32 gw gate

где
dns - IP-адрес вашего локального DNS-сервера,
vpn - IP-адрес вашего VPN-сервера,
gate - IP-адрес вашего маршрутизатора по умолчанию (шлюза).

Анвар комментирует...

Спсибо! За помошь. Но все равно не работает. Кстати у нас в сети DHCP сервера нет, проверил.

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

Анвар, для начала проверьте, что на Ethernet-интерфейсе применились настройки из interfaces, а в таблице маршрутизации появились маршруты для DNS и VPN-серверов.

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

Поднял сабж на ноуте с Ubuntu. Когда кабель воткнут перед загрузкой все работает, но если загрузиться без кабеля или выдернуть при работе, то все вышеописанные симптомы al31f начинают присутствовать и минут через пять у кед вешается плазма

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

Огромное спасибо за Ваш блог.
Поднял сабж на ноуте с Убунтой.
При загрузке системы с воткнутым кабелем все работает, но если какбль не втыкать или выдернуть при работе, то все симптома al31f начинают присутсвовать. Минут через пять у кед вешается плазма.

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

Попробуйте поставить ifplugd и прописать в его настройки уфанетовский интерфейс, чтобы при втыкании/вытыкании кабеля автоматически выполнялись соответствующие ifup и ifdown с настройками интерфейса из /etc/network/interfaces.

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

Большущее спасибо за инструкцию. Обычно применительно к своей системе надо что-нить допиливать, а тут все с полпинка завелось. Просто удивительно и чертовски приятно за свое освободившееся время! У меня ubuntu karmic, так что всем советую! Работает из каропки!

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

У меня такой вопрос. Как осуществить маршрутизацию на сервере домашней сети? Клиентские компы подключены к eth1 с IP 192.168.0.1. В данный момент на сервере поднят squid и один внешний VPN. Хотелось бы настроить таким образом, чтобы все компы могли ходить и в локальную сеть Уфанета и на внешку. Для меня непринципиально, через NAT они будут ходить или через прокси. Посоветуйте что-нибудь, пожалуйста.

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

Чтобы ходить через прокси на домашнем сервере, достаточно настроить на сервере два VPN-подключения, как это описано в статье. Затем на сервере нужно настроить прокси и прописать его в браузерах на других компьютерах.

Чтобы маршрутизировать трафик через домашний сервер, настроить два VPN-подключения в соответствии со статьёй, затем выставить переменную sysctl net.ipv4.conf.all.forwarding=1 и добавить в фаерволл два правила:

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o ppp1 -j MASQUERADE

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

И прописать на остальных компьютерах основным шлюзом адрес 192.168.0.1

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

Спасибо за оперативный ответ. Все работает наилучшим образом через прокси. К сведению: в роли сервера Ubuntu Desktop 9.04. Качает торренты (deluge), смотрим видео (постоянно подключен к большому ТВ), файлохранилищем является (4 ТБ на 4х HDD) и интернет раздает. До прочтения вашей статьи не решался добавлять 2й VPN по принципу работает-не трогай. Спасибо за статью. Очень помогла перебороть мою нерешительность.

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

Очень рад, что всё заработало сразу по статье.

Для управления файлохранилищем посоветовал бы ещё обратить внимание на LVM2 (если уже не используется). Тогда можно будет и новые жёсткие диски на сервер легко добавлять, и удалять имеющиеся и переезжать на новые жёсткие диски прямо на лету.

Я у себя дома объединил на сервере три старых жёстких диска в одну группу томов общим объёмом 520 гигабайт (120 + 160 + 240).

На сервере я в качестве торрентокачалки использовал transmission-daemon, у него достаточно удобный, хоть и простой, веб-интерфейс. Я, правда, в последнее время использую rtorrent - он работает несколько стабильнее и быстрее раздаёт.