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

Скрипты onConnect/onDisconnect

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

Для использования белых IP делайте алиасы и потом при помощи iptables :

iptables -t nat -A PREROUTING -i ethX -d $whiteIP -j DNAT --to $userIP
iptables -t nat -A POSTROUTING -s $userIP -j SNAT --to $whiteIP

ethX - смотрит в инет.

$whiteIP - Ваш внешний IP (XX.XXX.22.1-15)

$userIP - IP юзера (192.168.10.2)

 

А если просто выделить несколько внешних IP можно :

iptables -t nat -A POSTROUTING -s $userNET/24 -j SNAT --to $someIP

где:

$userNET/24 - подсеть юзеров (возможно не только /24 а и /32 и /26)

$someIP - несколько внешних IP , например XX.XXX.22.1-15 (с 1 по 15 - будут выдаваться рендомно)

+ этого способа - будет внешних не 1 на всех , а 15 на всех.

Или делать VLAN на юзера или свитчем его прямо в сеть с реал IP.

Поделиться сообщением


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

Вроде просто .... Все сделал но все равно не срабатывает

Поделиться сообщением


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

Как корректно настроить маршрутизацию и маскарадинг, чтобы, скажем, 192.168.10.2 на eth1 имел реальник XX.XXX.22.15 на eth0

/sbin/iptables -t nat -I PREROUTING -i eth0 -d XX.XXX.22.15 -j DNAT --to 192.168.10.2
/sbin/iptables -t nat -I POSTROUTING -s 192.168.10.2 -o eth0 -j SNAT --to XX.XXX.22.15

А так ?

ключ -I проставлен, чтобы если у Вас прописан маскарад это правило было выше. (или уберите маскарад или СНАТ для этих адресов в старом фаерволе).

Поделиться сообщением


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

Как корректно настроить маршрутизацию и маскарадинг, чтобы, скажем, 192.168.10.2 на eth1 имел реальник XX.XXX.22.15 на eth0

/sbin/iptables -t nat -I PREROUTING -i eth0 -d XX.XXX.22.15 -j DNAT --to 192.168.10.2
/sbin/iptables -t nat -I POSTROUTING -s 192.168.10.2 -o eth0 -j SNAT --to XX.XXX.22.15

А так ?

ключ -I проставлен, чтобы если у Вас прописан маскарад это правило было выше. (или уберите маскарад или СНАТ для этих адресов в старом фаерволе).

 

Урааа - огромное спасибо, заработало.

Поделиться сообщением


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

Люди помогите настроить билинг

мне надо чтоб было ограничение по скорости

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

может кто сможет со мной связаться по скайпу tolia_katsubo

или оставьте свои данные я вам наберу

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Можете подсказать как сделать авторизацию с проверкой мак? просто в баше не очень силен, бы л бы очень благодарен если бы кинули огрызок такого кода, и обяснили что нужно создавать, и в каких файлах. ОСь у меня ubuntu server, использую iptables.

