от Plamen Popow(28-01-2000)

рейтинг (3)   [ добре ]  [ зле ]

Printer Friendly Вариант за отпечатване

Tozi suwet e dobawen sus suglasieto na awtora mu Plamen Popow
Originalniata statiq se namira na adres http://www.qsl.net/lz1plp/


[ Продължение на част 2]

    Посочване на типовете и кодовете на ICMP.

    ICPM също така допуска и използването на допълнителни аргументи, но ICMP няма портове (ICMP използва тип и код за предаване на данни).
    Вие можете да посочите имената на ICMP пакетите (ipchains -h ICMP за списък на имената) след ключа -s или численото значение на типа и кода на ICMP, където типа следва след ключа -s, а кода след ключа -d.
    ICMP имената не са толкова дълги, достатъчно е да се укажат няколко символа, по които могат еднозначно да се различат от други.
    По-долу е показана малка таблица на ICMP типовете.
  Номер Име  Нужен е за 0 echo-reply  ping 3 destination-unreachable за който и да е TCP/UDP трафик 5 redirect  за роутинг, ако не е пуснат демон на роутинга 8 echo-request  ping 11 time-exceeded traceroute

Запомнете, че ICMP типовете не могат да бъдат използвани заедно с "!" НЕ БЛОКИРАЙТЕ 3 тип на ICMP пакетите !!!!!!!

    Посочване на интерфейса.
    Ключа -i сочи към имета на интерфейса за обработка. Интерфейс това е физическо устройство, през което "ходят" пакетите. За издаване на списък на работищите интерфейси има команда ifconfig, която ще ви покаже списък на "вдигнатите" интерфейси.
    Интерфейс за входните пакети (т.е. за тези, които минават "входната" верига) - това е едно и също като изходния интерфейс.
    Разрешава се да се посочват имената на тези интерфейси, които в дадения момент не съществуват. Правилата няма да се изпълняват до тогава докато тези интерфейси не се появят. Това може да бъде полезно за временни съединения с модем (ppp0) и за други подобни случаи.
    Също така се разрешава да се посочва след името на интерфейса знак "+". Това посочва към обработка на всичките интерфейиси започващи с тези букви. Например за обработка на всички PPP съединения, може да се посочи -i ppp+.
    Разрешава се заедно с името на интерфейса да се посочва знак "!" за отрицание (т.е. да се обработват всички интерфейси освен посочения).

    Посочване само на TCP SYN пакети.

    Тази опция е полезна за разрешаване на TCP съединения само в една посока. За пример, вие искате да се разхождате по чужд сървър, но да забраните на чуждия сървър да установява съединение с вас. Обикновенното решение е да се забрани приемането на TCP пакети, идващи от сървъра не върви, тъи като на сървъра му е нужно по някакъв начин да ви предава инфрмация.

    Решението се състой в това, че да се забраняват само тези пакети, които искат да направят съединение. Тези пакети се наричат SYN-пакети (честно казано това са обикновенни пакети само, че с вдигнат SYN флаг).
    Ключа -y се използва точно за това. За пример, ако е необходимо да се разрешат съединения с 192.169.1.1 е необходимо да се напише следното: -p TCP -s 192.168.1.1 -y
    Както обикновенно този ключ може да се използва заедно с флага "!", разрешавайки които и да е съединения освен пакетите за инициализация на съединение.

    Обработка на фрагменти.

    Понякога пакета е много голям за да се предаде целия. Когато това се случи пакета се разбва на няколко фрагмента и се праща във вид на няколко пакета. Другата страна приема всичките пакети от фрагментите и сабира от тях един голям.
    Проблема се състои в това, че служебната информация (адресите на изпращача и получателя, порт, ICMP тип и код и други) нужна на ядрото се съдържа само в първия фрагмент.
    Ако вашата машина е включена само във външна мрежа този проблем може да се реши лесно. При компилация на ядрото поставете always defragmet в "Y". Тази опция посочва на ядрото винаги да сабира всички фрагменти преди по-нататъшна работа.
    В друг случай важно е да се разбере как фарагментите минават списъка с правила. Което и да е правило, което се опитва да разбере информация за фрагмента не я получава, освен в случая с първия фрагмент.
    За осигуряване на тази възможност в описанието на правилата е необходимо да се добави ключа -f. За осигуряване сработването на правилото само на првия фаргмент, ключа -f може да се използва със знака "!".
    Обикновенно това се използва за защита на преминаване на втори и следващи пакети от тогава, както първия фрагмент е минал филтрация и за защита от събиране на фрагментите на хоста-приемник. Това може да бъде опасно тъй като някои машини падат от просто пращане на фрагменти. Аз предупредих ;-).

    За машините, които служат за главни в мрежата - много от пакетите (TCP, UDP и ICMP) идват вече фрагментирани - бъдете внимателни.
    За пример, следното правило ще отхвърля всички фрагменти идваши към 192.168.1.1
