Перейти к содержимому

DeepNet

ASP24.com.ua - Вся линейка моделей Ubiquiti для создания идеальной сети. Звоните! 050-225-7770
Фото

Скрипты onConnect/onDisconnect


  • Чтобы отвечать, сперва войдите на форум
92 ответов в теме

#1 Den_LocalNet

Den_LocalNet

    Дьявол

  • Сitizens
  • ФишкаФишкаФишкаФишкаФишкаФишкаФишкаФишка
  • 4 723 Сообщений:
  • Пол:Мужчина

Опубликовано 12 Май 2005 - 10:59

Мануал по Iptables: http://gazette.lrn.r...s-tutorial.html

Добавляем сюда свои скрипты.
Обязательно приписывать:
1. ОС
2. Файрвол
3. Дополниптельно устанавливаемыем/подгружаемые модули
Приветствуется краткое описание.

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

  • 0

LanTorg.com

#2 Den_LocalNet

Den_LocalNet

    Дьявол

  • Сitizens
  • ФишкаФишкаФишкаФишкаФишкаФишкаФишкаФишка
  • 4 723 Сообщений:
  • Пол:Мужчина

Опубликовано 04 Июнь 2005 - 14:14

Скрипт 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 &#34;<=;$cur_date;$cur_time;$ID;$LOGIN;$IP;$CASH&#34; >> /home/stat/logs/connect.log

Скрипт OnDisconnect на FreeBSD для ipfw
LOGIN=$1
IP=$2
CASH=$3
ID=$4

fwcmd=&#34;/sbin/ipfw&#34;
cur_date=`date \+\%Y.\%m.\%d`
cur_time=`date \+\%H&#58;\%M&#58;\%S`


${fwcmd} delete `expr $ID + 501`
${fwcmd} delete `expr $ID &#39;*&#39; 10 + 10001`
${fwcmd} delete `expr $ID &#39;*&#39; 10 + 10002`
${fwcmd} delete `expr $ID &#39;*&#39; 10 + 10003`

echo &#34;D `date +%Y.%m.%d-%H.%M.%S`       $ID     $IP     $CASH&#34; >> /var/stargazer/users/$LOGIN/connect.log
echo &#34;D `date +%Y.%m.%d-%H.%M.%S`       $ID     $LOGIN  $IP     $CASH&#34; >> /var/stargazer/users/allconnect.log
echo &#34;=>;$cur_date;$cur_time;$ID;$LOGIN;$IP;$CASH&#34; >> /home/stat/logs/connect.log
by denz

  • 0

#3 denz

denz

    Точу Зубы

  • Сitizens
  • ФишкаФишкаФишка
  • 191 Сообщений:

Опубликовано 04 Октябрь 2005 - 11:52

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

LOGIN=$1
IP=$2
CASH=$3
ID=$4
SPEED=`cat /var/stargazer/users/$LOGIN/conf | grep &#39;Note=&#39; | cut -d &#34;=&#34; -f2`
fwcmd=&#34;/sbin/ipfw -q&#34;
cur_date=`date \+\%Y.\%m.\%d`
cur_time=`date \+\%H&#58;\%M&#58;\%S`

# DELETE RULEZ
${fwcmd} delete `expr $ID &#39;*&#39; 10 + 10001`
${fwcmd} delete `expr $ID &#39;*&#39; 10 + 10002`
${fwcmd} delete `expr $ID &#39;*&#39; 10 + 10003`
${fwcmd} delete `expr $ID &#39;*&#39; 10 + 10004`
${fwcmd} delete `expr $ID &#39;*&#39; 10 + 10005`

# ADD RULEZ
${fwcmd} pipe `expr $ID + 101` config bw $SPEED
${fwcmd} add `expr $ID &#39;*&#39; 10 + 10001` allow icmp from $IP to any icmptype 0,3,4,11,12
${fwcmd} add `expr $ID &#39;*&#39; 10 + 10002` pipe `expr $ID + 101` ip from $IP to any via xl0
${fwcmd} add `expr $ID &#39;*&#39; 10 + 10003` pipe `expr $ID + 101` ip from any to $IP via xl0
${fwcmd} add `expr $ID &#39;*&#39; 10 + 10004` allow ip from $IP to any
${fwcmd} add `expr $ID &#39;*&#39; 10 + 10005` allow ip from any to $IP

# ADD TO LOG
echo &#34;<=;$cur_date;$cur_time;$ID;$LOGIN;$IP;$CASH&#34; >> /var/stargazer/users/$LOGIN/connect.log
echo &#34;<=;$cur_date;$cur_time;$ID;$LOGIN;$IP;$CASH&#34; >> /home/stat/logs/allconnect.log

# OnDisconnect
LOGIN=$1
IP=$2
CASH=$3
ID=$4

fwcmd=&#34;/sbin/ipfw -q&#34;

# TIME FORMAT
cur_date=`date \+\%Y.\%m.\%d`
cur_time=`date \+\%H&#58;\%M&#58;\%S`

# DELETE RULEZ FRO IPFW
${fwcmd} delete `expr $ID &#39;*&#39; 10 + 10001`
${fwcmd} delete `expr $ID &#39;*&#39; 10 + 10002`
${fwcmd} delete `expr $ID &#39;*&#39; 10 + 10003`
${fwcmd} delete `expr $ID &#39;*&#39; 10 + 10004`
${fwcmd} delete `expr $ID &#39;*&#39; 10 + 10005`

echo &#34;=>;$cur_date;$cur_time;$ID;$LOGIN;$IP;$CASH&#34; >> /var/stargazer/users/$LOGIN/connect.log
echo &#34;=>;$cur_date;$cur_time;$ID;$LOGIN;$IP;$CASH&#34; >> /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
...

  • 0
DAS7-UANIC

NG Optics

#4 hopeful

hopeful

    Пролетал Мимо

  • Маглы
  • Фишка
  • 35 Сообщений:

Опубликовано 13 Январь 2006 - 14:50

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

#5 napTu

napTu

    Точу Зубы

  • Сitizens
  • ФишкаФишкаФишка
  • 231 Сообщений:
  • Пол:Мужчина

Опубликовано 10 Апрель 2006 - 13:38

Скрипт с примером получения из конфигурации дополнительных данных о пользователе, а также с управлением приоритетами очередей: (freeBSD,ipfw)
# Login
LOGIN=$1
#user IP
IP=$2
#cash
CASH=$3
#user ID
ID=$4

#получаем из поля DATA0 данные о приоритетах трафика в формате &#34;90,30,5&#34;

