Iptables складаються з двох частин: частини, що входить в ядро Лінукса та користувацьких утиліт. Для роботи iptables ядро вашої системи має бути відповідним чином налаштоване. Налаштування ядра обговорюватиметься в наступному параграфі.

Компіляція ядра Лінукса з підтримкою netfilter/iptables

Раджу звернути увагу на розширення patch-o-matic-ng, які додають досить багато додаткових функцій до Netfilter. Patch-o-matic-ng — це набір доповнень, які у майбутньому буде введено до складу ядра, брати тут. Також цікаві доповнення є у пакеті L7-filter.

emerge l7-filter

Процес компіляції ядра GNU/Linux детально описано тут. Додатково для підтримки netfilter/iptables необхідно увімкнути:

Networking  --->
  [*] Networking support
    Networking options  --->
     <*> Packet socket
     [*]   Packet socket: mmapped IO
     <*> Unix domain sockets
     <*> IPsec user configuration interface
     <*> PF_KEY sockets
     [*] TCP/IP networking
     .......
     [*] Network packet filtering (replaces ipchains)  --->
       --- Network packet filtering (replaces ipchains)
       [ ]   Network packet filtering debugging
       IP: Netfilter Configuration  --->
        <*> Connection tracking (required for masq/NAT)
        [*]   Connection tracking flow accounting
        [*] Connection mark tracking support
        <*> SCTP protocol connection tracking support (EXPERIMENTAL)
        <*> FTP protocol support
        <*> IRC protocol support
        <*> TFTP protocol support
        <*> Amanda backup protocol support
        <*> Userspace queueing via NETLINK
        <*> IP tables support (required for filtering/masq/NAT)
        <*>   limit match support
        <*>   IP range match support
        <*>   MAC address match support
        <*>   Packet type match support
        <*>   netfilter MARK match support
        <*>   Multiple port match support
        <*>   TOS match support
        <*>   recent match support
        <*>   ECN match support
        <*>   DSCP match support 
        <*>   AH/ESP match support
        <*>   LENGTH match support
        <*>   TTL match support
        <*>   tcpmss match support
        <*>   Helper match support
        <*>   Connection state match support
        <*>   Connection tracking match support 
        <*>   Owner match support
        <*>   address type match support
        <*>   realm match support
        <*>   SCTP protocol match support
        <*>   comment match support
        <*>   Connection mark match support
        <*>   hashlimit match support
        <*>   Packet filtering
        <*>     REJECT target support
        <*>   LOG target support
        <*>   ULOG target support
        <*>   TCPMSS target support
        <*>   Full NAT
        <*>     MASQUERADE target support
        <*>     REDIRECT target support
        <*>     NETMAP target support
        <*>     SAME target support
        <*>     Basic SNMP-ALG support (EXPERIMENTAL)
        <*>   Packet mangling
        <*>     TOS target support
        <*>     ECN target support
        <*>     DSCP target support
        <*>     MARK target support
        <*>     CLASSIFY target support
        <*>     CONNMARK target support
        <*>   CLUSTERIP target support (EXPERIMENTAL)
        <*>   raw table support (required for NOTRACK/TRACE)
        <*>     NOTRACK target support
        <*> ARP tables support
        <*>   ARP packet filtering
        <*>   ARP payload mangling
      IPv6: Netfilter Configuration (EXPERIMENTAL)  --->
        <*> Userspace queueing via NETLINK
        <*> IP6 tables support (required for filtering/masq/NAT)
        <*>   limit match support
        <*>   MAC address match support
        <*>   Routing header match support
        <*>   Hop-by-hop and Dst opts header match support
        <*>   Fragmentation header match support
        <*>   HL match support
        <*>   Multiple port match support
        <*>   Owner match support
        <*>   netfilter MARK match support
        <*>   IPv6 Extension Headers Match
        <*>   AH/ESP match support
        <*>   Packet Length match support
        <*>   EUI64 address check
        <*>   Packet filtering
        <*>     LOG target support
        <*>   Packet mangling
        <*>     MARK target support
        <*>   raw table support (required for TRACE)

