Инсталиране
и настройка на “прозрачна защитна стена” (transparent
firewall)
Заб.:Авторът
е напълно наясно, че (може да) съществуват неточности и грешки.
Показаното тук е само с учебна цел! Преди да направите каквото и да е
архивирайте важните си данни (а защо не всичко?) ! Превода на
английските термини може да не е съвсем точен. За контакти:
uvigii@mail.bg
, най актуалната версия на:
http://uvigii.jeckyll.net/pub/doc/tf/TF.html
Съдържание:
1.Идея
за използване
2.Инсталация
2.1.
Подготовка
2.2.
Ядро: кърпеж, конфигуриране, компилиране, инсталация.
2.3.
Brctl: конфигуриране, компилиране, инсталация.
2.4.
Squid: конфигуриране, компилиране, инсталация.
3.Настройки
3.1.
Настройка на бриджа.
3.2.
Настройка на IP филтър с iptables.
3.3.
Настройка на Squid.
4.Заключение.
1. Идея за използване
Представете
си следната ситуация (фиг.1):

В
нашите права/задължения влиза администрирането само на LAN,
разполагаме с ограничен бюджет но трябва да реализираме по някакъв
начин филтриране на трафика от и към интернет. Един от възможните
варианти е да направим 'интелигентен' комутатор (switch) използвайки
Линукс (фиг2). В нашия случай той ще има само два порта и ще служи
да отдели локалната мрежа от рутера на ISP, който би трябвало да се
явява шлюз по подразбиране (default gateway) за потребителите в LAN.
По този начин IP пакетите ще се преглеждат съгласно правила зададени
от нас, при което ще преминат само тези които ние искаме. Чрез
настройката на прокси сървър бихме могли да отидем по-далече и да
филтрираме определено съдържание на някои сайтове, например всички
mp3 файлове от free.xxx.bg. Можем също да определим и скоростта с
която ще се свалят определени файлове т.е. можем да определим
скорост от 1 кб/с за mp3 файловете на free.xxx.bg и 10 кб/с за html
документите от същия сайт. Забележете, че не се налага да се
преконфигурират машиниите в LAN, нито рутера на ISP. Възможно е
машината която ще ползваме да работи без да е конфигурирана с IP
адрес. В този случай линукс-суича, ще има конфигуриран IP адрес за
да се администрира отдалечено. При по-параноична конфигурация е
възможно това да не се прави.
2. Инсталация
2.1.
Подготовка
Следващите
стъпки са реализирани под Slackware
с ядро 2.4.24
необходими
са ни:
Инсталирана
система; компилатор; работещи мрежови контролери (NIC) eth0, eth1
;-)
изходния
код на ядрото
brctl
ebtables
2.2.
Ядро: кърпене, конфигуриране, компилиране, инсталация.
За
да може iptables да 'вижда' IP пакетите (3-ти слой от OSI модела)
който 'преминават' опаковани като фреймове през бриджа (2-ри слой от
OSI модела) за ядра от серията 2.4 е необходимо да се пачне ядрото
на Линукс. За целта декомпресирайте ebtables в /usr/src/linux , след
което:
root@fw:/usr/src/linux#
patch -p1 -i ebtables-brnf-5_vs_2.4.24.diff
root@fw:/usr/src/linux#
make menuconfig
В
networking options
Избираме
Network packet filtering (replaces ipchains)
и
802.1d Ethernet Bridging
компилираме
root@fw:/usr/src/linux#
make clean && make dep && make bzImage &&
make modules
Инсталираме
новото ядро и модулите към него, преглеждаме /etc/lilo.conf
изпълняваме:
root@fw:/usr/src/linux#
/sbin/lilo
Рестартираме
системата.
2.3.
Brctl: конфигуриране, компилиране, инсталация.
root@fw:/tmp#
tar -xzvf bridge-utils-0.9.6.tar.gz
root@fw:/tmp#
cd bridge-utils
root@fw:/tmp/bridge-utils#
./configure
root@fw:/tmp/bridge-utils#
make all
root@fw:/tmp/bridge-utils#
make install
2.4.
Squid: конфигуриране, компилиране, инсталация.
Squid
е кеширащ http прокси сървър с богат набор от функции. Следващите
стъпки не са задължителни ако не желаете да инсталирате Squid .
root@fw:/tmp#
tar -xzvf squid-2.5.STABLE5.tar.gz
root@fw:/tmp#
cd squid-2.5.STABLE5
root@fw:/tmp/squid-2.5.STABLE5#
./configure --prefix=/usr/local/squid --enable-delay-pools
–enable-linux-netfilter
root@fw:/tmp/squid-2.5.STABLE5#
make all
root@fw:/tmp/squid-2.5.STABLE5#
mkdir /usr/local/squid
root@fw:/tmp/squid-2.5.STABLE5#
chown nobody /usr/local/squid
root@fw:/tmp/squid-2.5.STABLE5#
su nobody
nobody@fw:/tmp/squid-2.5.STABLE5$
make install
nobody@fw:/$
exit
Настройки
3.1.
Настройка на бриджа.
Създаваме
скрипта /etc/rc.d/rc.bridge
#!/bin/sh
#
#
/etc/rc.d/rc.bridge.
BRVER="0.0.1"
#
BRCTL="/usr/local/sbin/brctl"
IFCONFIG="/sbin/ifconfig"
ROUTE="/sbin/route"
#
BR="br_fw"
INTIF0="eth0"
EXTIF0="eth1"
BRIP="10.4.9.5"
BRNET="10.4.9.0"
BRMASK="255.255.255.0"
BRBRC="10.4.9.255"
BRGW="10.4.9.1"
#
echo
"Starting brige $BRVER ... "
#
$IFCONFIG
$INTIF0 0.0.0.0
$IFCONFIG
$EXTIF0 0.0.0.0
#
$BRCTL
addbr $BR
$BRCTL
addif $BR $INTIF0
$BRCTL
addif $BR $EXTIF0
#
$IFCONFIG
$BR up
$IFCONFIG
$BR $BRIP netmask $BRMASK broadcast $BRBRC
$ROUTE
add default gw $BRGW
$IFCONFIG
$ROUTE
$BRCTL
show
#
След
което го стартираме:
root@fw:/etc/rc.d#
./rc.bridge
Може
да добавим следното в /etc/rc.d/rc.inet1
/etc/rc.d/rc.brige
с
цел автоматично изпълнение на скрипта при старт на машината. Разбира
се добре е да съобразите кога ще стартирате /etc/rc.d/rc.firewall !
Може да направите start i stop функции и т.н. В случая няма
значение.
Вече
би трябвало да имаме работещ бридж с два физически интерфейса eth0 –
към локалната мрежа и eth1 – към ISP рутера, един логически
административен адрес 10.4.9.5
3.2.
Настройка на IP филтър с iptables.
Тук
вече всичко е в ръцете Ви.
Пример
А Този пример изисква
работещ Squid!
root@fw:/etc/rc.d#
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT
--to-port 8080
root@fw:/etc/rc.d#
iptables -A FORWARD -i eth1 -p tcp --dport 80 -j DROP
С
горните два реда ще пренасочим IP пакетите идващи от локалната мрежа
и отиващи към 80-и порт(http) на машини извън LAN към 8080-и порт на
бридж машината и ще забраним всички пакети пристигащи от вън и
отиващи към 80-и порт в LAN . Резултатът може да проверите чрез
смяна на кабелите на двете мрежови карти.
Пример
Б
root@fw:/etc/rc.d#
iptables -P INPUT DROP
root@fw:/etc/rc.d#
iptables -A INPUT -i eth1 -p tcp -s 10.4.10.2 --dport 22 -j ACCEPT
root@fw:/etc/rc.d#
iptables -A INPUT -i eth0 -p tcp -s 10.4.9.2--dport 22 -j ACCEPT
С
този пример забраняваме на всички освен на машини с мрежови адреси
10.4.10.2 и 10.4.9.2 да се свързват на 22-и порт на бридж машината
(SSH). Забележете, че по подразбиране всички пакети които не са
изрично приети, ще бъдат отшвърлени т.е. в този случай връзки към
други портове няма да са възможни.
3.3.
Настройка на Squid
Използването
на Squid в този случай е по скоро показателно отколкото наложително.
Целта му е да допълни функционалността на iptables, това се постига
чрез доста удобния (поне за мен) начин за филтриране на url,
delay_pools и т.н. Той е гъвкъв и може да се настрои да работи само
като url филтър без да кешира каквото и да е ! Друг вариант е да се
ползва отделна машина за прокси сървър.
За
да работи като transparent proxy не трябва да се забрави
httpd_accel_port
80
httpd_accel_with_proxy
on
httpd_accel_host
virtual
httpd_accel_uses_host_header
on
в
/usr/local/squid/etc/squid.conf.
Пример
А
#
acl
Webs05 dstdomain .microsoft.com .msn.com .msn.net
acl
Webs50 dst 0.0.0.0/0.0.0.0
#
acl
Hosts50 src 10.42.9.0/255.255.255.0
acl
Hosts90 src 10.42.9.2/255.255.255.255
#
acl
Conn50 maxconn 6
#
http_access
deny Hosts50 Webs05
http_access
allow Hosts90 Webs50
http_access
allow Hosts50 Webs50 !Conn50
http_access
deny all
По
този начин ще направим следното: 1. Ще забраним достъпа до
microsoft.com и производни, 2 Ще разрешим на всички в локалната
мрежа достъп до всички сайтове с максимум 6 връзки едновременно (за
1 IP) (Освен Hosts90). Забележете, че msn.com, msn.net и
microsoft.com няма да са достъпни!
Пример
Б
acl
Hosts90 src 10.42.9.2/255.255.255.255
#
acl
Words50 url_regex -i ftp .exe .mp3 .wav .avi .mov .mpeg .iso .rar
.zip .ace delay_pools 1
#
delay_class 1 2
delay_access 1
allow Words50 !Hosts90
delay_parameters 1 -1/-1 1000/10000
#
По
този начин ще ограничим всички потребители освен 10.42.9.2 да теглят
mp3 и подобни със скорост 1000 байта/с.
4.
Заключение
При
направените тестове с 2 правила в iptables на AMD K6II – 300
Mhz 128 MB RAM 2x RTL8139D бяха измерени Total rates:1648.7
kbytes/sec, 1529.8 packets/sec. При CPU states: 9.0% user
88.2% system 0.0% nice 0.0% iowait 2.6% idle .
Iptraf натоварваше с около 20% системата, т.е. е възможно да се
постигнат по-добри резултати при неговото изключване.