UDATA0=`grep &#39;Group=&#39; /usr/stg/var/users/$LOGIN/conf | cut -d &#39;=&#39; -f2`
UDATA0=`echo $UDATA0 | tr -d A-Z`
UDATA0=`echo $UDATA0 | tr -d a-z`
prio1=`echo $UDATA0 | cut -d &#39;,&#39; -f1`
prio2=`echo $UDATA0 | cut -d &#39;,&#39; -f2`
prio3=`echo $UDATA0 | cut -d &#39;,&#39; -f3`
if [ ! $prio1 ]
then
 prio1=90
 prio2=30
 prio3=5
fi

#получаем данные о тарифе и остатке FreeMb
trf=`grep &#39;Tariff=&#39; /usr/stg/var/users/$LOGIN/conf | cut -d &#39;=&#39; -f2`
uah=`grep &#39;FreeMb=&#39; /usr/stg/var/users/$LOGIN/stat | cut -d &#39;=&#39; -f2`
uah=`echo $uah | cut -d &#39;.&#39; -f1`

ipn=`echo $IP | cut -d &#39;.&#39; -f4`

echo &#34;C `date +%Y.%m.%d-%H.%M.%S` $IP $CASH&#34; >> /usr/stg/var/users/$LOGIN/connect.log
echo &#34; &#34; > NULL

#для хранения текущего состояния пользователя используется файл с номером ID, который запускается также при перезаливке правил IPFW
echo &#34;#!/bin/sh&#34; > /usr/stg/usr/user$ID

#ifconfig lo0 192.168.55.$ipn/32 add
#sleep .1 каждому юзеру отведены доп адреса на lo0, используемые в зависимости от типа трафика