ipchains -A output -f -D 192.168.1.1 -j DENY

    Какво става във филтъра на пакети?
    Добре, сега ние знаем всички пътища, по които ние можем да отправяме пакетите. Ако пакета минава правилото, става следното:

1 - Брояча на байтове за това правило се увеличава с размера на пакета (заедно със заглавието).
2 - Брояча на пакети за това правило се увеличава.
3 - Ако правилото изисква, информацията за пакета се записва в лог.
4 - Ако правилото изисква, полето TypeOfService на пакета се променя.
5 - Ако правилото изисква, пакета се маркира (не и за ядрата 2.0).
6 - Проверява се следващото правило по пътя, които следва пакета.

    Установяване на указания.

    Дадените ключове позволяват да се укаже на ядрото къде да препраща пакета, който е попаднал под деиствие на правилата. ipchains използва ключа "-j" (от jump-to - прескочи-към) за указване на адресата на пакета.
    Най-простия случай - това е да не се посочва адресата вообще. Този тип на правила се нарича accounting, те обикновенно се използват преброяването на числото на определен тип пакети. Без значение дали този пакет попада под действие на това правило или не, ядрото все едно ще провери следващите правила във веригата. За пример, за преброяването на числото на пакетите идващи от 192.168.1.1, ние можем да посочим следното:
ipchains -A input -s 192.168.1.1
    Използвайки командата ipchains -L -v вие ще можете да прегледате броячите на пакетите и байтовете за всяко правило.
    Има 6 специални указания, първите три ACCEPT, REJECT и DENY са разбираеми. ACCEPT пропуска пакетите, REJECT отхвърля пакетите с оповестяване на източника, DENY отхвърля пакета така, като че ли той никога не е идвал.
    Следващото указание, MASQ казва на ядрото да направи маскарадинг на пакета. За да работи това правило ядрото трябва да бъде компилирано с поддръжка на IP Masquerading. За уточняване да детаилите четете Masquerading-HOWTO. Това правило ще работи само за веригата "препращане".
    Указанието REDIRECT посочва на ядрото да препраща пакета на посочения адрес бе да взима предвид реалния адрес, посочен в заглавието на пакета. Това правило работи само за TCP и UDP протоколите. Допълнително вие можете да укажите порт (номер или име) след "-j REDIRECT". В този случай пакета ще бъде препратен на указания порт, даже ако той е пратен на друг порт. Това правило работи само за входната верига.
    Указание REUTRN посочва на ядрото веднага да пропусне пакета до края на веригата.
    Което и да друго правило сочи към вериги определяеми от потребителя. Пакета преминава правилата на тази верига както обикновенно.
  input Test Rule1: -p ICMP -j REJECT Rule1: -s 192.168.1.1 Rule2: -p TCP -j Test Rule2: -d 192.168.1.1 Rule3: -p UDP -j DENY  

Да вземем TCP пакет, който идва от 192.168.1.1 към 1.2.3.4. Той влиза във входната верига и се проверява правило 1 - не сработва. Правило 2 сработва, но неговото указание е Test и за това следващото правило, което се проверява това е първото правило във веригата Test. 1-то правило не сработва и се проверява 2-то. То съшо не сработва и ние достигнахме края на веригата и се връщаме назад, проверява се правило 3, което също не сработва.

Да опишем пътя на пакета.     Записване на пакетите в лог.

    Ако в правилото е посочен флаг -l, ядрото при сработване на првилото, ще ви даде предупреждение. Този флаг е полезен за експерименти и за известяването ви за идването на някакъв пакет.

    Управление на TypeOfService.

    Има 4 бита в заглавието на пакета, наричани битове TypeOfService (тип на сервиза) - "Minimum Delay" (минимално задържане), "Maximum Throughput" (максимална пропускателна способност), "Maximum Reliability" (максимална достъпност) и "Minimum Cost" (минимална цена). Само един от тези битове може да бъде използван.
    Обикновенно установяват за съединения, отнасящи се към telnet&ftp control минимална задръжка, а за FTP data максимална пропускателна способност. Това се прави по следния начин:

ipchains -A output -p tcp -d 0.0.0.0/0 telnet -t 0x01 0x10
ipchains -A output -p tcp -d 0.0.0.0/0 ftp -t 0x01 0x10
ipchains -A output -p tcp -s 0.0.0.0/0 ftp-data -t 0x01 0x08

