FreeBSD: Firewall ipfw + shell + sqlite3 — когда не хочется ставить лишних пакетов
,h2>История о том, когда не нужен perl или php и реляционная база данных
В общем мой знакомый попросил Меня поднять ему сервер для домашних компиков и соседей.
У него уже была FreeBSD Я лишь обновил её до 8.2
>uname -a FreeBSD nas1 8.2-RELEASE FreeBSD 8.2-RELEASE #2: Sun Mar 20 23:24:26 EET 2011 root@nas1:/usr/obj/usr/src/sys/NAS2 amd64
Задача заключалась в том, что бы для определённых мак-адресов не ограничивать скорость.
Сначала Я хотел решить эту задачу с помощью php+mysql (это первая мысль), но потом подумал сколько может быть гемороя с этим всем если mysql не будет запускаться.
Тогда Я подумал решить с помощью php, но его надо было так же ставить, а потом еще и возможно обновлять.
И тогда Я вспомнил о sqlite и решил это всё на shell+sqlite :=)
Firewall ipfw + shell + sqlite3 — когда не хочется ставить лишних пакетов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #!/bin/sh sqlite3=/usr/local/bin/sqlite3 db=/arp.db tmp=/tmp/arp mask="10." mac_not_ipfw="00-AA-B0-00-00-FF 00:aa:bb:cc:ee:0c" ipfw_number_start=100 ipfw_step=1 pipe_start=10 ipfw="/sbin/ipfw " ipfwa="/sbin/ipfw add " temp=`echo $mac_not_ipfw| tr "[A-Z]" "[a-z]"|tr "-" ":" ` mac_not_ipfw=$temp bw_8="8Mbis/s" $sqlite3 $db " create table IF NOT EXISTS arp ( mac TEXT UNIQUE, ip TEXT);" #cat $tmp|grep -v "incomplete" |tr '(' ' '|tr ')' ' '|sed 's/^ //'| tr "[A-Z]" "[a-z]"|tr "-" ":"| awk '{print"delete from arp where mac= \047"$4"\047;insert into arp (ip,mac) values (\047"$2"\047, \047"$4"\047); \n" }'|grep 10.198 cat $tmp|grep -v "incomplete" |tr '(' ' '|tr ')' ' '|sed 's/^ //'| tr "[A-Z]" "[a-z]"|tr "-" ":"| awk '{print"delete from arp where mac=\047"$4"\047" }'| $sqlite3 $db > /dev/null 2>&1 echo '#!/bin/tcsh'>/tmp/sqlite.sh cat $tmp|grep -v "incomplete" |tr '(' ' '|tr ')' ' '|sed 's/^ //'| tr "[A-Z]" "[a-z]"|tr "-" ":"| awk '{print"sqlite3 /arp.db \" delete from arp where mac=\047"$4"\047 ;\"" }'>/tmp/sqlite.sh /bin/tcsh /tmp/sqlite.sh cat $tmp|grep -v "incomplete" |tr '(' ' '|tr ')' ' '|sed 's/^ //'| tr "[A-Z]" "[a-z]"|tr "-" ":"| awk '{print"insert into arp (ip,mac) values (\047"$2"\047, \047"$4"\047); \n" }'| $sqlite3 $db > /dev/null 2>&1 echo '#!/bin/tcsh'>/tmp/sqlite.sh echo "\n">>/tmp/sqlite.sh cat $tmp|grep -v "incomplete" |tr '(' ' '|tr ')' ' '|sed 's/^ //'| tr "[A-Z]" "[a-z]"|tr "-" ":"| awk '{print"sqlite3 /arp.db \"delete from arp where mac=\047"$4"\047; \"; sqlite3 /arp.db \"insert into arp (ip,mac) values (\047"$2"\047, \047"$4"\047); \";" }'>/tmp/sqlite.sh /bin/tcsh /tmp/sqlite.sh l="" for temp in $mac_not_ipfw do l=$l" AND mac!='$temp'" done ip="" temp="" temp=`$sqlite3 $db "SELECT ip FROM arp WHERE ip LIKE '10.%' $l"` ip=$ip" "$temp temp=`$sqlite3 $db "SELECT ip FROM arp WHERE ip LIKE '192.%' $l"` ip=$ip" "$temp ipall=$ip ip="" pipe_n=`expr $pipe_start + 1` pipe_n2=`expr $pipe_n + 1` ipfw_number_start=`expr $ipfw_number_start + $ipfw_step ` for ip in $ipall do $ipfw pipe $pipe_n config bw $bw_8 > /dev/null 2>&1 $ipfw pipe $pipe_n2 config bw $bw_8 > /dev/null 2>&1 $ipfw delete $ipfw_number_start > /dev/null 2>&1 $ipfwa $ipfw_number_start pipe $pipe_n all from $ip to not 10.0.0.0/8 > /dev/null 2>&1 $ipfwa $ipfw_number_start pipe $pipe_n2 all from not 10.0.0.0/8 to $ip > /dev/null 2>&1 pipe_n=$pipe_n2 pipe_n=`expr $pipe_n + 1` pipe_n2=`expr $pipe_n + 1` ipfw_number_start=`expr $ipfw_number_start + $ipfw_step ` done |
Добавляем в крон:
*/1 * * * * root arp -an>/tmp/arp;/fil_arp.sh > /dev/null 2>&1
Как видно нагрузка на систему не очень большая — её вообще нет)))
last pid: 93385; load averages: 0.01, 0.02, 0.05 up 1+21:14:53 12:27:42 50 processes: 1 running, 49 sleeping CPU: 0.8% user, 0.0% nice, 1.7% system, 0.2% interrupt, 97.3% idle Mem: 68M Active, 317M Inact, 329M Wired, 304K Cache, 212M Buf, 1250M Free Swap: 2047M Total, 2047M Free PID USERNAME THR PRI NICE SIZE RES STATE C TIME WCPU COMMAND 853 root 1 44 0 24392K 3080K select 1 15:41 0.00% ppp 1737 mysql 16 49 0 203M 45680K sigwai 0 1:00 0.00% mysqld 1624 dhcpd 1 44 0 10564K 6012K select 1 0:19 0.00% dhcpd 1775 root 1 44 0 26132K 4520K select 1 0:02 0.00% sshd 74351 root 1 44 0 38064K 5376K select 1 0:01 0.00% sshd 1786 root 1 65 0 7976K 1644K nanslp 1 0:01 0.00% cron 1422 root 2 76 0 31288K 5120K select 1 0:01 0.00% mpd5 1279 root 1 44 0 6920K 1524K select 1 0:01 0.00% syslogd