Jump to content

СТГ+iptables = глюк


Recommended Posts

Доброго времени суток, господа. Наступил на грабли, с которых не могу слезть уже несколько месяцев. Посему сначала выложу все свои скрипты для ясности.

 


################################################################################
#                        Файл настроек сервера stargazer                       #
################################################################################



# Имя лог-файла куда пишутся события
LogFile = /var/log/stargazer.log



# Имя файла в котором определяются правила подсчета трафика
Rules = /etc/stargazer/rules



# Время через которое пишется d БД детальная статистика пользователя
# Значения: 1, 1/2, 1/4, 1/6.
# 1 - раз в чаc, 1/2 - раз в пол часа, 1/4 - раз в 15 мин, 1/6 - раз в 10 мин
DetailStatWritePeriod=1/6



# Периодичность записи записи в БД информации о статистике пользователя (минуты)
# При большом кол-ве пользователей эту величину стоит увеличить, т.к.
# запись в БД может занимать длительное время.
# Значения: 1...1440 (минуты)
StatWritePeriod = 10



# День снятия абонплаты
# Значения: 0...31. 0 - Последний день месяца
DayFee = 27



# Абонплата снимается в последний (yes) или первый (no) день учетного периода.
# Это влияет на то, как будет снята абонплата (АП) при переходе на новый тариф.
# Если у пользователя был тариф A с АП=100 и он хочет перейти на тариф B с АП=200,
# то при переходе на новый тариф со счета пользователя снимется 100, если
# DayFeeIsLastDay = yes и 200, если DayFeeIsLastDay = no
DayFeeIsLastDay = no



# День сброса данных о трафике за месяц и день перехода пользователей на новые тарифы
# Значения: 0...31. 0 - Последний день месяца
DayResetTraff = 1



# "Размазанное" снятие абонплаты. Снятие АП не раз в месяц, а каждый
# день 1/30 или 1/31 части АП
# Значения: yes, no
SpreadFee = yes



# Данная опция определяет может ли пользователь получить доступ в интерент
# если у него на счету нет денег, но остался предоплаченный трафик
# Значения: yes, no
FreeMbAllowInet = no



# Эта опция определяет что будет писаться в стоимость трафика в detail_stat.
# Если у пользователя еще есть предоплаченный трафик и WriteFreeMbTraffCost = no,
# то в detail_stat стоимость будет 0. Если у пользователя уже нет
# предоплаченного трафика и WriteFreeMbTraffCost = no, то в detail_stat
# будет записана стоиость трафика. При WriteFreeMbTraffCost = yes стоимость
# трафика будет записана в любом случае.
WriteFreeMbTraffCost = no



# Названия направлений. Направления без названий не будут отображаться в
# авторизаторе и конфигураторе. Названия состоящие из нескольких слов должны
# быть взяты в кавычки
<DirNames>
   DirName0 = INET
   DirName1 = FREE
   DirName2 =
   DirName3 =
   DirName4 =
   DirName5 =
   DirName6 =
   DirName7 =
   DirName8 =
   DirName9 =
</DirNames>



# Кол-во запускаемых процессов stg-exec.
# Эти процессы отвечают за выполнение скриптов OnConnect, OnDisconnect, ...
# Кол-во процессов означает сколько скриптов могут выполнятся одновременно.
# Значения: 1...1024
ExecutersNum = 100



# Message Key для stg-exec.
# Идентификатор очереди сообщений для выполнятеля скриптов.
# Его изменение может понадобится если есть необходимость запустить несколько
# экземпляров stg. Если вы не понимаете, что это, не трогайте этот параметр!
# Значения: 0...2^32
# Значение по умолчанию: 5555
# ExecMsgKey = 5555



# Путь к директории, в которой находятся модули сервера
ModulesPath = /usr/lib/stg



################################################################################
# Store module
# Настройки плагина работающего с БД сервера

# Второй параметр - это имя модуля без mod_ в начале и .so в конце
# Т.е. полное имя модуля mod_store_files.so
<StoreModule store_files>

   # Рабочая директория сервера, тут содержатся данные о тарифах, пользователях,
   # администраторах и т.д.
   WorkDir = /var/stargazer


   # Владелец, группа и права доступа на файлы статистики (stat) пользователя
   ConfOwner = root
   ConfGroup = root
   ConfMode = 600


   # Владелец, группа и права доступа на файлы конфигурации (conf) пользователя
   StatOwner = root
   StatGroup = root
   StatMode = 640

   # Владелец, группа и права доступа на лог-файлы (log) пользователя
   UserLogOwner = root
   UserLogGroup = root
   UserLogMode = 640