Звичайно, можна вибрати тільки необхідні пункти і збирати їх як модулі, це зробить ядро меншим і швидшим.

Опис деяких параметрів налаштування ядра та відповідних їм модулів

Звісно, потрібно додати драйвери для ваших пристроїв, тобто для картки Ethernet, PPP і SLIP. Ці опції необхідні для забезпечення базових можливостей iptables, щоб одержати додаткові можливості доведеться ввімкнути в ядрі деякі додаткові опції. Нижче наводиться список опцій для ядра 2.4.9 та їх стислий опис:

CONFIG_NETFILTER : Ця опція необхідна, якщо ви збираєтеся використовувати комп'ютер як мережевий екран (firewall) чи шлюз (gateway) до Інтернету. Інакше кажучи, вам вона точно знадобиться, бо навіщо тоді читати це керівництво!

CONFIG_IP_NF_CONNTRACK : Трасування зєднання. Трасування зєднання, серед іншого, використовується для трансляції мережевих адрес і маскарадингу (NAT і Masquerading). Якщо вже ви збираєтеся будувати мережевий екран (firewall) для локальної мережі, то вам точно знадобиться ця опція. Приміром, цей модуль необхідний роботи для rc.firewall.txt.

CONFIG_IP_NF_FTP : Відслідковування з’єднань FTP. Звичайне відслідковування з’єднань не працює з активним режимом роботи FTP. Якщо у вас не буде цього модулю, ви матимете проблеми при роботі з FTP через через мережевий екран (firewall).

CONFIG_IP_NF_IPTABLES : Ця опція необхідна до виконання операцій фільтрації, перетворення мережевих адрес (NAT) і маскарадинга (masquerading). Без неї взагалі наврядчи щось зможете зробити з iptables.

CONFIG_IP_NF_MATCH_LIMIT : Цей модуль необов'язковий, але він використовується у прикладі rc.firewall.txt. Він дає можливість обмеження кількості дозволених співпадінь для деякого правила. Наприклад, -m limit --limit 3/minute вказує, що задане правило може пропустити не більше 3-х пакетів на хвилину. Отже, даний модуль можна використовувати для захисту від нападів типу "Відмова у обслуговуванні".

CONFIG_IP_NF_MATCH_MAC : Цей модуль дозволяє додавати правила, що використовують адреси MAC. Як відомо, кожна мережна карта має власну унікальну адресу Ethernet, тож є можливість блокувати пакети, що приходять з певних адрес MAC (тобто з певних мережевих карт). Проте даний модуль не використовується у rc.firewall.txt і в даному керівництві загалом.

CONFIG_IP_NF_MATCH_MARK : Функція позначення пакетів (MARK). За допомогою цього модуля ви можете позначати потрібні пакети, та потім на основі цих позначок приймати рішення щодо маршрутизації пакета. Докладніше опис цієї функції наводиться нижче.

CONFIG_IP_NF_MATCH_MULTIPORT : Цей модуль дозволить будувати правила з перевіркою на приналежність пакета до діапазону номерів вхідних/вихідних портів.

CONFIG_IP_NF_MATCH_TOS : Цей модуль дозволить будувати правила на основі поля TOS у пакеті. Поле TOS — цея Type Of Service. Також ви можете встановлювати і скидати біти цього поля власними правилами у таблиці mangle командами ip/tc.

CONFIG_IP_NF_MATCH_TCPMSS : Ця опція додає можливість перевірки поля MSS в пакетах TCP.

