жёсткая привязка по мак это 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