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     [email protected]:/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

Leave a Comment

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Загрузка...
Menu Title