При авторизации MAC не проверяется. Но можно сделать дополнительную проверку в OnConnect. Описываем MAC, например, в в одном из полей UserData. При вызове скрипта получаем реальный MAC с помощью arp -n $IP (ну там еще tail'ом и cut'ом немножко поработать), и вычитываем соответствующий UserData из БД (файловой или SQL'ной). Если совпадает - разрешаем юзера в файрволле.

Привет всем, помогите с кодом в OnConnect для проверки mac адреса при подключении, уже все перечисленные примеры перепробовал, не получается никак.

система fedora 15

вот мой onconnect, шейпер работает прекрасно, а вот проверка по маку не работает

 

#!/bin/bash

 

iface_cli=em1

 

# Login

LOGIN=$1

 

#user IP

IP=$2

 

#cash

CASH=$3

 

#user ID

ID=$4

 

#Selected dirs to connect

DIRS=$5

 

default_speed=32kbit

 

# =========== shaping by tariff ===========

#tariff=$(grep -i "^tariff=" /var/stargazer/users/$LOGIN/conf | cut -f 2 -d"=")

#echo "tariff=$tariff" > /var/stargazer/users/$LOGIN/connect.log

#case $tariff in

# minimum) speedkb=128kbit;; # 128 kbit

# middle) speedkb=256kbit;; # 256 kbi

# maximum) speedkb=512kbit;; # 512 kbit

# *) speedkb=$default_speed;; # default speed

#esac

# ========= shaping by tariff end =========

 

# ========= shaping by userdata0 ==========

speedR=$(grep -i "^Userdata0=" /var/stargazer/users/$LOGIN/conf | cut -f 2 -d"=")

speed=$(echo $speedR | grep "^[0-9]*[0-9]$")

MAC=$(grep -i "^Userdata1=" /var/stargazer/users/$LOGIN/conf | cut -f 2 -d"=")

 

if [ -z "$speed" ]

then

speedkb=$default_speed

else

speedkb="$speed"kbit

fi

# ======= shaping by userdata0 end ========

 

declare -i mark=$ID+10

 

echo "$mark" > /var/stargazer/users/$LOGIN/shaper_mark

echo "$speedkb" > /var/stargazer/users/$LOGIN/shaper_rate

 

iptables -t mangle -A FORWARD -d $IP -j MARK --set-mark $mark

 

tc class add dev $iface_cli parent 1:1 classid 1:$mark htb rate $speedkb burst 40k

tc filter add dev $iface_cli parent 1: protocol ip prio 3 handle $mark fw classid 1:$mark

 

if [ -n "$MAC" ]

then

/sbin/iptables -A FORWARD -s $IP -j ACCEPT

/sbin/iptables -A FORWARD -d $IP -j ACCEPT

else

/sbin/iptables -A FORWARD -s $IP -m mac --mac-source $MAC -j ACCEPT

/sbin/iptables -A FORWARD -d $IP -j ACCEPT

 

 

/sbin/iptables -t filter -A FORWARD -s $IP -j ACCEPT

/sbin/iptables -t filter -A FORWARD -d $IP -j ACCEPT

/sbin/iptables -t filter -A INPUT -s $IP -j ACCEPT

/sbin/iptables -t filter -A OUTPUT -d $IP -j ACCEPT

fi

fi

Поделиться сообщением


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

чтобы промерять по маку есть 2 варианта:

1. ip адреса жёстко привязаны к маку по ARP тогда проверка при авторизации не нужна, просто никто другой не сможет подключиться

2. ip не привязаны, но при авторизации проверяется MAC сетевой

я у себя еспользую 1-ый вариант, если у вас 2-ой случай, то можно просто их сравнивать, узнать текущий мак можно через

 

arp -a $IP | cut -f 4 -d " "

 

или нужно именно разрешить форвард по мак?

 

ещё не понятно зачем 2 раза одно и то же

 

/sbin/iptables -A FORWARD -s $IP -j ACCEPT

/sbin/iptables -A FORWARD -d $IP -j ACCEPT

это же и есть filter

Поделиться сообщением


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

чтобы промерять по маку есть 2 варианта:

1. ip адреса жёстко привязаны к маку по ARP тогда проверка при авторизации не нужна, просто никто другой не сможет подключиться

2. ip не привязаны, но при авторизации проверяется MAC сетевой

я у себя еспользую 1-ый вариант, если у вас 2-ой случай, то можно просто их сравнивать, узнать текущий мак можно через

 

arp -a $IP | cut -f 4 -d " "

 

или нужно именно разрешить форвард по мак?

 

ещё не понятно зачем 2 раза одно и то же

 

/sbin/iptables -A FORWARD -s $IP -j ACCEPT

/sbin/iptables -A FORWARD -d $IP -j ACCEPT

это же и есть filter

 

Нужна жесткая привязка по мак, т.е. разрешить форвард по мак и IP, DHCP нету

а, ну тогда надо создать постоянную таблицу arp ?(если честно, еще плаваю в линуксе)

Не могли бы вы поделиться кодом OnConnect ?

Поделиться сообщением


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

Нужна жесткая привязка по мак, т.е. разрешить форвард по мак и IP, DHCP нету

а, ну тогда надо создать постоянную таблицу arp ?(если честно, еще плаваю в линуксе)

Не могли бы вы поделиться кодом OnConnect ?

жёсткая привязка по мак это ARP

 

arp -s 192.168.1.2 00:1a:6a:00:00:00

 

в таком случае у абонента с айпи 192.168.1.2 и мак адресом отличным от 00:1a:6a:00:00:00 доступа к серверу не будет, он не будет даже пинговаться

в вашем же примере скрипта проверка по маку учавствует только между обменом (цепочка FORWARD)

 

приведу свой пример, база у меня в MySQL

вот часть скрипта OnConnect отвечающая на мак

 MAC=`/usr/bin/mysql -sN -h$DBHOST -u$DBUSER -p$ROOTDBPASS $DBNAME -e "SELECT Userdata0 FROM users WHERE login = '$login'"`
   /usr/bin/arping -I eth_local $IP -c 1 -w 0
   newMAC=`/usr/sbin/arp -a $IP | cut -f 4 -d " "`
   /usr/sbin/arp -d $IP
   /usr/sbin/arp -s $IP $newMAC
   if [ -z "`/bin/echo $MAC | grep $newMAC`" ]; then
       /etc/stargazer/sgconf set -s 127.0.0.1 -p 4446 -a $STGADM -w $STGPASS -u $login --ud0 $newMAC
   fi

принцип работы:

- берём МАС прописаный в карточке юзера

- делаем arping чтобы мак "прорезался" на сервере, так сказать засветился

- выделяем этот мак

- статиески привязываем его (сначала опустошаем потом привязываем это для тех кому мак не нужно привязывать, команда -s попросту не сработает)

- если же мак в базе и реальный мак разные тогда в базу заносится новый, сделано для того кто меняет сетевушку, всё равно кто то левый не сможет достучаться до сервера чтобы это сделать :unsure:

 

собственно вот, а так ещё раз в сутки по крону отрабатывает скрипт

macfix

#!/bin/sh

source /etc/stargazer/sql.conf

# lan0
for ((ip=2;ip<255;ip++));
do /usr/sbin/arp -s 192.168.0.${ip} ${firmmac}
done;
echo "lan0 done"

# lan1
for ((ip=2;ip<31;ip++));
do /usr/sbin/arp -s 192.168.1.${ip} ${firmmac}
done;
echo "lan1 done"

# lan2
for ((ip=2;ip<15;ip++));
do /usr/sbin/arp -s 192.168.2.${ip} ${firmmac}
done;
echo "lan2 done"

LOGINS=`/usr/bin/mysql -sN -h$DBHOST -u$DBUSER -p$ROOTDBPASS $DBNAME -e "SELECT login FROM users"`
for login in $LOGINS
do
   IP=`/usr/bin/mysql -sN -h$DBHOST -u$DBUSER -p$ROOTDBPASS $DBNAME -e "SELECT IP FROM users WHERE login = '$login'"`
   MAC=`/usr/bin/mysql -sN -h$DBHOST -u$DBUSER -p$ROOTDBPASS $DBNAME -e "SELECT Userdata0 FROM users WHERE login = '$login'"`
   LOCKED=`/usr/bin/mysql -sN -h$DBHOST -u$DBUSER -p$ROOTDBPASS $DBNAME -e "SELECT Down FROM users WHERE login = '$login'"`
   if [ $LOCKED = 0 ]; then
       /usr/sbin/arp -d $IP
       /usr/sbin/arp -s $IP $MAC
   fi
done
lan4 done"

echo "arp table fixed"

Поделиться сообщением


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

Нужна жесткая привязка по мак, т.е. разрешить форвард по мак и IP, DHCP нету

а, ну тогда надо создать постоянную таблицу arp ?(если честно, еще плаваю в линуксе)

Не могли бы вы поделиться кодом OnConnect ?

жёсткая привязка по мак это ARP

 

arp -s 192.168.1.2 00:1a:6a:00:00:00

 

в таком случае у абонента с айпи 192.168.1.2 и мак адресом отличным от 00:1a:6a:00:00:00 доступа к серверу не будет, он не будет даже пинговаться

в вашем же примере скрипта проверка по маку учавствует только между обменом (цепочка FORWARD)

 

приведу свой пример, база у меня в MySQL

вот часть скрипта OnConnect отвечающая на мак

 MAC=`/usr/bin/mysql -sN -h$DBHOST -u$DBUSER -p$ROOTDBPASS $DBNAME -e "SELECT Userdata0 FROM users WHERE login = '$login'"`
   /usr/bin/arping -I eth_local $IP -c 1 -w 0
   newMAC=`/usr/sbin/arp -a $IP | cut -f 4 -d " "`
   /usr/sbin/arp -d $IP
   /usr/sbin/arp -s $IP $newMAC
   if [ -z "`/bin/echo $MAC | grep $newMAC`" ]; then
       /etc/stargazer/sgconf set -s 127.0.0.1 -p 4446 -a $STGADM -w $STGPASS -u $login --ud0 $newMAC
   fi

принцип работы:

- берём МАС прописаный в карточке юзера

- делаем arping чтобы мак "прорезался" на сервере, так сказать засветился

- выделяем этот мак

- статиески привязываем его (сначала опустошаем потом привязываем это для тех кому мак не нужно привязывать, команда -s попросту не сработает)

- если же мак в базе и реальный мак разные тогда в базу заносится новый, сделано для того кто меняет сетевушку, всё равно кто то левый не сможет достучаться до сервера чтобы это сделать :)

 

