Тема №7 Netfilter

       Цел на упражнението: запознаване с Netfilter. Задаване на правила с iptables. Всеки студент да въведе правила на своя компютър за забрана на командата ping със своите съседни компютри. Студендите да конфигурират своя компютър, както като ssh сървър, така и като ssh клиент.
               Понятия:
  Netfilter -верига, която се състои правила, които се прилагат върху пакетите, когато преминават през системата. Също така, дава възможност за филтриране на пакети, мрежови адреси, портове и други пакети манипулации.
Netfilter/ iptables е наследник на ipchains ( верига от правила използвани за защитна стена) на Linux след версия на ядро 2.4, която е наследник на първия код за филтриране на пакети - ipfw ( IP FireWall).
Чрез iptables се определят правилата за филтриране на пакетите и съответно транслирането на адресите.

               Теоритична част:

Таблица IPTABLES
 Подразбиращата таблица е filter.
   Синтаксис:
            iptables [-t table] command chain rule-specification [options]
            iptables [-t таблица] команда верига спецификация-на-правилото [опции]
Чрез iptables се определят правилата за филтриране на пакетите и съответно транслирането на адресите. Списъка от правила, които се прилагат върхупакетите се нарича верига (chain). Съществуват три основни вериги:
     - INPUT - верига за входящите пакети, предназначени за локалната система;
     - OUTPUT - верига за изходящите пакети от локалната система;
     - FORWARD - верига за пренасочване на пакети от един мрежов интерфейс към друг;

Схемата представя преминаването на пакетите пез iptables
Layer


Веригите образуват таблици: FILTER, NAT, MANGLE. Потребителите могат да създават нови таблици и нови вериги.
        FILTER table се използва за филтриране на трафика, т.е. разрешава или забранява преминаването на пакетите и съединенията. Всеки пакет преминава през тази таблица, по някоя от веригите.
        NAT table използва се за преобразуване на адресите и номерата на портовете на обработващите пакетите. През тази таблица винаги преминава първия или единствения пакет, на всяка нова връзка.
Съдържа следните три предефинираните вериги:
      PREROUTING – обработва входящите пакети преди маршрутизирането им. В нея се осъществява DNAT
(Destination NАТ) – транслира адреса на получателя.
      POSTROUTING – обработва изходящите пакети след като вече са маршрутизирани. В нея се осъществява SNAT
(Source NАТ) – транслира адреса на източника.
       - в тази верига се осъществяа ограничен DNAT над локални пакети.
         MANGLE table – всички пакети преминават през тази таблица. Използва се за промяна на допълнителните полета в хедъра на пакета. Може да се използва и за промяна на TOS (Type of service) битовете или за поставяне на маркер върху пакета, който след това netfilter да използва. Правилата си имат определена цел (действието, което трябва да се предприеме). Целите на веригите са:
   ACCEPT – тази цел указва пропускане на пакетите.
   DROP – отхвърляне на пакетите.
   REJECT – отхвърляне на пакетите и връщане на съобщение за грешка.
   MASQUERADE – маскиране на пакета.
          iptables е разгледана подробно в тема №3 NAT - транслиране
iptables -L -n -v --line-numbers – извежда характеристиките на защитната стена и номер на ред;
    -L - показва списъка с правила;
    -v - допълнителна информация;
    -n - показва IP адрес и номер на порт;
    --line-numbers - показва и номер на ред;
route add default gateway 192.168.0.1 – указва на хоста да използва шлюз към Интернет с адрес 192.168.0.1 . Всеки пакет, който няма маршрут до местоназначението си ще се предава на 192.168.0.1;
route del default   – изтрива подразбиращия се маршрут ( не можете да се свържете с Интернет);
iptables -D INPUT 3 - трие трети ред от INPUT веригата;
iptables -F - изтрива всички правила;
       или
iptables --flush - изтрива всички правила;
     За да може пакетите да се пренасочват от една мрежа в друга,трябва да се разреши препращането.
