lalex 0 Опубликовано: 2009-03-25 13:58:45 Share Опубликовано: 2009-03-25 13:58:45 Имею CentOS 5.2 и СТГ 2.4. юзеры ходят в интернет через транспарент прокси, натится несколько портов. несколько человек (5-6 где-то) умудряется качать при выключенном авторизаторе. т.е. стартуют закачку при включенном авторизаторе и, выключаясь, продолжают качать дальше. Самостоятельно воссоздать картину не смог, т.к. авторизатор чётко отрабатывает и меня дисконектит. при наблюдении за качающим юзером я смотрел и видел что скрипт дисконекта отрабатывает и в фаерволе появляются строки iptables -I FORWARD -i $eth_local -s $ip -j DROP iptables -I FORWARD -o $eth_local -d $ip -j DROP соответствующие его адресу и моему интерфейсу, но tcpdump говорит о том, что юзер в это время что-то качет. в подтверждение тому sarg на прокси сервере это доказывает. подскажите пожалуйста, буду рад любой критике. вот настройки СТГ: OnConnect #!/bin/bash # Login LOGIN=$1 #user IP echo=$2 IP=$2 #cash CASH=$3 #user ID ID=$4 test -x /var/stargazer/users/$LOGIN/OnConnect && { /var/stargazer/users/$LOGIN/OnConnect $1 $2 $3; exit 0; }; eth=eth1 eth_local=eth0 mir=xxx.xxx.xxx.xxx iptables -t filter -A INPUT -s $IP -j ACCEPT iptables -t filter -A FORWARD -s $IP -j ACCEPT iptables -t filter -A FORWARD -d $IP -j ACCEPT iptables -t filter -A OUTPUT -d $IP -j ACCEPT iptables -D FORWARD -i $eth_local -s $IP -j DROP while [ $? -eq 0 ] do iptables -D FORWARD -i $eth_local -s $IP -j DROP done iptables -D FORWARD -o $eth_local -d $IP -j DROP while [ $? -eq 0 ] do iptables -D FORWARD -o $eth_local -d $IP -j DROP done iptables -t nat -A POSTROUTING -o $eth -s $IP -p udp -m multiport --dport 21,53,443,25,110,587:27015 -j SNAT --to-source $mir iptables -t nat -A POSTROUTING -o $eth -s $IP -p tcp -m multiport --dport 21,53,443,25,110,587:27015 -j SNAT --to-source $mir iptables -t nat -A PREROUTING -s $IP -d ! 10.111.0.1 -p tcp --dport 80 -j REDIRECT --to-port 3128 iptables -I FORWARD -s $IP -d ! 10.111.0.1 -m connlimit --connlimit-above 20 -j DROP ############################################################# echo "C `date +%Y.%m.%d-%H.%M.%S` $IP $CASH" >> /var/stargazer/users/$LOGIN/connect.log OnDisconnect #!/bin/bash LOGIN=$1 ip=$2 CASH=$3 test -x /var/stargazer/users/$LOGIN/OnDisconnect && { /var/stargazer/users/$LOGIN/OnDisconnect $1 $2 $3; exit 0; }; eth_local=eth0 eth=eth1 mir=xxx.xxx.xxx.xxx iptables -t filter -D INPUT -s $ip -j ACCEPT while [ $? -eq 0 ] do iptables -t filter -D INPUT -s $ip -j ACCEPT done ################################## iptables -t filter -D FORWARD -s $ip -j ACCEPT while [ $? -eq 0 ] do iptables -t filter -D FORWARD -s $ip -j ACCEPT done ################################## iptables -t filter -D FORWARD -d $ip -j ACCEPT while [ $? -eq 0 ] do iptables -t filter -D FORWARD -d $ip -j ACCEPT done ################################## iptables -t filter -D OUTPUT -d $ip -j ACCEPT while [ $? -eq 0 ] do iptables -t filter -D OUTPUT -d $ip -j ACCEPT done ################################# iptables -t nat -D POSTROUTING -o $eth -s $ip -p tcp -m multiport --dport 21,53,443,25,110,587:27015 -j SNAT --to-source $mir while [ $? -eq 0 ] do iptables -t nat -D POSTROUTING -o $eth -s $ip -p tcp -m multiport --dport 21,53,443,25,110,587:27015 -j SNAT --to-source $mir done ################################# iptables -t nat -D POSTROUTING -o $eth -s $ip -p udp -m multiport --dport 21,53,443,25,110,587:27015 -j SNAT --to-source $mir while [ $? -eq 0 ] do iptables -t nat -D POSTROUTING -o $eth -s $ip -p udp -m multiport --dport 21,53,443,25,110,587:27015 -j SNAT --to-source $mir done ################################# iptables -t nat -D PREROUTING -s $ip -d ! 10.111.0.1 -p tcp --dport 80 -j REDIRECT --to-port 3128 while [ $? -eq 0 ] do iptables -t nat -D PREROUTING -s $ip -d ! 10.111.0.1 -p tcp --dport 80 -j REDIRECT --to-port 3128 done iptables -D FORWARD -s $ip -d ! 10.111.0.1 -m connlimit --connlimit-above 20 -j DROP while [ $? -eq 0 ] do iptables -D FORWARD -s $IP -d ! 10.111.0.1 -m connlimit --connlimit-above 20 -j DROP done iptables -I FORWARD -i $eth_local -s $ip -j DROP iptables -I FORWARD -o $eth_local -d $ip -j DROP echo "D `date +%Y.%m.%d-%H.%M.%S` $ip $CASH" >> /var/stargazer/users/$LOGIN/connect.log скрипт, выполняемый перед стартом СТГ #!/bin/bash #external ip wan=ххх.ххх.ххх.ххх #internal ip lan=10.111.0.1 EXT_IFACE=eth1 INT_IFACE=eth0 echo "1" > /proc/sys/net/ipv4/ip_forward # #echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout #echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time #echo 1 > /proc/sys/net/ipv4/tcp_window_scaling #echo 0 > /proc/sys/net/ipv4/tcp_sack #echo 1280 > /proc/sys/net/ipv4/tcp_max_syn_backlog # #echo 1 > /proc/sys/net/ipv4/tcp_syncookies #echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts #echo "65535" > /proc/sys/net/ipv4/ip_conntrack_max modprobe ip_conntrack_ftp modprobe ip_nat_ftp iptables -F iptables -t nat -F iptables -t filter -F iptables -X iptables -t nat -X iptables -t filter -X iptables -t filter -P INPUT DROP iptables -t filter -P FORWARD DROP iptables -t filter -P OUTPUT DROP iptables -t filter -A INPUT -s $wan -j ACCEPT iptables -t filter -A INPUT -d $wan -j ACCEPT iptables -t filter -A OUTPUT -s $wan -j ACCEPT iptables -t filter -A OUTPUT -s $lan -j ACCEPT iptables -t filter -A INPUT -d $lan -j ACCEPT # iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # iptables -A INPUT -m state --state INVALID -j DROP iptables -A FORWARD -m state --state INVALID -j DROP # SYN iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP #new rules #iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP #end #iptables -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP #iptables -N syn-flood #iptables -A syn-flood -m limit --limit 100/second --limit-burst 150 -j RETURN #iptables -A syn-flood -j LOG --log-prefix "SYN flood: " #iptables -A syn-flood -j DROP iptables -A INPUT -p ! icmp -m state --state INVALID -j DROP iptables -A FORWARD -p ! icmp -m state --state INVALID -j DROP iptables -A OUTPUT -p ! icmp -m state --state INVALID -j DROP # UDP iptables -A INPUT -p udp -s 0/0 --dport 135:139 -j DROP #iptables -A INPUT -p udp -s 0/0 --dport 138 -j DROP iptables -A INPUT -p udp -s 0/0 --dport 113 -j REJECT iptables -A INPUT -p udp -s 0/0 --sport 67 --dport 68 -j ACCEPT #SMTP iptables -t filter -A FORWARD -p tcp --dport 25 -j DROP iptables -t filter -A FORWARD -p tcp --sport 25 -j DROP #Microsoft drop iptables -t filter -A FORWARD -p tcp -d 131.107.115.40/32 --dport 443 -j DROP iptables -t filter -A INPUT -p tcp --dport 135:139 -j DROP iptables -t filter -A FORWARD -p udp --dport 135:139 -j DROP iptables -t filter -A INPUT -p tcp --dport 445 -j DROP iptables -t filter -A FORWARD -p udp --dport 445 -j DROP #authorizer iptables -t filter -A INPUT -p udp -s 10.111.0.0/255.255.252.0 -d $lan --dport 5555 -j ACCEPT iptables -t filter -A OUTPUT -p udp -d 10.111.0.0/255.255.252.0 -s $lan --sport 5555 -j ACCEPT #ssh iptables -t filter -A INPUT -p tcp -s 10.111.0.0/255.255.252.0 -d $lan --dport 22 -j ACCEPT iptables -t filter -A OUTPUT -p tcp -d 10.111.0.0/255.255.252.0 -s $lan --sport 22 -j ACCEPT #webmin #iptables -t filter -A INPUT -p tcp -s 10.111.0.0/255.255.252.0 -d $lan -m multiport --destination-port 9999,10000 -j ACCEPT #iptables -t filter -A OUTPUT -p tcp -d 10.111.0.0/255.255.252.0 -s $lan -m multiport --destination-port 9999,10000 -j ACCEPT #www iptables -t filter -A INPUT -p tcp -s 10.111.0.0/255.255.252.0 -d $lan --dport 80 -j ACCEPT iptables -t filter -A OUTPUT -p tcp -d 10.111.0.0/255.255.252.0 -s $lan --sport 80 -j ACCEPT #DHCP iptables -t filter -A INPUT -p udp -s 10.111.0.0/255.255.252.0 -d $lan --dport 67 -j ACCEPT iptables -t filter -A OUTPUT -p udp -d 10.111.0.0/255.255.252.0 -s $lan --sport 67 -j ACCEPT iptables -t filter -A INPUT -p udp -s 10.111.0.0/255.255.252.0 -d $lan --dport 68 -j ACCEPT iptables -t filter -A OUTPUT -p udp -d 10.111.0.0/255.255.252.0 -s $lan --sport 68 -j ACCEPT и конфигурационный файл самого СТГ: ################################################################################ # Файл настроек сервера stargazer # ################################################################################ # Имя лог-файла куда пишутся события LogFile = /var/log/stargazer.log # Имя PID-файла куда пишется идентификатор процесса # По умолчанию /var/run/pid # PIDFile = /var/run/stargazer.pid # Имя файла в котором определяются правила подсчета трафика 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 = 1 # Абонплата снимается в последний (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 = no # Данная опция определяет может ли пользователь получить доступ в интерент # если у него на счету нет денег, но остался предоплаченный трафик # Значения: yes, no FreeMbAllowInet = no # Эта опция определяет что будет писаться в стоимость трафика в detail_stat. # Если у пользователя еще есть предоплаченный трафик и WriteFreeMbTraffCost = no, # то в detail_stat стоимость будет 0. Если у пользователя уже нет # предоплаченного трафика и WriteFreeMbTraffCost = no, то в detail_stat # будет записана стоиость трафика. При WriteFreeMbTraffCost = yes стоимость # трафика будет записана в любом случае. WriteFreeMbTraffCost = no # Необязательный параметр. Указывает снимать полную абонплату у пользователя даже # если он быз заморожен только часть учетного периода. # По умолчанию установлен в no # FullFee=no # Необязательный параметр указывающий показывать на счету и позволять # использовать пользователю абонплату. По умолчанию установлен в yes # ShowFeeInCash=yes # Названия направлений. Направления без названий не будут отображаться в # авторизаторе и конфигураторе. Названия состоящие из нескольких слов должны # быть взяты в кавычки <DirNames> DirName0 = Local DirName1 = Internet </DirNames> # Кол-во запускаемых процессов stg-exec. # Эти процессы отвечают за выполнение скриптов OnConnect, OnDisconnect, ... # Кол-во процессов означает сколько скриптов могут выполнятся одновременно. # Значения: 1...1024 ExecutersNum = 5 # Message Key для stg-exec. # Идентификатор очереди сообщений для выполнятеля скриптов. # Его изменение может понадобится если есть необходимость запустить несколько # экземпляров stg. Если вы не понимаете, что это, не трогайте этот параметр! # Значения: 0...2^32 # Значение по умолчанию: 5555 # ExecMsgKey = 5555 # Путь к директории, в которой находятся модули сервера ModulesPath = /usr/lib/stg # Определяет директорию, в которой будут находится файлы "монитора" # работы сервера. В этой директории будут созданы пустые файлы, время # модификации которых будет меняться примерно раз в минуту. Если какой-то # компонент сервера зависнет, файл(ы) перестанет обновлятся, и по этому # признаку можно определить сбой в работе сервера и при надобности # перезапустить. Если параметр не указан или пустой, мониторинг производится # не будет. Параметр не является обязательным, по умолчанию пустой. # MonitorDir=/var/stargazer/monitor ################################################################################ # 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 # Удалять резервные копии после успешной записи conf/stat # Значения: yes, no # По умолчанию: yes # RemoveBak = yes # Восстанавливать файлы conf/stat из резервных копий при ошибке чтения # Значения: yes, no # По умолчанию: no # ReadBak = no </StoreModule> #<StoreModule store_firebird> # # Адрес сервера БД # server=localhost # # # Путь к БД на сервере или ее алиас # database=/var/stg/stargazer.fdb # # # Имя пользователя БД # user=stg # # # Пароль пользователя БД # password=123456 #</StoreModule> #<StoreModule store_mysql> # # Имя пользователя БД # dbuser = stg # # # Пароль пользователя БД # rootdbpass = 123456 # # # Имя БД на сервере # dbname = stg # # # Адрес сервера БД # dbhost = localhost #</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 = 5555 # Время между посылками запроса пользователю жив ли он # и обновлением данных статистики (секунды) # Значения: 5...600 UserDelay = 15 #Таймаут для пользователя. Если в течение этого времени авторизатор #не отвечает, пользователь будет отключен # Значения: 15...1200 UserTimeout = 65 # Этот параметр определяет что будет передаваться программе InetAccess от сервера # как отстаток предоплаченного трафика # Значения: # FreeMb = 0 - кол-во бесплатных мегабайт в пресчете на цену нулевого направления # FreeMb = 1 - кол-во бесплатных мегабайт в пресчете на цену первого направления # FreeMb = 2 - кол-во бесплатных мегабайт в пресчете на цену второго направления # FreeMb = 3 - кол-во бесплатных мегабайт в пресчете на цену третьего направления # ........................ # FreeMb = 9 - кол-во бесплатных мегабайт в пресчете на цену девятого направления # FreeMb = cash - кол-во денег на которые юзер может бесплатно качать # FreeMb = none - ничего не передавать FreeMb = none </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_ether> # Модуль без параметров </Module> # <Module cap_ipq> # Модуль без параметров # </Module> # Модуль захвата трафика "mod_cap_nf.so" # Принимает информацию о трафике по протоколу NetFlow # Второй параметер - это имя модуля без mod_ в начале и .so в конце # <Module cap_nf> # TCPPort - порт для TCP-соединений # TCPPort = 42111 # UDPPort - порт для UDP-соединений # UDPPort = 42111 # Могут иметь совпадающие значения. # Если параметр не указан - соответствующий порт не "прослушивается". # </Module> # Настройки модуля пингующего пользователей "mod_ping.so" # Второй параметр - это имя модуля без mod_ в начале и .so в конце <Module ping> # Время, в секундах, между пингами одного и того же пользователя # Значения: 10...3600 PingDelay = 15 </Module> # # Настройки модуля для удаленного выполнения скриптов OnConnect и # # OnDisconnect "mod_remote_script.so" # # Второй параметр - это имя модуля без mod_ в начале и .so в конце # <Module remote_script> # # # Время, в секундах, между посылками подтверждений, того, что пользователь # # всё еще онлайн # # Значения: 10...600 # SendPeriod = 15 # # # Соответствие подсетей, в которой находится пользователь и # # соответствующего роутера. Первая часть строки - подсеть, заданная # # как IP-адрес и маска, через пробел - IP-адрес роутера на котором # # должны выполняться скрипты # # Например эта запись "192.168.1.0/24 192.168.1.1" означает, что для # # всех пользователей из подсети 192.168.1.0/24, скрипты будут # # выполняться на роутере с адресом 192.168.1.1 # # Subnet0...Subnet100 # Subnet0 = 192.168.1.0/24 192.168.1.7 # Subnet1 = 192.168.2.0/24 192.168.2.5 # Subnet2 = 192.168.3.0/24 192.168.2.5 # Subnet3 = 192.168.4.0/24 192.168.2.5 # # # Пароль для шифрования пакетов между stg-сервером и сервером, # # выполняющим скрипты # Password = 123456 # # # Этот параметр определяет какие параметры пользователя передаются # # на удаленный сервер # # Cash, FreeMb, Passive, Disabled, AlwaysOnline, TariffName, NextTariff, Address, # # Note, Group, Email, RealName, Credit, EnabledDirs, Userdata0...Userdata9 # UserParams=Cash Tariff EnabledDirs # # # Порт по которому сервер отсылает сообщения на роутер # # Значения: 1...65535 # Port = 9999 # # </Module> # <Module radius> # Password = 123456 # ServerIP = 127.0.0.1 # Port = 6666 # AuthServices = Login-User # AcctServices = Framed-User # </Module> </Modules> ################################################################################ З.Ы. Хочу остановить это беспредел, пока ситуация не достигла угрожающего масштаба Ссылка на сообщение Поделиться на других сайтах
Serjio 19 Опубліковано: 2009-03-25 17:06:48 Share Опубліковано: 2009-03-25 17:06:48 это из-за сквида, делай правила блокирующие пользователя при выполнении OnDisconnect. Ссылка на сообщение Поделиться на других сайтах
lalex 0 Опубліковано: 2009-03-25 17:11:23 Автор Share Опубліковано: 2009-03-25 17:11:23 это из-за сквида, делай правила блокирующие пользователя при выполнении OnDisconnect. так дело в том, что все правила добавляющиеся в скрипте конекта, убираются в скрипте дисконекта и добавляется форвардное правило блокирующее адрес, с которого был инициирован дисконект. Ссылка на сообщение Поделиться на других сайтах
fernir 0 Опубліковано: 2009-03-27 14:16:35 Share Опубліковано: 2009-03-27 14:16:35 Вопрос номер раз: Политика по умолчанию в INPUT OUTPUT FORWARD? Логично что она будет DROP, но всетаки. Да, я видел в основном скрипте файрвола, но всетаки. Просто ты принудительно прописываешь пользователю DROP, а поидее хватает дефолтных политик. iptables -t filter -P INPUT DROPiptables -t filter -P FORWARD DROP iptables -t filter -P OUTPUT DROP Просто вот это: iptables -I FORWARD -i $eth_local -s $ip -j DROP iptables -I FORWARD -o $eth_local -d $ip -j DROP Никак не влияет на соединение с проксей. Посомтри, где может быть утечка... watch -n1 'netstat -a -n -p -t | grep 10.0.0.13 & netstat-nat -n | grep 10.0.0.13 & iptables -L -v -n -x | grep 10.0.0.13' Чтонибудь типа вот этого... Покажи кусок выхлопа tcpdump, непонятно через что именно юзер тянет. Смутные подозрения в области прозрачности прокчика... Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВхід
Уже зарегистрированы? Войдите здесь.
Войти сейчас