собственно вот, а так ещё раз в сутки по крону отрабатывает скрипт

macfix

#!/bin/sh

source /etc/stargazer/sql.conf

# lan0
for ((ip=2;ip<255;ip++));
do /usr/sbin/arp -s 192.168.0.${ip} ${firmmac}
done;
echo "lan0 done"

# lan1
for ((ip=2;ip<31;ip++));
do /usr/sbin/arp -s 192.168.1.${ip} ${firmmac}
done;
echo "lan1 done"

# lan2
for ((ip=2;ip<15;ip++));
do /usr/sbin/arp -s 192.168.2.${ip} ${firmmac}
done;
echo "lan2 done"

LOGINS=`/usr/bin/mysql -sN -h$DBHOST -u$DBUSER -p$ROOTDBPASS $DBNAME -e "SELECT login FROM users"`
for login in $LOGINS
do
   IP=`/usr/bin/mysql -sN -h$DBHOST -u$DBUSER -p$ROOTDBPASS $DBNAME -e "SELECT IP FROM users WHERE login = '$login'"`
   MAC=`/usr/bin/mysql -sN -h$DBHOST -u$DBUSER -p$ROOTDBPASS $DBNAME -e "SELECT Userdata0 FROM users WHERE login = '$login'"`
   LOCKED=`/usr/bin/mysql -sN -h$DBHOST -u$DBUSER -p$ROOTDBPASS $DBNAME -e "SELECT Down FROM users WHERE login = '$login'"`
   if [ $LOCKED = 0 ]; then
       /usr/sbin/arp -d $IP
       /usr/sbin/arp -s $IP $MAC
   fi
