Перейти до

Скрипты onConnect/onDisconnect


Рекомендованные сообщения

Мануал по Iptables: http://gazette.lrn.ru/rus/articles/iptables-tutorial.html

 

Добавляем сюда свои скрипты.

Обязательно приписывать:

1. ОС

2. Файрвол

3. Дополниптельно устанавливаемыем/подгружаемые модули

Приветствуется краткое описание.

 

Запрещено:

1. Обсуждать в топике проблемы тех или иных скриптов.

Ссылка на сообщение
Поделиться на других сайтах
  • 4 weeks later...
  • Відповіді 91
  • Створено
  • Остання відповідь

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

В Ubilling посмотрите примеры нарезки скорости, если я не ошибаюсь и за некоторое отсутствие под руками клавы на меня не отразилось, там нету привязки к файловой базе.

Скрипт 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

Ссылка на сообщение
Поделиться на других сайтах
  • 3 months later...

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

Смотрим:

# 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
...

Ссылка на сообщение
Поделиться на других сайтах
  • 3 months later...

Хочу поделиться опытом настройки скриптов 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

Ссылка на сообщение
Поделиться на других сайтах
  • 2 months later...

Скрипт с примером получения из конфигурации дополнительных данных о пользователе, а также с управлением приоритетами очередей: (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


Ссылка на сообщение
Поделиться на других сайтах
  • 2 months later...

а как же.

политика всех цепочек таблицы 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

Ссылка на сообщение
Поделиться на других сайтах
  • 3 weeks later...

Чегото у меня гораздо проще..

ОСь - 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

 

Вот ещёбы написал как прозрачность по проще прикрутить..?!)

Ссылка на сообщение
Поделиться на других сайтах

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.

Ссылка на сообщение
Поделиться на других сайтах
  • 1 month later...

Продвинутая версия управления через 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
...

Відредаговано Wapr-Old
Ссылка на сообщение
Поделиться на других сайтах
  • 3 months later...

Вот решил нарисовать как я использую 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:

Ссылка на сообщение
Поделиться на других сайтах
  • 5 months later...

Вот такое, работать, в принцыпе, должно всюду где есть перл баш и 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 ? ибо если нет... придется еще немного посидеть.

 

зы. местами есть еще дэбаги... в принцыпе работе никак не мешают.

работать должно на любой версии старгейзера.

 

очень хотелось бы пообщаться с автором :( если не сложно - пм мне кто-нить его асю. сохраню в строгой секретности. хотим немножко помочь проекту чем сможем.

Ссылка на сообщение
Поделиться на других сайтах

на ID надеяться нельзя, т.к. это дело не было ни разу специфицировано. Видимо сугубо внутренняя служебная переменная.

Запуска OnDisconnect-OnConnect при смене тарифа мне добиться от авторов не удалось :(

Скоро выложу ещё более продвинутую версию с DNAT :)

Ссылка на сообщение
Поделиться на других сайтах

Еще один пример... с ограничением мира по скорости, которая указана в примичании и несколько других фич..

#!/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`

Ссылка на сообщение
Поделиться на других сайтах
  • 1 month later...

Скрипты для СТГ с использованием модуля 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!";
?>

Ссылка на сообщение
Поделиться на других сайтах

Скрипт 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

Ссылка на сообщение
Поделиться на других сайтах
  • 2 weeks later...

Скрипт запуска 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

Ссылка на сообщение
Поделиться на других сайтах
  • 2 months later...

Простые скрипты 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 слушал только на этом адресе. Для сервера указывать не обязательно.

Ссылка на сообщение
Поделиться на других сайтах
  • 4 weeks later...
  • 1 month later...
  • 1 month later...

в случае FreeBSD, PF и использования правил с ключами "keep state" следует при отключении пользователя не только удалять его адрес из таблицы, но и удалять запись с его адресом из таблицы состояний. Вот так:

/sbin/pfctl -t users -T delete $IP
/sbin/pfctl -k $IP

Ссылка на сообщение
Поделиться на других сайтах

Выношу на суд общественности мои скрипты 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:

Ссылка на сообщение
Поделиться на других сайтах
  • 3 weeks later...

Нужна помощь!

 

Перешли на базу Фиребёрд и возникла проблема с "резкой" скорости абонентам

 

в поле 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 скрипту

Ссылка на сообщение
Поделиться на других сайтах

А как вы такой ужас скомпилировали вобще? Оно даже компилироваться не должно было!

Нужно не note (который class std::string), а note.c_str() (она вернет указатель на константный буфер, который схавает strprintf)

Ссылка на сообщение
Поделиться на других сайтах
Нужно не 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 - компилилось без ошибок )))

 

в том то и дело

Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Вхід

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Зараз на сторінці   0 користувачів

    Немає користувачів, що переглядають цю сторінку.


×
×
  • Створити нове...