>>была такая проблема, решения не нашел, так как иногда они отрубаются, а
>>иногда и нет, в итоге написал скрипт, который раз в пять
>>минут проверяет, и вырубает повисшие соединения.
>
>Была у меня такая-же проблема, но с PPPoE, я её практически решил
>
>http://www.opennet.me/base/net/rp_pppoe.txt.html
>
>Но всё-же иногда, очень редко такая штука(завис pppd) случается... :(
>Поэтому интересно:
>А по какому признаку ты определяешь, что сессия зависла?
>
>Скриптом не поделишься?
у меня частный случай, посему проблему решил так, беру список ppp, так как у нас в системе адреса строго привязаны к пользователю, узнаю pppшный адрес, делаю запрос к биллинговой системе и она выдает мне локальный адрес для этого клиента, затем узнаю netstat-том есть ли подключение по этому адресу по порту vpn сервера, если нету убиваю этот ppp нафиг.
--------------------------
#!/bin/bash
##############################################################################
# Ищем зависшие ppp , а также те соединения которые отрыты не локального ip адреса
# пользователя соединение и прибиваем их нафиг чтобы клиенты смогли зайти
##############################################################################
SUCCESS=0
lockfile=/var/lock/check_ppp
getlocalip=/netup/scripts/getlocalip
if [ -e $lockfile ]
then
exit;
fi
touch $lockfile;
# проверяем не зависло ли соединение
for if_ppp in `ifconfig | grep ppp | cut -d\ -f1 | tr -d " "`
do
# Находим ip адрес данного соединения
if_ppp_ip=""`ifconfig $if_ppp | grep inet | cut -d : -f 3 | cut -d \ -f 1 | tr -d " "`;
if [ "$if_ppp_ip" != "" ]
then
# Проверяем все локальные ип с которых могло быть подключение
flagtokill=1;
for if_ppp_local_ip in ""`$getlocalip $if_ppp_ip`
do
#echo $if_ppp_local_ip;
if [ "if_ppp_local_ip" != "" ]
then
is_connect=""`netstat -anlt | tr -s " " | grep "\:1723 $if_ppp_local_ip\:" | grep ESTABLISHED`;
if [ "$is_connect" != "" ]
then
flagtokill=0;
fi;
fi;
done;
if [ "$flagtokill" == "1" ]
then
# находим ип адрес даного соединения так как пока мы проверяли он мог отрубиться
if_ppp_ip_stop=""`ifconfig $if_ppp | grep inet | cut -d : -f 3 | cut -d \ -f 1 | tr -d " "`;
if [ "$if_ppp_ip_stop" == "$if_ppp_ip" ]
then
echo `date +%b%t%e%t%T`" kill pppd $if_ppp_ip need ip $if_ppp_local_ip" >> /var/log/control.log;
pid_stops=""`cat /var/run/$if_ppp.pid`;
kill -s SIGKILL $pid_stops;
fi;
fi;
fi;
done;
------------------------
основной момент это вызов скрипта $getlocalip
он обращается к биллингу, так что нефакт что данное решение вам подойдет.
хотя решение и громоздкое но отрабатывает довольно шустро.
|