Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: [FAQ] Авто реконект xl2tp соединения.  (Прочитано 1484 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн mos.lutsk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
[FAQ] Авто реконект xl2tp соединения.
« : 21 Августа 2011, 21:37:37 »
Прошу сильно не пинать так как это мой первый скрипт. Уверен что можно все было сделать в три раза проще, но увы...

И так:
Предположим что Network Manager вы удалили, поставили и настроили xl2tpd пакет, и интернет у вас работает.

Часто бывает что при загрузке системы демон xl2tpd не поднимает соединение с интернетом и потом приходиться в ручную перезапускать его, это связано с тем что на момент попытки соединения с сервером система еще не получила от DHCP свой IP и DNS, но возможны и другие причины.

Я предлагаю удалить xl2tpd из авто запуска и оставить эту задачу для скрипта:

sudo update-rc.d -f xl2tpd remove
Скрипт работает в несколько этапов:
1. При загрузке системы пингует сервер провайдера и только после этого запускает демон.
2. После установки соединения с интернетом каждых 10 секунд проверяет пинги на тестовый адрес(я использую гугл).
3. В случает отсутствия ответов от тестового сервера проверяет физический линк, наличие локального IP, пинги на сервер провайдера, наличие процессов xl2tpd и pppd и в зависимости от ситуации принимает меры.

Я храню скрипт в /etc/init.d
sudo nano /etc/init.d/check-inet
И запускаю его из rc.local
sudo nano /etc/rc.localДобавляем путь к скрипту до "exit 0"
Пример:
(Нажмите, чтобы показать/скрыть)

Не забываем дать скрипту право на исполнение.

Сам скрипт :

#!/bin/bash


DIP=tp.kyivstar.ua # IP или домен провайдера для l2tp подключения
TIP=google.com # IP или домен для проверки интернета
IFACE=eth0 # Физический интерфейс

path=/var/log/ # Путь к логам
name=check_internet # Имя лога
LOGFILE=$path/$name/$name.log

log(){
   message="$(date +"%y-%m-%d %T") $@"
   echo $message
   echo $message >>$LOGFILE
}

while eval ! "ping -c 1 -W 1 $DIP" > /dev/null
do
log "Нету пинга на $DIP"
sleep 1
done
if eval "ping -c 1 -W 1 $DIP" > /dev/null; then
log "Связь с $DIP установлена"
/etc/init.d/xl2tpd start
log "Демон xl2tpd стартует"
    else
log "Нету пинга на $DIP"
fi

while true
do
if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
echo "Интернет работает!"
   else
if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
        log "Интернет работает!"
else
log "Интернет пропал"
sleep 2
ip addr show $IFACE | grep "state DOWN" > /dev/null
                if [ $? -eq 0 ]; then
                        log "Упал линк на $IFACE"
                        while eval "ip addr show $IFACE | grep DOWN > /dev/null"
                        do
                        log "Нету линка"
                        sleep 5
                        done
                        log "Линк поднялся на $IFACE"
                        sleep 5
                        if eval "ip addr show $IFACE | grep inet > /dev/null"; then
                        log "Адрес присвоен на $IFACE"
                        else
                        log "Нету адреса"
                        dhclient $IFACE
                        sleep 3
                        ip addr show $IFACE | grep inet | awk '{print $2}' > /dev/null
                        if [ $? -eq 0 ]; then
                                log "Получен адрес по DHCP"
                                sleep 1
                        else
                                log "Проблема с DHCP клиентом"
killall dhclient
sleep 1
dhclient $IFACE
log "Повторная попытка получить адрес по DHCP"
if eval "ip addr show $IFACE | grep inet > /dev/null"; then
                        log "Адрес присвоен на $IFACE"
                        else
                        log "Остановка скрипта проблема с получение DHCP"
halt
                                fi
                        fi
fi
                else
log "Линк поднят на $IFACE"
                        if eval "ip addr show $IFACE | grep inet > /dev/null"; then
                        log "Адрес присвоен на $IFACE"
                        else
                        log "Нету адреса"
                        dhclient $IFACE
                        sleep 3
                        ip addr show $IFACE | grep inet | awk '{print $2}' > /dev/null
                                if [ $? -eq 0 ]; then
                                log "Получен адрес по DHCP"
                                sleep 1
                                else
                                log "Проблема с DHCP клиентом"
killall dhclient
                                sleep 1
                                dhclient $IFACE
                                log "Повторная попытка получить адрес по DHCP"
                                if eval "ip addr show $IFACE | grep inet > /dev/null"; then
                                log "Адрес присвоен на $IFACE"
                                else
                                log "Остановка скрипта проблема с получение DHCP"
                                halt
                                fi

                                fi

                        fi
                fi

if eval "pgrep xl2tpd > /dev/null"; then
log "Демон xl2tpd уже запущен"
if eval "pgrep pppd > /dev/null"; then
log "Демон pppd уже запущен"
if eval "ping -c 1 -W 1 $DIP" > /dev/null; then
        log "Связь с $DIP установлена"
killall pppd
sleep 1
        /etc/init.d/xl2tpd restart > /dev/null
        log "Рестарт xl2tpd демона"
        sleep 3
        if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
        log "Интернет заработал!"
        fi
        else
        log "Нету пинга на $DIP"
        killall dhclient > /dev/null
        sleep 1
        dhclient $IFACE > /dev/null
        log "Повторная попытка получить адрес по DHCP"
        sleep 3
        if eval "ping -c 1 -W 1 $DIP" > /dev/null; then
        log "Связь с $DIP установлена"
killall pppd
sleep 1
        /etc/init.d/xl2tpd restart > /dev/null
        log "Рестарт xl2tpd демона"
        sleep 3
        if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
        log "Интернет заработал!"
        fi
        else
        log "Нету пинга на $DIP"
        fi
fi
else
log "Не запущен pppd демон"
killall xl2tpd > /dev/null
killall pppd > /dev/null
sleep 1
if eval "ping -c 1 -W 1 $DIP" > /dev/null; then
        log "Связь с $DIP установлена"
        /etc/init.d/xl2tpd start > /dev/null
        log "Cтарт xl2tpd демона"
        sleep 3
        if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
        log "Интернет заработал!"
        fi
        else
        log "Нету пинга на $DIP"
        killall dhclient > /dev/null
        sleep 1
        dhclient $IFACE > /dev/null
        log "Повторная попытка получить адрес по DHCP"
        sleep 3
        if eval "ping -c 1 -W 1 $DIP" > /dev/null; then
        log "Связь с $DIP установлена"
        /etc/init.d/xl2tpd start > /dev/null
        log "Старт xl2tpd демона"
        sleep 3
        if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
        log "Интернет заработал!"
        fi
        else
        log "Нету пинга на $DIP"
        fi

fi
fi
else
log "Не запущен xl2tpd демон"
killall xl2tpd > /dev/null
killall pppd > /dev/null
sleep 1
if eval "ping -c 1 -W 1 $DIP" > /dev/null; then
        log "Связь с $DIP установлена"
        /etc/init.d/xl2tpd start > /dev/null
        log "Cтарт xl2tpd демона"
        sleep 3
        if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
        log "Интернет заработал!"
        fi
        else
        log "Нету пинга на $DIP"
        killall dhclient > /dev/null
        sleep 1
        dhclient $IFACE > /dev/null
        log "Повторная попытка получить адрес по DHCP"
        sleep 3
        if eval "ping -c 1 -W 1 $DIP" > /dev/null; then
        log "Связь с $DIP установлена"
        /etc/init.d/xl2tpd start > /dev/null
        log "Старт xl2tpd демона"
        sleep 3
        if eval "ping -c 1 -W 1 $TIP" > /dev/null; then
        log "Интернет заработал!"
        fi
        else
        log "Нету пинга на $DIP"
        fi

fi
fi
fi
fi
sleep 10
done



« Последнее редактирование: 21 Августа 2011, 22:21:02 от mos.lutsk »

Оффлайн acehd

  • Любитель
  • *
  • Сообщений: 72
    • Просмотр профиля
Re: Авто реконект xl2tp соединения.
« Ответ #1 : 21 Августа 2011, 22:22:17 »
Многие проблемы может решить обычный sleep в начале /etc/init.d/xl2tpd

Оффлайн mos.lutsk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Re: [FAQ] Авто реконект xl2tp соединения.
« Ответ #2 : 21 Августа 2011, 22:30:05 »
Цитировать
Многие проблемы может решить обычный sleep в начале /etc/init.d/xl2tpd
Возможно и так, но sleep у каждого может быть разным. Например у меня dhclient отрабатывает за 2 сек. при загрузке.
А если у кого то за 10 сек. Или у провайдера DHCP сервер нагружен. То как просчитать время sleep.

Оффлайн acehd

  • Любитель
  • *
  • Сообщений: 72
    • Просмотр профиля
Re: [FAQ] Авто реконект xl2tp соединения.
« Ответ #3 : 21 Августа 2011, 22:41:33 »
Ну если считать корнем зла вражеский DHCР-сервер, то можно ограничиться простеньким циклом:
while true; do
ifconfig eth0 | grep -P "inet addr:[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" >/dev/null 2>&1
if [ "$?" -ne "0" ]; then
sleep 5
else
break
fi
done

Оффлайн mos.lutsk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Re: [FAQ] Авто реконект xl2tp соединения.
« Ответ #4 : 21 Августа 2011, 23:08:52 »
Можно и так. Кому как удобней  :)
Основная задача не в запуске демона, а в поднятии связи после разрыва.

