Перейти до

trend

Маглы
  • Всього повідомлень

    3
  • Приєднався

  • Останній візит

Сообщения додав trend

  1. Нужна жесткая привязка по мак, т.е. разрешить форвард по мак и 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

  2. чтобы промерять по маку есть 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 ?

  3. Можете подсказать как сделать авторизацию с проверкой мак? просто в баше не очень силен, бы л бы очень благодарен если бы кинули огрызок такого кода, и обяснили что нужно создавать, и в каких файлах. ОСь у меня 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

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