Iptables

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук
iptables
Автор(и) Русті Рассел
Розробник(и) Netfilter Core Team
Перший випуск 1998
Стабільний випуск 1.4.14 (26 травня 2011; 1159 днів тому)
Написано на C
Операційна система Linux
Ліцензія GNU General Public License
Сайт www.netfilter.org

Iptables — утиліта командного рядка, стандартний інтерфейс керування роботою міжмережевного екрану (брандмауеру) Netfilter для ядер Linux від версії 2.4. Всупереч поширеній думці, ані iptables, ані netfilter не виконують маршрутизацію пакетів і не керують нею. Netfilter лише фільтрує та модифікує (також для NAT) пакети за правилами, вказаними адміністратором через утиліту iptables. Для використання утиліти iptables потрібні привілеї суперкористувача (root).

Іноді під словом iptables мається на увазі сам міжмережевий екран netfilter.

Терміни[ред.ред. код]

Flow of network packets through Netfilter

DNAT — від анг. Destination Network Address Translation — Зміна Мережевої Адреси Отримувача. DNAT — це зміна адреси призначення у заголовці пакета. Найчастіше використовують у парі з SNAT. Основне застосування — використання єдиної реальної IP-адреси кількома комп'ютерами для виходу до Інтернету та умов надання додаткових мережевих послуг зовнішнім клієнтам.
Потік (Stream) — під цим терміном мається на увазі з'єднання, крізь яке передаються і приймаються пакети. Я використав цей термін для позначення з'єднання, якими передається меншою мірою 2 пакета в обох напрямах. Що стосується TCP це означатиме з'єднання, крізь яке передається SYN пакет і далі приймається SYN/ACK пакет. Але це також може передбачати й передачу SYN пакета і прийом повідомлення ICMP Host unreachable. Інакше кажучи, використовую цей термін у досить широкому діапазоні застосувань.
SNAT — від анг. Source Network Address Translation — Зміна Мережевого Адресу Відправника. SNAT — це й зміна вихідного адресу в заголовку пакета. Основне застосування — використання єдиного реального IP-адресу кількома комп'ютерами для виходу до Інтернету. В теперішній час діапазон реальних IP-адрес, за стандартом IPv4, недостатньо широкий, та їх бракує усім (перехід на IPv6 дозволить позбутись цієї проблеми).
Стан (State) — під цим терміном мається на увазі стан, де знаходиться пакет, відповідно до RFC 793 — Transmission Control Protocol, і ті трактуванням, які є у netfilter/iptables. Хочу звернути вашу увагу на той факт, що визначення станів пакетів, як внутрішніх так зовнішніх станів, що використовуються Netfilter, в повному обсязі відповідають зазначеному вище в RFC 793.
Простір користувача (User space) — під цим терміном маю на увазі усе, що розміщено поза ядром, наприклад: команда iptables -h виконується поза ядром, тоді як команда iptables -A FORWARD -p tcp -j ACCEPT виконується (частково) у просторі ядра, оскільки вона додає нове правило до наявного набору.
Простір ядра (Kernel space) — більшою або меншою мірою є твердженням, зворотним терміну «Простір користувача». Підрозуміває місце виконання — в середені ядра.

Встановлення netfilter/iptables[ред.ред. код]

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

Компіляція ядра Лінукса з підтримкою 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)


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

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