Във файла /etc/sysctl.conf се съдържа променливата net.ipv4.ip_forward = 0
     0 – не е разрешено; 1 – разрешено транслиране.
     Пишем в командния ред :
cat /proc/sys/net/ipv4/ip_forward
По този начин се проверява стойността на променливата net.ipv4.ip_forward, ако е равна на 0 пишем в командния ред :
echo 1 > /proc/sys/net/ipv4/ip_forward
По този начин променяме net.ipv4.ip_forward = 1 .
     Можем да включим проверка за адрес на източника:
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
Променяме стойността на параметъра rp_filter=1, по този начин се предпазваме от измами (spoofing) с IP адреси, като проверяваме дали всеки пакет е пристигнал от интерфейса, от който сме очаквали.

     Свързва (препраща) eth1 от външна мрежа (интернет) с eth0 е свързан към вътрешната мрежа:
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
echo-request - 8 - ехо запитване;
echo-reply - 0 - ехо отговор;
-i eth1 - пристигащи на интерфейс на eth1 ;
-о eth1 - излизащи от интерфейс от eth1 ;
Блокиране на програмата PING
      1. Най-лесния начин е да се блокират всички echo заявки.
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
     Обратна разрешава всички echo заявки.
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
      2. Ako се напише този ред на вашия компютър, ping към вашия компюър се блокира :
т.е блокира се в изходящата верига (OUTPUT) ехо отговора (echo-reply - код 0);
iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP
      3. Може да се напише и така за забрана на определен адрес:
iptables -A OUTPUT -s 10.10.55.64/26 -p icmp --icmp-type echo-reply -j DROP
      4. Забранява определен адрес:
iptables -A OUTPUT -s 10.10.55.64/26 -p icmp --icmp-type echo-reply -j DROP
iptables -A INPUT -s 10.10.55.64/26 -p icmp --icmp-type echo-request -j DROP
      5. В практическото упражнението по-долу, аз ще ползвам за забрана (DROP) тези два реда:
iptables -A INPUT -p icmp --icmp-type 8 --src 10.10.55.64 -j DROP
iptables -A OUTPUT -p icmp --icmp-type 8 --dst 10.10.55.64 -j DROP
      6. Предпазва от входящи ping заявки:
iptables -A INPUT -i eth1 -p icmp -s 0.0.0.0/0 -d 0.0.0.0/0 --icmp-type 8 -j DROP
      7. Разрешава/ забранява (DROP), ping от външен потребител:
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

Практическо упражнение

   Намираме се в локална мрежа, на която са раздадени определена област адреси и default gateway за свързване с Интернет. Всички компютри в мрежата са свързани чрез switch с Интернет. В конкретния пример ние ползваме адресите: 10.10.55.64/26 - 10.10.55.127/26; default gateway 10.10.55.126 (IP адресите са примерни. Вие използвайте вашите.) . Тези адреси трябва да Ви бъдат дадени от мрежовия администратор.
Целта ни е да забраним ping на двата съседни на мен компютри.
Ako не знаем, кой е използвал компютъра преди нас, за всеки случай пишем:
iptables -F
echo 1 > /proc/sys/net/ipv4/ip_forward
1. Мрежовите карти трябва да са свързани със суича - за да имате Интернет:
Проверяваме активните мржови карти:
ifconfig или с ifconfig -a - по този начин виждаме всички мрежови карти. Ако имаме няколко мрежови карти, трябва да проверим, коя е свързана с интернет eth0, eth1, eth2 и т.н.(като преместваме кабела за Интернет от едната на другата).
Ако интерфейса го виждаме с ifconfig -a , трябва да го активираме с: ifconfig eth0 up ( съответно: eth1,eth2 ..).
Приемаме, че е първата мрежова карта е свързана (eth0) и пишем:
    Задаваме IP адрес на първия компютър (например D1):
