Перейти до

скрипт для борьбы с неплательщиками


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

В усмерть достали любители не платить вовремя, в связи с чем, за ночь наваял простенький скрипт на пхп. Скрипт проверяет состояние счетов, составляет список айпи пользователей, у которых остаток 0 или менее и добавляет в айпитейблс соответствующее правило (я закрываю ДИСИ++, чат, IRC, jabber). Скрипт запускаю кроном раз в 10 минут. Если юзер оплатил, порты открываются.

Я не программер, потому не пинать :) Пишу за тем, чтобы услышать идеи/советы по оптимизации скрипта. К примеру на данный момент при запуске скрипта генерятся правила iptables -D по всем айпи, а потом снова iptables -I по неплательщикам, дабы избежать дублирования правил и удалить правила для тех, кто заплатил(догадываюсь, что это можно сделать как-то грамотнее удаляя/добавляя лишь конкретные айпи, подскажите плз).

 

Также хотелось бы узнать юзает ли кто-либо подобные скрипты(на bash, perl, etc.) для решения вопроса. Если не жалко поделитесь :)

 

#!/usr/bin/php
#php script for stargazer by Garik
<?php
$iptables="/sbin/iptables";
$server="192.168.1.1";
$dirname = "/var/stargazer/users/";
$dh = opendir($dirname);
while (gettype($file=readdir($dh)) != boolean)
{
if (( is_dir("$dirname/$file")) & ($file!="..") & ($file!="."))
$users[]="$file";
};
closedir($dh);
foreach ($users as $user)
{
#bablo
$file = "$dirname$user/stat";
($fp = fopen("$file", 'r')) or die ("log file read error");
while ( ! feof( $fp))
{
$line=fgets( $fp, 1024);
if (ereg ("Cash=",$line)!=false)
{
$balans=sprintf("%.2f",trim(substr($line,5,15)));
};
};
#ip
$file = "$dirname$user/conf";
($fp = fopen("$file", 'r')) or die ("log file read error");
while ( ! feof( $fp))
{
$line=fgets($fp, 1024);
if (ereg ("IP=",$line)!=false)
{$ip=trim(substr($line,3,15));
};
};
$iplist[]="$ip";
if ($balans<="-0")
{$color="RED";
$badboys[]="$ip";} #sozdaem massiv neplatelshikov
else
{$color="#FFF0D9";
$goodboys[]="$ip";} #sozdaem massiv zaplativshih
};
#FLUSH iptables ban rulles
foreach ($iplist as $usersip)
{
system ("$iptables -D INPUT -s $usersip -p tcp -m multiport --dports 65500,6667,5222,5223 -j DROP\n");
};
#BAN
foreach ($badboys as $badboy)
{
system ("$iptables -I INPUT 1 -s $badboy -p tcp -m multiport --dports 65500,6667,5222,5223 -j DROP\n");
};
#UNBAN
foreach ($goodboys as $goodboy)
{
#system ("$iptables -I INPUT 1 -s $goodboy -d $server -p tcp --dport 6666 -j ACCEPT\n");
};
?>

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

Можно сделать так - фаерволл изначально запрещает всем в локалке доступ к себе и, естественно, наружу.

А потом отдельно прописать доступ всем админским компами серверам.

И подредактировать OnConnect так, чтоб он открывал доступ наружу и к самому серверу.

Можно сделать так, чтоб какие-то порты были открыты и без запуска onconnect.

А остальное только с ним.

ПОлучается так: включил ключик - имеешь ирку, аську и прочие сервисы.

Выключил - не имеешь.

Если у человека 0, то он их иметь не будет и так.

Никакого скрипта ещё не надо.

 

Лично у нас без OnConnect доступны ввв, джаббер, пинг (коды 0 и 8) до сервера.

Остальное (почта) доступно после включения.

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

Лично у нас без OnConnect доступны ввв, джаббер, пинг (коды 0 и 8) до сервера.

Остальное (почта) доступно после включения.

