LINUX.ORG.RU
ФорумAdmin

CentOS 5.1 + PPTP - подвисшие туннели + странности шейпера


0

0

Поднят сервер на CentOS 5.1 (ядро обновлял из репозиториев после установки - месяца 1.5 назад - древнее 2.6.18, но с кучей патчей/багфиксов, любит рэдхет это дело)

Наблюдаются следующие странности:

1) Подвисшие ppp туннели, интерфейсы - не подняты, ИП - не выданы, pppd - висят, но их PID среди /var/run/ppp*.pid нет (как и файлов для соответствующих интерфейсов, и radattr.pppX для данных интерфейсов). И, ессно, данные процессы жрут системные ресурсы, причем - очень нехило (после их килла в кол-ве около 170 штук загрузка ядер упала с 200% (дуалкор, показания по SNMP) до 80%, load average - с 200 до 3... Пока нагрузка была не такой большой - проблемы так активно не вылазили, сейчас при вечернем онлайне порядка 500 человек - стали вылазить через пару суток аптайма.

В логи при килле гадит следующее:

Dec 18 00:17:35 server3 pppd[17070]: ioctl(TIOCSETD, N_TTY): Interrupted system call (line 562)
Dec 18 00:17:35 server3 pppd[17070]: tcsetattr: Invalid argument (line 1001)
Dec 18 00:17:35 server3 pppd[17070]: Exit.
Гугл ничего толкового не дал, мессага tcsetattr: Invalid argument (line 1001) встречается в логах только при принудительном киллянии повисшего процесса.

Версия poptop - 1.3.4, pppd - 2.4.4 (шел в дистре)

2) Странности с шейпером (исходящий шейпер - основан на маркировке пакетов iptables и последующем их заворачивании в классы tc) - при дисконнекте не все правила iptables уничтожаются, иногда бывает, что 1-2 правила остаются из 3. К слову, данный скрипт на федоре 9 (ядро 2.6.23) крашил систему при выполнении не в дебаг-режиме через терминал (когда его отлаживал, пускал вручную), при этом в дебаг-режиме баша - работал четко, ессно - ставить его на ifup/ifdown на работающей машине без резерва побоялся...

Посему - вопрос: кто с подобным сталкивался и как с этим бороться?

pptpd.conf:

option /etc/ppp/options.pptpd
logwtmp
delegate
connections 2000
options.pptpd
name pptpd
require-mschap
require-chap
ms-dns 10.255.0.2
ms-dns 10.255.0.12
lock
nobsdcomp
novj
novjccomp
nologfd
lcp-echo-interval 2
lcp-echo-failure 12
default-asyncmap
plugin radius.so
plugin radattr.so

Мои скрипты шейпера:

# cat ip-up.local

#!/bin/sh

debug=0;
INPUT=eth0;
UBURST="burst 512k"
DBURST="burst 64k"

if [ -f /var/run/radattr.$1 ]
then
   PPPNUM=`echo $1|sed 's/ppp//'|awk '{printf "%03d",$1}'`
#   IP=$5
#   echo $IP >/var/run/shaper/$1
   QDISC_ETH=`tc qdisc show dev $INPUT|grep -v sfq|awk '{print $2}'`
   DOWNSPEED=`/bin/awk  '/PPPD-Downstream-Speed-Limit/ {print $2}'  /var/run/radattr.$1`
   UPSPEED=`/bin/awk  '/PPPD-Upstream-Speed-Limit/ {print $2}'  /var/run/radattr.$1`
   FILTERS=`/bin/awk  '/Filter-Id/ {print $2}'  /var/run/radattr.$1`

   if [ "$QDISC_ETH" != "htb" ];
   then
     tc qdisc del dev $INPUT root >/dev/null
     tc qdisc add dev $INPUT root handle 1: htb default 2 r2q 100
     tc class add dev $INPUT parent 1: classid 1:1 htb rate 100mbit ceil 1000mbit burst 1024k cburst 64k prio 2
     tc class add dev $INPUT parent 1: classid 1:2 htb rate 100mbit ceil 1000mbit burst 1024k cburst 64k prio 1
  fi


   if [ w${debug} = w1 ] ; then
     echo "Debug mode" >>/tmp/pptpd
     echo $DOWNSPEED >>/tmp/pptpd
     echo $UPSPEED >>/tmp/pptpd
     echo $FILTERS >>/tmp/pptpd
   fi;

    /sbin/tc qdisc del dev $1 root    > /dev/null
    /sbin/tc qdisc del dev $1 ingress &>/dev/null

##### speed server->client
   if [ "$UPSPEED" != "0" ] ;
   then
     /sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 100
     /sbin/tc class add dev $1 parent 1: classid 1:1 htb rate ${UPSPEED}kbit $UBURST quantum 1514
     /sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${UPSPEED}kbit $UBURST prio 1 quantum 1514
     /sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${UPSPEED}kbit $UBURST prio 2 quantum 1514
     /sbin/tc qdisc add dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 1514
     /sbin/tc qdisc add dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 1514
     /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10
     /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10

#     /sbin/tc filter add dev $1 parent 1: protocol ip prio 10 u32 match ip protocol 6 0xff match u8 0x05 0x0f at 0 match u160x0000 0xffc0 at 2 match u8 0x10 0xff at 33 flowid 1:10
   fi