ifconfig eth0 10.10.55.64/26
    Задаваме маршрута по подразбиране за Интернет:
route add default gw 10.10.55.126
    Задаваме IP адрес на втория компютър (например D2):
ifconfig eth0 10.10.55.65/26
route add default gw 10.10.55.126
    Задаваме IP адрес на третия компютър (например D3):
ifconfig eth0 10.10.55.66/26
route add default gw 10.10.55.126
   На втория компютър (D2) забраняваме ping към D1 и D3:
iptables -A INPUT -p icmp --icmp-type 8 --src 10.10.55.64 -j DROP
iptables -A OUTPUT -p icmp --icmp-type 8 --dst 10.10.55.64 -j DROP
iptables -A INPUT -p icmp --icmp-type 8 --src 10.10.55.66 -j DROP
iptables -A OUTPUT -p icmp --icmp-type 8 --dst 10.10.55.66 -j DROP
Тестваме с ping от D3: ping 10.10.55.65
   На третия компютър (D3) забраняваме ping към D4 и D1:
iptables -A INPUT -p icmp --icmp-type 8 --src 10.10.55.64 -j DROP
iptables -A OUTPUT -p icmp --icmp-type 8 --dst 10.10.55.64 -j DROP
iptables -A INPUT -p icmp --icmp-type 8 --src 10.10.55.67 -j DROP
iptables -A OUTPUT -p icmp --icmp-type 8 --dst 10.10.55.67 -j DROP
Тестваме с ping от D1: ping 10.10.55.66
Тестваме ssh
SSH (Secure Shell) - мрежов протокол за достъп до отдалечена машина по сигурна връзка;
       1.За да можем да виждаме на кой терминал се намираме, ako се намираме на D3 пишем:
sysctl kernel.hostname=D3
Трябва да стартираме терминала отново и от лявата страна трябва да има изписано D3.
Искаме да разрешим сигурна връзка само с IP адрес: 10.10.55.66
Ssh осъществява връзка на порт 22, !- означава обратно, DROP -забрана, но фактически ние разрешаваме връзка със само този адрес.
Добавяме тези правила в iptables:
iptables -A INPUT -p tcp --dport 22 ! --src 10.10.55.66 -j DROP
iptables -A OUTPUT ! --dst 10.10.55.66 -p tcp --dport 22 -j DROP
1. Стартираме демона на ssh (на двата компютъра, които ще правят връзка):
service sshd start
2. След това, ако сте root (ако не сте root си пишете вашето име, но трябва да имате права на достъп) се свързвате с IP адреса:
ssh root@10.10.55.66
Ще Ви поиска root парола.
Би трябвало да сте логнат като от този IP адрес. Вижте името на комп. в лявата част на екрана.
За да излезете от ssh пишете:
exit

        Някои правила,който могат да бъдат добавени към iptables :
Защита от DoS (Denial-of-Service) – отказ от услуга
     Наводнваща атака SYN-flood – изпращат се голям брой малко пакети за кратко време с цел претоварване на мрежата.
  Защита от SYN-flood :
iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
   Ping of death (Ping на смърта)- когато изпратите Ping пакет по-голям от 65536 байта. Фрагментирането позволява да бъде изпратен такъв пакет, след това при сглобяването от страна на получателя, може да предизвика срив в неговата машина.
     Защита от Ping of death:
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
   Защита от сканиране на портове:
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP
   Ping of death (Ping на смъртта)- когато изпратите Ping пакет по-голям от 65536 байта. Фрагментирането позволява да бъде изпратен такъв пакет, след това при сглобяването от страна на получателя, може да предизвика срив в неговата машина.
   Защита от Ping of death:
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
   IP- spoofing (измама) атака, когато компютъра на нападателя се маскира като компютър от локалната мрежа. Лок. мрежата трябва да отказва пакети от външен интерфейс.
iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
      


Благодара за вниманието Ви !