Тема №3 NAT - транслиране на адреси

       Цел на упражнението: запознаване с начина на транслиране на адреси и портове. Филтриране на пакети, чрез командата iptables. Задаване на правила във филтрирания трафик.
       Теоритична част: NAT (Network Address Translation) – преобразуване на мржови адреси. Използва се, когато зад един реален IP адрес свързан с глобалната мрежа (Интернет), са свързани няколко компютри (хоста) в локална мрежа (LAN). Преобразуването на адресите се извуршва в маршрутизатора, който е свързан с Интернет.
       Понятия:
Порт – интерфейс, който е крайна точка на една логическа връзка. Портовете приемат стойности между 0 – 65536 (16 битово двойчно число 216=65536 ).
Целта на таблиците (iptables) е действието, което трябва да бъде предприето, ако отговаря на списъка от правила (веригата).

Преговор с допълнения:
  Препращането на IP адреси от един интерфейс на друг трябва да се разреши.
Във файла /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, по този начин се предпазваме от измами с IP адреси, като проверяваме дали всеки пакет е пристигнал от интерфейса, от който сме очаквали.
      
Принцип на действие на NAT

       При NAT пакетите във външната мрежа се маршрутизират с адрес различн от тези във вътрешната мрежа.

Layer
Ако искам да се свържа с произволен IP адрес в Интернет: 138.77.29.7 порт № 33 .
NAT маршрутизатора има външен IP адрес 194.144.11.22
Ако имаме пакет от компютър във вътрешната мрежа с адрес: 192.168.0.3 и порт №3333 и искаме да го изпратим на този: 138.77.29.7 Интернет адреса. В маршрутизатора срещу: 192.168.0.3 и порт №3333 се запаметява числото: 1212 и той го изпраща от своя адрес 194.144.11.22 и порт № 1212 на Интернет адреса 138.77.29.7 порт № 33. Когато се получава пакет от този Интернет адреса за 194.144.11.22 и порт № 1212 маршрутизатора проверява, каква е стойността срещу 1212 ==>( 192.168.0.3 и порт №3333) и го препраща на този адрес. Ако имаме няколко компютъра във вътрешна межа, транслирането се осъществява по същия начин.
Чрез iptables се определят правилата за филтриране на пакетите и съответно транслирането на адресите. Списъка от правила, които се прилагат върху пакетите се нарича верига (chain). Съществуват три основни вериги:

     - INPUT - верига за входящите пакети, предназначени за локалната система;
     - OUTPUT - верига за изходящите пакети от локалната система;
     - FORWARD - верига за пренасочване на пакети от един мрежов интерфейс към друг;
Веригите образуват таблици: 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
 Подразбиращата таблица е filter.
   Синтаксис:
            iptables [-t table] command chain rule-specification [options]
            iptables [-t таблица] команда верига спецификация-на-правилото [опции]
      -A (append) – добавяне на правило;
      -D (delete) – изтриване на правила от зададена верига;
      -C (check) – проверка;
      -I (insert) – вмъкване на правила- разширение на -А;
      -R (replace) – замяна на правило в зададена верига;
      -F (flush- изчистване) – изтриване на всички правила;
      -L (list) – извежда списъка на всички правила;
      -z (zero) – нулиране на броячите;
      -N (new) създаване на потребителски дефинирана верига;
      -X – изтриване на потребителски дефинирана верига;
      -P (policy) – политика;
      -E (rename chain) – преименуване на верига;

Някои опции на iptables
      -p – протокол;
      -s – адрес на източника;
      -d – адрес на получателя;
      -i – име на входния интерфейс;
      -o - име на изходния интерфейс;
      -j – цел, действие за правилото;
      -n – указва адресите и портовете да се извеждат като числа;
      -v – подробно извеждане;
      --v – изключително подробно извеждане;
      -- line-numbers – извеждат се правила и показва номерата на редовете преди спецификациите;
      --sport – задава порт на източника; валиден е след -p tcp или -p udp;
      --dport – задава порта на местоназначението; валиден е след -p tcp или -p udp;
      --tcp-flags – изследва списъка на вдигнатите и свалени TCP-флагове; валиден е след -p tcp;
      --syn – позволява хващането на TCP SYN-пакети (съкращение на--tcp-flags SYN,RST,ACK,FIN SYN);
      --mac-source [!] address - сравнява IP адреса на източника и неговия ethernet-адрес.MAC-адреса трябва да е в стандартен формат 12:34:56:78:90:10;
      --port - сравнява IP адреса на източника и на получателя по зададения порт;
      --state – пакетите могат да бъдат класифицирани в зависимост от състоянието на връзката :NEW, ESTABLISHED - установена, RELATED - сродна и INVALID. Обикновенно ESTABLISHED и RELATED се използват заедно.
                    Целта на таблиците (iptables) е действието, което трябва да бъде предприето, ако отговаря на списъка от правила (веригата). По подразбиране политиките са ACCEPT.
      -LOG – записва пакетите в дневника; пример: --log -tcp -secuence – прибавя към дневника TCP последователностите (съществува риск за сигурността).
      -MARK – задава маркера за защитната стена използва таблица -t mangle.
      -REJECT - отхвърляне на пакетите и връщане на съобщение за грешка.
      -TOS – в това поле се задава типа на услугата.