Ключа -t има 2 параметъра и двата в шестнадесетичен вид. С първото число и битовете TOS на пакета се изпълнява AND (логическо-и), а с втория XOR (изключващо-или). Това е достатъчно трудно за разбиране, за това ето една таблица:
  TOS Име Значение Използва се от Minimum Delay 0x01 0x10 ftp, telnet Maximum Throughput 0x01 0x08 ftp-data Maximum Reliability  0x01 0x04 snmp Minimum Cost 0x01 0x02 nntp

    Маркиране на пакети.

    За съжаление, това все още не е направено, но във всеки случай това няма да го бъде за ядрата 2.0.

    Операций върху цяла верига.

    Много полезно своиство на ipchains е да прави операций над цяла верига. Вие можете да наречете своята верига от правила както искате, с изключение на имената използвани от вградените вериги (input, output, forward) или указанията (MASQ, REDIRECT, DENY, REJECT или RETURN). Името на веригата може да бъде дълго до 8 символа.

    Създаване на нова верига.

    Нека да създадем нова верига. Нека да я наречем test.

    ipchains -N test

    Това е просто, сега можете да слагате правила във веригата.

    Махане на верига.
    Махането на верига е също толкова просто, както и създаването.

    ipchains -X test

    Защо -X ? Чисто и просто нямаше повече подходящи букви ;-).

    Запомнете вие не можете да махнете верига докато тя не е празна!

    Изчистване на верига.

    Най-простия начин да се изчисти верига, това е използването на ключа -F.

    ipchains -F forward

    Ако името на веригата не е посочено всички вериги ще бъдат изчистени.

    Разглеждане на веригите.

    Вое можете да разгледате всики правила във веригата използвайки ключа -L

# ipchains -L input
Chain input (refcnt = 1): (policy ACCEPT) target prot opt source destination  ports ACCEPT icmp ----- anywhere anywhere any # ipchains -L test
Chain test (refcnt = 0): target prot opt source destination ports DENY icmp ----- localnet/24 anywhere any #

refcnt показва колко правила има във веригата. Това число трябва да бъде 0, за да може веригата да се изтрие.

За ключа -L има 3 опций. -n забранява опитите на ipchains да преобразува ip адресите в символически. -v ви показва детайлен списък на правилата. Например

# ipchains -v -L input
Chain input (refcnt = 1): (policy ACCEPT) pkts bytes target prot opt tosa tosx ifname mark source destination  ports 10 840 ACCEPT  icmp --- 0xFF 0x00 lo anywhe anywhere  any

Запомнете, че числото на пакетите може да се извежда със съответните суфикси (K, M, G съответно за килобайт, мегабайт и гигабайт). Използвайки -x вие ще можете да извеждате числата в пълен формат.

    Нулиране на броячите.

    Това действие може да бъде направено с помоща на ключа -Z. Единствения проблем, който може да възникне в този случай се състой в това, че след командата -L и до командата -Z могат да дойдат няколко пакета, които няма да бъдат отчетени. Изхода от това положение се състой в едновременното използване на ключовете -L и -Z. Но в този случай вие няма да можете да оперирате с една верига - действията ще се осъществяват за всички вериги като за една.

    Установяване на указания за веригата.

    Тази опция е напълно анологична на установяването на указания за правилата с изключение на някои моменти.
    1 - възможни са само указания ACCEPT, DENY, REJECT или MASQ.
    2 - указанието MASQ е възможно само във веригата препращане (forward).
    3 - указанието RETURN трябва да се използва с голямо внимание.

    Операций с маскарадинга.

    Командата за IP маскарадинг -M може да бъде обединена с -L за разглеждане на текущите съединения или със -S за установяването на параметри.
    Командата -L може да бъде използвана с ключовете -n за разглеждането на адресите и портовете на текущите съединения или с -v за по-детайлно разглеждане на съшата информация.
    Командата -S трябва да върви с 3-те параметъра на таймаута всеки в секунди: първия за TCP сесийте, втория за TCP сесийте след пакета FIN и за UDP пакетите. Ако вие не искате да променяте, който и да е от параметрите просто оставете неговото значение на "0".
    Значенията по подразбиране се съдържат във файла '/usr/include/net/ip_masq.h', обикновенно 15 минути, 2 минути и 5 минути съответно.

    Проверка на пакетите.

    Понякога на вас ви трябва да видите, какво се случва с пакета, който влиза по някакъв начин в машината, например, тестиране на веригата за грешки. ipchains има за този случай командата -C.
    За указването на коя точно верига трябва да се тестира, нейното име може да се укаже след командата -C, иначе ядрото започва да минава през веригите започвайки от input.
    За указването на типа на пакетите се прилагат същите ключове, които се използват и при указването на правила за филтрите. Например, тестваме TCP SYN пакет от 192.168.1.1 на порт 6000 към 192.168.1.1 порт www, започвайки от входната верига. Това е класическо www съединение.

