IPCHAINS-HOWTO_BG 1.01 Тук по принцип трябва да има забележки за лиценза и за това, че автора не носи никаква отговорност, но аз ще пропусна това поради ненужност - на който му трябва това, може спокоино да го прочете в оригиналния IPCHAINS-HOWTO. Този документ представлява почити пълен превод на оригиналния. Какво е това ipchains. Linux ipchains това е замяна на ipfwadm (който беше портнат от BSD). За работа с него на вас ви трябва ядро по-голямо от 2.1.102. Защо да се преминава към ipchains? В старите версий на Linux fairwall не работеше с фрагменти на пакетите, имаше 32x битови броячи ( на Intel-процесори), не даваше да се указват типовете на протоколите, различни от TCP, UDP и ICMP, не даваше да се правят големи изменения автоматически, нямаше инверсни правила и беше много тежък за управление. Малко информация. Целия трафик в мрежата се праща във вид на пакети. В началото на всеки пакет има информация за това от къде идва, тип на пакета и други подобни детайли. Началото на пакета се нарича заглавие (header), останалата част на пакета обикновенно се нарича тяло (body). Някой протоколи като TCP, които се използват за web, mail и други, използват понятието "съединение" - преди какъвто и да е пакет с данни да бъде пратен на получателя, минават някои настройващи пакети (със специални заглавия) със съобщения от типа на "аз искам да направя съединение", "добре", "благодаря правя го". И само след това ще тръгнат нормалните пакети с информация. Филтър на пакети - това е част от програмното осигуряване, която гледа заглавията на пакетите и или го пуска по-нататък или забранява неговото по-нататъшно движение. Има известно различие между понятията "забрана" (deny) и "отказ" (reject). "Забрана" - това е когато пакет от изпращача се отхвърля от системата така, че изпращача мисли, че пакета не е пристигнал до получателя, а "Отказ" - това е когато изпращача се известява за това, че неговия пакет е бил отказан от получателя. Защо вообще ни е нужен филтър на пакетите? Управление. Когато вашия Linux е включен към различни мрежи (и към internet в това число), вие трябва да имате възможност да управлявате, с който и да е поток от данни, минаващи през вашата система. Например, вие трябва да бъдете сигурни, че който и да е пакет от вътрешната мрежа, който може да съдържа важна информация няма да отиде в просторите на internet. Безопасност. Когато Linux стои един на един с хаоса на internet и в добавка служи за мост към internet за машините от вътрешната мрежа, вие трябва да бъдете сигурни кой и къде ходи през моста. Например вие искате да се разходите в internet, но не искате вашата машина да бъде сървър (а вие сигурни ли сте, че всичките ви потребители имат пароли и излишните сервизи са затворени ?). С наличието на firewall тези проблеми се решават бързо и лесно. Хитрост ;-) По някога някоя неправилно настроена машина в локалната мрежа или потребител, който поради незнание или поради зъл умисъл започнат да пращат във външната мрежа различни пакети (започвайки от нюкове и завършвайки с пакети от троянци). Та така филтъра на пакетите, ще ви позволи да избегнете такива случаи и ще ви уведоми, какво се е случило автоматически и няма да ви кара да сидите и да контролирате трафика ръчно. Как да се инсталира филтър на пакети? На вас ви е нужно ядро, което е компилирано заедно с филтър на пакети. Погледнете за файла /proc/net/ip_fwchains - ако го виждате то тогава всичко е наред. Ако не го виждате, то тогава на вас ви е нужно да вземете ядро 2.1.102 или по-голямо. Ако вашето ядро е от серията 2.0, то тогава ви е необходим специален patch. Преконфигурираите си ядрото така, че в него да са включени опциите IP firewalling. В /usr/src/linux/.config за ядрата 2.1 и 2.2 е необходимо да бъдат включени следните опции: CONFIG_FIREWALL=y CONFIG_IP_FIREWALL=y Така също трябва да си свалите ipchains, която ще управлява филтъра на пакети в ядрото. Всички последни дистрибутиви на Linux, които са основани на ядрата 2.1 и 2.2 имат ipchains. Как пакетите минават през филтрите. Ядрото стартира с три списъка на правила, тези правила се наричат правила на fairwall или просто вериги (chains). Тези три вериги се наричат input (входна), output (изходна) и forward (препращане). Когато пакета идва (да кажем от мрежовата карта), ядрото използва входната верига за да определи дали може пакета да се предвижи по-нататък. Ако пакета мине тази проверка то той продължава своето движение (това също така се нарича роутинг). Ако пакета е предназначен за друга машина то ядрото преглежда веригата препращане (forward). И на края преди пакета да излезне, ядрото гледа изходната верига. Верига - това е списък от правила. Всяко правило изглежда така "ако заглавието на пакета съдържа това и това, то прави с пакета това". Ако правилото не съответства на заглавието на пакета, ядрото гледа на следващото правило във веригата. И нa карая, ако пакета е минал цялата верига от правила и нито едно правило не е съответствало, ядрото гледа на правилата от веригата. В защитените системи пакета обикновенно се отказва или забранява. ACCEPT/ REDIRECT ACCEPT --> C --> S --> ______ --> D --> ~~~~~~~~ --> local ------> _______ --> h -> a |input | e {Routing } | __|____ -->->|output | e | n |Chain | m {Decision} | |forward| | |Chain | c | i |______| a ~~~~~~~~ | |Chain | | |_______| k | t | s | | |_______| | | s | y | q | | | | | u | | v e v | | | v m | | DENY/ r Local Process| v | DENY/ | | v REJECT a |------- DENY/ | REJECT | |DENY d | REJECT | v | e -------+--------------------- DENY| | ------------------------------ Последователно описание на всеки стадий. Проверка на контролната сума (Checksum) - ядрото проверява пакета за цялост и коректност на заглавията. Ако пакета не отговаря на тези условия той се отказва. Назначение (Sanity) - ядрото проверява за кого е предназначен пакет, защо и къде. Много от пакетите се отсяват именно на този стадий, но приоритета на "входена" (input) верига е по-горе. Входна верига (input) - това е първата верига, с помоща на която филтъра отсеива пакетите. Ако решението на тази верига не е "отказ" (REJECT) или "забрана" (DENY), то тогава пакета продължава своето движение. Демаскарад (Demasquaerade) - ако пакета - това е отговор на предишен маскараден пакет, той се демаскирадира и веднага се пуска на входната верига. Ако вие не използвате маскарадинг, вие можете мислено да изтриете това място от рисунката. Роутинг (routing) - полето "получател" на пакета се анализира частта на кода, която е ответствена за това къде ще отиде по-нататък - за локална обработка или ще бъде препратен към друга машина (вижте веригата "препращане" (forward)). Локална обработка (local) - задача, пусната на локалната машина може да получи пакета само след като той мине роутинга и може да праща пакети в отговор (които, ще минат през изходната верига и след това през входната верига на интерфейса "lo", ако пакета е предназначен за процес на тази машина или ще излезне през изходната верига). Ако пакета не е създаден от задача на локалната машина, то се проверява веригата "препращане" (forward), иначе пакета отива направо на "изходната" (output) верига. Веригата "препращане" (forward) - тази връзка минават всички пакети, които са предназначени за транзитно преминаване през системата. "Изходна" (output) верига - през тази верига минават всички пакети, които се изпращат от тази машина. Използване на ipchains. Първо проверете каква версия на ipchains имате на машината си. # ipchains --version ipchains 1.3.5, 26-June-1998 Този документ се отнася именно за тази версия на програмата. ipchains има man-документация, но ако ви е неохоимо да разберете повече за пътищата на приминаване на пакетите, вие можете да проверите ръководството за програмиране на интерфейси (man 4 ipfw) или файл net/ipv4/ipfw.c в сорсовете на ядрото, те са достатъчно компетентни по този въпрос ;-). Има няколко различни неща, които могат да е правят с веригите. Първо - това е опериране с цели вериги. Ядрото стартира с три вградени вериги - "входна", "изходна", препращане" (input, output, forward) - тях вие не можете да махнете. По долу е показано какво може да се прави. Създаване на нова верига (-N) Махане на празна верига (-X) Смяна на правилата за вградени вериги (-P) Списък на всички правила на веригата (-L) Изчистване на веригата от правила (-F) Изтриване на броячите на пакети и байти във всички правила на веригите (-Z) Има няколко начина за манипулиране на правилата вътре в веригата. Добавяне на ново правило към веригата (-A) Да се вмъкне ново правило на указана позиция във веригата (-I) Да се замени правило в указана позиция във веригата (-R) Да се махне правило от указана позиция (-D) Да се махне първото правило, което сработва във веригата (-D) Има още няколко операции за маскарадинг. Да се покажат текущите съединения чрез маскарадинг (-M -L) Да се установят тайм-аути за маскарадинга (-M -S) В края има команди, които ви позволяват да проверите, какво се е случило с даден пакет, ако той тръгне през указаната верига. Операции с едно правило. Това са основни операции в ipchains - манипулация с правилата. Обикновенно, вие можете да изпробвате командите добави (-А) и изтрии (-D) правило. Аналогично и с командите вмъкни (-I) и замени (-R) - синтаксиса им е практически еднакъв. Всяко правило установява списък с условия, които пакета трябва да има и какво да се прави с него ако условията съвпадат. За пример даите да забраним всички ICMP пакети, които идват от адреса 127.0.0.1. В нашия случай протокола трябва да бъде ICMP и адрес на източника 127.0.0.1 - за такива условия "забрани". Адрес 127.0.0.1 - това е интерфейс-тапа, който го има даже, ако вие нямате реални мережови съединения. Вие можете да използвате програмата ping за генериране на тези пакети (тя просто праща пакети от типа на ICMP 8 (echo request), на което обикновенно всички добронамерени системи обикновенно отговарят с пакети от типа ICMP 0 (echo reply)). Това ще ни трябва на нас за тестване. # ping -c 1 127.0.0.1 PING 127.0.0.1 (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.2 ms --- 127.0.0.1 ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 0.2/0.2/0.2 ms # ipchains -A input -s 127.0.0.1 -p icmp -j DENY # ping -c 1 127.0.0.1 PING 127.0.0.1 (127.0.0.1): 56 data bytes --- 127.0.0.1 ping statistics --- 1 packets transmitted, 0 packets received, 100% packet loss # Вие виждате, че първия ping мина успешно (опцията "-c 1 казва на ping-а, четрябва да прати само един пакет). След това ние добавихме (-A) във "входната" верига правило, което указва на това, че пакетите 127.0.0.1 (-s 127.0.0.1) с протокол ICMP (-p ICMP) трябва да се забраняват (-j DENY). След това ние проверихме нашето правило, използвайки втория ping. Той малко почака преди да се предаде, очаквайки пакет с отговор, който никога няма да дойде. Не можем да махнем правилото по два начина. Тъй като знаем че имаме само едно правило, ние можем да използваме премахване на правило по номер, ето така: #ipchains -D input 1 Това маха правило номер 1 от изходната верига. Втория начин - това е огледално изображение на командата "добави", но със замяна на -A с -D. Този начин е полезен когато вие имате пълна с правила верига и не искате да смятате кое по номер е това правило. В този случай можете да направите следното: #ipchains -D input -s 127.0.0.1 -p icmp -j DENY Синтаксиса след командата (-D) трябва да съвпада със синтаксиса на командата -A (или -I и -R), с която и беше зададено това правило. Ако има няколко еднакви правила в различни вериги само първото правило ще бъде махнато. Спецификация за филтрите. Ние ще използваме -p за посочим на протокола и -s за посочим на адреса на източника, но има и други опции, които сочат други опции на пакетите. Те ще бъдат описани по-долу. Посочване на ip-адресите на източниците и получателите. ip-адресите на източниците (-s) и на получателите (-d) могат да се посочат по 4-ри начина. Обикновенно тях ги описват с пълните имена, например "localhost" или "linux.org". Втория начин - посочване на пълния ip-адрес, например 127.0.0.1. Третия и четвърти начини дават възможност да се посочват групи от ip адреси, например "62.76.19.0/24" или "62.76.19.0/255.255.255.0". И двата варианта сочат към адрсите от 62.76.19.0 включително до 62.76.19.255. Цифрите след "/" сочат каква част от ip адреса ще бъде значима. По подразбиране се приема "/32" или "/255.255.255.255" (влизат всички ip адреси). За посочване, на които и да е ip адрес е възможно изолзването на "/0", например #ipchains -A input -s 0/0 -j DENY Това ще предизвика същия ефект, както и без използването на -s вообще. Посочване на инверсия. Много флагове, включвайки -s и -d могат да имат трети аргумент във вида на "!", за изчисление на адресите, които НЕ попадат в посочването. Например под "-s ! localhost" попадат всички пакети, които не идват от localhost. Посочване на протокола. Протокола може да бъде посочен с помощана фалага -p. Протокола може да бъде номер (ако вие не знаете значенията на номерата за протокола ip) или едно от следните значения: TCP, UDP или ICMP. Регистъра няма значения, tcp е същото като TCP. Протоколите също така могат да бъдат инвертирани с помоща на "!", например "-s ! TCP" указва на тези протоколи, които не са TCP. Посочване на TCP и UDP портове. Когато са посочени протоколите TCP или UDP е възможен и трети аргумент, който сочи към TCP&UDP портове или тяхен диапазон (включвайки крайните портове). Диапазона се посочва с помоща на символа ":", например "6000:6010" сочи към 11 порта, от 6000 до 6010 включително. Ако долната граница не е посочена то тя се приема за 0. Ако горната граница не е посочена, тя се приема равна на 65535. Например за посочване на TCP съединения идващи от портове по-ниски от 1024, синтаксиса ще бъде следния "-p TCP -s 0.0.0.0/0 :1024". Така също портовете могат да бъдат посочени по име, например www (за превод на численото значение погледнете файла /etc/services). Номерата на портовете също така могат да бъдат инвертирани с помоща на "!". Например, за посочването, на които и да е TCP пакет освен WWW пакетите е нужно да се посочи "p TCP -d 0.0.0.0/0 ! www" Важно е да се разбере, че "p TCP -d ! 192.168.1.1 www" МНОГО СИЛНО СЕ РАЗЛИЧАВА от "-p TCP -d 192.168.1.1 ! www" Първото правило посочва към, които и да е TCP пакети на WWW порт, ня която и да е машина, но не и на 192.168.1.1. Второто правило посочва към, което и да е TCP съединение на 192.168.1.1, на който и да е порт с изключение на WWW. Обединявайки тези правила, ще получим -p TCP -d ! 192.168.1.1 ! www то ест, на която и да е машина освен 192.168.1.1, на който и да е порт освен WWW. Посочване на типовете и кодовете на 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, което също не сработва. Да опишем пътя на пакета. v __________________________ `input' | / `Test' v ------------------------|--/ -----------------------|---- | Rule1 | /| | Rule1 | | |-----------------------|/-| |----------------------|---| | Rule2 / | | Rule2 | | |--------------------------| -----------------------v---- | Rule3 /--+___________________________/ ------------------------|--- v Записване на пакетите в лог. Ако в правилото е посочен флаг -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.