Бюджетный интернет комбайн для дома и малого офиса на базе OpenWRT и роутера DLINK DSL-504T
Решил для дома собрать интернет роутер. Причин для этого было несколько:
1. Роутеры я собитать умею.
2. Всвязи с переходом на "Лимитный тариф" интернета(это когда платишь на каждый мегабайт скаченного траффика).
3. Не устраивает ограниченная функциональность роутеров мыльниц(например DLink).
На мыльницу выбор пал по очевидным причинам. Это низкое энергопотребление и никакого шума в работе. Конечно и недостатков полно, например объем оперативной памяти всего 16 мб(пользователям современных ПК с виндовс на борту это звучит как то дико), и объем постоянной памяти(флэш память) - 4МБ. А на это все надо еще и операционку положить, и логи траффика хранить.
В этих условиях нереально хранить статистику по посещаемым сайтам, и по дням. Поэтому делаем так: храним информацию о траффике суммарную по каждому IP сети, как сказали бы бухгалтера "нарастающим итогом". В конце месяца инфу отчищаем, или записываем в файл итогов(это как кому надо). Хранить будем в текстовых файлах(типа у нас выбор есть
Ну чтож, приступим:
1 этап Сборка прошивки роутера есть на сайте
http://downloads.openwrt.org/kamikaze/8.09/ar7/Для справки, AR7 это архитектура нашего процессора. Выбираем прошивку openwrt-ar7-squashfs.bin
В принципе это готовая к употреблению прошивка, включающая в себя даже WEB интерфейс. Но меня почему-то она не устроила, и я собрал свою. При этом тот же WEB интерфейс и отключил, чтобы не мешал думать :)
Сборка прошивки :
#apt-get install flex bison autoconf zlib1g-dev libncurses5-dev automake g++ patch gawk
#mkdir /home/trunk
#cd /home/trunk
#svn co https://svn.openwrt.org/openwrt/trunk/
#make menuconfig
#make
Для сборки прошивки понадобитя интернет(линкер качает много всего недостоющего, в т.ч исходники ядра Linux). В опциях MENUCONFIG выбрать платформу AR7.
Ну вот. Если все правильно, через 2 часика соберется прошивка :)) Долгий процесс, из-за кросс-компиляции. У нас то платформа 86 , а там AR7.
В папке "/home/trunk/8.9/bin/ " появится файл openwrt-ar7-squashfs.bin - его та нам и надо )
2 этапЗаливка прошивки в роутер. Дело в том, что для России эти железяки делают с урезанной памятью. Т.Е. вместо 16 МБ оперативки делают 8 МБ. Разлочить это дело можно с помощью утилит, написанных Олегом (
http://wl500g.info).
Сама заливка прошивки на роутер(в самом простом случае) выглядит так :
1. Приготовим на компьютере в коммандной строке(у меня Линукс)
#telnet 192.168.1.199
или сразу
#ftp 192.168.1.199
Отключиль питание от роутера, и через 2 сек. включили. при загрузке, загрузчик ADAM2 создает на адресе 192.168.1.199 фтп сервер. Быстренько логинимся в него(быстренько-потому что послу 5 секундной задержки ADAM2 начнет загрузку текущей прошивки)
login: adam2
password:adam2
Если нас известили, что пользователь adam2 успешно залогинился, значит пока все идет по плану
Переходим в папку, где находится файл пришивки
#cd /home/trunk/8.09/bin/
В интерпритаторе вводим команды:
#debug
#bin
#hash
#quote "MEDIA FLSH"
#put "openwrt-ar7-squashfs.bin" "openwrt.bin mtd4"
У меня например надпись об успешной прошивке появилась далеко не с первого раза.
Если все нормально, переходим дальше, если нет......курите документацию, и молите великого ктулху
3 этапНастройка комбайна
Итак, прошивка лежит на месте. Входим сначала по TELNET, потом надаем пароль для пользователя ROOT, потом уже входим по SSH и отключаем TELNET.
#telnet 192.168.1.1
#passwd root
#ssh root@192.168.1.1
root@OpenWrt#/etc/init.d/telnet stop
root@OpenWrt#/etc/init.d/telnet disable
Меняем скрипт /etc/init.d/firewall на самописный
#scp /home/firewall root@192.168.1.1:/etc/init.d/firewall
#ssh root@192.168.1.1
root@OpenWrt#chmod 755 /etc/init.d/firewall
Меняем файл /etc/config/network под реалии интернета
# Copyright (C) 2006 OpenWrt.org
config interface loopback
option ifname lo
option proto static
option ipaddr 127.0.0.1
option netmask 255.0.0.0
config interface lan
option type bridge
option ifname eth0
option proto static
option ipaddr 192.168.1.1
option netmask 255.255.255.0
option nat 1
## Example for ATM bridging.
## Useful for PPPoE or IP over ATM. Will create 'nas${unit}'
#
config atm-bridge
option unit 0
option encaps llc
option vpi 1
option vci 50
option payload bridged # some ISPs need this set to 'routed'
config interface wan
## PPPoE:
option ifname nas0
option proto pppoe
## PPPoA:
# option ifname atm0
# option proto pppoa
# option encaps llc
# option vpi 8
# option vci 35
## Both:
option username "Пользователь_PPPoE"
option password "Пароль_PPPoE"
Пример скрипта /etc/init.d/firewall
#!/bin/sh
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# VARIABLES
NB_IP=192.168.1.10
PC_IP=192.168.1.3
#POLICIES & DEFAULTS
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#CUSTOM CHAINS
iptables -N NOTEBOOK_WWW
iptables -N MAIN_WWW
iptables -N NOTEBOOK_OTHER
iptables -N MAIN_OTHER
iptables -A NOTEBOOK_WWW -j ACCEPT
iptables -A NOTEBOOK_OTHER -j ACCEPT
iptables -A MAIN_WWW -j ACCEPT
iptables -A MAIN_OTHER -j ACCEPT
iptables -A FORWARD -p icmp -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
#INPUTS
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
# FORWARDS CUSTOM
#iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -s $PC_IP -p tcp --dport 80 -j MAIN_WWW
iptables -A FORWARD -s $PC_IP -p tcp --dport ! 80 -j MAIN_OTHER
iptables -A FORWARD -s $PC_IP -p ! tcp -j MAIN_OTHER
iptables -A FORWARD -d $PC_IP -p tcp --sport 80 -m state --state ESTABLISHED,RELATED -j MAIN_WWW
iptables -A FORWARD -d $PC_IP -p tcp --sport ! 80 -m state --state ESTABLISHED,RELATED -j MAIN_OTHER
iptables -A FORWARD -d $PC_IP -p ! tcp -m state --state ESTABLISHED,RELATED -j MAIN_OTHER
iptables -A FORWARD -s 192.168.1.4 -j MAIN_WWW
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -d 192.168.1.4 -j MAIN_WWW
iptables -A FORWARD -s $NB_IP -p tcp --dport 80 -j NOTEBOOK_WWW
iptables -A FORWARD -s $NB_IP -p tcp --dport ! 80 -j NOTEBOOK_OTHER
iptables -A FORWARD -s $NB_IP -p ! tcp -j NOTEBOOK_OTHER
iptables -A FORWARD -d $NB_IP -p tcp --sport 80 -m state --state ESTABLISHED,RELATED -j NOTEBOOK_WWW
iptables -A FORWARD -d $NB_IP -p tcp --sport ! 80 -m state --state ESTABLISHED,RELATED -j NOTEBOOK_OTHER
iptables -A FORWARD -d $NB_IP -p ! tcp -m state --state ESTABLISHED,RELATED -j NOTEBOOK_OTHER
#MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
Как видно из скрипта, у меня 2 компа- ноутбук с IP=192.168.1.10 и основной ПК с IP=192.168.1.3
Траффик я решил делить на "Веб траффик" и "НеВеб траффик". Создаем 4 цепочки правил : MAIN_WWW, MAIN_OTHER, NOTEBOOK_WWW, NOTEBOOK_OTHER
Весь траффик так или иначе будет попадать в одну из цепочек. Ну а сосчитать траффик в каждой- это умеет IPTABLES(iptables -L <цепочка> -nvx).
Привожу пример скриптов формирования отчетов и сохранения показателей счетчиков при перезагрузке роутера.
/www/count.sh
#!/bin/sh
sh /www/ipt
file=/www/index.html;
nb_www=$(cat /www/NOTEBOOK_WWW);
nb_ot=$(cat /www/NOTEBOOK_OTHER);
pc_www=$(cat /www/MAIN_WWW);
pc_ot=$(cat /www/MAIN_OTHER);
echo > $file;
echo '<html><body>' >> $file;
echo '<H1>Traffic counter</H1> <br>' >> $file;
echo 'Notebook(www) = ' >> $file;
echo $(($nb_www/1024)) >> $file;
echo ' kB' >> $file;
echo '<br>' >> $file;
echo 'Notebook(other) = ' >> $file;
echo $(($nb_ot/1024)) >> $file;
echo ' kB' >> $file;
echo '<br>' >> $file;
echo 'Main(www) = ' >> $file;
echo $(($pc_www/1024)) >> $file;
echo ' kB' >> $file;
echo '<br>' >> $file;
echo 'Main(other) = ' >> $file;
echo $(($pc_ot/1024)) >> $file;
echo ' kB' >> $file;
echo '<br><br>' >> $file;
IT=$(cat /www/ITOG);ITOG=$(($IT/1024))
echo '<H2>SUMM '$ITOG' kB</H2>' >> $file;
echo '<hl><br>' >> $file;
echo $(date) >> $file;
echo '</body></html>' >> $file;
/www/ipt
#!/bin/sh
nbw=$(iptables -L NOTEBOOK_WWW -nvx|grep ACCEPT|awk {'print $2'})
nbwf=$(cat /www/NOTEBOOK_WWW)
nb1=$(($nbwf+$nbw))
echo $nb1>/www/NOTEBOOK_WWW
iptables -L NOTEBOOK_WWW -nvZ > /dev/null
nbo=$(iptables -L NOTEBOOK_OTHER -nvx|grep ACCEPT|awk {'print $2'})
nbof=$(cat /www/NOTEBOOK_OTHER)
nb2=$(($nbo+$nbof))
echo $nb2>/www/NOTEBOOK_OTHER
iptables -L NOTEBOOK_OTHER -nvZ > /dev/null
mw=$(iptables -L MAIN_WWW -nvx|grep ACCEPT|awk {'print $2'})
mwf=$(cat /www/MAIN_WWW)
m1=$(($mwf+$mw))
echo $m1>/www/MAIN_WWW
iptables -L MAIN_WWW -nvZ > /dev/null
mo=$(iptables -L MAIN_OTHER -nvx|grep ACCEPT|awk {'print $2'})
mof=$(cat /www/MAIN_OTHER)
m2=$(($mof+$mo))
echo $m2>/www/MAIN_OTHER
iptables -L MAIN_OTHER -nvZ > /dev/null
itog=$(($nb1+$nb2+$m1+$m2));export ITOG=$itog
echo $ITOG>/www/ITOG
Скрипт count.sh должет отрабатывать по cron у. Он создает файл index.html в папке
/www - это корневая папка WEB сервера openwrt.
Что это дало
1. Повышение скорости работы интернет(у меня безлимитка 1МБ, канал стал по настоящему 1МБ)
2. Возможности подсчета траффика
3. Переброс портов и DDNS есть и в стандартной прошивке, но на линуксе они гибче настраиваются.
4. Возможности расширения функционала.При наличии терпения, можно запихать туда OpenVPN, OpenSWAN, SQUID
На OPENWRT можно утанавливать пакеты так же как и на обычный линукс(есть утилита opkg, схожая по функциям с дебиановской apt-get)
Ну вот соссно и фсе !!! по тому же крону читстите показания iptables и файлы хранилищ в конце месяца. Дальнейшие навороты сделаете сами ! Пока.userdef.