Практическо упражнение

   Конфигурираме си един компютър за рутер (например с име: D4) с един реален IP адрес (100.20.30.2) и един адрес в локалната мрежа (192.168.0.2). Нека имаме хост (D3), който е в локалната мрежа (192.168.0.1) и искаме да го свържем с друг хост (D5) от външна мрежа (Интернет) с адрес: 100.20.30.1 . Ще тестваме преобразуването от частни адреси в публични.
Свържете компютрите по следната схема:
Layer

1. Осъществяваме връзка между мрежовите карти на съответните компютри:
       D3 eth1 <------> eth1 D4 eth0 <------> eth0 D5
      На компютъра D4, който ползваме за рутер пишем:
iptables -F
iptables -X
iptables -t nat -F
ifconfig eth0 100.20.30.2/24
ifconfig eth1 192.168.0.2/24
echo 1 > /proc/sys/net/ipv4/ip_forward
      На компютъра D3, пишем:
ifconfig eth1 192.168.0.1/24
route add default gw 192.168.0.2
      На компютъра D5, пишем:
ifconfig eth0 100.20.30.1/24
route add default gw 100.20.30.2
Тестваме връзките от D3: ping 192.168.0.2
Тестваме връзките от D5: ping 100.20.30.2
Ако тестваме връзките от D3 към D5 с: ping 100.20.30.1 трябва да има връзка.
      На компютъра D4 пишем:
iptables -t nat -A PREROUTING --dst 100.20.30.2 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1
Тестваме: ssh 100.20.30.2
iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.1 --dport 80 -j SNAT --to-source 192.168.0.2
Сега ако тестваме връзките от D3 към D5 с: ping 100.20.30.1 трябва ping да работи.
      За да можем да виждаме на кой терминал се намираме, ako се намираме на D5 пишем:
sysctl kernel.hostname=D5
Трябва да стартираме терминала отново.
Можем да тестваме и достъп от отдалечен терминал от D5 пишем :
Трябва да стартираме     . . . . ......................... на всички компютри.
Ако изведе съобщение за грешка от типа :
WORNING: REMOTE HOST IDENTIFICATION HAS CHALANGED
пишем:     . . . . . . . . . . ........................
      Ако тестваме сигурна (security) връзкa от D5 към D4:
       Добавяме в iptables на D4:
iptables -t nat -A PREROUTING --dst 100.20.30.2 -p tcp --dport 2222 -j DNAT --to-destination 192.168.0.1:22
      Тестваме на D5:
ssh 100.20.30.2 -p 2222
Ще Ви поиска root парола, след това трябва да сте логнат като компютър D3.
iptables -t nat -A POSTROUTING -p icmp --dst 192.168.0.1 --icmp-type 8 -j SNAT --to-source 192.168.0.2
      На компютъра D5 пишем:
ping 192.168.0.1
     На компютъра D4 е стартиран wireshark, би трябвало да се подмени адреса, от който пристигат пакетите.
Да не се забрави да се напише, exit за да се върнете отново във вашия терминал.
exit

Примери за iptables
iptables -L -n -v – извежда характеристиките на защитната стена;
iptables -L --line-numbers - показва и номер на ред;
Спиране, пускане, рестартиране и записване на iptables
service iptables stop
service iptables start
service iptables restart
service iptables save
Изчистваме правилата в iptables
      iptables -F
      iptables -X
      iptables -t nat -F
      iptables -t nat -X
      iptables -t mangle -F
      iptables -t mangle -X
      -F (flush- изчистване) – изтриване на всички правила;
      -X – изтриване на потребителски дефинирана верига;
      -t – избираме таблицата (filter,nat или mangle) и изчистваме правилата от нея;
      iptables -P INPUT ACCEPT
      iptables -P OUTPUT ACCEPT
      iptables -P FORWARD ACCEPT
      -P - избираме политиката по подразбиране (ACCEPT, DROP, REJECT)
   Премахване филтрирането на localhost:
