LINUX-BG   Адрес : http://www.linux-bg.org
IPCHAINS-HOWTO BG 1.01 (част 1)
От: Plamen Popow
Публикувана на: 28-01-2000
Адрес на статията: http://www.linux-bg.org/cgi-bin/y/index.pl?page=article&id=advices&key=316349746
Tozi suwet e dobawen sus suglasieto na awtora mu Plamen Popow
Originalniata statiq se namira na adres http://www.qsl.net/lz1plp/



Тук можете да видите документа в чист текст.

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 карая, ако пакета е минал цялата верига от правила и нито едно правило не е съответствало, ядрото гледа на правилата от веригата. В защитените системи пакета обикновенно се отказва или забранява.

    Последователно описание на всеки стадий.
    Проверка на контролната сума (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.

[ част 2 ]

<< IPCHAINS-HOWTO BG 1.01 (част 2) | Използване на TTF в Linux >>

Авторите на сайта, както и техните сътрудници запазват авторските права върху собствените си материали публикувани тук, но те са copyleft т.е. могат свободно да бъдат копирани и разпространявани с изискването изрично да се упоменава името на автора, както и да се публикува на видно място, че те са взети от оригиналния им URL-адрес на този сървър (http://www.linux-bg.org). Авторските права на преводните материали принадлежат на техните автори. Ако с публикуването тук на някакъв материал неволно са нарушени нечии права - след констатирането на този факт материалът ще бъде свален.

All trademarks, logos and copyrights mentioned on this site are the property of their respective owners.
Linux is copyright by Linus Torvalds.
© Линукс за българи ЕООД 2007
© Slavei Karadjov 1999 - 2006

All rights reserved.

Изпълнението отне: 0 wallclock secs ( 0.19 usr + 0.00 sys = 0.19 CPU)