CONFIG_IP_NF_MATCH_STATE : Це — одне з найбільших удосконалень у порівнянні з ipchains. Цей модуль дає можливість управління пакетами TCP, залежно від їх стану. Приміром, скажімо, що маємо встановлене з’єднання TCP з двостороннім трафіком, тоді пакет цього з’єднання вважатиметься ESTABLISHED (встановлеие з'єднання -- прим. ред). Це використовується у прикладі rc.firewall.txt.

CONFIG_IP_NF_MATCH_UNCLEAN : Цей модуль реалізує можливість додаткової перевірки пакетів IP, TCP, UDP і ICMP на наявність у них невідповідностей, "дивного", помилок. З його допомогою можна відхиляти такого роду пакети. Проте хочеться відзначити, що цей модуль поки що вважається експериментальним, і не завжди працюватиме однаково, тому не можна бути бути впевненим, що ми відкинули усі неправильні пакети.

CONFIG_IP_NF_MATCH_OWNER : Перевірка "власника" зєднання. Наприклад, ми можемо дозволити лише користувачеві root виходити в Internet. Цей модуль було написано як приклад роботи з iptables. Слід зазначити, що це модуль є експериментальним, і його функції можуть змінитися.

CONFIG_IP_NF_FILTER : Реалізація таблиці filter у якій переважно й здійснюється фільтрація. У цій таблиці знаходяться ланцюжки INPUT, FORWARD і OUTPUT. Цей модуль необхідний, якщо ви збираєтеся фільтрувати пакети.

CONFIG_IP_NF_TARGET_REJECT : Надає дію REJECT, яка відкидає вхідний пакет та надсилає ICMP-відповідь про помилку. Пам’ятайте, що з’єднання TCP, на відміну від UDP чи ICMP, завжди завершується пакетом TCP RST.

CONFIG_IP_NF_TARGET_MIRROR : Можливість відправки отриманого пакета назад (віддзеркалення). Наприклад, якщо призначити дію MIRROR для пакетів, що надходять у порт HTTP через ланцюжок INPUT (тобто вхідні з’єднання до WEB-серверу прим. пер.), то пакет повернеться назад (віддзеркалиться), і відправник побачить свою власне домашню сторінку. (Тут одні суцільні "якщо": Якщо в відправника стоїть WEB-сервер, якщо він слухає на тому самому порті, якщо в відправника є домашня сторінка, тощо. Адже суть власне зводиться до того, що з погляду відправника все так, начебто пакет надіслано до його власної машини. Простіше кажучи, дія MIRROR змінює місцями адресу відправника і одержувача і повертає змінений пекет до мережі прим. пер.)

CONFIG_IP_NF_NAT : Різні типи трансляції мережевих адрес. З допомогою цієї опції ви зможете організувати вихід до Інтернету для всіх комп'ютерів вашої локальної мережі, маючи лише одну унікальну адресу IP. Ця опція необхідна для роботи прикладу rc.firewall.txt.

CONFIG_IP_NF_TARGET_MASQUERADE : Маскарадинг. На відміну від NAT, маскарадинг використовують у тому випадку, коли наша адреса IP не відома заздалегідь, тобто для випадків DHCP, PPP, SLIP чи якогось іншого способу підключення з динамічним отриманням адреси IP. Маскарадинг має трошки вище навантаження на комп'ютер у порівнянні з NAT, але він працює у ситуаціях, коли неможливо заздалегідь вказати власну зовнішню адресу IP.

CONFIG_IP_NF_TARGET_REDIRECT : Переспрямування. Зазвичай, цю дію використовують для проксі. Ця дія зупиняє пакет та спрямовує його у інший порт, на якому знаходиться проксі-сервер. Таким чином можна влаштувати прозорий проксі.

CONFIG_IP_NF_TARGET_LOG : Додає дію LOG в iptables. Ми можемо використати цей модуль для фіксації окремих пакетів в системному журналі (syslog). Ця можливість може дуже корисною при налагодженні ваших сценаріїв.

CONFIG_IP_NF_TARGET_TCPMSS : Цей параметр можна використовувати для подолання проблем з деякими провайдерами Інтернету, які блокують пакети ICMP Fragmentation Needed. З-за такого блокування перегляд веб-сторінок може працювати, як і ssh, а от scp може обриватися після встановлення з’єднання. Дія TCPMSS обмежує значення MSS (Maximum Segment Size) (зазвичай MSS обмежується розміром MTU вихідного інтерфейсу мінус 40 байт прим. пер.). Отож таким чином можна обійти цю "злочинну безглуздість провайдерів чи серверів" (як кажуть автори netfilter).

Встановлення утиліт netfilter/iptables

Передусім подивимося як зібрати пакет iptables. Збриранняння пакета значною мірою залежить від конфігурації ядра.

В Gentoo встановлюємо командою:

# emerge net-firewall/iptables

Коли використовуєте Patch-o-matic-ng, то:

# export USE=extensions emerge net-firewall/iptables

В Debian для встановлення потрібно виконати:

# apt-get install iptables

Загалом, пакет iptables можна звантажити з домашньої сторінки проекту Netfilter.

Спочатку пакет з вихідними текстами iptables потрібно розпакувати. Ми розглядатимемо пакет iptables 1.2.6a. Розпакуєм звісно ж, командою:

bzip2 -cd iptables-1.2.6a.tar.bz2 | tar -xvf 

Також розпакування можна виконати командою

tar -xjvf iptables-1.2.6a.tar.bz2

Якщо розпакування відбулося вдало, то пакет буде розміщений в каталозі iptables-1.2.6a. За додатковою інформацією ви можете звернутися до файлу iptables-1.2.6a/INSTALL, який містить докладну інформацію по збірці та встановленню пакета.

Якщо вас зацікавили додаткові розширення L7, то:

emerge l7-files

Ініціалізаційні скрипти netfilter/iptables

Старт:

/etc/init.d/iptables start
/etc/init.d/ip6tables start

Зупинка:

/etc/init.d/iptables stop
/etc/init.d/ip6tables stop

Запис правил:

/etc/init.d/iptables save
/etc/init.d/ip6tables save

Для автоматичного завантаження netfilter/iptables при старті комп'ютера в Gentoo виконуємо:

rc-update -a iptables default

Якщо користуємось IPv6 виконуємо:

rc-update -a ip6tables default

Існують також дві утилітки, одна для відновлення правил ?iptables-restore(8), інша для збереження правил, щоб їх відновити після перевантаження ?iptables-save(8).

Отже, ми запускаємо iptables при старті системи, але в нас ще немає жодного правила. Щоб встановлити нові правила можна піти двома шляхами, перший: підправити файл /etc/rc.d/init.d/iptables, але цей спосіб має одну негативнy властивість — при перевстановленні iptables усі ваші правила буде втрачено, другий: ввести правила і зберегти їх командою:

/etc/init.d/iptables save

Збережені в такий спосіб правила будуть автоматично відновлюватися при кожному завантаженні системи до рівня default.

Якщо ви обрали перший варіант додавання правил iptables, то вам необхідно вписати їх у секцію start сценарію /etc/rc.d/init.d/iptables чи у функцію start(). Для виконання дій під час зупинки системи — внесіть відповідні правила до секції stop чи функції stop(). Хочеться вкотре нагадати, у разі перевстановлення iptables чи при автоматичному поновленні системи, ви можете втратити зміни, внесені до файлів /etc/init.d/iptables, або /etc/init.d/ip6tables.

Другий спосіб початкового завантаження правил кращий і надійніший. Він передбачає такі кроки. Спочатку — запишіть правила в файл і запустіть його, чи додайте їх командою iptables, що для вас зручніше. Потім виконайте команду:

/etc/init.d/iptables save

Таким чином весь набір правил буде збережено в файлі /etc/sysconfig/iptables, який автоматично підвантажується при запуску сервісу iptables. Згодом, після перезавантаження комп'ютера, сценарій iptables з /etc/init.d/ виконуватиме завантаження набору правил з файла /etc/sysconfig/iptables.

І, насамкінець, на завершення установки, варто було б видалити старі версії ipchains і iptables. Це необхідно зробити, щоб система не "переплутала" старий пакет iptables із нововстановленим. Вилучати старий пакет iptables необхідно в тому разі, коли ви вибрали установку із вихідних текстів за іншим від звичного шляхом, бо звичайно менеджер пакетів робить видалення застарілих версій автоматично.