</StoreModule>



################################################################################
# Прочие модули

<Modules>

   # Настройки плагина авторизации Always Online "mod_auth_ao.so"
   # Второй параметр - это имя модуля без mod_ в начале и .so в конце
   # Т.е. полное имя модуля mod_auth_ao.so
   <Module auth_ao>
   </Module>



   # Настройки плагина авторизации InetAccess "mod_auth_ia.so"
   # Второй параметр - это имя модуля без mod_ в начале и .so в конце
   # Т.е. полное имя модуля mod_auth_ia.so
   <Module auth_ia>

       # Порт на котором принимаются обращения от авторизатора
       # Значения: 1...65534
       Port = 4444


       # Время между посылками запроса пользователю жив ли он
       # и обновлением данных статистики (секунды)
       # Значения: 5...600
       UserDelay = 15


       #Таймаут для пользователя. Если в течение этого времени авторизатор
       #не отвечает, пользователь будет отключен
       # Значения: 15...1200
       UserTimeout = 65


       # Этот параметр определяет что будет передаваться программе InetAccess от сервера
       # как отстаток предоплаченного трафика
       # Значения:
       # FreeMb = 0 - кол-во бесплатных мегабайт в пресчете на цену нулевого направления
       # FreeMb = 1 - кол-во бесплатных мегабайт в пресчете на цену первого направления
       # FreeMb = 2 - кол-во бесплатных мегабайт в пресчете на цену второго направления
       # FreeMb = 3 - кол-во бесплатных мегабайт в пресчете на цену третьего направления
       # ........................
       # FreeMb = 9 - кол-во бесплатных мегабайт в пресчете на цену девятого направления
       # FreeMb = cash - кол-во денег на которые юзер может бесплатно качать
       # FreeMb = none - ничего не передавать
       FreeMb = cash

   </Module>



   # Модули можно использовать несколько раз с разными параметрами
   #<Module auth_ia>
   #    Port = 7777
   #    UserDelay = 15
   #    UserTimeout = 65
   #    FreeMb = 0
   #</Module>



   # Настройки модуля конфигурации SgConfig "mod_conf_sg.so"
   # Второй параметр - это имя модуля без mod_ в начале и .so в конце
   <Module conf_sg>

       # Порт по которому сервер взаимодействует с конфигуратором
       # Значения: 1...65535
       Port = 5555

   </Module>



   # Модуль захвата трафика "mod_cap_ether.so"
   # Второй параметер - это имя модуля без mod_ в начале и .so в конце
   # Без параметров. Только имя модуля.
   <Module cap_ipq>
       # Модуль без параметров
   </Module>



   # Настройки модуля пингующего пользователей "mod_ping.so"
   # Второй параметр - это имя модуля без mod_ в начале и .so в конце
   <Module ping>

       # Время, в секундах, между пингами одного и того же пользователя
       # Значения: 10...3600
       PingDelay = 15

   </Module>

</Modules>
################################################################################

 

 

#OnConnect
ip=$2

iptables -t filter -A INPUT -s $ip -j QUEUE
iptables -t filter -A FORWARD -s $ip -j QUEUE
iptables -t filter -A FORWARD -d $ip -j QUEUE
iptables -t filter -A OUTPUT -d $ip -j QUEUE

 

 

#OnDisconnect
ip=$2

iptables -t filter -D INPUT -s $ip -j QUEUE
while [ $? -eq 0 ]
do
iptables -t filter -D INPUT -s $ip -j QUEUE
done

iptables -t filter -D FORWARD -s $ip -j QUEUE
while [ $? -eq 0 ]
do
iptables -t filter -D FORWARD -s $ip -j QUEUE
done

iptables -t filter -D FORWARD -d $ip -j QUEUE
while [ $? -eq 0 ]
do
iptables -t filter -D FORWARD -d $ip -j QUEUE
done

iptables -t filter -D OUTPUT -d $ip -j QUEUE
while [ $? -eq 0 ]
do
iptables -t filter -D OUTPUT -d $ip -j QUEUE
done

 

 

Скрипт файрволла

 

#!/bin/bash

#clear tables
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X

#block by default
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP

# allow active connection
#iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A FORWARD -s 192.168.3.13/32 -o eth0 -j ACCEPT
iptables -A FORWARD -d 192.168.3.13/32 -i eth0 -j ACCEPT


iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT


iptables -A FORWARD -i eth0 -j DROP
iptables -A FORWARD -o eth0 -j DROP

