dmg Posted June 17, 2007 Posted June 17, 2007 Доброго времени суток, господа. Наступил на грабли, с которых не могу слезть уже несколько месяцев. Посему сначала выложу все свои скрипты для ясности. ################################################################################ # Файл настроек сервера 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?
egor2fsys Posted June 17, 2007 Posted June 17, 2007 В конец-начало скриптов поставьте вывод в лог и гляньте, а скрипты ли виноваты.
dmg Posted June 17, 2007 Author Posted June 17, 2007 В конец-начало скриптов поставьте вывод в лог и гляньте, а скрипты ли виноваты. спасибо, попробую, но тогда как понять, что не все правила удаляются, а только 1-2 из 4х...? По идее, при выполнении скрипта должны удаляться все..
dmg Posted June 17, 2007 Author Posted June 17, 2007 поставил вывод в лог, буду наблюдать... А не слабовата машина для СТГ у меня? потому что при рестарте сервиса стг могут даже не всем юзерам правила прописаться в iptables... периодически загрузка проца составляет 60 проц - СТГ кушает
egor2fsys Posted June 17, 2007 Posted June 17, 2007 Ну у вас подсчет через QUEUE, при таком способе подсчета если приложению не удасться обсчитать весь объем трафика то оно его не пропустит к клиенту.
dmg Posted June 17, 2007 Author Posted June 17, 2007 Ну у вас подсчет через QUEUE, при таком способе подсчета если приложению не удасться обсчитать весь объем трафика то оно его не пропустит к клиенту. угу, тогда как обойти это ограничение? и "не пропустит" = "удалит правило из iptables"? если при малом кол-ве юзеров все прекрасно работает, может ли причиной являться маленький объем ОЗУ (128мб)? З.Ы. Скриты ОнКоннект и ОнДисконнект при удалении правил не запускались (лог пуст)
egor2fsys Posted June 17, 2007 Posted June 17, 2007 Значит не СТГ виноват в изменении правил фаервола. Проверьте системные демоны и систему в целом. Не пропустит не равно удалит правило. Если демон не успеет обсчитать поток, то пакеты пройдут только тогда, когда приложение их обработает. Посмотрите на загрузку проца при большом кол-ве пользователей. Если она сильно высока, то значит демон не справляется с обработкой пакетов.
dmg Posted June 19, 2007 Author Posted June 19, 2007 причину найти не могу до сих пор, на днях доставлю ОЗУ - посмотрим.. неужели никто не сталкивался? кстати СТГ версии 2.402.9.7
dmg Posted June 20, 2007 Author Posted June 20, 2007 попробуйте поставить в начало скриптов#!/bin/bash эффекта положительного не заметил. Убрал из системы все "лишние" демоны -остался только СТГ, пптпд+система... То же самое... вероятно либо сами иптейблсы гонят, либо я хз :tongue:
Колян Posted June 20, 2007 Posted June 20, 2007 а загрузка проца, оперативы и т.д.? Скинь выхлоп команды топ.
egor2fsys Posted June 20, 2007 Posted June 20, 2007 причину найти не могу до сих пор, на днях доставлю ОЗУ - посмотрим.. неужели никто не сталкивался? кстати СТГ версии 2.402.9.7 По-поводу того что стоит ПППД. Он в момент подключения/отключеняи клиента исполняет скрипты, расположенные в /etc/ppp. Проверьте наличие там скриптов и пустые ли они. Предположение очень как бы шаткое, но других вариантов я не вижу.
Cell Posted June 21, 2007 Posted June 21, 2007 причину найти не могу до сих пор, на днях доставлю ОЗУ - посмотрим.. неужели никто не сталкивался? кстати СТГ версии 2.402.9.7 По-поводу того что стоит ПППД. Он в момент подключения/отключеняи клиента исполняет скрипты, расположенные в /etc/ppp. Проверьте наличие там скриптов и пустые ли они. Предположение очень как бы шаткое, но других вариантов я не вижу. Очень даже реальное предположение т.к. скрипты там вроде бы и простенькие... но если начинать в них втыкать то понимаешь что там куча инклюдов и что там iptables юзается это 100%
dmg Posted June 29, 2007 Author Posted June 29, 2007 причину найти не могу до сих пор, на днях доставлю ОЗУ - посмотрим.. неужели никто не сталкивался? кстати СТГ версии 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 вот это уже ближе к истине, удаляется чаще всего именно форвард у юзеров
vop Posted June 29, 2007 Posted June 29, 2007 В принципе, самудаляться правило не может. Случайно удалить правило без точного его повторения может только удаление по номеру строки. Так-что надо смотреть все скрипты, где удаляется по номеру. P.S. Вообще-то пихать юзеров в корневые цепочки уже давно не кошерно. Похоже, что стг застыл на этом. Сейчас не кошерно вооще юзеров в цепи пихать, ибо для этого давно существует ipset.
dmg Posted June 30, 2007 Author Posted June 30, 2007 В принципе, самудаляться правило не может. Случайно удалить правило без точного его повторения может только удаление по номеру строки. Так-что надо смотреть все скрипты, где удаляется по номеру. P.S. Вообще-то пихать юзеров в корневые цепочки уже давно не кошерно. Похоже, что стг застыл на этом. Сейчас не кошерно вооще юзеров в цепи пихать, ибо для этого давно существует ipset. Удаляться то не может, но... все-таки удалялось т.к. сейчас все пришло в норму, спасибо всем, проблема решена удалением тех строк из скриптов if-up & if-down, которые я приводил в предыдущем посте. З.Ы. Кстати, что именно пытался открывать пппд при поднятии нового интерфейса? Что есть mss?
vop Posted June 30, 2007 Posted June 30, 2007 З.Ы. Кстати, что именно пытался открывать пппд при поднятии нового интерфейса? Что есть mss? Скрипт пппц пытался сначала определить номер правила, а потом пытался удалить это правило по "угаданному" номеру. Учитывая, что все правила втыкались в корневую цепочку, и между первым и вторым старгейзер умудрялся вставить свои 4 правила - номера смещались. В результате пппц удалял не свое правило. В общем, типично FreeBSD'шный подход на линуксе вылазит боком.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now