##### speed client->server
   if [ "$DOWNSPEED" != "0" ] ;
   then
     tc class add dev $INPUT parent 1:1 classid 1:1$PPPNUM htb rate ${DOWNSPEED}kbit $DBURST quantum 1514
     tc class add dev $INPUT parent 1:1$PPPNUM classid 1:2$PPPNUM htb rate ${DOWNSPEED}kbit $DBURST prio 10 quantum 1514
     tc class add dev $INPUT parent 1:1$PPPNUM classid 1:3$PPPNUM htb rate ${DOWNSPEED}kbit $DBURST prio 1 quantum 1514
     tc qdisc add dev $INPUT parent 1:2$PPPNUM handle 2$PPPNUM: sfq perturb 10 quantum 1514
     tc qdisc add dev $INPUT parent 1:3$PPPNUM handle 3$PPPNUM: sfq perturb 10 quantum 1514

     iptables -t mangle -A FORWARD -i $1 -j MARK --set-mark 0x3$PPPNUM
     iptables -t mangle -A FORWARD -i $1 -p icmp -j MARK --set-mark 0x2$PPPNUM
     iptables -t mangle -A FORWARD -i $1 -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x2$PPPNUM

     tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 0x3$PPPNUM fw classid 1:3$PPPNUM
     tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 0x2$PPPNUM fw classid 1:2$PPPNUM
   fi

#### Filters
  if [ w$FILTERS != w ] ;
  then
    echo "filters not supported";
  fi;

 fi



# cat ip-down.local

#!/bin/sh

debug=0;
INPUT=eth0;

if [ -f /var/run/radattr.$1 ]
then
   PPPNUM=`echo $1|sed 's/ppp//'|awk '{printf "%03d",$1}'`
#   IP=$5
   QDISC_ETH=`tc qdisc show dev $INPUT|grep root|awk '{print $2}'`
   DOWNSPEED=`/bin/awk  '/PPPD-Downstream-Speed-Limit/ {print $2}'  /var/run/radattr.$1`
   UPSPEED=`/bin/awk  '/PPPD-Upstream-Speed-Limit/ {print $2}'  /var/run/radattr.$1`
   FILTERS=`/bin/awk  '/Filter-Id/ {print $2}'  /var/run/radattr.$1`


   if [ w${debug} = w1 ] ; then
     echo "Debug mode" >>/tmp/pptpd
     echo $DOWNSPEED >>/tmp/pptpd
     echo $UPSPEED >>/tmp/pptpd
     echo $FILTERS >>/tmp/pptpd
   fi;


##### speed server->client
   if [ "$UPSPEED" != "0" ] ;
   then
     /sbin/tc qdisc del dev $1 root    > /dev/null
   fi

##### speed client->server
   if [ "$DOWNSPEED" != "0" ] ;
   then
     tc filter del dev eth0 parent 1:0 protocol ip prio 1 handle 0x3$PPPNUM fw classid 1:3$PPPNUM
     tc filter del dev eth0 parent 1:0 protocol ip prio 2 handle 0x2$PPPNUM fw classid 1:2$PPPNUM
     tc class del dev $INPUT classid 1:3$PPPNUM
     tc class del dev $INPUT classid 1:2$PPPNUM
     tc class del dev $INPUT classid 1:1$PPPNUM

     iptables -t mangle -D FORWARD -i $1 -j MARK --set-mark 0x3$PPPNUM
     iptables -t mangle -D FORWARD -i $1 -p icmp -j MARK --set-mark 0x2$PPPNUM
     iptables -t mangle -D FORWARD -i $1 -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x2$PPPNUM

   fi

#### Filters
  if [ w$FILTERS != w ] ;
  then
    echo "filters not supported";
  fi;

 fi
★★★★★

внимательно погляди в messages

есть такие дятлы, у которых компьютер (или, что более часто, криво настроенная точка доступа) начинает молотить VPN-запросы, а ответов почему-то не слушает

если один и тот же айпишник стучится без ума и толку, значит наш клиент, гаси его фаерволом

я боролся с такими, выставив максимальное количество подключений (3) на нужный TCP-порт с одного адреса, вот так:

iptables -A INPUT -p tcp --syn --dport 1723 -m connlimit --connlimit-above 3 -j DROP

anonymous
()
Ответ на: комментарий от anonymous

В messages есть стандартные мессаги о коннектах-дисконнектах и о попытках глупых аппаратных роутеров коннектиться не смотря на отказ в авторизации... Иногда - сообщения о том, что Config-Request так и не дождались и потому линк разрывается...

А connlimit - вещь полезная, но это нужно ядро патчить, модуль собирать... Т.к. готовые модули под RHEL5/CentOS 5 я не нашел :(

Попробую еще поюзать accel-pptpd, может он будет более стабильно работать...

NiTr0 ★★★★★
() автор топика
Ответ на: комментарий от NiTr0

попробуй отключить дебаг на pptpd, кроме того он может молотить в сислог сообщения типа "GRE: accepting packet"...

anonymous
()
Ответ на: комментарий от anonymous

Дебаг отключен...

После ограничения соединений с 1 ип за период времени - за почти сутки появилась только 1 сессия. Просмотрел логи - возникла как результат неуспешной аутентификации радиусом, pppd вывел connection terminated но не вывел exit, повис на ioctl(TIOCSETD, N_TTY) - что подтверждают и логи при завершении, и strace. Погуглил - нашел подобное на 2.6.17 у людей, похоже баг модуля ppp...

NiTr0 ★★★★★
() автор топика
Ответ на: комментарий от NiTr0

если в сети много пакетов и идит они непоследовательно, то pptpd скидавает в log facility daemon сообщения, забивая наглухо сислог, новосозданные процессы pppd в этот момент и зависают на том самом ioctl...

ps.кстати в самих исходниках пппшки о подобном где-то было указано

anonymous
()
Ответ на: комментарий от anonymous

В логе ничего сверхъестественного, логируются только коннекты/дисконнекты. А их - не так и много. Да и процессы зависают перед тем, как выдать в лог exit...

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

NiTr0 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.