#allow VPN
iptables -t filter -A INPUT -p tcp -s 10.9.0.0/16 --dport 1723 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp -d 10.9.0.0/16 --sport 1723 -j ACCEPT

#allow GRE
iptables -t filter -A INPUT -p 47 -j ACCEPT
iptables -t filter -A OUTPUT -p 47 -j ACCEPT

#allow other icmp
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A FORWARD -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

#allow lo
iptables -t filter -A INPUT -d 127.0.0.1 -j ACCEPT
iptables -t filter -A OUTPUT -s 127.0.0.1 -j ACCEPT

#DNS resolving
iptables -t filter -A INPUT -p tcp --sport 53 -j ACCEPT
iptables -t filter -A FORWARD -p tcp --sport 53 -j ACCEPT
iptables -t filter -A FORWARD -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --sport 53 -j ACCEPT
iptables -t filter -A FORWARD -p udp --sport 53 -j ACCEPT
iptables -t filter -A FORWARD -p udp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT

# SSH
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --sport 22 -j ACCEPT

# Stargazer configurator
iptables -t filter -A INPUT -p tcp --dport 5555 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --sport 5555 -j ACCEPT

# UDP stargazer InetAccess
iptables -t filter -A INPUT -p udp -s 192.168.3.0/24 --sport 4444 -j ACCEPT
iptables -t filter -A OUTPUT -p udp -d 192.168.3.0/24 --dport 4444 -j ACCEPT

#NAT
iptables -t nat -A POSTROUTING -s 192.168.3.13 -d 0.0.0.0/0 -j MASQUERADE

iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j SNAT --to-source 90.188.134.1

iwconfig wlan0 key restricted xxxxxxxx

 

Итак, есть локалка 10.9.0.0/16 (eth0 на серве), из нее юзера по ВПН коннектятся к серверу, получают IP подсети 192.168.3.0/24 и вопщем-то прекрасно бегают по инету... Траф считается, все красиво... 192.168.3.13 - мой айпи, сижу на ВиФи и вижу локальную сеть (форвард через eth0 и маскарад для этого айпи в скрипте файрволла). Но когда пользователей стало не 10, а 50, периодически из iptables отваливаются правила, произвольно:

 


root@wsgate:/etc# iptables -L | grep 3.31
QUEUE      all  --  192.168.3.31         anywhere
QUEUE      all  --  192.168.3.31         anywhere
QUEUE      all  --  anywhere             192.168.3.31
QUEUE      all  --  anywhere             192.168.3.31
root@wsgate:/etc#

 

 

через определенное время (час-два-три):


root@wsgate:/etc# iptables -L | grep 3.31
QUEUE      all  --  192.168.3.31         anywhere
QUEUE      all  --  anywhere             192.168.3.31
QUEUE      all  --  anywhere             192.168.3.31
root@wsgate:/etc#

 

И все, у человека нет инета... Причем баланс у него положительный. Сначала грешил на то что скрипты не успевает обрабатывать один поток stg-exec, поставил 100 - эффекта нет... По крону запускаю маленький скриптик раз в сутки, но и этого иногда недостаточно - к вечеру слетает инет у некоторых юзеров:

 

killall -9 stargazer
killall -9 pptpd

/etc/stargazer/fw
stargazer
pptpd

 

Конфигурация серва: Селерон 1.4, 128мб ОЗУ... Живет на UBUNTU server (2.6.15-18-686) Крутится апач, самба, дхцп, фтп.

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

Ах да, каждую минуту происходит бэкап баз СТГ...

 

Так вот собственно вопрос: кто сталкивался с чем-либо подобным и как это решать? Кто может удалять правила из iptables?

Link to post
Share on other sites
В конец-начало скриптов поставьте вывод в лог и гляньте, а скрипты ли виноваты.

спасибо, попробую, но тогда как понять, что не все правила удаляются, а только 1-2 из 4х...? По идее, при выполнении скрипта должны удаляться все..

Link to post
Share on other sites

поставил вывод в лог, буду наблюдать... А не слабовата машина для СТГ у меня? потому что при рестарте сервиса стг могут даже не всем юзерам правила прописаться в iptables... периодически загрузка проца составляет 60 проц - СТГ кушает

Link to post
Share on other sites

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

Link to post
Share on other sites
Ну у вас подсчет через QUEUE, при таком способе подсчета если приложению не удасться обсчитать весь объем трафика то оно его не пропустит к клиенту.

угу, тогда как обойти это ограничение? и "не пропустит" = "удалит правило из iptables"? если при малом кол-ве юзеров все прекрасно работает, может ли причиной являться маленький объем ОЗУ (128мб)?

 