done
lan4 done"

echo "arp table fixed"

 

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

 

как я понял надо взять ваш код (только у меня база в текстовиках пока)

 

MAC=$(grep -i "^Userdata1=" /var/stargazer/users/$LOGIN/conf | cut -f 2 -d"=")
/usr/bin/arping -I $iface_cli $IP -c 1 -w 0
newMAC=`/usr/sbin/arp -a $IP | cut -f 4 -d " "`
/usr/sbin/arp -d $IP
/usr/sbin/arp -s $IP $newMAC

здесь мас подключившегося связывается с IP и если мак не равняется с маком в базе, то

#как вот тут правильно написать равенство мака в базе и newMAC, подскажите пожалуйста 
if [ -z "$MAC=$newMAC" ]; then
/sbin/iptables -t filter -A FORWARD -s $IP -j ACCEPT

Поделиться сообщением


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

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

если по ARP жёстко привязать мак то доступа у человека с другим маком не будет вообще

 

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

Поделиться сообщением


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

onConnect/onDisconnect для текстовых файлов.Парметры скорости для юзера задаются в Userdata0/Userdata1

onConnect

#!/usr/local/bin/bash
#user IP
IP=`cat ip | sed 's/ //g'`
#user ID
ID=`cat id | sed 's/ //g'`
#скорость загрузки
DOWN=`cat conf | grep -i 'Userdata0=' | sed -e "s/^.*=//g"`
#скорость отдачи
UP=`cat conf | grep -i 'Userdata1=' | sed -e "s/^.*=//g"`
ipfw="/sbin/ipfw"
inn='xl0'

${ipfw} pipe `expr $ID + 20000` config bw ${DOWN}Kbit/s
${ipfw} pipe `expr $ID + 25000` config bw ${UP}Kbit/s

${ipfw} add `expr $ID + 15000` pipe `expr $ID + 20000` ip from any to ${IP}
${ipfw} add `expr $ID + 15000` pipe `expr $ID + 25000` ip from ${IP} to any

 

onDisconnect

#!/usr/local/bin/bash
#user IP
IP=`cat ip | sed 's/ //g'`#user ID
ID=`cat id | sed 's/ //g'`
ipfw="/sbin/ipfw"
#удаление правил с шейпера
${ipfw} pipe delete `expr $ID + 20000`
${ipfw} pipe delete `expr $ID + 25000`
#удаление правил с файервола
${ipfw} delete `expr $ID + 15000`

Поделиться сообщением


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

Предлагаю заменить

DOWN=`cat conf | grep -i 'Userdata0=' | sed -e "s/^.*=//g"`
UP=`cat conf | grep -i 'Userdata1=' | sed -e "s/^.*=//g"`

на

DOWN=`grep -i "userdata0=" conf | tail -c +11`
UP=`grep -i userdata1 conf | tail -c +11`

Меньше на 1 форк и tail по идее быстрее чем sed.

Скрипты, к стати, не полны. Почему бы не привести их в полном, готовом к использованию виде?

Ну и непонятны вот эти телодвижения:

IP=`cat ip | sed 's/ //g'`
ID=`cat id | sed 's/ //g'`

Если ip и id это переменные которые получаем из параметров то нужно делать не cat а echo. И в них и так проблелов быть не может, это сгенерированные значения.

Изменено пользователем madf
опечатка

Поделиться сообщением


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

Скрипты, к стати, не полны. Почему бы не привести их в полном, готовом к использованию виде?

Плнаруется перевод БД на MySQL, поэтому вряд ли...

Возможно у кого-то есть примеры ограничения скорости для каждой учетки под mysql?

Поделиться сообщением


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

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

Поделиться сообщением


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

Помогите с примерами скриптов onconnect для микротик апи.

Поделиться сообщением


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

предполагаю что нужно изучать само API от микротика, к биллингу это никакого отношения не имеет

Поделиться сообщением


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

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

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

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

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

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

Войти

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

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×