Собственно, я потому и написал этот скрипт, так как не хотел вынуждать пользователей запускать ключик, для доступа к некоторым сервисам. В тоже время хотелось слегка "подтолкнуть" их к своевременной оплате. Задуманное удалось, результатом доволен. :( Хочу лишь немного оптимизировать скриптик.

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

А что, STG разве не блокирует неплательщиков? Я думал, что блокирует.

 

Ну по поводу самого скрипта. Совершенно зря ты все делаешь в корневой цепочке INPUT. Это iptables, а не ipchains. Лучше сделать селектор в INPUT, FORWARD, из которого вызывать отдельную цепочку. Тогда будет и проще работать, и меньше нагрузки на фильтр, и управлять проще. Например, если есть список тех, кому разрешено работать, то при изменении статуса платежа какого-либо клиента, простой скрипт сносит цепочку нафик, и тупо строит заново, возвращая разрешенных клиентов, и запрещая всех остальных.

 

У меня, например, для этих целей служит такой скрит на шелле:

 

#!/bin/sh
##############################################################################
# TopolA MS, Copyright © 2006, Oleg Vlasenko
##############################################################################
# User configuration data

CLI_NET="172.16.0.0/24"
# SYS_ADR1="172.16.1.25"
# SYS_ADR2="172.16.1.26"
# SYS_ADR3="172.16.1.27"

##############################################################################
# Filenames of allow list
RESLISTDIR=/usr/local/accnt/conf
ALLOWLIST=$RESLISTDIR"/internet.allow"

##############################################################################
# Bocking chain name
ACT_CHAIN="active"

##############################################################################
# Set iptables variable
IPT=${IPT:-`which iptables`}
if [ $? != 0 ]; then
 echo Can not find iptables command
 exit 1
fi

##############################################################################
# Check if we have "allow list" file.
if [ ! -f ${ALLOWLIST} ]; then
 exit 0
fi

##############################################################################
# Let's check if chain "active" exists. If so, flush it, else create a new one
$IPT -F $ACT_CHAIN >/dev/null 2>&1
if [ $? = 1 ]; then
   $IPT -N $ACT_CHAIN
   $IPT -I FORWARD -s ${CLI_NET} -j $ACT_CHAIN
fi

##############################################################################
# System addresses - should work always
# $IPT -A $ACT_CHAIN -s $SYS_ADR1 -j RETURN
# $IPT -A $ACT_CHAIN -s $SYS_ADR2 -j RETURN
# $IPT -A $ACT_CHAIN -s $SYS_ADR3 -j RETURN

# Add allowed addresses from accnt
/bin/cat $ALLOWLIST | while read Res; do
  $IPT -A $ACT_CHAIN -s $Res -j RETURN
done

# Rest of customer IP should be rejected
$IPT -A $ACT_CHAIN -j REJECT --reject-with icmp-host-unreachable

##############################################################################

 

Файл internet.allow содержит список IP клиентов, которым разрешено работать. Скрипт запускается регулярно из крона раз минут в 5. Список создает специальная тулзовина. В принципе, не сложно написать такую тулзовну и под старгейзер.

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

так так так...

 

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

 

т.е. для того чтобы не дать работать кому либо нужно задать не верную комбинацию АЙПи-МАК клиена?

я правильно понял?

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

совсем не обазательно

можно прописать мак пользователя и какой бі он айпи не ставил в сеть его не пустит

ну или айпи конкретній заблокировать

так же можно блокировать подсети

я по ошибке 1 раз сетку прову положил мин на 5 :(

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

Здравствуйте, натолкните меня на истинный путь:

Я хочу что бы по истичению бессплатных мегабайт (FreeMB) этот скрипт вырубал юзеров отзарубежа и оставлял только Украину...

Примеры моих конфигов:

#!/bin/bash
#Мратора
admin=192.168.1.2

#Адеса роутер
server0=192.168.1.100
server1=10.3.0.19

# Интерфейс смотрящий на клиентов
iface_cli=eth1

# Интерфейс смотрящий во внешний мир
iface_world=eth0

#орт
conf_port=5555
user_port=5555
IPFILE=/etc/stargazer/IPFILE.txt
# Разреаем форва пакетов между интерфейсами
# Эта штукаобяз
# по умолчаниюре
# Если мы птрахуемсяе не бкде
echo "1" > /proc/sys/net/ipv4/ip_forward
IPTABLES="/sbin/iptables"
# Оча файрвола
$IPTABLES -t filter -F
$IPTABLES -t filter -X
$IPTABLES -t nat -F
$IPTABLES -t nat -X

# Политика по умолчаниюем всё запрещено
$IPTABLES -t filter -P INPUT DROP
$IPTABLES -t filter -P FORWARD DROP
$IPTABLES -t filter -P OUTPUT DROP

# Разрешаем пингам ходить всюду и всега
$IPTABLES -t filter -A INPUT -p icmp -j ACCEPT
$IPTABLES -t filter -A FORWARD -p icmp -j ACCEPT
$IPTABLES -t filter -A OUTPUT -p icmp -j ACCEPT
# Разрешаем всё на локальном интерфейс
$IPTABLES -t filter -A INPUT -d 127.0.0.1 -j ACCEPT
$IPTABLES -t filter -A OUTPUT -s 127.0.0.1 -j ACCEPT
# Разрешь серверу общаться со внешним миром
$IPTABLES -t filter -A INPUT -i $iface_world -j ACCEPT
$IPTABLES -t filter -A OUTPUT -o $iface_world -j ACCEPT
#
$IPTABLES -t filter -A INPUT -i $iface_cli -j ACCEPT
$IPTABLES -t filter -A OUTPUT -o $iface_cli -j ACCEPT
# DNS. Замечу, ДНС работает и по TCP и по UDP
$IPTABLES -t filter -A INPUT -p tcp --sport 53 -j ACCEPT
$IPTABLES -t filter -A FORWARD -p tcp --sport 53 -j ACCEPT
$IPTABLES -t filter -A FORWARD -p tcp --dport 53 -j ACCEPT
$IPTABLES -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
$IPTABLES -t filter -A INPUT -p udp --sport 53 -j ACCEPT
$IPTABLES -t filter -A FORWARD -p udp --sport 53 -j ACCEPT
$IPTABLES -t filter -A FORWARD -p udp --dport 53 -j ACCEPT
$IPTABLES -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT

# SSH
$IPTABLES -t filter -A INPUT -p tcp -s $admin -d $server0 --dport 22 -j ACCEPT
$IPTABLES -t filter -A OUTPUT -p tcp -d $admin -s $server0 --sport 22 -j ACCEPT

# Stargazer configurator
$IPTABLES -t filter -A INPUT -p tcp -s 192.168.1.2 -d $server0 --dport $conf_port -j ACCEPT
$IPTABLES -t filter -A OUTPUT -p tcp -d 192.168.1.2 -s $server0 --sport $conf_port -j ACCEPT

# UDP stargazer InetAccess
$IPTABLES -t filter -A INPUT -p udp -s 192.168.1.0/24 --sport $user_port -d $server0 --dport $user_port -j ACCEPT
$IPTABLES -t filter -A OUTPUT -p udp -d 192.168.1.0/24 --dport $user_port -s $server0 -j ACCEPT

#Маскарад
$IPTABLES -t nat -A POSTROUTING -o $iface_world -j MASQUERADE

#UA_IX
$IPTABLES -X UA_IX
$IPTABLES -X UA_IX_S

$IPTABLES -N UA_IX
$IPTABLES -N UA_IX_S
#################
grep "^" $IPFILE | while read ip;
do
if [ $ip <> NULL ]
then $IPTABLES -A UA_IX -d $ip -j RETURN
fi
done
$IPTABLES -A UA_IX -j REJECT
################
grep "^" $IPFILE | while read ip;
do
if [ $ip <> NULL ]
then $IPTABLES -A UA_IX_S -d $ip -j RETURN
fi
done
$IPTABLES -A UA_IX_S -j REJECT
############
$IPTABLES -I INPUT 1 -i eth0 -j UA_IX_S
$IPTABLES -I OUTPUT 1 -o eth0 -j UA_IX
#$IPTABLES -I FORWARD 1 -s 192.168.1.20 -j UA_IX

 

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

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

К сожалению, ip-sentinel работает только на linux.

На FreeBSD не хотит даже компилиться.

Хотя я особенно не мудрствовал там.

Может напиьник сможет помочь )

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

уф

шото я запутался в документации

 

мне нужно заблокировать айпи

я в файле ips.cfg

написал:

 

192.168.1.100

 

и фсе...

это верно?

сюдя по доке так, но компьютер так и висит в сети...

или нужно дождаться его перезагрузки?

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

arp -S помогает даже на FreeBSD.

Но намного проще поставить сетевое оборудование и по SNMP/RMON управлять ALC по макам или отключать порты неплательщикам. :(

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

arp -s на фряхе действует мощно.

Во всяком случае простому юзеру локалку обрубает сразу.

 

Управляемые свичи поставить не проще, но эфективнее.

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

это кому оно обрезает локалку юзеру

чето я такого не заметил максимум что оно обрезает это доступ на сервак

а в нутри сегмента юзер гуляет свободно без всяких проблем и качает через нетбиос все что ему надо

проверено на своей шкуре

что касаеться фри могу ошибаться но в линуксе это по барабану

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

Во фре нужно использовать параметр pub.

arp -s ip mac pub

Тогда он будет рассылать этот мак-адрес по айпишнику всем запросившим.

Фишка в том, что когда винда инициализирует подключение, она рассылает пакеты "а нету ли тут кого с моим ип адресом?".

А сервер ей в ответ "есть!".

И виндовс ругается на эту тему и не хочет инициализировать интерфейс.

Точнее инициализирует, но работать через него не хотит.

Как обстоят дела с arp в линуксе, я не знаю )

Ещё могу добавить, что можно забивать мак-адреса не нулями, а генерируемыми случайными адресами.

Это поможет справиться с теми, кто захочет поменять мак-адрес.

 

Есессно, это не панацея и тут много способов чего-нибудь сделать.

Такое решение работает очень условно.

Поэтому управляемые свичи эффективнее и надежнее.

Т.е. позволяют безусловно отрубать народ.

Но если свичей нет, то можно попользоваться и этим.

 

Для пользователей на винде это более менее работает.

Для пользователей других ОС это тоже работает, если нет знаний на эту тему )

Ссылка на сообщение
Поделиться на других сайтах
Как обстоят дела с arp в линуксе, я не знаю )

Ну под линуксом, в принципе, тот же arp -s IP MAC pub

 

Но в любом случае, это не панацея. Панацея одна - отключение порта на свиче. Любым способом, включая монтера :)

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

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

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

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

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

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

Вхід

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

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

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

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