Den_LocalNet 1 474 Опубликовано: 2005-05-12 08:59:15 Share Опубликовано: 2005-05-12 08:59:15 Мануал по Iptables: http://gazette.lrn.ru/rus/articles/iptables-tutorial.html Добавляем сюда свои скрипты. Обязательно приписывать: 1. ОС 2. Файрвол 3. Дополниптельно устанавливаемыем/подгружаемые модули Приветствуется краткое описание. Запрещено: 1. Обсуждать в топике проблемы тех или иных скриптов. Ссылка на сообщение Поделиться на других сайтах
Den_LocalNet 1 474 Опубліковано: 2005-06-04 12:14:55 Автор Share Опубліковано: 2005-06-04 12:14:55 Скрипт OnConnect на FreeBSD для ipfw #Этот скрипт вызывается в момент, когда пользователь #успешно прошел авторизацию на сервере. Задач скрипта - перестроить #файрвол так, что бы пользователь получил доступ в интернет. #В поле Примечание у абонента я устанавливаю скорость по типу 64Kbit/s LOGIN=$1 IP=$2 CASH=$3 ID=$4 SPEED=`cat /var/stargazer/users/$LOGIN/conf | grep 'Note=' | cut -d "=" -f2` fwcmd="/sbin/ipfw -q" cur_date=`date \+\%Y.\%m.\%d` cur_time=`date \+\%H:\%M:\%S` ${fwcmd} pipe `expr $ID + 101` config bw $SPEED ${fwcmd} add `expr $ID + 501` pipe `expr $ID + 101` tcp from any to $IP via rl1 ${fwcmd} add `expr $ID '*' 10 + 10001` allow icmp from $IP to any out via rl1 icmptype 0,3,4,11,12 ${fwcmd} add `expr $ID '*' 10 + 10002` allow ip from $IP to any ${fwcmd} add `expr $ID '*' 10 + 10003` allow ip from any to $IP echo "C `date +%Y.%m.%d-%H.%M.%S` $ID $IP $CASH" >> /var/stargazer/users/$LOGIN/connect.log echo "C `date +%Y.%m.%d-%H.%M.%S` $ID $LOGIN $IP $CASH" >> /var/stargazer/users/allconnect.log echo "<=;$cur_date;$cur_time;$ID;$LOGIN;$IP;$CASH" >> /home/stat/logs/connect.log Скрипт OnDisconnect на FreeBSD для ipfw LOGIN=$1 IP=$2 CASH=$3 ID=$4 fwcmd="/sbin/ipfw" cur_date=`date \+\%Y.\%m.\%d` cur_time=`date \+\%H:\%M:\%S` ${fwcmd} delete `expr $ID + 501` ${fwcmd} delete `expr $ID '*' 10 + 10001` ${fwcmd} delete `expr $ID '*' 10 + 10002` ${fwcmd} delete `expr $ID '*' 10 + 10003` echo "D `date +%Y.%m.%d-%H.%M.%S` $ID $IP $CASH" >> /var/stargazer/users/$LOGIN/connect.log echo "D `date +%Y.%m.%d-%H.%M.%S` $ID $LOGIN $IP $CASH" >> /var/stargazer/users/allconnect.log echo "=>;$cur_date;$cur_time;$ID;$LOGIN;$IP;$CASH" >> /home/stat/logs/connect.log by denz Ссылка на сообщение Поделиться на других сайтах
denz 0 Опубліковано: 2005-10-04 09:52:31 Share Опубліковано: 2005-10-04 09:52:31 Немного обновленая версия скриптов, с ограничением скорости для каждого юзверя... Смотрим: # OnConnect LOGIN=$1 IP=$2 CASH=$3 ID=$4 SPEED=`cat /var/stargazer/users/$LOGIN/conf | grep 'Note=' | cut -d "=" -f2` fwcmd="/sbin/ipfw -q" cur_date=`date \+\%Y.\%m.\%d` cur_time=`date \+\%H:\%M:\%S` # DELETE RULEZ ${fwcmd} delete `expr $ID '*' 10 + 10001` ${fwcmd} delete `expr $ID '*' 10 + 10002` ${fwcmd} delete `expr $ID '*' 10 + 10003` ${fwcmd} delete `expr $ID '*' 10 + 10004` ${fwcmd} delete `expr $ID '*' 10 + 10005` # ADD RULEZ ${fwcmd} pipe `expr $ID + 101` config bw $SPEED ${fwcmd} add `expr $ID '*' 10 + 10001` allow icmp from $IP to any icmptype 0,3,4,11,12 ${fwcmd} add `expr $ID '*' 10 + 10002` pipe `expr $ID + 101` ip from $IP to any via xl0 ${fwcmd} add `expr $ID '*' 10 + 10003` pipe `expr $ID + 101` ip from any to $IP via xl0 ${fwcmd} add `expr $ID '*' 10 + 10004` allow ip from $IP to any ${fwcmd} add `expr $ID '*' 10 + 10005` allow ip from any to $IP # ADD TO LOG echo "<=;$cur_date;$cur_time;$ID;$LOGIN;$IP;$CASH" >> /var/stargazer/users/$LOGIN/connect.log echo "<=;$cur_date;$cur_time;$ID;$LOGIN;$IP;$CASH" >> /home/stat/logs/allconnect.log # OnDisconnect LOGIN=$1 IP=$2 CASH=$3 ID=$4 fwcmd="/sbin/ipfw -q" # TIME FORMAT cur_date=`date \+\%Y.\%m.\%d` cur_time=`date \+\%H:\%M:\%S` # DELETE RULEZ FRO IPFW ${fwcmd} delete `expr $ID '*' 10 + 10001` ${fwcmd} delete `expr $ID '*' 10 + 10002` ${fwcmd} delete `expr $ID '*' 10 + 10003` ${fwcmd} delete `expr $ID '*' 10 + 10004` ${fwcmd} delete `expr $ID '*' 10 + 10005` echo "=>;$cur_date;$cur_time;$ID;$LOGIN;$IP;$CASH" >> /var/stargazer/users/$LOGIN/connect.log echo "=>;$cur_date;$cur_time;$ID;$LOGIN;$IP;$CASH" >> /home/stat/logs/allconnect.log с фаерволом думаю несложно... выглядит это (ipfw show) бриблизительно так: ... 10011 163 14456 allow icmp from 172.12.114.6 to any icmptypes 0,3,4,11,12 10012 1659 181967 pipe 102 ip from 172.12.114.6 to any via xl0 10013 1780 815891 pipe 102 ip from any to 172.12.114.6 via xl0 10014 1659 181967 allow ip from 172.12.114.6 to any 10015 2470 1342574 allow ip from any to 172.12.114.6 10031 7435 683948 allow icmp from 172.12.114.42 to any icmptypes 0,3,4,11,12 10032 11183 1327402 pipe 104 ip from 172.12.114.42 to any via xl0 10033 19096 7432025 pipe 104 ip from any to 172.12.114.42 via xl0 10034 11183 1327402 allow ip from 172.12.114.42 to any 10035 30668 14159607 allow ip from any to 172.12.114.42 10191 1875 172320 allow icmp from 172.12.115.3 to any icmptypes 0,3,4,11,12 10192 6834 886513 pipe 105 ip from 172.12.115.3 to any via xl0 10193 9150 6539362 pipe 105 ip from any to 172.12.115.3 via xl0 10194 6834 886513 allow ip from 172.12.115.3 to any 10195 16292 12879816 allow ip from any to 172.12.115.3 ... Ссылка на сообщение Поделиться на других сайтах
hopeful 0 Опубліковано: 2006-01-13 12:50:57 Share Опубліковано: 2006-01-13 12:50:57 Хочу поделиться опытом настройки скриптов OnConnect OnDisconnect на FreeBSD c ipfilter. Пример простой но работоспособный, демонстрирует только принцип. В стандартный OnConnect нужно добавить: ## Start of IPFilter rules script /sbin/ipf –f - << EOF pass in quick on lnc1 from $IP to any pass out quick on lnc1 from any to $IP EOF ## End of IPFilter rules script Соответственно в стандартный OnDisconnect: ## Start of IPFilter rules script /sbin/ipf –rf - << EOF pass in quick on lnc1 from $IP to any pass out quick on lnc1 from any to $IP EOF ## End of IPFilter rules script Такой способ добавления правил связан с тем, что ipfilter не работает напрямую с номерами правил и символьной подстановкой. Рекомендую так же раз в сутки привести правила FW к исходному состоянию, запустив по крону следующий простой скрипт: #!/bin/sh /sbin/ipnat –CF –f /etc/ipnat.rules /sbin/ipf –Fa –f /etc/ipf.rules Ссылка на сообщение Поделиться на других сайтах
napTu 4 Опубліковано: 2006-04-10 11:38:50 Share Опубліковано: 2006-04-10 11:38:50 Скрипт с примером получения из конфигурации дополнительных данных о пользователе, а также с управлением приоритетами очередей: (freeBSD,ipfw) # Login LOGIN=$1 #user IP IP=$2 #cash CASH=$3 #user ID ID=$4 #получаем из поля DATA0 данные о приоритетах трафика в формате "90,30,5" UDATA0=`grep 'Group=' /usr/stg/var/users/$LOGIN/conf | cut -d '=' -f2` UDATA0=`echo $UDATA0 | tr -d A-Z` UDATA0=`echo $UDATA0 | tr -d a-z` prio1=`echo $UDATA0 | cut -d ',' -f1` prio2=`echo $UDATA0 | cut -d ',' -f2` prio3=`echo $UDATA0 | cut -d ',' -f3` if [ ! $prio1 ] then prio1=90 prio2=30 prio3=5 fi #получаем данные о тарифе и остатке FreeMb trf=`grep 'Tariff=' /usr/stg/var/users/$LOGIN/conf | cut -d '=' -f2` uah=`grep 'FreeMb=' /usr/stg/var/users/$LOGIN/stat | cut -d '=' -f2` uah=`echo $uah | cut -d '.' -f1` ipn=`echo $IP | cut -d '.' -f4` echo "C `date +%Y.%m.%d-%H.%M.%S` $IP $CASH" >> /usr/stg/var/users/$LOGIN/connect.log echo " " > NULL #для хранения текущего состояния пользователя используется файл с номером ID, который запускается также при перезаливке правил IPFW echo "#!/bin/sh" > /usr/stg/usr/user$ID #ifconfig lo0 192.168.55.$ipn/32 add #sleep .1 каждому юзеру отведены доп адреса на lo0, используемые в зависимости от типа трафика #здесь организован доступ к сокс. Для безлима доступность определяется наличием FreeMb. #дополнительный скрипт контроллирует остаток FreeMb if [ $trf != "bezlim" ] then #allow to 1080 echo "ipfw add `expr $ID '*' 10 + 30002` allow ip from $IP to 192.168.55.4 1080 in via rl0" >> /usr/stg/usr/user$ID else if [ $uah -gt 0 ] then echo "ipfw add `expr $ID '*' 10 + 30002` allow ip from $IP to 192.168.55.4 1080 in via rl0" >> /usr/stg/usr/user$ID else echo "ipfw add `expr $ID '*' 10 + 30002` deny ip from $IP to 192.168.55.4 1080 in via rl0" >> /usr/stg/usr/user$ID fi fi #правила разрешающие доступ через rl0 и на прокси echo "ipfw add `expr $ID '*' 10 + 30001` fwd 127.0.0.1,3128 all from $IP to any 80,81,82,8080,8101,8181 in recv rl0" >> /usr/stg/usr/user$ID echo "ipfw add `expr $ID '*' 10 + 30003` allow all from $IP to any in recv rl0" >> /usr/stg/usr/user$ID echo "ipfw add `expr $ID '*' 10 + 30004` allow all from any to $IP out xmit rl0" >> /usr/stg/usr/user$ID #организация отдельных очередей для юзеров #типы трафика: маленькие пакеты - высокий приоритет, http страницы через прокси - средний приоритет, файлы закачек через прокси и прочий трафик не через прокси - низкий приоритет. echo "ipfw queue `expr $ID '*' 10 + 1000` config pipe 1 weight $prio1 queue 20" >> /usr/stg/usr/user$ID echo "ipfw queue `expr $ID '*' 10 + 1001` config pipe 1 weight $prio2 queue 20" >> /usr/stg/usr/user$ID echo "ipfw queue `expr $ID '*' 10 + 1002` config pipe 1 weight $prio3 queue 20" >> /usr/stg/usr/user$ID #доступ на очередь #очередь настроена на пропуск трафика далее по правилам ipfw echo "ipfw add `expr $ID '*' 10 + 40001` queue `expr $ID '*' 10 + 1000` ip from any to $IP,192.168.55.$ipn,192.168.99.$ipn in recv ppp0 iplen 1-555" >> / echo "ipfw add `expr $ID '*' 10 + 40002` queue `expr $ID '*' 10 + 1001` ip from any to 192.168.55.$ipn in recv ppp0 iplen 556-9999" >> /usr/stg/usr/user$ echo "ipfw add `expr $ID '*' 10 + 40003` queue `expr $ID '*' 10 + 1002` ip from any to $IP,192.168.99.$ipn in recv ppp0 iplen 556-9999" >> /usr/stg/usr/u #в дисконнекте не забываем удалить # ipfw queue 100 delete # ipfw queue 200 delete и т.д. #запускаем созданный скрипт sh /usr/stg/usr/user$ID > NULL Ссылка на сообщение Поделиться на других сайтах
egor2fsys 5 Опубліковано: 2006-06-13 13:54:58 Share Опубліковано: 2006-06-13 13:54:58 а как же. политика всех цепочек таблицы filter - DROP OnConnect #!/bin/bash # Login user=$1 ip=$2 cash=$3 eth=<внешний интерфейс> eth_local=<внутренний интерфейс> mir=<IP адрес внешнего интерфейса> iptables -t filter -A INPUT -s $ip -j ACCEPT > /dev/null iptables -t filter -A FORWARD -s $ip -j ACCEPT > /dev/null iptables -t filter -A FORWARD -d $ip -j ACCEPT > /dev/null iptables -t filter -A OUTPUT -d $ip -j ACCEPT > /dev/null iptables -D FORWARD -i $eth_local -s $ip -j DROP > /dev/null while [ $? -eq 0 ] do iptables -D FORWARD -i $eth_local -s $ip -j DROP > /dev/null done iptables -D FORWARD -o $eth_local -d $ip -j DROP > /dev/null while [ $? -eq 0 ] do iptables -D FORWARD -o $eth_local -d $ip -j DROP > /dev/null done iptables -t nat -A POSTROUTING -s $ip -o $eth -j SNAT --to-source $mir > /dev/null OnDisconnect #!/bin/bash user=$1 ip=$2 eth=<внешний интерфейс> eth_local=<внутренний интерфейс> mir=<IP адрес внешнего интерфейса> iptables -t filter -D INPUT -s $ip -j ACCEPT > /dev/null while [ $? -eq 0 ] do iptables -t filter -D INPUT -s $ip -j ACCEPT > /dev/null done iptables -t filter -D FORWARD -s $ip -j ACCEPT > /dev/null while [ $? -eq 0 ] do iptables -t filter -D FORWARD -s $ip -j ACCEPT > /dev/null done iptables -t filter -D FORWARD -d $ip -j ACCEPT > /dev/null while [ $? -eq 0 ] do iptables -t filter -D FORWARD -d $ip -j ACCEPT > /dev/null done iptables -t filter -D OUTPUT -d $ip -j ACCEPT > /dev/null while [ $? -eq 0 ] do iptables -t filter -D OUTPUT -d $ip -j ACCEPT > /dev/null done iptables -t nat -D POSTROUTING -s $ip -o $eth -j SNAT --to-source $mir > /dev/null while [ $? -eq 0 ] do iptables -t nat -D POSTROUTING -s $ip -o $eth -j SNAT --to-source $mir > /dev/null done iptables -I FORWARD -i $eth_local -s $ip -j DROP > /dev/null iptables -I FORWARD -o $eth_local -d $ip -j DROP > /dev/null первоначальная настройка фаервола должна быть произведена самостоятельно; скрипты не претендуют на оригинальность или еще на что-то главное что они работают.... у меня на сервере все наезды пожалуйста адресуйте в /dev/null Ссылка на сообщение Поделиться на других сайтах
Sephiroth. 0 Опубліковано: 2006-07-03 10:04:45 Share Опубліковано: 2006-07-03 10:04:45 Чегото у меня гораздо проще.. ОСь - ASP 9.2 Linux OnConnect /sbin/iptables -t filter -D FORWARD -i eth1 -s $2 -j DROP /sbin/iptables -t filter -D FORWARD -i eth1 -s $2 -j ACCEPT /sbin/iptables -t filter -A FORWARD -i eth1 -s $2 -j ACCEPT /sbin/iptables -t nat -A POSTROUTING -s $2 -d 0/0 -o eth0 -j SNAT --to-source 85.28.208.2 OnDisconnect /sbin/iptables -t filter -D FORWARD -i eth1 -s $2 -j ACCEPT /sbin/iptables -t filter -D FORWARD -i eth1 -s $2 -j DROP /sbin/iptables -t filter -A FORWARD -i eth1 -s $2 -j DROP /sbin/iptables -t nat -D POSTROUTING -s $2 -d 0/0 -o eth0 -j SNAT --to-source 85.28.208.2 Вот ещёбы написал как прозрачность по проще прикрутить..?!) Ссылка на сообщение Поделиться на других сайтах
Septima 0 Опубліковано: 2006-07-10 07:49:33 Share Опубліковано: 2006-07-10 07:49:33 FreeBSD+ipfw2 - простой случай (без зажима скорости): в основном списке правил ipfw add pass tcp from any to any established ipfw add pass tcp from table(1) to any setup OnConnect: ipfw table 1 add ${IP} OnDisconnect: ipfw table 1 delete ${IP} Как собрать ipfw2 на 4.х - читаем man ipfw. Ссылка на сообщение Поделиться на других сайтах
Wapr-Old 0 Опубліковано: 2006-08-30 12:26:41 Share Опубліковано: 2006-08-30 12:26:41 (відредаговано) Продвинутая версия управления через iptables OnConnect: #!/bin/sh #Этот скрипт вызывается в момент, когда пользователь #успешно прошел авторизацию на сервере. Задача скрипта - перестроить #файрвол так, что бы пользователь получил доступ в интернет # ©2003-2006 Wapr Old. Ver 3.0 #Умолчания: При запуске сервера должна быть создана цепочка BILL # с последним правилом -j DROP и в неё должны отправляться все пакеты # для которых необходимо управление доступом. (как минимум из FORWARD) # например так: # iptables -A FORWARD -i $WAN -o $LAN -j BILL # iptables -A FORWARD -i $LAN -o $WAN -j BILL # iptables -A INPUT -p tcp --dport 3128 -i $LAN -j BILL #1. Скрипт проверяет наличие юзерской цепочки по шаблону # BILL_${LOGIN} и если её нет, создает её. #2. В неё при создании добавляются в нужном порядке # разрешающие правила для всех необходимых адресов и критериев # ограничения скорости с возвратом пакетов через -j ACCEPT # Стоит учесть, что сюда попали пакеты ТОЛЬКО данного юзера. #3. В цепочку BILL добавляется вызов юзерской цепочки для всех # входящих и исходящих пакетов данного юзера # iptables -I BILL -s $IP -j BILL_${LOGIN} # iptables -I BILL -d $IP -j BILL_${LOGIN} #4. Для отключения юзера надо удалить только 2 правила в цепочке BILL, # а его цепочка остается на будущее. (так будет) #Отдельная цепочка для каждого юзера сделана для минимизации нагрузки #на сервер при управлении широкими каналами (у меня 2x100Мбит) и исключения #ситуации, когда пакеты одного юзера проходят через все правила всех остальных. # Login LOGIN=$1 #user IP IP=$2 #cash CASH=$3 #user ID ID=$4 DinM=( 31 28 31 30 31 30 31 31 30 31 30 31 ) D=`date '+%Y-%m-%d %H-%M-%S'` Month=${D:5:2} Day=${D:8:2} IPT="/usr/sbin/iptables" sgconf="/sbin/sgconf" bc="/usr/bin/bc" GW2="10.100.100.128" usersconf="/var/stargazer/users/$LOGIN/conf" usersstat="/var/stargazer/users/$LOGIN/stat" tariffs="/var/stargazer/tariffs" abon_key="_abon" anlim_key="anlim_" logfile="/var/log/stargazer-test" if [ ! -e "$usersconf" ]; then echo "ERROR: User file '$usersconf' not found" >> $logfile exit fi TariffName=`cat "$usersconf" | grep "Tariff=" | cut -d"=" -f2` # Сделаем юзерскую цепочку (если нету) if $IPT -N "BILL_$LOGIN" 2>/dev/null; then if [ "_${TariffName#$anlim_key}" != "_${TariffName}" ]; then # анлим найден limit_value=${TariffName:${#anlim_key}:2} # параметр анлима из тарифа # дебильное ограничение скорости limit="-m limit --limit ${limit_value}/s --limit-burst ${limit_value}0" # фильтры для внешней локальной сети без ограничений и в самом начале. $IPT -A "BILL_$LOGIN" -s 10.0.0.0/8 -d $IP -j ACCEPT # т.к. LAN: 10.100.0.0/16 $IPT -A "BILL_$LOGIN" -d 10.0.0.0/8 -s $IP -j ACCEPT # а WAN: 10.0.0.0/8 $IPT -A "BILL_$LOGIN" -s 85.21.29.0/24 -j ACCEPT # далее IP можно не упоминать $IPT -A "BILL_$LOGIN" -d 85.21.28.0/24 -j ACCEPT $IPT -A "BILL_$LOGIN" -s 85.21.52.0/24 -j ACCEPT $IPT -A "BILL_$LOGIN" -d 85.21.52.0/24 -j ACCEPT $IPT -A "BILL_$LOGIN" -s 85.21.79.0/24 -j ACCEPT $IPT -A "BILL_$LOGIN" -d 85.21.79.0/24 -j ACCEPT $IPT -A "BILL_$LOGIN" -s 85.21.88.0/24 -j ACCEPT $IPT -A "BILL_$LOGIN" -d 85.21.88.0/24 -j ACCEPT $IPT -A "BILL_$LOGIN" -s 85.21.90.0/24 -j ACCEPT $IPT -A "BILL_$LOGIN" -d 85.21.90.0/24 -j ACCEPT # всё остальное ограничиваем по скорости $IPT -A "BILL_$LOGIN" $limit -j ACCEPT else # это для тарифов без ограничения скорости # limit="" $IPT -A "BILL_$LOGIN" -j ACCEPT fi fi # Управление локальным файрволом iptables -I BILL -d $IP -j "BILL_$LOGIN" && \ iptables -I BILL -s $IP -j "BILL_$LOGIN" # turn on internet echo "$D Local login='$LOGIN' ip=$IP cash=$CASH" >> $logfile # Управление удалённым файрволом и уведомления об оплате # Проверим, что юзер платит абонплату (в названии его тарифа есть фрагмент "$key") if [ "_${TariffName#$anlim_key}" != "_${TariffName}" -o \ "_${TariffName%$abon_key}" != "_${TariffName}" ]; then if [ $Day -ge $(( ${DinM[$Month]}-2 )) ]; then # осталось меньше 2-х дней Fee=$(cat $tariffs/$TariffName.tf | grep "Fee=" | cut -d"=" -f2) # Узнаем абонплату # echo "$CASH < $Fee = " $(echo "$CASH < $Fee" | bc) # for debug if [ $(echo "$CASH < $Fee" | $bc) != 0 ]; then echo "$sgconf -s 127.0.0.1 -p 5555 -a messenger -w free \ -u $LOGIN -m 'бМХЛЮМХЕ! с бЮЯ МЕ НОКЮВЕМ ЯКЕДСЧЫХИ ЛЕЯЪЖ. \ рЮПХТ: $Fee; нЯРЮРНЙ: $CASH ЕД.'" | at now+1minutes 2>/dev/null fi fi exit # второй роутер отключен # Проверка доступности GW if [ `ping -A -c 2 $GW2 >/dev/null;echo $?` != "0" ]; then echo "$D Error! Gateway $GW2 is inaccessible." >> $logfile $sgconf -s 127.0.0.1 -p 5555 -a messenger -w free -u $LOGIN -m "хГБХМХРЕ, МН ЬКЧГ $GW2 МЕДНЯРСОЕМ. яБ exit fi # Проверка, что юзер уже включен на втором GW already=`ssh $GW2 -l r_main "/sbin/iptables -L BILL | grep $IP" 2>/dev/null` if [ -z $already ]; then # если не включен # Проверим, что баланс > 0 cash=`cat "$usersstat" | grep "Cash=" | grep "-"` if [ -z "$cach" ]; then # если не в минусе ssh $GW2 -l r_main "/sbin/iptables -I BILL -d $IP -j RETURN" ssh $GW2 -l r_main "/sbin/iptables -I BILL -s $IP -j RETURN" echo "$D Remote login='$LOGIN' ip=$IP" >> $logfile fi elif [ -e "/home/$LOGIN/free_always.txt" ]; then echo "$D Remote Find keeped connect from '$LOGIN' ip=$IP" >> $logfile else echo "$D Warning! Double login from $IP" >> $logfile fi fi OnDiconnect: #!/bin/sh #Этот скрипт вызывается в момент, когда пользователь #желает отключится от интернета или вышел таймаут у пользователя #и сервер сам отключает пользователя # Задач скрипта подобна задаче скрипта OnConnect - перестроить #файрвол так, что бы пользователю закрыть доступ в интернет # ©2003-2006 Wapr Old. Ver 3.0 #Умолчания: При запуске сервера должна быть создана цепочка BILL # с последним правилом -j DROP и в неё должны отправляться все пакеты # для которых необходимо управление доступом. (как минимум из FORWARD) # например так: # iptables -A FORWARD -i $WAN -o $LAN -j BILL # iptables -A FORWARD -i $LAN -o $WAN -j BILL # iptables -A INPUT -p tcp --dport 3128 -i $LAN -j BILL # Login LOGIN=$1 #user IP IP=$2 #cash CASH=$3 #user ID ID=$4 D=`date '+%Y-%m-%d %H-%M-%S'` IPT="/usr/sbin/iptables" GW2="10.100.100.128" #ssh_timeout="-o ConnectionTimeout 5" usersconf="/var/stargazer/users/$LOGIN/conf" usersstat="/var/stargazer/users/$LOGIN/stat" key="_abon" anlim_key="anlim_" logfile="/var/log/stargazer-test" if [ ! -e "$usersconf" ]; then echo "ERROR: User file '$usersconf' not found" >> $logfile exit fi TariffName=`cat "$usersconf" | grep "Tariff=" | cut -d"=" -f2` # Управление локальным файрволом $IPT -D BILL -d $IP -j "BILL_$LOGIN" && \ $IPT -D BILL -s $IP -j "BILL_$LOGIN" # turn off internet echo "$D Local logout='$LOGIN' ip=$IP cash=$CASH" >> $logfile # удаление юзерской цепочки # это временно, до появления в сервере переподключения при смене тарифа # или придумывания механизма пересоздания этой цепочки на лету при смене тарифа $IPT -F "BILL_$LOGIN" && $IPT -X "BILL_$LOGIN" exit # Управление удалённым файрволом # Проверим, что юзер платит абонплату (в названии его тарифа есть фрагмент "$key") if [ "_${TariffName#$anlim_key}" != "_${TariffName}" -o \ "_${TariffName%$abon_key}" != "_${TariffName}" ]; then if [ ! -e "/home/$LOGIN/free_always.txt" ]; then ssh $GW2 -T -l r_main "/sbin/iptables -D BILL -d $IP -j RETURN" && \ ssh $GW2 -T -l r_main "/sbin/iptables -D BILL -s $IP -j RETURN" if [ $? != "0" ]; then echo "$D Error! Gateway $GW2 it is inaccessible." >> $logfile exit fi echo "$D Remote logout='$LOGIN' ip=$IP" >> $logfile else echo "$D Remote Keep connect for '$LOGIN' ip=$IP" >> $logfile fi fi Предполагается, что тарифы без абонплаты названы просто "ляляля", а с абонплатой - "ляляля_abon", "жужужу_abon", "anlim_15", "anlim_70"... А также при запуске сервера создаётся цепочка BILL, в которую собираются все пакеты, подлежащие управлению биллингом. ... IPT=/usr/sbin/iptables ... # interfaces LAN="eth1" # my local network iface WAN_1="eth2" # inet from adsl router WAN_2="eth0" # local network corbina WAN_VPN="ppp+" # inet pptp corbina localnet="10.100.0.0/16" ... # billing chain # через эту цепочку проходят все пакеты из/в интернет $IPT -N BILL $IPT -A BILL -j DROP ... # INPUT ##################### $IPT -A INPUT -i lo -j ACCEPT $IPT -A INPUT -p tcp --dport 3128 -i $LAN -j BILL ... # OUTPUT #################### $IPT -A OUTPUT -p tcp --sport 3128 -o $LAN -j BILL # query trough squid ... # FORWARD ################### $IPT -A FORWARD -i $WAN_1 -o $LAN -j BILL $IPT -A FORWARD -i $LAN -o $WAN_1 -j BILL $IPT -A FORWARD -i $WAN_VPN -o $LAN -j BILL $IPT -A FORWARD -i $LAN -o $WAN_VPN -j BILL $IPT -A FORWARD -i $WAN_2 -o $LAN -j BILL $IPT -A FORWARD -i $LAN -o $WAN_2 -j BILL $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT ... Відредаговано 2006-09-13 08:59:01 Wapr-Old Ссылка на сообщение Поделиться на других сайтах
kroc 0 Опубліковано: 2006-12-12 07:55:51 Share Опубліковано: 2006-12-12 07:55:51 Вот решил нарисовать как я использую STG и iptables с проверкой по мак адресу (через поле UserData0) . Система ASPLinux 10 две сетевухи: eth0-локал, eth1 - интернет прокси Squid - непрозрачный NAT -не для всех Основной скрипт Firewall при загрузке. #!/bin/sh # # Copyright © 2006 Evgeniy Murashkin, NVUTC; # IPTABLES="/sbin/iptables" # сбрасываем все рулесы в таблицах filter, nat и mangle. $IPTABLES -F $IPTABLES -t nat -F $IPTABLES -t mangle -F # очищаем все недефолтные (пользовательские) цепочки в таблицах. $IPTABLES -X $IPTABLES -t nat -X $IPTABLES -t mangle -X # устанавливаем политики в таблице filter $IPTABLES -P INPUT DROP $IPTABLES -P FORWARD DROP $IPTABLES -P OUTPUT DROP # устанавливаем политики в таблице nat $IPTABLES -t nat -P PREROUTING ACCEPT $IPTABLES -t nat -P POSTROUTING ACCEPT $IPTABLES -t nat -P OUTPUT ACCEPT # устанавливаем политики в таблице mangle $IPTABLES -t mangle -P PREROUTING ACCEPT $IPTABLES -t mangle -P INPUT ACCEPT $IPTABLES -t mangle -P FORWARD ACCEPT $IPTABLES -t mangle -P OUTPUT ACCEPT $IPTABLES -t mangle -P POSTROUTING ACCEPT # 1. Конфигурация. # 1.1 Internet . INET_IP="x.x.x.x" # ваш внешний интерфейс INET_BROADCAST="x.x.x.x" # ваш бродкаст INET_IFACE="eth1" # 1.2 Local . LAN_IP="192.168.1.8" LAN_IP_RANGE="192.168.1.0/24" LAN_BROADCAST="192.168.1.255" LAN_IFACE="eth0" # 1.3 Localhost Configuration. LO_IFACE="lo" LO_IP="127.0.0.1" ########################################################################### # # 2. Подгружаем модули. # # /sbin/depmod -a # 2.1 Нужные модули /sbin/modprobe ip_tables /sbin/modprobe iptable_filter /sbin/modprobe ip_conntrack /sbin/modprobe ip_conntrack_ftp #/sbin/modprobe ip_conntrack_irc /sbin/modprobe iptable_mangle /sbin/modprobe iptable_nat /sbin/modprobe ipt_LOG /sbin/modprobe ipt_limit /sbin/modprobe ipt_REJECT #/sbin/modprobe ip_queue /sbin/modprobe ipt_state ############################################################ # 3. /proc set up. # 3.1 Устанавливаем флаг форвардинга в 1 (включаем NAT) echo "1" > /proc/sys/net/ipv4/ip_forward ############################################################ # # 4. Устанавливаем Рулесы. ###### # 4.1 таблица Filter # # 4.1.1 Создаем пользовательские цепочки. # $IPTABLES -N all2all $IPTABLES -N common $IPTABLES -N eth0_fwd $IPTABLES -N eth0_in $IPTABLES -N eth1_fwd $IPTABLES -N eth1_in $IPTABLES -N fw2loc $IPTABLES -N fw2net $IPTABLES -N loc2fw $IPTABLES -N loc2net $IPTABLES -N logdrop $IPTABLES -N net2all $IPTABLES -N net2fw $IPTABLES -N newnotsyn $IPTABLES -N reject $IPTABLES -N rfc1918 # 4.1.2 INPUT chain $IPTABLES -A INPUT -i lo -j ACCEPT $IPTABLES -A INPUT -p ! icmp -m state --state INVALID -j DROP $IPTABLES -A INPUT -p tcp -m state --state NEW -m tcp ! --syn -j newnotsyn $IPTABLES -A INPUT -i eth0 -j eth0_in $IPTABLES -A INPUT -i eth1 -j eth1_in $IPTABLES -A INPUT -j common $IPTABLES -A INPUT -j LOG --log-level info --log-prefix "Firewall:INPUT:REJECT:" $IPTABLES -A INPUT -j reject # 4.1.3 FORWARD chain $IPTABLES -A FORWARD -p ! icmp -m state --state INVALID -j DROP $IPTABLES -A FORWARD -p tcp -m state --state NEW -m tcp ! --syn -j newnotsyn $IPTABLES -A FORWARD -i eth0 -j eth0_fwd $IPTABLES -A FORWARD -i eth1 -j eth1_fwd $IPTABLES -A FORWARD -j common $IPTABLES -A FORWARD -j LOG --log-level info --log-prefix "Firewall:FORWARD:REJECT:" $IPTABLES -A FORWARD -j reject # 4.1.4 OUTPUT chain $IPTABLES -A OUTPUT -o lo -j ACCEPT $IPTABLES -A OUTPUT -p ! icmp -m state --state INVALID -j DROP $IPTABLES -A OUTPUT -p tcp -m state --state NEW -m tcp ! --syn -j newnotsyn $IPTABLES -A OUTPUT -o eth0 -j fw2loc $IPTABLES -A OUTPUT -o eth1 -j fw2net $IPTABLES -A OUTPUT -j common $IPTABLES -A OUTPUT -j LOG --log-level info --log-prefix "Firewall:OUTPUT:REJECT:" $IPTABLES -A OUTPUT -j reject # 4.2.1 Создаем правила в цепочках # eth0_in chain $IPTABLES -A eth0_in -j loc2fw # eth0_fwd chain $IPTABLES -A eth1_fwd -p tcp -m state --state NEW -m tcp --tcp-flags SYN,ACK SYN,ACK -j reject $IPTABLES -A eth0_fwd -o eth1 -j loc2net # eth1_in chain $IPTABLES -A eth1_in -p tcp -m state --state NEW -m tcp --tcp-flags SYN,ACK SYN,ACK -j reject $IPTABLES -A eth1_in -m state --state NEW -j rfc1918 $IPTABLES -A eth1_in -j net2fw # eth1_fwd chain $IPTABLES -A eth1_fwd -p tcp -m state --state NEW -m tcp --tcp-flags SYN,ACK SYN,ACK -j reject $IPTABLES -A eth1_fwd -m state --state NEW -j rfc1918 $IPTABLES -A eth1_fwd -o eth0 -j net2all # loc2fw chain (доступ из локалки на этот сервер: Squid и т.д.) # Доступ к Squid открывается скриптом OnDisconnect $IPTABLES -A loc2fw -p icmp -m icmp --icmp-type 8 -j ACCEPT # разрешаем ping $IPTABLES -A loc2fw -p tcp -m state --state NEW -m tcp --dport 53 -j ACCEPT # DNS $IPTABLES -A loc2fw -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT # DNS $IPTABLES -A loc2fw -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT # SSH $IPTABLES -A loc2fw -p udp -m state --state NEW -m udp --dport 5555 -j ACCEPT # avtorizator stargazera $IPTABLES -A loc2fw -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT #FTP $IPTABLES -A loc2fw -p udp -m state --state NEW -m udp --dport 123 -j ACCEPT #time ntpd $IPTABLES -A loc2fw -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT # web на этом сервере $IPTABLES -A loc2fw -m state --state RELATED,ESTABLISHED -j ACCEPT # разрешаем открытые соединения $IPTABLES -A loc2fw -j all2all # loc2net chain # Тут те - кому можно собирать почту и т.д. через NAT $IPTABLES -A loc2net -p icmp -m icmp --icmp-type 8 -j ACCEPT $IPTABLES -A loc2net -p tcp -m state --state NEW -m tcp -s 192.168.1.224 --dport 21 -j ACCEPT #ftp $IPTABLES -A loc2net -p tcp -m state --state NEW -m tcp -s 192.168.1.224 --dport 23 -j ACCEPT $IPTABLES -A loc2net -p tcp -m state --state NEW -m tcp -s 192.168.1.224 --dport 25 -j ACCEPT $IPTABLES -A loc2net -p tcp -m state --state NEW -m tcp -s 192.168.1.224 --dport 110 -j ACCEPT $IPTABLES -A loc2net -p tcp -m state --state NEW -m tcp -s 192.168.1.224 --dport 5190 -j ACCEPT #ICQ $IPTABLES -A loc2net -p tcp -m state --state NEW -m tcp -s 192.168.1.224 --dport 2802 -j ACCEPT #webmoney $IPTABLES -A loc2net -m state --state RELATED,ESTABLISHED -j ACCEPT $IPTABLES -A loc2net -j common $IPTABLES -A loc2net -j LOG --log-level info --log-prefix "Firewall:loc2net:DROP:" $IPTABLES -A loc2net -j DROP # fw2loc chain (пакеты с сервера в локалку) $IPTABLES -A fw2loc -m state --state RELATED,ESTABLISHED -j ACCEPT $IPTABLES -A fw2loc -p icmp -m icmp --icmp-type 8 -j ACCEPT $IPTABLES -A fw2loc -j ACCEPT # fw2net chain (пакеты с сервера в интернет) $IPTABLES -A fw2net -p icmp -m icmp --icmp-type 8 -j ACCEPT $IPTABLES -A fw2net -p udp -m state --state NEW -j ACCEPT $IPTABLES -A fw2net -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT # разрешаем www $IPTABLES -A fw2net -p tcp -m state --state NEW -m tcp --dport 53 -j ACCEPT #dns $IPTABLES -A fw2net -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT $IPTABLES -A fw2net -p udp -m state --state NEW -m udp --dport 123 -j ACCEPT #ntp $IPTABLES -A fw2net -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT $IPTABLES -A fw2net -p tcp -m state --state NEW -m tcp --dport 23 -j ACCEPT $IPTABLES -A fw2net -m state --state RELATED,ESTABLISHED -j ACCEPT $IPTABLES -A fw2net -j common $IPTABLES -A fw2net -j LOG --log-level info --log-prefix "Firewall:fw2net:DROP:" $IPTABLES -A fw2net -j DROP # net2fw chain $IPTABLES -A net2fw -m state --state RELATED,ESTABLISHED -j ACCEPT $IPTABLES -A net2fw -p icmp -m icmp --icmp-type 8 -j ACCEPT $IPTABLES -A net2fw -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT #ftp на серваке извне $IPTABLES -A net2fw -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT #ssh #$IPTABLES -A net2fw -j LOG --log-level info --log-prefix "Firewall:net2fw:DROP:" $IPTABLES -A net2fw -j net2all # net2all chain $IPTABLES -A net2all -m state --state RELATED,ESTABLISHED -j ACCEPT $IPTABLES -A net2all -j common #$IPTABLES -A net2all -j LOG --log-level info --log-prefix "Firewall:net2all:DROP:" #можно вкл. но слишком большие логи $IPTABLES -A net2all -j reject # all2all chain $IPTABLES -A all2all -j common $IPTABLES -A all2all -j LOG --log-level info --log-prefix "Firewall:all2all:REJECT:" $IPTABLES -A all2all -j reject # logdrop chain $IPTABLES -A logdrop -j LOG --log-level info --log-prefix "Firewall:logdrop:DROP:" $IPTABLES -A logdrop -j DROP # newnotsyn chain $IPTABLES -A newnotsyn -j LOG --log-level info --log-prefix "Firewall:newnotsyn:DROP:" $IPTABLES -A newnotsyn -j DROP # reject chain $IPTABLES -A reject -p tcp -j REJECT --reject-with tcp-reset $IPTABLES -A reject -p udp -j REJECT --reject-with icmp-port-unreachable $IPTABLES -A reject -p icmp -j REJECT --reject-with icmp-host-unreachable $IPTABLES -A reject -j REJECT --reject-with icmp-host-prohibited # common chain $IPTABLES -A common -p udp -m multiport --dports 135,137,138,139,445 -j reject $IPTABLES -A common -p tcp -m multiport --dports 113,139,445,135 -j reject $IPTABLES -A common -p udp --dport 1900 -j DROP $IPTABLES -A common -d 255.255.255.255 -j DROP $IPTABLES -A common -d 224.0.0.0/4 -j DROP $IPTABLES -A common -d $INET_BROADCAST -j DROP $IPTABLES -A common -d $LAN_BROADCAST -j DROP # rfc1918 chain $IPTABLES -A rfc1918 -s 255.255.255.255 -j RETURN $IPTABLES -A rfc1918 -m conntrack --ctorigdst 255.255.255.255 -j RETURN $IPTABLES -A rfc1918 -s 169.254.0.0/16 -j DROP $IPTABLES -A rfc1918 -m conntrack --ctorigdst 169.254.0.0/16 -j DROP $IPTABLES -A rfc1918 -s 172.16.0.0/12 -j DROP $IPTABLES -A rfc1918 -m conntrack --ctorigdst 172.16.0.0/12 -j DROP $IPTABLES -A rfc1918 -s 192.0.2.0/24 -j DROP $IPTABLES -A rfc1918 -m conntrack --ctorigdst 192.0.2.0/24 -j DROP $IPTABLES -A rfc1918 -s 192.168.0.0/16 -j DROP $IPTABLES -A rfc1918 -m conntrack --ctorigdst 192.168.0.0/16 -j DROP $IPTABLES -A rfc1918 -s 0.0.0.0/7 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 0.0.0.0/7 -j logdrop $IPTABLES -A rfc1918 -s 2.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 2.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 5.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 5.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 7.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 7.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 10.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 10.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 23.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 23.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 27.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 27.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 31.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 31.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 36.0.0.0/7 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 36.0.0.0/7 -j logdrop $IPTABLES -A rfc1918 -s 39.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 39.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 41.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 41.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 42.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 42.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 49.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 49.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 50.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 50.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 58.0.0.0/7 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 58.0.0.0/7 -j logdrop $IPTABLES -A rfc1918 -s 60.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 60.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 70.0.0.0/7 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 70.0.0.0/7 -j logdrop $IPTABLES -A rfc1918 -s 72.0.0.0/5 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 72.0.0.0/5 -j logdrop $IPTABLES -A rfc1918 -s 83.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 83.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 84.0.0.0/6 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 84.0.0.0/6 -j logdrop $IPTABLES -A rfc1918 -s 88.0.0.0/5 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 88.0.0.0/5 -j logdrop $IPTABLES -A rfc1918 -s 96.0.0.0/3 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 96.0.0.0/3 -j logdrop $IPTABLES -A rfc1918 -s 127.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 127.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 197.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 197.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 198.18.0.0/15 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 198.18.0.0/15 -j logdrop $IPTABLES -A rfc1918 -s 201.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 201.0.0.0/8 -j logdrop $IPTABLES -A rfc1918 -s 240.0.0.0/4 -j logdrop $IPTABLES -A rfc1918 -m conntrack --ctorigdst 240.0.0.0/4 -j logdrop ######## # 5 таблица NAT # # 5.1 Создаем польз. цепочки $IPTABLES -t nat -N eth1_masq # POSTROUTING chain $IPTABLES -t nat -A POSTROUTING -o eth1 -j eth1_masq # 5.2 Создаем правила в польз. цепочках # eth1_masq chain $IPTABLES -t nat -A eth1_masq -s $LAN_IP_RANGE -j SNAT --to-source $INET_IP Скрипт OnConnect. #!/bin/sh # # IPTABLES="/sbin/iptables" # Login LOGIN=$1 #user IP IP=$2 #cash CASH=$3 #user ID ID=$4 LAN_IP="192.168.1.8" # свой адрес сервера с стг usercfg="/var/stargazer/users/$LOGIN/conf" mac=`cat "$usercfg" | grep "Userdata0=" | cut -d"=" -f2` $IPTABLES -D loc2fw -p tcp -m tcp -s $IP -d $LAN_IP --dport 3128 -j DROP if [ -z "$mac"]; then $IPTABLES -I loc2fw 1 -p tcp -m state --state NEW -m tcp -s $IP -d $LAN_IP --dport 3128 -j ACCEPT else $IPTABLES -I loc2fw 1 -p tcp -m state --state NEW -m tcp -s $IP -d $LAN_IP --dport 3128 -m mac --mac-source $mac -j ACCEPT #если надо , добавляем другие правила fi mac адрес берется из строки файла conf если его нет то добавляется правило без mac адреса Скрипт OnDisconnect #!/bin/sh # # IPTABLES="/sbin/iptables" # Login LOGIN=$1 #user IP IP=$2 #cash CASH=$3 #user ID ID=$4 LAN_IP="192.168.1.8" # свой адрес сервера с стг usercfg="/var/stargazer/users/$LOGIN/conf" mac=`cat "$usercfg" | grep "Userdata0=" | cut -d"=" -f2` $IPTABLES -D loc2fw -p tcp -m state --state NEW -m tcp -s $IP -d $LAN_IP --dport 3128 -j ACCEPT $IPTABLES -D loc2fw -p tcp -m state --state NEW -m tcp -s $IP -d $LAN_IP --dport 3128 -m mac --mac-source $mac -j ACCEPT $IPTABLES -I loc2fw 1 -p tcp -m tcp -s $IP -d $LAN_IP --dport 3128 -j DROP Два правила для удаления для того чтобы не получилось граблей типа: при добавлении мак-адреса в поле UserData0 в конфигураторе , когда пользователь включен, правило без мак-адреса может остаться и зависнуть при дисконекте юзера. если какоето из правил удаления не совпадает то оно просто не срабатывает. Есть конечно некоторая шняга при обратном событии - когда админ удаляет юзеру мак-адрес а юзер в онлайне. Тогда из строки файла conf при дисконекте юзера ничего не возьметься и правило с мак-адресом зависнет и будет пускать юзера. на этот случай надо или вырубать юзера перед удалением(изменением) мак адреса, либо в cкрипт OnChange загнать основной скрипт для FW (в начале). Это не есть законченное решение поэтому нельзя использовать это как есть, все надо подгонять под себя. Для прозрачного прокси необходимо кое что добавить и немного переделать 4.1.3 FORWARD chain :-) Если кто захочет обсудить, поправить или уточнить данный скрипт пишите на kroc@newmail.ru или стучитесь в асю 158167510 :loop: :loop: Ссылка на сообщение Поделиться на других сайтах
прывыд 0 Опубліковано: 2007-05-30 19:24:42 Share Опубліковано: 2007-05-30 19:24:42 Вот такое, работать, в принцыпе, должно всюду где есть перл баш и iptables, изначально под линух.... брались идеи из постов повыше.... дорабатывалось по вкусу. считется что все таблицы по умолчанию дроп. все довольно примитивненько. для шейпинга собственно тоже создать немножко нужно... хотя можно и без него.... вот например так: имеем в виду что и iptables и iproute2 собирались с поддержкой коекаких штук (соответсвенно и ядро тоже) хотя можно и без них (esfq например...) поле userdata1 должно сожержать мак, регистр не важен... болванка для шейпера... номера меток нужно ставить побольше, чтобы они не могли случайно совпасть с ID пользователя. #!/bin/bash ipr=/ISP-serv/iproute2/usr/sbin/tc echo "Clear iproute2" $ipr qdisc del dev eth1 root $ipr qdisc del dev eth0 root IN_RATE=12 OUT_RATE=12 LOCAL=70 ceil=14kbps DEV_LAN=eth0 DEV_WAN=eth1 burst=1 echo "= in-LAN ==============================================" echo "Creating root qdisc and class" $ipr qdisc add dev $DEV_LAN root handle 1: htb default 100 $ipr class add dev $DEV_LAN parent 1:0 classid 1:1 htb rate $LOCAL'mbit' burst 150'k' # TOT --------------------------------------------------------- LOCAL echo "Creating class id: 5 for LAN" $ipr class add dev $DEV_LAN parent 1:1 classid 1:5 htb rate $LOCAL'mbit' ceil $LOCAL'mbit' burst 150'k' prio 5 echo "Attach qdisc: esfq to class id: 5 for LAN" $ipr qdisc add dev $DEV_LAN parent 1:5 esfq perturb 5 hash dst echo "Creating filters for class id: 5 for LAN" $ipr filter add dev $DEV_LAN protocol ip parent 1:0 prio 5 handle 5 fw flowid 1:5 # TOT --------------------------------------------------------- LOCAL echo "Creating class id: 100 for LAN" $ipr class add dev $DEV_LAN parent 1:1 classid 1:100 htb rate $LOCAL'mbit' ceil $LOCAL'mbit' burst $burst'k' prio 5 echo "Attach qdisc: esfq to class id: 100 for LAN" $ipr qdisc add dev $DEV_LAN parent 1:100 esfq perturb 5 hash dst echo "Creating filters for class id: 100 for LAN" $ipr filter add dev $DEV_LAN protocol ip parent 1:0 prio 1 handle 100 fw flowid 1:100 echo "= out-LAN ==============================================" echo "Creating root qdisc and class" $ipr qdisc add dev $DEV_WAN root handle 1: htb default 100 $ipr class add dev $DEV_WAN parent 1:0 classid 1:1 htb rate $LOCAL'mbit' burst $burst'k' ############ echo "Creating class id: 100 for WAN" $ipr class add dev $DEV_WAN parent 1:1 classid 1:100 htb rate $LOCAL'mbit' burst $burst'k' prio 5 echo "Attach qdisc: esfq to class id: 100 for WAN" $ipr qdisc add dev $DEV_WAN parent 1:100 esfq perturb 5 hash dst echo "Creating filters for class id: 100 for WAN" $ipr filter add dev $DEV_WAN protocol ip parent 1:0 prio 5 handle 100 fw flowid 1:100 # --------------------------------------------------------- OnConnect #!/bin/bash ### родные переменные, передаваемые биллингом # Login LOGIN=$1 #user IP IP=$2 #cash CASH=$3 #user ID - используется для ограничения скорости ID=$4 ### наши переменные DinM=( 31 28 31 30 31 30 31 31 30 31 30 31 ) D=`date '+%Y-%m-%d %H-%M-%S'` Month=${D:5:2} Day=${D:8:2} IPT="/ISP-serv/iptables/usr/local/sbin/iptables" IPR="/ISP-serv/iproute2/usr/sbin/tc" # в зависимости от версии сервера берем нужный sgconf sgconf="/etc/stargazer/sgconf" bc="/usr/bin/bc" usersconf="/var/stargazer/users/$LOGIN/conf" usersstat="/var/stargazer/users/$LOGIN/stat" tariffs="/var/stargazer/tariffs" unlim_key="unlim_" logfile="/var/log/stargazer-test" DEV_LAN=eth0 DEV_WAN=eth1.39 burst=1 if [ ! -e "$usersconf" ]; then echo "ERROR: User file '$usersconf' not found" >> $logfile exit fi #проверяем есть ли индивидуальный ОнКоннект test -x /var/stargazer/users/$login/OnConnect if [ $? eq 0 ] then /var/stargazer/users/$login/OnConnect exit 0 fi TariffName=`cat "$usersconf" | grep "Tariff=" | cut -d"=" -f2` ### сверяем МАК - не забыть потом убрать в сквиде... ### не забываем, что в биллинг МАК должен быть полностью из заглавных букв ### надо бы поправить, чтобы было все равно... #user MAC MAC1temp=`sed -n 's/Userdata1=//p' /var/stargazer/users/$LOGIN/conf` MAC2temp=`arp $IP | awk '/'$IP'/{print $3}'` MAC1=echo $MAC1temp | tr "[:lower:]" "[:upper:]" MAC2=echo $MAC2temp | tr "[:lower:]" "[:upper:]" #должно быть сравнение а не присваиваение - тобишь '=='? похоже в баше не имеет значения... if [ $MAC1 = $MAC2 ]; then #в добрый путь #открываем файр $IPT -t filter -A INPUT -s $IP -j ACCEPT $IPT -t filter -A FORWARD -s $IP -j ACCEPT $IPT -t filter -A FORWARD -d $IP -j ACCEPT $IPT -t filter -A OUTPUT -d $IP -j ACCEPT echo "C `date +%Y.%m.%d-%H.%M.%S` $IP $CASH " >> /var/stargazer/users/$LOGIN/connect.log ### безлимитный тариф должен называться по шаблону "unlim_xxx" - где 'ххх' - скорость доступа ### в интернет. смотрим если тариф анлим... if [ "_${TariffName#$unlim_key}" != "_${TariffName}" ]; then # анлим найден limit_value=${TariffName:${#unlim_key}:3} # параметр анлима из тарифа # # echo $TariffName $limit_value >> /var/stargazer/users/$LOGIN/connect.log # #маркеруем пакеты $IPT -t mangle -I INPUT -s $IP -j MARK --set-mark $ID $IPT -t mangle -I FORWARD -s $IP -j MARK --set-mark $ID $IPT -t mangle -I FORWARD -d $IP -j MARK --set-mark $ID $IPT -t mangle -I OUTPUT -d $IP -j MARK --set-mark $ID #Unlim - DEV_LAN - ограничиваем на локальном интерфейсе $IPR class add dev $DEV_LAN parent 1:1 classid 1:$ID htb rate $limit_value'kbit' burst $burst'k' prio 2 2>> / connect $IPR qdisc add dev $DEV_LAN parent 1:$ID esfq perturb 5 hash dst 2>> /connect $IPR filter add dev $DEV_LAN protocol ip parent 1:0 prio 1 handle $ID fw flowid 1:$ID 2>> /connect #Unlim - DEV_WAN - ограничиваем на внешнем интерфейсе $IPR class add dev $DEV_WAN parent 1:1 classid 1:$ID htb rate $limit_value'kbit' burst $burst'k' prio 2 2>> / connect $IPR qdisc add dev $DEV_WAN parent 1:$ID esfq perturb 5 hash dst 2>> /connect $IPR filter add dev $DEV_WAN protocol ip parent 1:0 prio 1 handle $ID fw flowid 1:$ID 2>> /connect fi #добавляем запись в лог, при удачной авторизации echo "$D Local login='$LOGIN' ip=$IP cash=$CASH" >> $logfile ### уведомления об оплате ### просто ищем символ '_' в имени тарифа, если его нет - абонплату не проверяем ### в таком случае имена тарифов могут быть любыми. # поставили $Month-1, это правильно, нумерация индексов массива с нуля if [ $(echo `expr "$TariffName" : '.*_.*'`) != 0 ]; then if [ $Day -ge $(( ${DinM[$Month-1]}-3 )) ]; then # осталось меньше 3-х дней Fee=$(cat $tariffs/$TariffName.tf | grep "Fee=" | cut -d"=" -f2) # Узнаем абонплату # echo "$CASH < $Fee = " $(echo "$CASH < $Fee" | bc) # for debug if [ $(echo "$CASH < $Fee" | $bc) != 0 ]; then echo "$sgconf -s 127.0.0.1 -p 4445 -a логин -w пасс \ -u $LOGIN -m ''сообщаем пользователю какой он плохой, и вставляем разные переменные, типа денег вот сколько а надо сколько, плати жадный! " | at now+1mi nutes 2>/dev/null fi fi fi else # если маки не совпадают - болт и досвидания. об чем пишем в лог echo "ERROR `date +%Y.%m.%d-%H.%M.%S` $MAC1 <--> $MAC2 " >> /var/stargazer/users/$LOGIN/badmac.log #и сообщаем об ошибке ) дабы подсказать ответ саппорту echo "$sgconf -s 127.0.0.1 -p 4445 -a mess -w cegth -u $LOGIN -m 'ERROR A1'" | at now+1minutes 2>/dev/null fi exit OnDisconnect #!/bin/bash IPR=/ISP-serv/iproute2/usr/sbin/tc IPT=/ISP-serv/iptables/usr/local/sbin/iptables ID=$4 IP=$2 LOGIN=$1 DEV_LAN=eth0 DEV_WAN=eth1.39 burst=1 unlim_key="unlim_" usersconf="/var/stargazer/users/$LOGIN/conf" TariffName=`cat "$usersconf" | grep "Tariff=" | cut -d"=" -f2` $IPT -t filter -D INPUT -s $IP -j ACCEPT while [ $? -eq 0 ] do $IPT -t filter -D INPUT -s $IP -j ACCEPT done ################################## $IPT -t filter -D FORWARD -s $IP -j ACCEPT while [ $? -eq 0 ] do $IPT -t filter -D FORWARD -s $IP -j ACCEPT done ################################## $IPT -t filter -D FORWARD -d $IP -j ACCEPT while [ $? -eq 0 ] do $IPT -t filter -D FORWARD -d $IP -j ACCEPT done ################################## $IPT -t filter -D OUTPUT -d $IP -j ACCEPT while [ $? -eq 0 ] do $IPT -t filter -D OUTPUT -d $IP -j ACCEPT done ######################################### - убираем метки $IPT -t mangle -D INPUT -s $IP -j MARK --set-mark $ID while [ $? -eq 0 ] do $IPT -t mangle -D INPUT -s $IP -j MARK --set-mark $ID done ######################################## $IPT -t mangle -D FORWARD -s $IP -j MARK --set-mark $ID while [ $? -eq 0 ] do $IPT -t mangle -D FORWARD -s $IP -j MARK --set-mark $ID done ######################################## $IPT -t mangle -D FORWARD -d $IP -j MARK --set-mark $ID while [ $? -eq 0 ] do $IPT -t mangle -D FORWARD -d $IP -j MARK --set-mark $ID done ####################################### $IPT -t mangle -D OUTPUT -d $IP -j MARK --set-mark $ID while [ $? -eq 0 ] do $IPT -t mangle -D OUTPUT -d $IP -j MARK --set-mark $ID done if [ "_${TariffName#$unlim_key}" != "_${TariffName}" ]; then # анлим найден limit_value=${TariffName:${#unlim_key}:3} # параметр анлима из тарифа echo "Unlim detected ($limit_value kbit) userid = $ID used by "$LOGIN"" >> /ss.log ################################################## - удаляем ограничение скорости #####Unlim - DEV_LAN - ограничиваем на локальном интерфейсе $IPR qdisc del dev $DEV_LAN parent 1:$ID esfq perturb 5 hash dst 2>> /discoonect while [ $? -eq 0 ] do $IPR qdisc del dev $DEV_LAN parent 1:$ID esfq perturb 5 hash dst done $IPR filter del dev $DEV_LAN protocol ip parent 1:0 prio 1 handle $ID fw flowid 1:$ID 2>> /discoonect while [ $? -eq 0 ] do $IPR filter del dev $DEV_LAN protocol ip parent 1:0 prio 1 handle $ID fw flowid 1:$ID done $IPR class del dev $DEV_LAN parent 1:1 classid 1:$ID htb rate $limit_value'kbit' burst $burst'k' prio 2 2>> /discoonect while [ $? -eq 0 ] do $IPR class del dev $DEV_LAN parent 1:1 classid 1:$ID htb rate $limit_value'kbit' burst $burst'k' prio 2 done #####Unlim - DEV_WAN - ограничиваем на внешнем интерфейсе $IPR qdisc del dev $DEV_WAN parent 1:$ID esfq perturb 5 hash dst while [ $? -eq 0 ] do $IPR qdisc del dev $DEV_WAN parent 1:$ID esfq perturb 5 hash dst done $IPR filter del dev $DEV_WAN protocol ip parent 1:0 prio 1 handle $ID fw flowid 1:$ID while [ $? -eq 0 ] do $IPR filter del dev $DEV_WAN protocol ip parent 1:0 prio 1 handle $ID fw flowid 1:$ID done $IPR class del dev $DEV_WAN parent 1:1 classid 1:$ID htb rate $limit_value'kbit' burst $burst'k' prio 2 while [ $? -eq 0 ] do $IPR class del dev $DEV_WAN parent 1:1 classid 1:$ID htb rate $limit_value'kbit' burst $burst'k' prio 2 done fi OnUserAdd - добавляем запись в dhcpd.conf и рестартим сервис #!/usr/bin/perl # Login #login=$1 #echo $login #password #password=$2 #echo $password #tariff name #tariff=$3 #echo $tariff #echo "added user $login $password $tariff" >> /tmp/add_del # argv[0]=login # argv[1]=IP # print $ARGV[0]."\n"; $configFile="/var/stargazer/users/".$ARGV[0]."/conf"; open (FH,"< /var/stargazer/users/".$ARGV[0]."/conf") or die "cannot open the file!"; my $MAC=""; my $IP=""; while ($line=<FH>) { if ($line=~m/^Userdata1\s*=\s*(\S+)/i) { $MAC=$1; } if ($line=~m/^IP\s*=\s*(\S+)/i) { $IP=$1; } } close(FH); $resultDHCPDstr="host ".$ARGV[0]."\t\t{hardware ethernet ".$MAC."; fixed-address ".$IP.";} # gen by perl\n"; print $resultDHCPDstr; open (OLD,"< "."/etc/dhcpd.conf") or die "cannot open file /etc/dhcpd.conf !\n"; open (NEW,"> "."dhcpd.conf.new") or die "cannot open dhcpd.conf.new!\n"; @array=<OLD>; for ($i=$#array; $i!=-1; $i--) { # изменяем только самую последнюю строку if ($array[$i]=~m/}/) { $array[$i]=$resultDHCPDstr."\n\n}\n"; last; } } print NEW @array; close (OLD); close (NEW); rename ("/etc/dhcpd.conf","/etc/dhcpd.conf.orig"); rename ("dhcpd.conf.new","/etc/dhcpd.conf"); `service dhcpd restart`; скрипты не идеальны, хочется услышать мнение разбирающихся, остальных просьба не тревожить.... ах да - большой вопрос ID пользователя откуда берется и где храниться... ибо заметил что он не постоянен (хотя возможно на старой версии сервера)... и большой вопрос номер два, когда старгейзер переходит на следующий месяц, будет ли он перезапускать скрипт OnConnect ? ибо если нет... придется еще немного посидеть. зы. местами есть еще дэбаги... в принцыпе работе никак не мешают. работать должно на любой версии старгейзера. очень хотелось бы пообщаться с автором если не сложно - пм мне кто-нить его асю. сохраню в строгой секретности. хотим немножко помочь проекту чем сможем. Ссылка на сообщение Поделиться на других сайтах
Wapr-Old 0 Опубліковано: 2007-05-30 21:05:05 Share Опубліковано: 2007-05-30 21:05:05 на ID надеяться нельзя, т.к. это дело не было ни разу специфицировано. Видимо сугубо внутренняя служебная переменная. Запуска OnDisconnect-OnConnect при смене тарифа мне добиться от авторов не удалось Скоро выложу ещё более продвинутую версию с DNAT Ссылка на сообщение Поделиться на других сайтах
centre-lan 1 Опубліковано: 2007-05-30 22:16:39 Share Опубліковано: 2007-05-30 22:16:39 Еще один пример... с ограничением мира по скорости, которая указана в примичании и несколько других фич.. #!/bin/sh LOGIN=$1 IP=$2 CASH=$3 ID=$4 GROUP=`grep 'Group=' /var/stargazer/users/$LOGIN/conf | cut -d '=' -f2` TRF=`grep 'Tariff=' /var/stargazer/users/$LOGIN/conf | cut -d '=' -f2` SPD=`grep 'Note=' /var/stargazer/users/$LOGIN/conf | cut -d '=' -f2` echo "C `date +%Y.%m.%d-%H.%M.%S` $IP $CASH" >> /var/stargazer/users/$LOGIN/connect.log if [ $GROUP = 'server' ] then exit 1 fi if [ $TRF = 'Admin' ] then ipfw add `expr $ID '*' 10 + 30002` allow all from $IP to any ipfw add `expr $ID '*' 10 + 30002` allow all from any to $IP ipfw table 2 del $IP exit 1 fi if [ $TRF = 'Magik' ] then SPEEDMAGIK=`expr $SPD '*' 23 '/' 10` TENMBIT=`expr 10 '*' 23 '/' 10` ipfw pipe `expr $ID '*' 10 + 20002` config bw "$TENMBIT"Mbit/s ipfw pipe `expr $ID '*' 10 + 30002` config bw "$SPEEDMAGIK"Kbit/s ipfw add `expr $ID '*' 10 + 30002` pipe `expr $ID '*' 10 + 20002` all from $IP to table\(1\) ipfw add `expr $ID '*' 10 + 30002` pipe `expr $ID '*' 10 + 20002` all from table\(1\) to $IP ipfw add `expr $ID '*' 10 + 30002` allow all from $IP to table\(2\) ipfw add `expr $ID '*' 10 + 30002` allow all from table\(2\) to $IP ipfw add `expr $ID '*' 10 + 30002` pipe `expr $ID '*' 10 + 30002` all from any to $IP ipfw add `expr $ID '*' 10 + 30002` pipe `expr $ID '*' 10 + 30002` all from $IP to any exit 1 fi #LINK="600" if [ $SPD != '' ] then SPEED=`expr $SPD '*' 23 '/' 10` ipfw pipe `expr $ID '*' 10 + 30002` config bw "$SPEED"Kbit/s ipfw add `expr $ID '*' 10 + 30002` allow all from $IP to table\(1\) ipfw add `expr $ID '*' 10 + 30002` allow all from table\(1\) to $IP ipfw add `expr $ID '*' 10 + 30002` allow all from $IP to table\(2\) ipfw add `expr $ID '*' 10 + 30002` allow all from table\(2\) to $IP ipfw add `expr $ID '*' 10 + 30002` pipe `expr $ID '*' 10 + 30002` all from any to $IP ipfw add `expr $ID '*' 10 + 30002` pipe `expr $ID '*' 10 + 30002` all from $IP to any exit 1 else ipfw pipe `expr $ID '*' 10 + 30002` config bw 600Kbit/s ipfw add `expr $ID '*' 10 + 30002` allow all from $IP to table\(1\) ipfw add `expr $ID '*' 10 + 30002` allow all from table\(1\) to $IP ipfw add `expr $ID '*' 10 + 30002` allow all from $IP to table\(2\) ipfw add `expr $ID '*' 10 + 30002` allow all from table\(2\) to $IP ipfw add `expr $ID '*' 10 + 30002` pipe `expr $ID '*' 10 + 30002` all from any to $IP ipfw add `expr $ID '*' 10 + 30002` pipe `expr $ID '*' 10 + 30002` all from $IP to any exit 1 fi OnDisconnect #!/bin/sh LOGIN=$1 IP=$2 CASH=$3 ID=$4 echo "C `date +%Y.%m.%d-%H.%M.%S` $IP $CASH" >> /var/stargazer/users/$LOGIN/connect.log ipfw del `expr $ID '*' 10 + 30002` Ссылка на сообщение Поделиться на других сайтах
Колян 2 Опубліковано: 2007-07-01 14:58:30 Share Опубліковано: 2007-07-01 14:58:30 Скрипты для СТГ с использованием модуля mysql_store, с возможностью резать скорость, за основу взяты скрипты Den_LocalNet: OnConnect: #!/usr/bin/php <?php $ext_face="re1"; //Интерфейс, на котором резать скорость $fwcmd="/sbin/ipfw -q"; //Путь к фаерволлу $login=$argv[1]; $ID='$argv[4]'; $id1=($ID*10+10001); $id2=($ID*10+10002); $id3=($ID*10+10003); $id4=($ID*10+10004); $id5=($ID*10+10005); $idspd=($ID+101); mysql_connect('localhost', 'root', 'pwd'); //Настройки БД mysql_select_db('stargazer'); $q=mysql_query("SELECT `Note`, `IP` FROM `users` WHERE `login`='$login'"); $arr=mysql_fetch_array($q, MYSQL_ASSOC); $IP=$arr[iP]; exec("$fwcmd delete $id1"); exec("$fwcmd delete $id2"); exec"$fwcmd delete $id3"); exec("$fwcmd delete $id4"); exec("$fwcmd delete $id5"); exec("$fwcmd pipe $idspd config bw $arr[Note]"); exec("$fwcmd add $id1 allow icmp from $IP to any icmptype 0,3,4,11,12"); exec("$fwcmd add $id2 pipe $idspd ip from $IP to any via $ext_face"); exec("$fwcmd add $id3 pipe $idspd ip from any to $IP via $ext_face"); exec("$fwcmd add $id4 allow ip from $IP to any"); exec("$fwcmd add $id5 allow ip from any to $IP"); $curr_date=date("m_Y"); $date=date("Y-m-d h:i:s"); mysql_query("INSERT INTO `logs_$curr_date` VALUES ('', '$login', '$date, User $login connected!')"); echo "$date, User $login connected!"; ?> OnDisconnect: #!/usr/bin/php <?php $ext_face="re1"; //Интерфейс, на котором резать скорость $fwcmd="/sbin/ipfw -q"; //Путь к фаерволлу $login=$argv[1]; $ID='$argv[4]'; $id1=($ID*10+10001); $id2=($ID*10+10002); $id3=($ID*10+10003); $id4=($ID*10+10004); $id5=($ID*10+10005); $idspd=($ID+101); mysql_connect('localhost', 'root', 'pwd'); //Настройки БД mysql_select_db('stargazer'); $q=mysql_query("SELECT `Note`, `IP` FROM `users` WHERE `login`='$login'"); $arr=mysql_fetch_array($q, MYSQL_ASSOC); $IP=$arr[iP]; exec("$fwcmd delete $id1"); exec("$fwcmd delete $id2"); exec("$fwcmd delete $id3"); exec("$fwcmd delete $id4"); exec("$fwcmd delete $id5"); $curr_date=date("m_Y"); $date=date("Y-m-d h:i:s"); mysql_query("INSERT INTO `logs_$curr_date` VALUES ('', '$login', '$date, User $login DisConnected!')"); echo "$date, User $login DisConnected!"; ?> Ссылка на сообщение Поделиться на других сайтах
Cell 7 Опубліковано: 2007-07-01 17:05:30 Share Опубліковано: 2007-07-01 17:05:30 Скрипт OnUserAdd в связке с dhcpd При добавлении юзера удаляет } в конце dhcpd.conf, дописывает сторочку с привязкой ip и mac, ставит } на место. прописывает ip в статическую таблицу arp и вносит изменения в файл /etc/ethers для организации статической таблицы arp при старте системы. Ну и ребутит dhcpd. МАС адрес должен добавляться в конфигураторе в поле "Userdata0" #!/bin/bash PATH=/sbin:/usr/sbin:/bin:/usr/bin # Login login=$1 ip=`cat /var/stargazer/users/$login/conf | grep 'IP=' | cut -d "=" -f2` mac=`cat /var/stargazer/users/$login/conf | grep 'Userdata0=' | cut -d "=" -f2` num=`cat /etc/dhcpd.conf | wc -l` hst=`echo $ip | cut -d"." -f4` # в больших сетях можно заюзать hst=$login #let "num=num+1" sed $num"d" /etc/dhcpd.conf > /var/tmp/dhcpd.temp echo " host host-$hst {hardware ethernet $mac; fixed-address $ip;} }" >> /var/tmp/dhcpd.temp rm /etc/dhcpd.conf mv /var/tmp/dhcpd.temp /etc/dhcpd.conf echo "$ip $mac" >> /etc/ethers arp -s $ip $mac service dhcpd reload Ссылка на сообщение Поделиться на других сайтах
Cell 7 Опубліковано: 2007-07-15 11:33:47 Share Опубліковано: 2007-07-15 11:33:47 Скрипт запуска STG в качестве демона на Linux #!/bin/bash . /etc/rc.d/init.d/functions RETVAL=0 start() { echo -n $"Запускаю биллинговую систему (Stargazer)....." ( /usr/sbin/stargazer &) daemon true RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/stargaser return $RETVAL } stop() { echo -n "Останавливаю биллинговую систему (Stargazer)....." killproc stargazer rm -f /var/lock/subsys/stargazer echo return $RETVAL sleep 1 } case "$1" in start) start ;; stop) stop ;; restart) stop sleep 2 start ;; *) echo "Используй: `basename $0` { start | stop | restart }" exit ;; esac Ссылка на сообщение Поделиться на других сайтах
Queeq 0 Опубліковано: 2007-10-12 12:38:54 Share Опубліковано: 2007-10-12 12:38:54 Простые скрипты OnConnect и OnDisconnect с отключением направлений (в данном случае направления два), система FreeBSD, файрвол PF. В PF'е используются такие таблицы: <uaix> - список украинских сетей (первое направление). <uausr> - список юзеров, у которых включено первое направление. <wusr> - список юзеров, у которых включено всё остальное (второе направление). OnConnect #!/usr/local/bin/bash # Login LOGIN=$1 #user IP IP=$2 #cash CASH=$3 #user ID ID=$4 #Selected dirs to connect DIRS=$5 #Выдираем из переменной DIRS первое и второе направление uaix=${DIRS:0:1} world=${DIRS:1:1} #Если включено первое направление - добавить адрес юзера в таблицу тех, кому разрешать первое направление. if [ $uaix == 1 ] then `pfctl -t uausr -T add $IP` fi #Если включено второе направление - добавить адрес юзера в таблицу тех, кому разрешать второе направление. if [ $world == 1 ] then `pfctl -t wusr -T add $IP` fi OnDisconnect #!/usr/local/bin/bash # Login LOGIN=$1 #user IP IP=$2 #cash CASH=$3 #user ID ID=$4 #Selected dirs to disconnect DIRS=$5 #Выдираем из переменной DIRS первое и второе направление uaix=${DIRS:0:1} world=${DIRS:1:1} #Если отмечено первое направление - удалить адрес юзера из таблицы тех, кому разрешать первое направление. if [ $uaix == 1 ] then `pfctl -t uausr -T delete $IP` fi #Если отмечено второе направление - удалить адрес юзера из таблицы тех, кому разрешать второе направление. if [ $world == 1 ] then `pfctl -t wusr -T delete $IP` fi В pf.conf: table <uaix> persist file "/etc/pf_ua-ix.txt" table <uausr> persist table <wusr> persist #####какие-то ещё правила##### #Разрешить подключенным к первому направлению это направление pass quick from <uausr> to <uaix> pass quick from <uaix> to <uausr> #Остальным заблочить block quick from <uaix> block quick to <uaix> #Разрешить подключенным ко второму направлению всё остальное pass quick from <wusr> pass quick to <wusr> ################################# block all Вроде всё. Если заметите недочёты - пишите в личку - подправлю. З.Ы. Кстати работает очень быстро. На полных 100 мбитах файрвол сожрал всего 7% процессора P4 2.4 GHz. Случай, когда биллинг и файрвол на разных машинах Для этого потребуется поставить pftabled на обоих машинах. Для двух таблиц (как в данном случае) я запускаю два процесса pftabled на сервере с привязкой к таблицам uausr и wusr (чтобы с клиента нельзя было менять другие таблицы). Слушать эти процессы будут на разных портах. pftabled -a <firewall_IP> -d -f uausr -p 56788 pftabled -a <firewall_IP> -d -f wusr -p 56789 На клиенте в скриптах OnConnect и OnDisconnect меняем: `pfctl -t uausr -T add $IP` на `pftabled-client <firewall_IP> 56788 uausr add $IP` `pfctl -t wusr -T add $IP` на `pftabled-client <firewall_IP> 56788 wusr add $IP` `pfctl -t uausr -T delete $IP` на `pftabled-client <firewall_IP> 56788 uausr del $IP` `pfctl -t wusr -T delete $IP` на `pftabled-client <firewall_IP> 56788 wusr del $IP` <firewall_IP> - я привязываю на сервере, чтобы pftabled слушал только на этом адресе. Для сервера указывать не обязательно. Ссылка на сообщение Поделиться на других сайтах
ponomar 0 Опубліковано: 2007-11-10 09:03:34 Share Опубліковано: 2007-11-10 09:03:34 Выложите пожалуйста у кого есть Скрипты для СТГ с использованием модуля mysql_store, с возможностью резать скорость под iptables Ссылка на сообщение Поделиться на других сайтах
xzvf 0 Опубліковано: 2008-01-09 04:09:28 Share Опубліковано: 2008-01-09 04:09:28 ПХП скрипты неработают, ручками работают? Ссылка на сообщение Поделиться на других сайтах
BECHA 0 Опубліковано: 2008-02-25 15:50:20 Share Опубліковано: 2008-02-25 15:50:20 в случае FreeBSD, PF и использования правил с ключами "keep state" следует при отключении пользователя не только удалять его адрес из таблицы, но и удалять запись с его адресом из таблицы состояний. Вот так: /sbin/pfctl -t users -T delete $IP /sbin/pfctl -k $IP Ссылка на сообщение Поделиться на других сайтах
BECHA 0 Опубліковано: 2008-03-01 08:20:57 Share Опубліковано: 2008-03-01 08:20:57 Выношу на суд общественности мои скрипты STG. Система Debian 4.0, STG 2.404.9.7. Требовалось обеспечить доступ в локальную сеть провадера и подсчет интерента, получаемого сервером с одного из компьютеров сети првайдера. Стартовый скрипт фаера: #!/bin/bash echo "IpTables Rules Loading" # diclamer int_if="eth0" int_adr="192.168.0.1" int_net="192.168.0.0/23" # ext_if="eth1" ext_adr="192.168.111.222" ext_net="192.168.111.0/24" # #$wan_if="ppp+" # lo_if="lo0" lo_adr="127.0.0.1" # cmd="/sbin/iptables -v" # # Clear old $cmd -F $cmd -t nat -F $cmd -t mangle -F $cmd -X # $cmd -A INPUT -i lo0 -j ACCEPT # # Setup polices $cmd -P INPUT DROP $cmd -P OUTPUT DROP $cmd -P FORWARD DROP # # Create additional chais $cmd -N bad_tcp_p $cmd -N allowed $cmd -N tcp_p $cmd -N udp_p $cmd -N icmp_p # ################### # bad_tcp_p chain # ################### $cmd -A bad_tcp_p -p tcp --tcp-flags SYN,ACK SYN,ACK \ -m state --state NEW -j REJECT --reject-with tcp-reset # $cmd -A bad_tcp_p -p tcp ! --syn -m state --state NEW -j LOG \ --log-prefix "New not syn:" # ################# # allowes chain # ################# $cmd -A allowed -p TCP --syn -j ACCEPT $cmd -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT $cmd -A allowed -p TCP -j DROP # ############# # TCP rules # ############# $cmd -A tcp_p -p TCP -i $int_if -s $int_net --dport 22 -j allowed $cmd -A tcp_p -p TCP -i $ext_if -s $ext_net --dport 22 -j allowed $cmd -A tcp_p -p TCP -i $int_if -s $int_net --dport 5555 -j allowed $cmd -A tcp_p -p TCP -i $ext_if -s 192.168.111.1 --dport 5555 -j allowed # ############# # UDP rules # ############# $cmd -A udp_p -p UDP -i $int_if -s $int_net --dport 5555 -j ACCEPT $cmd -A udp_p -p UDP -i $ext_if -s $ext_net --dport 5555 -j ACCEPT # ############## # ICMP rules # ############## $cmd -A icmp_p -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT $cmd -A icmp_p -p ICMP -s 0/0 --icmp-type 0 -j ACCEPT # ############### # INPUT chain # ############### $cmd -A INPUT -p tcp -j bad_tcp_p $cmd -A INPUT -p tcp -d $ext_adr -m state --state ESTABLISHED,RELATED -j ACCEPT $cmd -A INPUT -p udp -d $ext_adr -m state --state ESTABLISHED,RELATED -j ACCEPT $cmd -A INPUT -p TCP -j tcp_p $cmd -A INPUT -p UDP -j udp_p $cmd -A INPUT -p ICMP -i $int_if -j icmp_p $cmd -A INPUT -p ICMP -i $ext_if -j icmp_p $cmd -A INPUT -d 224.0.0.0/8 -j DROP $cmd -A INPUT -p GRE -j ACCEPT # ################# # FORWARD chain # ################# $cmd -A FORWARD -p tcp -j bad_tcp_p $cmd -A FORWARD -i $int_if -s $int_net -o $ext_if -j ACCEPT $cmd -A FORWARD -m state -i eth+ -o eth+ --state ESTABLISHED,RELATED -j ACCEPT # ################ # OUTPUT chain # ################ $cmd -A OUTPUT -p TCP -j bad_tcp_p $cmd -A OUTPUT -p ALL -s $lo_adr -j ACCEPT $cmd -A OUTPUT -p ALL -s $int_adr -j ACCEPT $cmd -A OUTPUT -p ALL -s $ext_adr -j ACCEPT # # Modify TTL (speecially for greedy providers) $cmd -t mangle -A POSTROUTING -o $ext_if -j TTL --ttl-set 128 # # Masquerade. #$cmd -t nat -A POSTROUTING -o $ext_if -j MASQUERADE # # SNAT $cmd -t nat -A POSTROUTING -p ALL -s $int_net -o $ext_if -j SNAT --to-source $ext_adr # echo 1 > /proc/sys/net/ipv4/ip_forward # скрипт /etc/ppp/ip-up вызываемый при поднятии интерфейса ppp0 привожу только то, что я в него дописал. cmd="/sbin/iptables -v" # $cmd -A INPUT -p ALL -d $PPP_LOCAL -m state --state ESTABLISHED,RELATED -j ACCEPT $cmd -A INPUT -p ICMP -i $PPP_IFACE -j icmp_p $cmd -A OUTPUT -p ALL -o $PPP_IFACE -s $PPP_LOCAL -j ACCEPT $cmd -t mangle -A POSTROUTING -o $PPP_IFACE -j TTL --ttl-set 128 $cmd -t nat -A POSTROUTING -p ALL -o $PPP_IFACE -j SNAT --to-source $PPP_LOCAL аналогично ip-down cmd="/sbin/iptables -v" # $cmd -D INPUT -p ALL -d $PPP_LOCAL -m state --state ESTABLISHED,RELATED -j ACCEPT $cmd -D INPUT -p ICMP -i $PPP_IFACE -j icmp_p $cmd -D OUTPUT -p ALL -o $PPP_IFACE -s $PPP_LOCAL -j ACCEPT $cmd -t mangle -D POSTROUTING -o $PPP_IFACE -j TTL --ttl-set 128 $cmd -t nat -D POSTROUTING -p ALL -o $PPP_IFACE -j SNAT --to-source $PPP_LOCAL OnConnect cmd="/sbin/iptables -v" $cmd -A FORWARD -i eth0 -s $2 -j ACCEPT $cmd -A FORWARD -s $2 -m state --state ESTABLISHED,RELATED -j ACCEPT $cmd -A FORWARD -d $2 -m state --state ESTABLISHED,RELATED -j ACCEPT OnDisconnect cmd="/sbin/iptables -v" $cmd -D FORWARD -i eth0 -s $2 -j ACCEPT while [ $? -eq 0 ] do $cmd -D FORWARD -i eth0 -s $2 -j ACCEPT done ### $cmd -D FORWARD -s $2 -m state --state ESTABLISHED,RELATED -j ACCEPT while [ $? -eq 0 ] do $cmd -D FORWARD -s $2 -m state --state ESTABLISHED,RELATED -j ACCEPT done ### $cmd -D FORWARD -d $2 -m state --state ESTABLISHED,RELATED -j ACCEPT while [ $? -eq 0 ] do $cmd -D FORWARD -d $2 -m state --state ESTABLISHED,RELATED -j ACCEPT done # буду рад любой конструктивной критике :00: Ссылка на сообщение Поделиться на других сайтах
vovksextra 0 Опубліковано: 2008-03-22 13:17:36 Share Опубліковано: 2008-03-22 13:17:36 Нужна помощь! Перешли на базу Фиребёрд и возникла проблема с "резкой" скорости абонентам в поле note у нас стоял параметр, который и определял саму скорость в скрипте onConnect - там все было понятно, а теперь стал вопрос как вытянуть это поле из базы и передать скрипту в виде параметра нашли в модуле user.cpp код strprintf(&scriptOnConnectParams, "%s \"%s\" \"%s\" \"%f\" \"%d\" \"%s\"", scriptOnConnect.c_str(), login.c_str(), inet_ntostr(currIP), (double)cash, id, dirsStr); заменили на strprintf(&scriptOnConnectParams, "%s \"%s\" \"%s\" \"%f\" \"%d\" \"%s\" \"%s"", scriptOnConnect.c_str(), login.c_str(), inet_ntostr(currIP), (double)cash, id, dirsStr, note); Все как-бы хорошо - теперь в скрипте имеем $6 который и есть наша скорость. но есть одно но - после изменения кода, при подключении юзера валится старгейзер. Мы так поняли что коду не нравится переменная note. MADF- подскажи куда рыть далее Вообщем нужно каким то макаром передать параметр note скрипту Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2008-03-22 14:00:47 Share Опубліковано: 2008-03-22 14:00:47 А как вы такой ужас скомпилировали вобще? Оно даже компилироваться не должно было! Нужно не note (который class std::string), а note.c_str() (она вернет указатель на константный буфер, который схавает strprintf) Ссылка на сообщение Поделиться на других сайтах
vovksextra 0 Опубліковано: 2008-03-22 14:23:07 Share Опубліковано: 2008-03-22 14:23:07 Нужно не note (который class std::string), а note.c_str() (она вернет указатель на константный буфер, который схавает strprintf) как раз note.c_str() и не катило - ошибка при компиляции была ! user.cpp: In member function `void USER::Connect(bool)': user.cpp:611: error: 'class USER_PROPERTY<std::string>' has no member named 'c_str' gmake: *** [user.o] Ошибка 1 а вот просто note - компилилось без ошибок ))) в том то и дело Ссылка на сообщение Поделиться на других сайтах
Genius 0 Опубліковано: 2008-03-22 14:48:30 Share Опубліковано: 2008-03-22 14:48:30 Вот по такой конструкции должно работать ((string)note).c_str() Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВхід
Уже зарегистрированы? Войдите здесь.
Войти сейчас