# ipchains -C input -p tcp -y -s 192.168.1.1 60000 -d 192.168.1.2 www packet accepted

    Полезни примери.

    За пример ще разгледаме някоя машина. Използва се dial-up (-i ppp0), взимат се новини (-p TCP -s news nntp) и поща (-p TCP -s mail pop-3), от време на време има достъп до ftp за обновяване на системата (-p TCP -y -s ftp.cdrom.com ftp-data). Достъп до web през прокси-сървър (-p TCP -d proxy 3128), но на нас не ни трябва реклама от doubleclick.net или от Dilbert Archive (-p TCP -y -d 199.95.207.0/24 & -p TCP -y -d 199.95.208.0/24). Ние не искаме да пукаме потребители до нас по ftp (-p TCP -d $LOCALIP ftp) и вообще в локалната мрежа (-s 192.168.1.0/24).

    1 - ние не искаме нещо или някой да праща пакети към doubleclick.net

# ipchains -A output -d 199.95.207.0/24 -j REJECT
# ipchains -A output -d 199.95.208.0/24 -j REJECT

    2 - ще направим верига ppp-out за правила, които ще дистват по време на връзката ни с интернет

# ipchains -N ppp-out
# ipchains -A output -i ppp0 -j ppp-out

    3 - минимална задръжка за telnet&web

# ipchains -A ppp-out -p TCP -d proxy.virtual.net.au 8080 -t 0x01 0x10
# ipchains -A ppp-out -p TCP -d 0.0.0.0 telnet -t 0x01 0x10

    4 - минимален приоритет за ftp данните, nntp, pop-3

# ipchains -A ppp-out -p TCP -d 0.0.0.0/0 ftp-data -t 0x01 0x02
# ipchains -A ppp-out -p TCP -d 0.0.0.0/0 nntp -t 0x01 0x02
# ipchains -A ppp-out -p TCP -d 0.0.0.0/0 pop-3 -t 0x01 0x02

    5 - ще направим верига за входящи по dial-up пакети

# ipchains -N ppp-in
# ipchains -A input -i ppp0 -j ppp-in

    6 - ще забраним достъпа да вътрешната мрежа

# ipchains -A ppp-in -s 192.168.1.0/24 -l -j DENY

    7 - ще разрешим съединения към DNS, ftp, и данни от ftp само към нас

# ipchains -A ppp-in -p TCP -s 203.29.16.1 -d $LOCALIP dns -j ACCEPT
# ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 1024:5999 -j ACCEPT
# ipchains -A ppp-in -p TCP -s 0.0.0.0/0 ftp-data -d $LOCALIP 6010: -j ACCEPT
# ipchains -A ppp-in -p TCP -d $LOCALIP ftp -j ACCEPT

    8 - локалните пакети трябва свободно да си ходят

# ipchains -A input -i lo -j ACCEPT

    9 - ако нито едно от правилата не е сработило, забраняваме пакета

# ipchains -P input DENY

    Съхранение и възтановяване на настройките на fairwall-а.

    Уморително е всеки път да се въвеждат изредените по-горе команди. Има 2 изхода, да се запишат всички команди в шел-скрипт или да се възползваме от ютилитите ipchains-save и ipchains-restore.
# ipchains-save > my_firewall
# ipchains-restore my_firewall
Как да ги използваме, от примера се вижда. ipchains-save може да има само един параметър - името на запазваната верига, ако то не е посочено то се запазват всички вериги. ipchains-restore има 2 ключа: -v, който описва, какво прави скрипта и -f, който автоматически изчиства съществуващата верига преди възтановяването на правилата в нея.

    По-подробно за това, какво не трябва да се забранява и за различията между ipfwadm и ipchians вие можете да прочетете в оригиналния IPCHAINS-HOWTO. За пускането на нормално работещ firewall е достатъчно и горе посоченото. Не възразявам, ако някой събере сили и преведе останалото и допълни този документ от оригинала ;-).
 

    Преведено от Пламен Попов, 14 декември 1999.

[ Край ]


<< Как да пуснем Licq през Firewall или proxy | IPCHAINS-HOWTO BG 1.01 (част 1) >>