iptables -A INPUT -i lo -s 127.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -o lo -d 127.0.0.0/8 -j ACCEPT
   Отваряме порт 80:
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
   Блокиране на IP-адрес:
iptables -A INPUT -s 1.1.1.1 -j DROP
   Блокиране входящите заявки на порт 80 :
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP
   Блокиране входящите заявки на порт 80 за IP-адреса 1.2.3.4 :
# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP
Блокиране или разрешение трафика от Mac-адрес:
# iptables -A INPUT -m mac --mac-source 00:19:99:3C:AB:24 -j DROP
   разрешава трафика само за TCP порт 8080 от mac adres 00:19:99:3C:AB:24
# iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:19:99:3C:AB:24 -j ACCEPT
Блокиране на определен домейн
Първо да разберем неговия IP-адрес:
   host -t a facebook.com         или
   nslookup www.fаcebook.com
На мен ми изведе: facebook.com has address 66.220.158.68
Командата whois ще работи ако бъде инсталирана.
За Fedora / RHEL / Redhat / CentOS / Scientific Linux: yum -y install jwhois    .
Когато тествам командата whois :
whois 66.220.158.68 | grep CIDR
на екрана ми извежда:
CIDR:         66.220.144.0/20
  Блокиране на адреса:
iptables -A OUTPUT -p tcp -d 66.220.144.0/20 -j DROP
  Можем да блокираме името на домейна:
iptables -A OUTPUT -p tcp -d www.fаcebook.com -j DROP
iptables -A OUTPUT -p tcp -d fаcebook.com -j DROP
  Разрешава/ забранява ICMP заявки за ping:
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
  Филтриране на съдържанието: ako пакета съдържа определен набор от символи напр. “Hello” на порт 80:
iptables -A INPUT -p tcp --dport 80 -m string --string 'Hello' --algo kmp -j DROP
  Филтрация по браузер:
iptables -A INPUT -p tcp --dport 80 -m string --algo kmp --string "Mozilla" -j REJECT
   Проверяваме правилата на iptables
  Проверка на отворени/ затворени портове:
netstat -tulpn
Защита от 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
     Създаване на конкретен пример с Netfilter и командата iptables:
Приемаме, че eth0 – външен интерфейс (свързан с Internet), eth1 – вътрешен интерфейс.
Web server: 192.168.1.20 порт 80; Mail server: 192.168.1.21 порт 25;
DNS server: 192.168.1.18 порт 53 за UDP и TCP;

iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P INPUT -i lo -j ACCEPT
iptables -P OUTPUT -o lo -j ACCEPT
iptables -A FORWARD -m state --state NEW -p tcp -d 192.168.1.20 --dport 80 -j ACCEPT
iptables -A FORWARD -m state --state NEW -p tcp -d 192.168.1.21 --dport 25 -j ACCEPT
iptables -A FORWARD -m state --state NEW -p tcp -d 192.168.1.18 --dport 53 -j ACCEPT
iptables -A FORWARD -p udp -d 192.168.1.18 --dport 53 -j ACCEPT
iptables -A FORWARD -p udp -s 192.168.1.18 --sport 53 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED ,RELATED -j ACCEPT
iptables -A FORWARD -m state --state NEW -i eth1 -j ACCEPT

service iptables save

Допълнително може да се разреши достъпът (вмъква се след ред №6:) до:
   POP3 порт 110:
iptables -A FORWARD -m state --state NEW -p tcp -d 192.168.1.21 --dport 110 -j ACCEPT
   IMAP порт 143:
iptables -A FORWARD -m state --state NEW -p tcp -d 192.168.1.21 --dport 143 -j ACCEPT
   IMAP+SSL порт 993:
iptables -A FORWARD -m state --state NEW -p tcp -d 192.168.1.21 --dport 993 -j ACCEPT
Ако искаме да ги запишем във файл firewall.sh пишем: : nano /etс/firewall.sh:
Копираме текста (от iptables -F до (без този текст: service iptables save)).
Записваме го с Ctrl+X след това Y.
Правим го изпълним: chmod +x /etс/firewall.sh
За да се стартира файла заедно със стартиране на операционната система. Трябва да отворим файла rc.local :
nano /etс/rc.local
преди exit 0 добавяме реда :
/etс/firewall.sh
      


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