CONFIG_NETFILTER — Ця опція необхідна, якщо ви збираєтеся використовувати комп'ютер як мережного екрана (firewall) чи шлюзу (gateway) до Інтернету. Інакше кажучи, вам вона точно знадобиться, бо навіщо тоді читати це керівництво!
І, звісно потрібно додати драйвери для ваших пристроїв, тобто. для карти Ethernet, PPP і SLIP. Ці опції необхідні забезпечення базових можливостей iptables, щоб одержати додаткових можливостей доведеться включити в ядро деякі додаткові опції. Нижче наводиться список опцій для ядра 2.4.9 та його стисле опис:
CONFIG_IP_NF_CONNTRACK — Трасування з'єднання. Трасування з'єднання, серед іншого, використовується при трансляції мережевих адрес і маскарадинге (NAT і Masquerading). Якщо вже ви збираєтеся будувати CC;ережевий екран (firewall) для локальної мережі, то, вам точно знадобиться ця опція. Приміром, цей модуль необхідний роботи [#RCFIREWALLTXT rc.firewall.txt]. CONFIG_IP_NF_FTP — Трасування FTP з'єднання. Обмін по FTP йде занадто інтенсивно, щоб використовувати звичайні методи трасування. Не додати цей модуль, ви зіштовхнетеся з труднощами під час передачі протоколу FTP через мережевий екран (firewall). CONFIG_IP_NF_IPTABLES — Ця опція необхідна до виконання операцій фільтрації, перетворення мережевих адрес (NAT) і маскарадинга (masquerading). Без неї взагалі щось зможете робити з iptables.
CONFIG_IP_NF_MATCH_LIMIT — Цей модуль необов'язковий, але він використовують у прикладах [#RCFIREWALLTXT rc.firewall.txt]. Він дає можливість обмеження кількості перевірок для деякого правила. Наприклад, -m limit --limit 3/minute вказує, що заданий правило може пропустити трохи більше 3-х пакетів на хвилину. Отже, даний модуль можна використовувати захисту від нападів типу «Відмова у обслуговуванні».
CONFIG_IP_NF_MATCH_MAC — Цей модуль дозволить будувати правила, засновані на MAC-адресації. Як відомо, кожна мережна карта має власний унікальний Ethernet-адрес, в такий спосіб, є можливість блокувати пакети, вступники з певних MAC-адрес (тобто. з певних мережевих карт). Слід, проте, зазначити, що даний модуль немає в [#RCFIREWALLTXT rc.firewall.txt] чи де або ще даному керівництві.
CONFIG_IP_NF_MATCH_MARK — Функція маркування пакетів MARK. Наприклад, під час використання функції 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 пакетами, виходячи з їхньому фінансовому стані (state). Приміром, скажімо, що маємо встановлений TCP з'єднання, з трафіком в обидва кінці, тоді пакет отриманий за таким з'єднанню вважатиметься ESTABLISHED (встановлений з'єднання — прим. ред). Ця можливість широко використовують у прикладі [#RCFIREWALLTXT rc.firewall.txt].
CONFIG_IP_NF_MATCH_UNCLEAN — Цей модуль реалізує можливість додаткової перевірки IP, TCP, UDP і ICMP пакетів щодо наявності у них невідповідностей, «дивного», помилок. Установивши його, приміром, одержимо можливість «відсікати» такого роду пакети. Проте хочеться відзначити, що це модуль поки що залишається на експериментальної стадії і завжди працюватиме однаково, тому ніколи не можна буде бути впевненим, що ми «скинули» цілком правильні пакети.
CONFIG_IP_NF_MATCH_OWNER — Перевірка «власника» з'єднання (socket). Наприклад, ми можемо дозволити лише користувачеві root виходити в Internet. Цей модуль було написано як приклад роботи з iptables. Слід зазначити, що це модуль має статус експериментального і може завжди виконувати своїх функцій. CONFIG_IP_NF_FILTER — Реалізація таблиці filter у якій переважно й здійснюється фільтрація. У цьому таблиці перебувають ланцюжка INPUT, FORWARD і OUTPUT. Цей модуль обов'язковий, коли ви плануєте здійснювати фільтрацію пакетів.
CONFIG_IP_NF_TARGET_REJECT — Добавляется дію REJECT, яке виробляє передачу ICMP-повідомлення про помилку у відповідь вхідний пакет, який відхиляє 42;ься заданим правилом. Запам'ятайте, що TCP з'єднання, на відміну UDP і ICMP, завжди завершуються чи відкидаються пакетом TCP RST.
CONFIG_IP_NF_TARGET_MIRROR — Можливість відправки отриманого пакета назад (відбиток). Наприклад, якщо призначити дію MIRROR для пакетів, що у порт HTTP через нашу ланцюжок INPUT (тобто. на наш WEB-сервер прим. перши.), то пакет пошлють назад (відбито) і цього, відправник побачить своє власне домашню сторінку. (Тут одні суцільні «якщо»: Якщо в відправника стоїть WEB-сервер, коли він дбає про тому самому порту, якщо в відправника є домашня сторінка тощо. . Адже суть власне зводиться до того що, що з погляду відправника все так, начебто пакет надіслав своє власне машину, а простіше, дію MIRROR змінює місцями адресу відправника і одержувача видає змінений пекет до мережі прим. перши.)
CONFIG_IP_NF_NAT — Трансляція мережевих адрес у її видах. З допомогою цієї опції ви зможете дати вихід до Інтернету всім комп'ютерів вашої локальної мережі, маючи лише одне унікальний IP-адрес. Ця опція необхідна до роботи прикладу [#RCFIREWALLTXT 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 — Ця опція можна використовувати задля подолання обмежень, накладених деякими провайдерами (Internet Service Providers), які блокують ICMP Fragmentation Needed пакети. Через війну таких обмежень сервери провайдерів можуть передавати web-сторінки, ssh може працювати, тоді як scp обривається після встановлення з'єднання заліза і ін. Для подолання такого роду обмежень ми можемо використати дію TCPMSS обмежуючи значення MSS (Maximum Segment Size) (зазвичай MSS обмежується розміром MTU вихідного інтерфейсу мінус 40 байт прим. перши.). Отже ми маємо можливість подолати те, що автори netfilter називають «злочинної безмозглостью провайдерів чи серверів» («criminally braindead ISPs or servers») в довідці по конфігурації ядра.

Встановлення утиліт 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, але цей спосіб має одну негативну властивість — при перевстановленні 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 необхідно зробити в тому разі, коли ви вибрали установку із вихідних текстів за іншим від звичного шляхом, бо звичайно менеджер пакетів робить видалення застарілих версій автоматично.