Гарри Кашпировский

  • Гость
Re: [FAQ] Авто реконект xl2tp соединения.
« Ответ #5 : 22 Августа 2011, 00:35:32 »
Простите любезно, что не совсем по теме, однако меня интересует возможность управлять l2tp-соединением через interfaces средствами ifup $iface|ifdown $iface. И описанием что-то вроде этого
Код: (/etc/ppp/peers/l2tp) [Выделить]
pty "/usr/sbin/xl2tpd -c /etc/xl2pd.conf -D"
# PPPD options
Код: (/etc/network/interfaces) [Выделить]
auto l2tp
iface l2tp inet ppp
      provider l2tp
      pre-down kill -15 $(cat /var/run/xl2tpd.pid)

Кто-нибудь реализовывал подобную конструкцию? Жутко интересно стало: зачем же передавать управление интерфейсом демону, когда есть штатное средство.

Оффлайн mos.lutsk

  • Автор темы
  • Новичок
  • *
  • Сообщений: 27
    • Просмотр профиля
Re: [FAQ] Авто реконект xl2tp соединения.
« Ответ #6 : 22 Августа 2011, 00:49:15 »
Честно говоря не пробовал, но мысль стоящая.
Мне бы ее несколько дней назад. Тогда б со скриптом не возился, а пробовал бы так реализовать.
Но не факт что получилось бы.

Например у меня проблема заключалась в провайдере, соединение не рвалось, а инет пропадает, в логах чисто, демон работает на все 100% никаких ошибок.

 

Страница сгенерирована за 0.053 секунд. Запросов: 25.