Системата в ядрото, която се грижи за всички тези неща, се нарича Netfilter. Тя се управлява чрез командата iptables Защитната стена на GNU/Linux обикновено се реализира като последователност от команди на iptables, намиращи се в rc стартов скрипт.
Отделните команди на iptables принципно имат подобна структура:
iptables -F верига – (-F) изчиства всички предишни правила от веригата.
iptables -P верига_цел – (-P) настройва подразбиращата се политика (или още цел) за веригата.
iptables -A верига -i интерфейс -j цел – (-A) добавя текущата спецификация към веригата.
Освен ако не се конкретизира таблица с аргумент -t , командите ще се прилагат към таблицата filter. Параметърът -i прилага правило към именуван интерфейс, а -j идентифицира целта.
Главната таблица filter съдържа три подразбиращи се вериги. Всеки пакет, който се обработва от ядрото, се пропуска през точно една от тях. Правилата във веригата FORWARD се прилагат върху всички пакети, които пристигат на мрежовия интерфейс и трябва да се пренасочат към друг. Правилата във веригитите INPUT и OUTPUT се прилагат върху трафика, адресиран към или идващ от локалния адрес.
Освен таблицата filter, iptables съдържа и таблиците nat и mangle. Таблицата nat съдържа вериги правила за контрол на Network Address Translation. Таблицата mangle съдържа вериги, които модифицират или променят съдържанието на мрежовите пакети извън контекста на NAT и филтрирането на пакети.
Всяко правило, което съставя верига има цел, която определя какво се прави с отговарящите й пакети. Най-често използваните цели са ACCEPT, DROP и REJECT. Когато правилото води до използване на ACCEPT, на отговарящите пакети се позволява да продължат по пътя си. DROP и REJECT отхвърлят пакетите. DROP го прави тихо, а REJECT връща ICMP съобщение за грешка.
И още:
-p Съответствие по протокол: tcp, udp или icmp
-s Съответсвие по хост или IP адрес на източник
-d Съответсвие на хост или IP адрес на дестинация
–sport Съответсвие по порт на източника
–dport Съответсвие по порт на дестинацията
–icmp-type Съответсвие по код за тип на ICMP
За да проверите кои правила са влезли в сила изпълнете следните команди:
iptables -L -n проверка на таблицата filter
iptables -t nat -L -n проверка на таблицата nat
iptables -t mangle -L -n проверка на таблицата mangle
Несъмнено първата среща с iptables особено в случаи на домашен маршрутизатор това е NAT или маскиране на няколко хоста зад статичен адрес даден от доставчика на интернет така, че всички да излизат с неговия адрес в интернет.
Тази задача се изпълнява в два варианта MASQUERADE, когато имаме динамичен ип адрес даден от доставчика и SNAT когато имаме статичен. Нека видим пример с MASQUERADE.
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -s 192.168.0.0/24
iptables -t nat -A POSTROUTING -j MASQUERADE -o ppp0 -s 192.168.0.0/24
Както се вижда от примера MASQUERADE работи на всякакви интерфеиси без да е нужно да се описва външния ип адрес даден от доставчика. В първия ред маскираме цялата 192.168.0.0/24 през eth0 а 192.168.0.0/24 през ppp0. Всъщност ако си представим, че получаме интернет от ppp0 всички вътрешни адреси от 192.168.0.1 до 192.168.0.254 ще излизат с ип адреса на ppp0.
SNAT се описва по същия начин но с тази разлика, че трябва да имате статичен ип адрес.
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 10.25.3.5
Тук всички си задават въпроса – Ако имаме Linux маршрутизатор с домашна мрежа с ип адрес 192.168.0.1 на мрежов интерфейс eth1 и статичен ип адрес към доставчика 10.25.3.5 на мрежов интерфейс eth0 след като знаем как да маскираме мрежа 192.168.0.0/24 може ли да получим достъп от доставчика към домашен компютър например Windows услугата Remote Desktop. Тази хватка също става много лесно този път с DNAT. Първия ред описва услугата Remote Desktop а следващите четири Windows Share.
iptables -t nat -A PREROUTING -p tcp -d 10.25.3.5 --dport 3389 -j DNAT --to 192.168.0.2:3389
iptables -t nat -A PREROUTING -p tcp -d 10.25.3.5 --dport 445 -j DNAT --to 192.168.0.2:445
iptables -t nat -A PREROUTING -p tcp -d 10.25.3.5 --dport 139 -j DNAT --to 192.168.0.2:139
iptables -t nat -A PREROUTING -p udp -d 10.25.3.5 --dport 138 -j DNAT --to 192.168.0.2:138
iptables -t nat -A PREROUTING -p udp -d 10.25.3.5 --dport 137 -j DNAT --to 192.168.0.2:137
В практиката често се случва така, че определени хостове трябва да виждат някакъв порт на които има услуга а други не. Класически случаи е Windows share нека направим така, че ще забраним на всички и достъп ще имат само два хоста
iptables -A INPUT -s 10.25.22.99 -j ACCEPT
iptables -A INPUT -s 10.25.3.137 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 21,139,445,3306 -j REJECT
iptables -A INPUT -p udp -m multiport --dport 137,138 -j REJECT
Както се вижда в примера портове 21 ftp и 3306 mysql също за блокирани за външния свят. Когато някое правило е във веригата INPUT то важи само за пакети които идват от вън.
Друг често използван вариант е в които не искаме някои хост или мрежа да знае за съществуването ни:
iptables -A INPUT -s 10.25.22.99 -j DROP
iptables -A INPUT -s 172.16.10.0/24 -j DROP
За да работят NAT и FORWARD трябва да е разрешено препращане на пакети между мрежовите интерфеси. Всяка дистрибуция има някакъв скрипт за това но:
echo 1 > /proc/sys/net/ipv4/ip_forward
работи на всички и може да я поставите в rc.local. Всъщност с командата echo в /proc/sys/net могат да се променят много ключови параметри в ядрото като например да се увеличи броя на възможните конекции преминаващи през маршрутизатора от 65536 до 262144 echo 262144 > /proc/sys/net/nf_conntrack_max имайки впредвид колко ресурси иска p2p трафика в днешно време.
Аз често създавам файл /etc/init.d/netscript и поставям в него правилата на iptables. Правя това защото нямам представа какво ще трябва да се промени в бъдеще на конфигурацията затова ще ви покажа много проста такава която ще работи навсякъде.
#!/bin/bash
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -j MASQUERADE -o eth0 -s 192.168.0.0/24