З.Ы.

 

Скриты ОнКоннект и ОнДисконнект при удалении правил не запускались (лог пуст)

Link to post
Share on other sites

Значит не СТГ виноват в изменении правил фаервола. Проверьте системные демоны и систему в целом. Не пропустит не равно удалит правило. Если демон не успеет обсчитать поток, то пакеты пройдут только тогда, когда приложение их обработает. Посмотрите на загрузку проца при большом кол-ве пользователей. Если она сильно высока, то значит демон не справляется с обработкой пакетов.

Link to post
Share on other sites

причину найти не могу до сих пор, на днях доставлю ОЗУ - посмотрим.. неужели никто не сталкивался? кстати СТГ версии 2.402.9.7

Link to post
Share on other sites
попробуйте поставить в начало скриптов

#!/bin/bash

эффекта положительного не заметил. Убрал из системы все "лишние" демоны -остался только СТГ, пптпд+система... То же самое... вероятно либо сами иптейблсы гонят, либо я хз :tongue:

Link to post
Share on other sites
причину найти не могу до сих пор, на днях доставлю ОЗУ - посмотрим.. неужели никто не сталкивался? кстати СТГ версии 2.402.9.7

По-поводу того что стоит ПППД. Он в момент подключения/отключеняи клиента исполняет скрипты, расположенные в /etc/ppp. Проверьте наличие там скриптов и пустые ли они. Предположение очень как бы шаткое, но других вариантов я не вижу.

Link to post
Share on other sites
причину найти не могу до сих пор, на днях доставлю ОЗУ - посмотрим.. неужели никто не сталкивался? кстати СТГ версии 2.402.9.7

По-поводу того что стоит ПППД. Он в момент подключения/отключеняи клиента исполняет скрипты, расположенные в /etc/ppp. Проверьте наличие там скриптов и пустые ли они. Предположение очень как бы шаткое, но других вариантов я не вижу.

Очень даже реальное предположение т.к. скрипты там вроде бы и простенькие... но если начинать в них втыкать то понимаешь что там куча инклюдов и что там iptables юзается это 100%

Link to post
Share on other sites
  • 2 weeks later...
причину найти не могу до сих пор, на днях доставлю ОЗУ - посмотрим.. неужели никто не сталкивался? кстати СТГ версии 2.402.9.7

По-поводу того что стоит ПППД. Он в момент подключения/отключеняи клиента исполняет скрипты, расположенные в /etc/ppp. Проверьте наличие там скриптов и пустые ли они. Предположение очень как бы шаткое, но других вариантов я не вижу.

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

 

iptables -o "$PPP_IFACE" --insert FORWARD 1 -p tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu

 

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

 

тааак, при отключении фейса выполняется

 

iptables -L -n -v --line-numbers | grep "TCPMSS.*$PPP_IFACE.*clamp" | cut -f1 -d " " | xargs -n1 -r iptables -D FORWARD

 

вот это уже ближе к истине, удаляется чаще всего именно форвард у юзеров

Link to post
Share on other sites

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

 

P.S. Вообще-то пихать юзеров в корневые цепочки уже давно не кошерно. Похоже, что стг застыл на этом. Сейчас не кошерно вооще юзеров в цепи пихать, ибо для этого давно существует ipset.

Link to post
Share on other sites
В принципе, самудаляться правило не может. Случайно удалить правило без точного его повторения может только удаление по номеру строки. Так-что надо смотреть все скрипты, где удаляется по номеру.

 

P.S. Вообще-то пихать юзеров в корневые цепочки уже давно не кошерно. Похоже, что стг застыл на этом. Сейчас не кошерно вооще юзеров в цепи пихать, ибо для этого давно существует ipset.

Удаляться то не может, но... все-таки удалялось т.к. сейчас все пришло в норму, спасибо всем, проблема решена удалением тех строк из скриптов if-up & if-down, которые я приводил в предыдущем посте.

 

З.Ы.

Кстати, что именно пытался открывать пппд при поднятии нового интерфейса? Что есть mss?

Link to post
Share on other sites

З.Ы.

Кстати, что именно пытался открывать пппд при поднятии нового интерфейса? Что есть mss?

Скрипт пппц пытался сначала определить номер правила, а потом пытался удалить это правило по "угаданному" номеру. Учитывая, что все правила втыкались в корневую цепочку, и между первым и вторым старгейзер умудрялся вставить свои 4 правила - номера смещались. В результате пппц удалял не свое правило. В общем, типично FreeBSD'шный подход на линуксе вылазит боком. :)

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...