#здесь организован доступ к сокс. Для безлима доступность определяется наличием FreeMb.
#дополнительный скрипт контроллирует остаток FreeMb
if [ $trf != &#34;bezlim&#34; ]
then
 #allow to 1080
 echo &#34;ipfw add `expr $ID &#39;*&#39; 10 + 30002` allow ip from $IP to 192.168.55.4 1080 in via rl0&#34; >> /usr/stg/usr/user$ID
else
 if [ $uah -gt 0 ]
 then
  echo &#34;ipfw add `expr $ID &#39;*&#39; 10 + 30002` allow ip from $IP to 192.168.55.4 1080 in via rl0&#34; >> /usr/stg/usr/user$ID
 else
  echo &#34;ipfw add `expr $ID &#39;*&#39; 10 + 30002` deny ip from $IP to 192.168.55.4 1080 in via rl0&#34; >> /usr/stg/usr/user$ID
 fi
fi

#правила разрешающие доступ через rl0 и на прокси
echo &#34;ipfw add `expr $ID &#39;*&#39; 10 + 30001` fwd 127.0.0.1,3128 all from $IP to any 80,81,82,8080,8101,8181 in recv rl0&#34; >>  /usr/stg/usr/user$ID
echo &#34;ipfw add `expr $ID &#39;*&#39; 10 + 30003` allow all from $IP to any in recv rl0&#34; >>  /usr/stg/usr/user$ID
echo &#34;ipfw add `expr $ID &#39;*&#39; 10 + 30004` allow all from any to $IP out xmit rl0&#34; >> /usr/stg/usr/user$ID

#организация отдельных очередей для юзеров
#типы трафика: маленькие пакеты - высокий приоритет, http страницы через прокси - средний приоритет, файлы закачек через прокси и прочий трафик не через прокси - низкий приоритет.
echo &#34;ipfw queue `expr $ID &#39;*&#39; 10 + 1000` config pipe 1 weight $prio1 queue 20&#34; >> /usr/stg/usr/user$ID
echo &#34;ipfw queue `expr $ID &#39;*&#39; 10 + 1001` config pipe 1 weight $prio2 queue 20&#34; >> /usr/stg/usr/user$ID
echo &#34;ipfw queue `expr $ID &#39;*&#39; 10 + 1002` config pipe 1 weight $prio3 queue 20&#34; >> /usr/stg/usr/user$ID

#доступ на очередь
#очередь настроена на пропуск трафика далее по правилам ipfw
echo &#34;ipfw add `expr $ID &#39;*&#39; 10 + 40001` queue `expr $ID &#39;*&#39; 10 + 1000` ip from any to $IP,192.168.55.$ipn,192.168.99.$ipn in recv ppp0 iplen 1-555&#34; >> /
echo &#34;ipfw add `expr $ID &#39;*&#39; 10 + 40002` queue `expr $ID &#39;*&#39; 10 + 1001` ip from any to 192.168.55.$ipn in recv ppp0 iplen 556-9999&#34; >> /usr/stg/usr/user$
echo &#34;ipfw add `expr $ID &#39;*&#39; 10 + 40003` queue `expr $ID &#39;*&#39; 10 + 1002` ip from any to $IP,192.168.99.$ipn in recv ppp0 iplen 556-9999&#34; >> /usr/stg/usr/u

#в дисконнекте не забываем удалить
 # ipfw queue 100 delete
 # ipfw queue 200 delete и т.д.


#запускаем созданный скрипт
sh /usr/stg/usr/user$ID > NULL



  • 0

#6 egor2fsys

egor2fsys

    Stg Helper Mod

  • Сitizens
  • ФишкаФишкаФишкаФишкаФишкаФишка
  • 1 284 Сообщений:

Опубликовано 13 Июнь 2006 - 15:54

а как же.
политика всех цепочек таблицы 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
  • 0
1cv7s.exe
1cv8.exe --- in progress, done 40 %

#7 Sephiroth.

Sephiroth.

    Пролетал Мимо

  • Маглы
  • Фишка
  • 24 Сообщений:

Опубликовано 03 Июль 2006 - 12:04

Чегото у меня гораздо проще..
ОСь - 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

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

#8 Septima

Septima

    Пролетал Мимо

  • Маглы
  • Фишка
  • 26 Сообщений:

Опубликовано 10 Июль 2006 - 09:49

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.
  • 0

#9 Wapr-Old

Wapr-Old

    Точу Зубы

  • Сitizens
  • ФишкаФишкаФишка
  • 168 Сообщений:

Опубликовано 30 Август 2006 - 14:26

Продвинутая версия управления через 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 &#39;+%Y-%m-%d %H-%M-%S&#39;`
Month=${D:5:2}
Day=${D:8:2}
IPT=&#34;/usr/sbin/iptables&#34;
sgconf=&#34;/sbin/sgconf&#34;
bc=&#34;/usr/bin/bc&#34;
GW2=&#34;10.100.100.128&#34;
usersconf=&#34;/var/stargazer/users/$LOGIN/conf&#34;
usersstat=&#34;/var/stargazer/users/$LOGIN/stat&#34;
tariffs=&#34;/var/stargazer/tariffs&#34;
abon_key=&#34;_abon&#34;
anlim_key=&#34;anlim_&#34;
logfile=&#34;/var/log/stargazer-test&#34;

if [ ! -e &#34;$usersconf&#34; ]; then
    echo &#34;ERROR: User file &#39;$usersconf&#39; not found&#34; >> $logfile
    exit
fi

TariffName=`cat &#34;$usersconf&#34; | grep &#34;Tariff=&#34; | cut -d&#34;=&#34; -f2`

# Сделаем юзерскую цепочку (если нету)
if $IPT -N &#34;BILL_$LOGIN&#34; 2>/dev/null; then
    if [ &#34;_${TariffName#$anlim_key}&#34; != &#34;_${TariffName}&#34; ]; then # анлим найден
        limit_value=${TariffName:${#anlim_key}:2}       # параметр анлима из тарифа
        # дебильное ограничение скорости
        limit=&#34;-m limit --limit ${limit_value}/s --limit-burst ${limit_value}0&#34;
        # фильтры для внешней локальной сети без ограничений и в самом начале.
        $IPT -A &#34;BILL_$LOGIN&#34; -s 10.0.0.0/8 -d $IP -j ACCEPT    # т.к. LAN: 10.100.0.0/16
        $IPT -A &#34;BILL_$LOGIN&#34; -d 10.0.0.0/8 -s $IP -j ACCEPT    # а WAN: 10.0.0.0/8
        $IPT -A &#34;BILL_$LOGIN&#34; -s 85.21.29.0/24 -j ACCEPT        # далее IP можно не упоминать
        $IPT -A &#34;BILL_$LOGIN&#34; -d 85.21.28.0/24 -j ACCEPT
        $IPT -A &#34;BILL_$LOGIN&#34; -s 85.21.52.0/24 -j ACCEPT
        $IPT -A &#34;BILL_$LOGIN&#34; -d 85.21.52.0/24 -j ACCEPT
        $IPT -A &#34;BILL_$LOGIN&#34; -s 85.21.79.0/24 -j ACCEPT
        $IPT -A &#34;BILL_$LOGIN&#34; -d 85.21.79.0/24 -j ACCEPT
        $IPT -A &#34;BILL_$LOGIN&#34; -s 85.21.88.0/24 -j ACCEPT
        $IPT -A &#34;BILL_$LOGIN&#34; -d 85.21.88.0/24 -j ACCEPT
        $IPT -A &#34;BILL_$LOGIN&#34; -s 85.21.90.0/24 -j ACCEPT
        $IPT -A &#34;BILL_$LOGIN&#34; -d 85.21.90.0/24 -j ACCEPT
        # всё остальное ограничиваем по скорости
        $IPT -A &#34;BILL_$LOGIN&#34; $limit -j ACCEPT
    else
        # это для тарифов без ограничения скорости
#       limit=&#34;&#34;
        $IPT -A &#34;BILL_$LOGIN&#34; -j ACCEPT
    fi
fi
# Управление локальным файрволом
iptables -I BILL -d $IP -j &#34;BILL_$LOGIN&#34; && \
iptables -I BILL -s $IP -j &#34;BILL_$LOGIN&#34; # turn on internet
echo &#34;$D Local      login=&#39;$LOGIN&#39; ip=$IP cash=$CASH&#34; >> $logfile

# Управление удалённым файрволом и уведомления об оплате

# Проверим, что юзер платит абонплату (в названии его тарифа есть фрагмент &#34;$key&#34;)
if [ &#34;_${TariffName#$anlim_key}&#34; != &#34;_${TariffName}&#34; -o \
     &#34;_${TariffName%$abon_key}&#34; != &#34;_${TariffName}&#34; ]; then
    if [ $Day -ge $(( ${DinM[$Month]}-2 )) ]; then # осталось меньше 2-х дней
        Fee=$(cat $tariffs/$TariffName.tf | grep &#34;Fee=&#34; | cut -d&#34;=&#34; -f2) # Узнаем абонплату
#       echo &#34;$CASH < $Fee = &#34; $(echo &#34;$CASH < $Fee&#34; | bc) # for debug
        if [ $(echo &#34;$CASH < $Fee&#34; | $bc) != 0 ]; then
             echo &#34;$sgconf -s 127.0.0.1 -p 5555 -a messenger -w free \
             -u $LOGIN -m &#39;бМХЛЮМХЕ! с бЮЯ МЕ НОКЮВЕМ ЯКЕДСЧЫХИ ЛЕЯЪЖ. \
             рЮПХТ: $Fee; нЯРЮРНЙ: $CASH ЕД.&#39;&#34; | at now+1minutes 2>/dev/null
        fi
    fi

exit # второй роутер отключен

    # Проверка доступности GW
    if [ `ping -A -c 2 $GW2 >/dev/null;echo $?` != &#34;0&#34; ]; then
        echo &#34;$D Error!     Gateway $GW2 is inaccessible.&#34; >> $logfile
        $sgconf -s 127.0.0.1 -p 5555 -a messenger -w free -u $LOGIN -m &#34;хГБХМХРЕ, МН ЬКЧГ $GW2 МЕДНЯРСОЕМ. яБ
        exit
    fi
    # Проверка, что юзер уже включен на втором GW
    already=`ssh $GW2 -l r_main &#34;/sbin/iptables -L BILL | grep $IP&#34; 2>/dev/null`
    if [ -z $already ]; then # если не включен
        # Проверим, что баланс > 0
        cash=`cat &#34;$usersstat&#34; | grep &#34;Cash=&#34; | grep &#34;-&#34;`
        if [ -z &#34;$cach&#34; ]; then # если не в минусе
            ssh $GW2 -l r_main &#34;/sbin/iptables -I BILL -d $IP -j RETURN&#34;
            ssh $GW2 -l r_main &#34;/sbin/iptables -I BILL -s $IP -j RETURN&#34;
            echo &#34;$D Remote     login=&#39;$LOGIN&#39; ip=$IP&#34; >> $logfile
        fi
    elif [ -e &#34;/home/$LOGIN/free_always.txt&#34; ]; then
        echo &#34;$D Remote     Find keeped connect from &#39;$LOGIN&#39; ip=$IP&#34; >> $logfile
    else
        echo &#34;$D Warning!   Double login from $IP&#34; >> $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 &#39;+%Y-%m-%d %H-%M-%S&#39;`
IPT=&#34;/usr/sbin/iptables&#34;
GW2=&#34;10.100.100.128&#34;
#ssh_timeout=&#34;-o ConnectionTimeout 5&#34;
usersconf=&#34;/var/stargazer/users/$LOGIN/conf&#34;
usersstat=&#34;/var/stargazer/users/$LOGIN/stat&#34;
key=&#34;_abon&#34;
anlim_key=&#34;anlim_&#34;
logfile=&#34;/var/log/stargazer-test&#34;

if [ ! -e &#34;$usersconf&#34; ]; then
    echo &#34;ERROR: User file &#39;$usersconf&#39; not found&#34; >> $logfile
    exit
fi

TariffName=`cat &#34;$usersconf&#34; | grep &#34;Tariff=&#34; | cut -d&#34;=&#34; -f2`
# Управление локальным файрволом
$IPT -D BILL -d $IP -j &#34;BILL_$LOGIN&#34; && \
$IPT -D BILL -s $IP -j &#34;BILL_$LOGIN&#34; # turn off internet
echo &#34;$D Local      logout=&#39;$LOGIN&#39; ip=$IP cash=$CASH&#34; >> $logfile
# удаление юзерской цепочки
# это временно, до появления в сервере переподключения при смене тарифа
# или придумывания механизма пересоздания этой цепочки на лету при смене тарифа
$IPT -F &#34;BILL_$LOGIN&#34; && $IPT -X &#34;BILL_$LOGIN&#34;

exit

# Управление удалённым файрволом

# Проверим, что юзер платит абонплату (в названии его тарифа есть фрагмент &#34;$key&#34;)
if [ &#34;_${TariffName#$anlim_key}&#34; != &#34;_${TariffName}&#34; -o \
     &#34;_${TariffName%$abon_key}&#34; != &#34;_${TariffName}&#34; ]; then
    if [ ! -e &#34;/home/$LOGIN/free_always.txt&#34; ]; then
        ssh $GW2 -T -l r_main &#34;/sbin/iptables -D BILL -d $IP -j RETURN&#34; && \
        ssh $GW2 -T -l r_main &#34;/sbin/iptables -D BILL -s $IP -j RETURN&#34;
        if [ $? != &#34;0&#34; ]; then
            echo &#34;$D Error!     Gateway $GW2 it is inaccessible.&#34; >> $logfile
            exit
        fi
        echo &#34;$D Remote     logout=&#39;$LOGIN&#39; ip=$IP&#34; >> $logfile
    else
        echo &#34;$D Remote     Keep connect for &#39;$LOGIN&#39; ip=$IP&#34; >> $logfile
    fi
fi

Предполагается, что тарифы без абонплаты названы просто "ляляля", а с абонплатой - "ляляля_abon", "жужужу_abon", "anlim_15", "anlim_70"... :)
А также при запуске сервера создаётся цепочка BILL, в которую собираются все пакеты, подлежащие управлению биллингом.


...
IPT=/usr/sbin/iptables
...
# interfaces
LAN=&#34;eth1&#34;              # my local network iface
WAN_1=&#34;eth2&#34;         # inet from adsl router
WAN_2=&#34;eth0&#34;         # local network corbina
WAN_VPN=&#34;ppp+&#34;    # inet pptp corbina
localnet=&#34;10.100.0.0/16&#34;
...
# 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, 13 Сентябрь 2006 - 10:59

  • 0

#10 kroc

kroc

    Пролетал Мимо

  • Маглы
  • Фишка
  • 17 Сообщений:

Опубликовано 12 Декабрь 2006 - 09:55

Вот решил нарисовать как я использую STG и iptables с проверкой по мак адресу (через поле UserData0) .
Система ASPLinux 10
две сетевухи: eth0-локал, eth1 - интернет
прокси Squid - непрозрачный
NAT -не для всех

Основной скрипт Firewall при загрузке.
#!/bin/sh
#
# Copyright © 2006  Evgeniy Murashkin, NVUTC;
#

IPTABLES=&#34;/sbin/iptables&#34;

# сбрасываем все рулесы в таблицах 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=&#34;x.x.x.x&#34; # ваш внешний интерфейс
INET_BROADCAST=&#34;x.x.x.x&#34; # ваш бродкаст
INET_IFACE=&#34;eth1&#34;

#  1.2 Local .
LAN_IP=&#34;192.168.1.8&#34;
LAN_IP_RANGE=&#34;192.168.1.0/24&#34;
LAN_BROADCAST=&#34;192.168.1.255&#34;
LAN_IFACE=&#34;eth0&#34;

# 1.3 Localhost Configuration.
LO_IFACE=&#34;lo&#34;
LO_IP=&#34;127.0.0.1&#34;

###########################################################################
#
# 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 &#34;1&#34; > /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 &#34;Firewall:INPUT:REJECT:&#34;
$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 &#34;Firewall:FORWARD:REJECT:&#34;
$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 &#34;Firewall:OUTPUT:REJECT:&#34;
$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 &#34;Firewall:loc2net:DROP:&#34;
$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 &#34;Firewall:fw2net:DROP:&#34;
$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 &#34;Firewall:net2fw:DROP:&#34;
$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 &#34;Firewall:net2all:DROP:&#34; #можно вкл. но слишком большие логи
$IPTABLES -A net2all -j reject

# all2all chain
$IPTABLES -A all2all -j common
$IPTABLES -A all2all -j LOG --log-level info --log-prefix &#34;Firewall:all2all:REJECT:&#34;
$IPTABLES -A all2all -j reject 

# logdrop chain
$IPTABLES -A logdrop -j LOG --log-level info --log-prefix &#34;Firewall:logdrop:DROP:&#34;
$IPTABLES -A logdrop -j DROP

# newnotsyn chain
$IPTABLES -A newnotsyn -j LOG --log-level info --log-prefix &#34;Firewall:newnotsyn:DROP:&#34;
$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=&#34;/sbin/iptables&#34;
# Login
LOGIN=$1
#user IP
IP=$2
#cash
CASH=$3
#user ID
ID=$4
LAN_IP=&#34;192.168.1.8&#34; #  свой адрес сервера с стг
usercfg=&#34;/var/stargazer/users/$LOGIN/conf&#34;
mac=`cat &#34;$usercfg&#34; | grep &#34;Userdata0=&#34; | cut -d&#34;=&#34; -f2`

$IPTABLES -D loc2fw  -p tcp -m tcp -s $IP -d $LAN_IP --dport 3128 -j DROP
 

if [ -z &#34;$mac&#34;]; 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=&#34;/sbin/iptables&#34;
# Login
LOGIN=$1
#user IP
IP=$2
#cash
CASH=$3
#user ID
ID=$4
LAN_IP=&#34;192.168.1.8&#34; #  свой адрес сервера с стг
usercfg=&#34;/var/stargazer/users/$LOGIN/conf&#34;
mac=`cat &#34;$usercfg&#34; | grep &#34;Userdata0=&#34; | cut -d&#34;=&#34; -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

#11 прывыд

прывыд

    Пролетал Мимо

  • Маглы
  • Фишка
  • 6 Сообщений:

Опубликовано 30 Май 2007 - 21:24

Вот такое, работать, в принцыпе, должно всюду где есть перл баш и iptables, изначально под линух.... брались идеи из постов повыше.... дорабатывалось по вкусу.

считется что все таблицы по умолчанию дроп. все довольно примитивненько.

для шейпинга собственно тоже создать немножко нужно... хотя можно и без него.... вот например так:

имеем в виду что и iptables и iproute2 собирались с поддержкой коекаких штук (соответсвенно и ядро тоже) хотя можно и без них (esfq например...)

поле userdata1 должно сожержать мак, регистр не важен...


болванка для шейпера... номера меток нужно ставить побольше, чтобы они не могли случайно совпасть с ID пользователя.
#!/bin/bash

ipr=/ISP-serv/iproute2/usr/sbin/tc

echo &#34;Clear iproute2&#34;
$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 &#34;= in-LAN ==============================================&#34;
echo &#34;Creating root qdisc and class&#34;
$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&#39;mbit&#39; burst 150&#39;k&#39;

# TOT --------------------------------------------------------- LOCAL
echo &#34;Creating class id: 5 for LAN&#34;
$ipr class add dev $DEV_LAN parent 1:1  classid 1:5  htb rate $LOCAL&#39;mbit&#39; ceil $LOCAL&#39;mbit&#39; burst 150&#39;k&#39;  prio 5
echo &#34;Attach qdisc: esfq to class id: 5 for LAN&#34;
$ipr qdisc add dev $DEV_LAN parent 1:5 esfq perturb 5 hash dst
echo &#34;Creating filters for class id: 5 for LAN&#34;
$ipr filter add dev $DEV_LAN protocol ip parent 1:0 prio 5 handle 5  fw flowid 1:5
# TOT --------------------------------------------------------- LOCAL

echo &#34;Creating class id: 100 for LAN&#34;
$ipr class add dev $DEV_LAN parent 1:1  classid 1:100  htb rate $LOCAL&#39;mbit&#39; ceil $LOCAL&#39;mbit&#39; burst $burst&#39;k&#39;  prio 5
echo &#34;Attach qdisc: esfq to class id: 100 for LAN&#34;
$ipr qdisc add dev $DEV_LAN parent 1:100  esfq perturb 5 hash dst
echo &#34;Creating filters for class id: 100 for LAN&#34;
$ipr filter add dev $DEV_LAN protocol ip parent 1:0 prio 1 handle 100 fw flowid 1:100

echo &#34;= out-LAN ==============================================&#34;
echo &#34;Creating root qdisc and class&#34;
$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&#39;mbit&#39; burst $burst&#39;k&#39;

############
echo &#34;Creating class id: 100 for WAN&#34;
$ipr class add dev $DEV_WAN parent 1:1 classid 1:100 htb rate $LOCAL&#39;mbit&#39; burst $burst&#39;k&#39; prio 5
echo &#34;Attach qdisc: esfq to class id: 100 for WAN&#34;
$ipr qdisc add dev $DEV_WAN parent 1:100 esfq perturb 5 hash dst
echo &#34;Creating filters for class id: 100 for WAN&#34;
$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 &#39;+%Y-%m-%d %H-%M-%S&#39;`
Month=${D:5:2}
Day=${D:8:2}
IPT=&#34;/ISP-serv/iptables/usr/local/sbin/iptables&#34;
IPR=&#34;/ISP-serv/iproute2/usr/sbin/tc&#34;
# в зависимости от версии сервера берем нужный sgconf
sgconf=&#34;/etc/stargazer/sgconf&#34;
bc=&#34;/usr/bin/bc&#34;
usersconf=&#34;/var/stargazer/users/$LOGIN/conf&#34;
usersstat=&#34;/var/stargazer/users/$LOGIN/stat&#34;
tariffs=&#34;/var/stargazer/tariffs&#34;
unlim_key=&#34;unlim_&#34;
logfile=&#34;/var/log/stargazer-test&#34;
DEV_LAN=eth0
DEV_WAN=eth1.39
burst=1

if [ ! -e &#34;$usersconf&#34; ]; then
    echo &#34;ERROR: User file &#39;$usersconf&#39; not found&#34; >> $logfile
    exit
fi

#проверяем есть ли индивидуальный ОнКоннект
test -x /var/stargazer/users/$login/OnConnect
if [ $? eq 0 ]
then
/var/stargazer/users/$login/OnConnect
exit 0
fi

TariffName=`cat &#34;$usersconf&#34; | grep &#34;Tariff=&#34; | cut -d&#34;=&#34; -f2`

### сверяем МАК - не забыть потом убрать в сквиде...
### не забываем, что в биллинг МАК должен быть полностью из заглавных букв
### надо бы поправить, чтобы было все равно...
#user MAC
MAC1temp=`sed -n &#39;s/Userdata1=//p&#39; /var/stargazer/users/$LOGIN/conf`
MAC2temp=`arp $IP | awk &#39;/&#39;$IP&#39;/{print $3}&#39;`
MAC1=echo $MAC1temp | tr &#34;[:lower:]&#34; &#34;[:upper:]&#34;
MAC2=echo $MAC2temp | tr &#34;[:lower:]&#34; &#34;[:upper:]&#34;

#должно быть сравнение а не присваиваение - тобишь &#39;==&#39;? похоже в баше не имеет значения...
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 &#34;C `date +%Y.%m.%d-%H.%M.%S` $IP $CASH &#34; >> /var/stargazer/users/$LOGIN/connect.log

        ### безлимитный тариф должен называться по шаблону &#34;unlim_xxx&#34; - где &#39;ххх&#39; - скорость доступа
        ### в интернет. смотрим если тариф анлим...
            if [ &#34;_${TariffName#$unlim_key}&#34; != &#34;_${TariffName}&#34; ]; 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&#39;kbit&#39; burst $burst&#39;k&#39; 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&#39;kbit&#39; burst $burst&#39;k&#39; 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 &#34;$D Local      login=&#39;$LOGIN&#39; ip=$IP cash=$CASH&#34; >> $logfile

        ### уведомления об оплате
        ### просто ищем символ &#39;_&#39; в имени тарифа, если его нет - абонплату не проверяем
        ### в таком случае имена тарифов могут быть любыми.
        # поставили $Month-1, это правильно, нумерация индексов массива с нуля
        if [ $(echo `expr &#34;$TariffName&#34; : &#39;.*_.*&#39;`) != 0 ]; then
            if [ $Day -ge $(( ${DinM[$Month-1]}-3 )) ]; then # осталось меньше 3-х дней
                Fee=$(cat $tariffs/$TariffName.tf | grep &#34;Fee=&#34; | cut -d&#34;=&#34; -f2) # Узнаем абонплату
                #       echo &#34;$CASH < $Fee = &#34; $(echo &#34;$CASH < $Fee&#34; | bc) # for debug
                if [ $(echo &#34;$CASH < $Fee&#34; | $bc) != 0 ]; then
                echo &#34;$sgconf -s 127.0.0.1 -p 4445 -a логин -w пасс \
                -u $LOGIN -m &#39;&#39;сообщаем пользователю какой он плохой, и вставляем разные переменные, типа денег вот сколько а надо сколько, плати жадный! &#34; | at now+1mi
nutes 2>/dev/null
                fi
            fi
        fi

else

# если маки не совпадают - болт и досвидания. об чем пишем в лог
echo &#34;ERROR `date +%Y.%m.%d-%H.%M.%S` $MAC1 <--> $MAC2 &#34; >> /var/stargazer/users/$LOGIN/badmac.log
#и сообщаем об ошибке ) дабы подсказать ответ саппорту
echo &#34;$sgconf -s 127.0.0.1 -p 4445 -a mess -w cegth -u $LOGIN -m &#39;ERROR A1&#39;&#34; | 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=&#34;unlim_&#34;
usersconf=&#34;/var/stargazer/users/$LOGIN/conf&#34;
TariffName=`cat &#34;$usersconf&#34; | grep &#34;Tariff=&#34; | cut -d&#34;=&#34; -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 [ &#34;_${TariffName#$unlim_key}&#34; != &#34;_${TariffName}&#34; ]; then # анлим найден
    limit_value=${TariffName:${#unlim_key}:3}       # параметр анлима из тарифа

    echo &#34;Unlim detected ($limit_value kbit) userid = $ID used by &#34;$LOGIN&#34;&#34; >> /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&#39;kbit&#39; burst $burst&#39;k&#39; prio 2 2>> /discoonect
    while [ $? -eq 0 ]
    do
    $IPR class del dev $DEV_LAN parent 1:1 classid 1:$ID htb rate $limit_value&#39;kbit&#39; burst $burst&#39;k&#39; 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&#39;kbit&#39; burst $burst&#39;k&#39; prio 2
    while [ $? -eq 0 ]
    do
    $IPR class del dev $DEV_WAN parent 1:1 classid 1:$ID htb rate $limit_value&#39;kbit&#39; burst $burst&#39;k&#39; 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 &#34;added user $login $password $tariff&#34; >> /tmp/add_del

# argv[0]=login
# argv[1]=IP

# print $ARGV[0].&#34;\n&#34;;

$configFile=&#34;/var/stargazer/users/&#34;.$ARGV[0].&#34;/conf&#34;;

open (FH,&#34;< /var/stargazer/users/&#34;.$ARGV[0].&#34;/conf&#34;) or die &#34;cannot open the file!&#34;;

my $MAC=&#34;&#34;;
my $IP=&#34;&#34;;

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=&#34;host &#34;.$ARGV[0].&#34;\t\t{hardware ethernet &#34;.$MAC.&#34;; fixed-address &#34;.$IP.&#34;;} # gen by perl\n&#34;;

print $resultDHCPDstr;


open (OLD,&#34;< &#34;.&#34;/etc/dhcpd.conf&#34;) or die &#34;cannot open file /etc/dhcpd.conf !\n&#34;;
open (NEW,&#34;> &#34;.&#34;dhcpd.conf.new&#34;) or die &#34;cannot open dhcpd.conf.new!\n&#34;;


@array=<OLD>;

for ($i=$#array; $i!=-1; $i--)
{
    # изменяем только самую последнюю строку
    if ($array[$i]=~m/}/)
    {
        $array[$i]=$resultDHCPDstr.&#34;\n\n}\n&#34;;
        last;
    }
}


print NEW @array;

close (OLD);
close (NEW);

rename (&#34;/etc/dhcpd.conf&#34;,&#34;/etc/dhcpd.conf.orig&#34;);
rename (&#34;dhcpd.conf.new&#34;,&#34;/etc/dhcpd.conf&#34;);


`service dhcpd restart`;



скрипты не идеальны, хочется услышать мнение разбирающихся, остальных просьба не тревожить....

ах да - большой вопрос ID пользователя откуда берется и где храниться... ибо заметил что он не постоянен (хотя возможно на старой версии сервера)... и большой вопрос номер два, когда старгейзер переходит на следующий месяц, будет ли он перезапускать скрипт OnConnect ? ибо если нет... придется еще немного посидеть.

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

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

#12 Wapr-Old

Wapr-Old

    Точу Зубы

  • Сitizens
  • ФишкаФишкаФишка
  • 168 Сообщений:

Опубликовано 30 Май 2007 - 23:05

на ID надеяться нельзя, т.к. это дело не было ни разу специфицировано. Видимо сугубо внутренняя служебная переменная.
Запуска OnDisconnect-OnConnect при смене тарифа мне добиться от авторов не удалось :(
Скоро выложу ещё более продвинутую версию с DNAT :)
  • 0

#13 centre-lan

centre-lan

    Вампиреныш

  • Сitizens
  • ФишкаФишкаФишкаФишкаФишка
  • 534 Сообщений:

Опубликовано 31 Май 2007 - 00:16

Еще один пример... с ограничением мира по скорости, которая указана в примичании и несколько других фич..
#!/bin/sh
LOGIN=$1
IP=$2
CASH=$3
ID=$4
GROUP=`grep &#39;Group=&#39; /var/stargazer/users/$LOGIN/conf | cut -d &#39;=&#39; -f2`
TRF=`grep &#39;Tariff=&#39; /var/stargazer/users/$LOGIN/conf | cut -d &#39;=&#39; -f2`
SPD=`grep &#39;Note=&#39; /var/stargazer/users/$LOGIN/conf | cut -d &#39;=&#39; -f2`

echo &#34;C `date +%Y.%m.%d-%H.%M.%S` $IP $CASH&#34; >> /var/stargazer/users/$LOGIN/connect.log


if [ $GROUP = &#39;server&#39; ]
then
    exit 1
fi


if [ $TRF = &#39;Admin&#39; ]
then
    ipfw add `expr $ID &#39;*&#39; 10 + 30002` allow all from $IP to any
    ipfw add `expr $ID &#39;*&#39; 10 + 30002` allow all from any to $IP
    ipfw table 2 del $IP
    exit 1
fi

if [ $TRF = &#39;Magik&#39; ]
then
        SPEEDMAGIK=`expr $SPD &#39;*&#39; 23 &#39;/&#39; 10`
        TENMBIT=`expr 10 &#39;*&#39; 23 &#39;/&#39; 10`
        ipfw pipe `expr $ID &#39;*&#39; 10 + 20002` config bw &#34;$TENMBIT&#34;Mbit/s
        ipfw pipe `expr $ID &#39;*&#39; 10 + 30002` config bw &#34;$SPEEDMAGIK&#34;Kbit/s

        ipfw add `expr $ID &#39;*&#39; 10 + 30002` pipe `expr $ID &#39;*&#39; 10 + 20002` all from $IP to table\(1\)
        ipfw add `expr $ID &#39;*&#39; 10 + 30002` pipe `expr $ID &#39;*&#39; 10 + 20002` all from table\(1\) to $IP

        ipfw add `expr $ID &#39;*&#39; 10 + 30002` allow all from $IP to table\(2\)
        ipfw add `expr $ID &#39;*&#39; 10 + 30002` allow all from table\(2\) to $IP

        ipfw add `expr $ID &#39;*&#39; 10 + 30002` pipe `expr $ID &#39;*&#39; 10 + 30002` all from any to $IP
        ipfw add `expr $ID &#39;*&#39; 10 + 30002` pipe `expr $ID &#39;*&#39; 10 + 30002` all from $IP to any
    exit 1
fi


#LINK=&#34;600&#34;
if [ $SPD != &#39;&#39; ]
then

        SPEED=`expr $SPD &#39;*&#39; 23 &#39;/&#39; 10`
        ipfw pipe `expr $ID &#39;*&#39; 10 + 30002` config bw &#34;$SPEED&#34;Kbit/s

        ipfw add `expr $ID &#39;*&#39; 10 + 30002` allow all from $IP to table\(1\)
        ipfw add `expr $ID &#39;*&#39; 10 + 30002` allow all from table\(1\) to $IP

        ipfw add `expr $ID &#39;*&#39; 10 + 30002` allow all from $IP to table\(2\)
        ipfw add `expr $ID &#39;*&#39; 10 + 30002` allow all from table\(2\) to $IP

        ipfw add `expr $ID &#39;*&#39; 10 + 30002` pipe `expr $ID &#39;*&#39; 10 + 30002` all from any to $IP
        ipfw add `expr $ID &#39;*&#39; 10 + 30002` pipe `expr $ID &#39;*&#39; 10 + 30002` all from $IP to any
        exit 1
else

        ipfw pipe `expr $ID &#39;*&#39; 10 + 30002` config bw 600Kbit/s

        ipfw add `expr $ID &#39;*&#39; 10 + 30002` allow all from $IP to table\(1\)
        ipfw add `expr $ID &#39;*&#39; 10 + 30002` allow all from table\(1\) to $IP

        ipfw add `expr $ID &#39;*&#39; 10 + 30002` allow all from $IP to table\(2\)
        ipfw add `expr $ID &#39;*&#39; 10 + 30002` allow all from table\(2\) to $IP

        ipfw add `expr $ID &#39;*&#39; 10 + 30002` pipe `expr $ID &#39;*&#39; 10 + 30002` all from any to $IP
        ipfw add `expr $ID &#39;*&#39; 10 + 30002` pipe `expr $ID &#39;*&#39; 10 + 30002` all from $IP to any
        exit 1
fi

OnDisconnect
#!/bin/sh

LOGIN=$1
IP=$2
CASH=$3
ID=$4

echo &#34;C `date +%Y.%m.%d-%H.%M.%S` $IP $CASH&#34; >> /var/stargazer/users/$LOGIN/connect.log
ipfw del `expr $ID &#39;*&#39; 10 + 30002`

  • 0

#14 Колян

Колян

    Вампир

  • Сitizens
  • ФишкаФишкаФишкаФишкаФишкаФишка
  • 1 556 Сообщений:

Опубликовано 01 Июль 2007 - 16:58

Скрипты для СТГ с использованием модуля mysql_store, с возможностью резать скорость, за основу взяты скрипты Den_LocalNet:
OnConnect:
#!/usr/bin/php

<?php
$ext_face=&#34;re1&#34;; //Интерфейс, на котором резать скорость
$fwcmd=&#34;/sbin/ipfw -q&#34;; //Путь к фаерволлу
$login=$argv[1];
$ID=&#39;$argv[4]&#39;;
$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(&#39;localhost&#39;, &#39;root&#39;, &#39;pwd&#39;); //Настройки БД
mysql_select_db(&#39;stargazer&#39;);
$q=mysql_query(&#34;SELECT `Note`, `IP` FROM `users` WHERE `login`=&#39;$login&#39;&#34;);
$arr=mysql_fetch_array($q, MYSQL_ASSOC);
$IP=$arr[IP];
exec(&#34;$fwcmd delete $id1&#34;);
exec(&#34;$fwcmd delete $id2&#34;);
exec&#34;$fwcmd delete $id3&#34;);
exec(&#34;$fwcmd delete $id4&#34;);
exec(&#34;$fwcmd delete $id5&#34;);
exec(&#34;$fwcmd pipe $idspd config bw $arr[Note]&#34;);
exec(&#34;$fwcmd add $id1 allow icmp from $IP to any icmptype 0,3,4,11,12&#34;);
exec(&#34;$fwcmd add $id2 pipe $idspd ip from $IP to any via $ext_face&#34;);
exec(&#34;$fwcmd add $id3 pipe $idspd ip from any to $IP via $ext_face&#34;);
exec(&#34;$fwcmd add $id4 allow ip from $IP to any&#34;);
exec(&#34;$fwcmd add $id5 allow ip from any to $IP&#34;);
$curr_date=date(&#34;m_Y&#34;);
$date=date(&#34;Y-m-d h:i:s&#34;);
mysql_query(&#34;INSERT INTO `logs_$curr_date` VALUES (&#39;&#39;, &#39;$login&#39;, &#39;$date, User $login connected!&#39;)&#34;);
echo &#34;$date, User $login connected!&#34;;
?>
OnDisconnect:
#!/usr/bin/php
<?php
$ext_face=&#34;re1&#34;; //Интерфейс, на котором резать скорость
$fwcmd=&#34;/sbin/ipfw -q&#34;; //Путь к фаерволлу
$login=$argv[1];
$ID=&#39;$argv[4]&#39;;
$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(&#39;localhost&#39;, &#39;root&#39;, &#39;pwd&#39;); //Настройки БД
mysql_select_db(&#39;stargazer&#39;);
$q=mysql_query(&#34;SELECT `Note`, `IP` FROM `users` WHERE `login`=&#39;$login&#39;&#34;);
$arr=mysql_fetch_array($q, MYSQL_ASSOC);
$IP=$arr[IP];
exec(&#34;$fwcmd delete $id1&#34;);
exec(&#34;$fwcmd delete $id2&#34;);
exec(&#34;$fwcmd delete $id3&#34;);
exec(&#34;$fwcmd delete $id4&#34;);
exec(&#34;$fwcmd delete $id5&#34;);

$curr_date=date(&#34;m_Y&#34;);
$date=date(&#34;Y-m-d h:i:s&#34;);
mysql_query(&#34;INSERT INTO `logs_$curr_date` VALUES (&#39;&#39;, &#39;$login&#39;, &#39;$date, User $login DisConnected!&#39;)&#34;);
echo &#34;$date, User $login DisConnected!&#34;;
?>

  • 0
Админ без пива, что сервак без проца!

#15 Cell

Cell

    Точу Зубы

  • Сitizens
  • ФишкаФишкаФишка
  • 215 Сообщений:

Опубликовано 01 Июль 2007 - 19:05

Скрипт 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 &#39;IP=&#39; | cut -d &#34;=&#34; -f2`
mac=`cat /var/stargazer/users/$login/conf | grep &#39;Userdata0=&#39; | cut -d &#34;=&#34; -f2`
num=`cat /etc/dhcpd.conf | wc -l`
hst=`echo $ip | cut -d&#34;.&#34; -f4` # в больших сетях можно заюзать hst=$login
#let &#34;num=num+1&#34;
sed $num&#34;d&#34; /etc/dhcpd.conf > /var/tmp/dhcpd.temp
echo &#34;            host host-$hst {hardware ethernet $mac; fixed-address $ip;}
}&#34; >> /var/tmp/dhcpd.temp
rm /etc/dhcpd.conf
mv /var/tmp/dhcpd.temp /etc/dhcpd.conf

echo &#34;$ip       $mac&#34; >> /etc/ethers

arp -s $ip $mac

service dhcpd reload

  • 0

#16 Cell

Cell

    Точу Зубы

  • Сitizens
  • ФишкаФишкаФишка
  • 215 Сообщений:

Опубликовано 15 Июль 2007 - 13:33

Скрипт запуска STG в качестве демона на Linux

#!/bin/bash
. /etc/rc.d/init.d/functions
RETVAL=0
start()
{
echo -n $&#34;Запускаю биллинговую систему (Stargazer).....&#34;
( /usr/sbin/stargazer &)
    daemon true
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/stargaser
return $RETVAL
}

stop()
{
echo -n &#34;Останавливаю биллинговую систему (Stargazer).....&#34;
killproc stargazer
rm -f /var/lock/subsys/stargazer
echo
return $RETVAL
sleep 1
        }

case &#34;$1&#34; in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 2
start
;;
*)
echo &#34;Используй: `basename $0` { start | stop | restart }&#34;
exit
;;
esac


  • 0

#17 Queeq

Queeq

    Вампиреныш

  • Сitizens
  • ФишкаФишкаФишкаФишкаФишка
  • 572 Сообщений:
  • Пол:Мужчина

Опубликовано 12 Октябрь 2007 - 14:38

Простые скрипты 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&#58;0&#58;1}
world=${DIRS&#58;1&#58;1}


#Если включено первое направление - добавить адрес юзера в таблицу тех, кому разрешать первое направление.
if &#91; $uaix == 1 &#93;
then
    &#96;pfctl -t uausr -T add $IP&#96;
fi

#Если включено второе направление - добавить адрес юзера в таблицу тех, кому разрешать второе направление.
if &#91; $world == 1 &#93;
then
    &#96;pfctl -t wusr -T add $IP&#96;
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&#58;0&#58;1}
world=${DIRS&#58;1&#58;1}

#Если отмечено первое направление - удалить адрес юзера из таблицы тех, кому разрешать первое направление.
if &#91; $uaix == 1 &#93;
then
    &#96;pfctl -t uausr -T delete $IP&#96;
fi

#Если отмечено второе направление - удалить адрес юзера из таблицы тех, кому разрешать второе направление.
if &#91; $world == 1 &#93;
then
    &#96;pfctl -t wusr -T delete $IP&#96;
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 слушал только на этом адресе. Для сервера указывать не обязательно.
  • 0

#18 ponomar

ponomar

    Первая Кровь

  • Маглы
  • ФишкаФишка
  • 71 Сообщений:

Опубликовано 10 Ноябрь 2007 - 11:03

Выложите пожалуйста у кого есть Скрипты для СТГ с использованием модуля mysql_store, с возможностью резать скорость под iptables
  • 0

#19 xzvf

xzvf

    Пролетал Мимо

  • Маглы
  • Фишка
  • 46 Сообщений:
  • Пол:Мужчина

Опубликовано 09 Январь 2008 - 06:09

ПХП скрипты неработают, ручками работают?
  • 0
>-<>

#20 BECHA

BECHA

    Пролетал Мимо

  • Маглы
  • Фишка
  • 21 Сообщений:

Опубликовано 25 Февраль 2008 - 17:50

в случае FreeBSD, PF и использования правил с ключами "keep state" следует при отключении пользователя не только удалять его адрес из таблицы, но и удалять запись с его адресом из таблицы состояний. Вот так:
/sbin/pfctl -t users -T delete $IP
/sbin/pfctl -k $IP

  • 0




0 пользователей читают эту тему

0 members, 0 guests, 0 anonymous users

Local.blog МЕТА - Украина