Налаштування iptables

Рекламний блок


Отже, сьогодні ми будемо розбиратися, що ж це за звір такий цей IPTables і як з ним боротись, перемогти й загнуздати? :)

Межсетевой экран (брандмауэр, firewall)

IPTables - утиліта командного рядка, є стандартним інтерфейсом управління роботою міжмережевого екрану (фаєрвола або брандмауера) NETFilter для ядер Linux, починаючи із версії 2.4. Для використання утиліти IPTables потрібні права суперкористувача (root).

Іноді під словом IPTables мається на увазі і сам міжмережевий екран NETFilter. З його допомогою можна досить гнучко управляти правилами маршрутизації (в даному випадку - обробкою пакетів, що надходять до нас або ж виходять від нас).

Наприклад, можна заборонити одного комп'ютера, доступ в Інтернет, іншому вирішити доступ тільки до сайтів, третій "прокинути" (призначити) заздалегідь певний порт, а "підозрілі" пакети відправляти назад відправнику (нехай сам себе ламає). Можна підміняти «на льоту» службову інформацію IP пакетів (відправник, одержувач, TTL , тощо) та багато іншого, чого відразу й не придумаєш.

Що, для початку, слід знати про файрволах, - вони призначені для захисту, тому треба міцно запам'ятати, що останнім правилом (policy) повинно бути «забороняти інше». Друге, але все ж, не менш важливе - обережно редагуйте правила віддалено по SSH або Telnet.

Випадки коли проводилася створення правил на удаленке, а після застосування правил неуважний адмін опинявся "відрізаний" від сервера не поодинокі! І добре, якщо сервер в двох кроках, що якщо він десь у тридев'ятому царстві?


Принцип роботи брандмауера

Коли пакет приходить на наш брандмауер, то він спершу потрапляє на мережеву карту, перехоплюється відповідним драйвером і далі передається в ядро. Далі пакет проходить ряд таблиць, а потім передається або локального додатком, або переправляється на іншу машину.

Порядок проходження пакета наведено в таблиці нижче:

Крок Таблиця Ланцюжок Примітка 1 Кабель (тобто Інтернет) 2 Мережевий інтерфейс (наприклад, eth0) 3 mangle PREROUTING Зазвичай ця ланцюжок використовується для внесення змін у заголовок пакета, наприклад для зміни бітів TOS та ін. 4 nat PREROUTING Ця ланцюжок використовується для трансляції мережевих адрес (Destination Network Address Translation). Source Network Address Translation виконується пізніше, в іншому ланцюжку. Будь-якого роду фільтрація в цьому ланцюжку може проводитися тільки у виняткових випадках 5 Ухвалення рішення щодо подальшої маршрутизації, тобто в цій точці вирішується куди піде пакет - локального додатком або на інший вузол в мережі. 6 mangle FORWARD Далі пакет потрапляє в ланцюжок FORWARD таблиці mangle, яка повинна використовуватися тільки у виняткових випадках, коли необхідно внести деякі зміни в заголовок пакета між двома точками прийняття рішення про маршрутизацію. 7 Filter FORWARD В ланцюжок FORWARD потрапляють тільки ті пакети, які йдуть на інший хост Вся фільтрація транзитного трафіку повинна виконуватися тут. Не забувайте, що через цю ланцюжок проходить трафік в обох напрямках. Обов'язково враховуйте це обставина при написанні правил фільтрації. 8 mangle POSTROUTING Ця ланцюжок призначена для внесення змін у заголовок пакета вже після того як прийнято останнє рішення про маршрутизацію. 9 nat POSTROUTING Ця ланцюжок призначена в першу чергу для Source Network Address Translation. Не використовуйте її для фільтрації без особливої на те необхідності. Тут же виконується і маскарадинг (Masquerading). 10 Вихідний мережевий інтерфейс (наприклад, eth1) 11 Кабель (нехай буде LAN)


Як Ви можете бачити, пакет проходить кілька етапів, перш ніж буде переданий далі. На кожному з етапів пакет може бути зупинений, будь то ланцюжок iptables або що-небудь ще, але нас головним чином цікавить iptables.

Зауважте, що немає яких-небудь ланцюжків, специфічних для окремих інтерфейсів або чого-небудь подібного. Ланцюжок FORWARD проходять ВСІ пакети, які рухаються через наш брандмауер-роутер. Не використовуйте ланцюжок INPUT для фільтрації транзитних пакетів, вони туди просто не потрапляють. Через цю ланцюжок рухаються тільки дані, призначені цьому ж хосту.


Правила iptables

Наведу приклад частини мого конфига роутера: vlan332 - це інтерфейс через який я отримую доступ до Інтернету, vlan333 - доступ в локальну мережу провайдера, а 172.30.2.5 - мій комп'ютер.

#NAT
iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE
iptables -t nat -A POSTROUTING -o vlan333 -j MASQUERADE

#Torrent
iptables -A PREROUTING -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5
iptables -A PREROUTING -t nat -p udp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5

#Open port
iptables -A INPUT -p tcp --dport 53 -j ACCEPT #DNS TCP
iptables -A INPUT -p udp --dport 53 -j ACCEPT #DNS UDP
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #WEB server

#Все інше входить "дропан" (видалити)
iptables -A INPUT -i vlan332 -j DROP

Що все це значить? Перш за все, для зручності читання я поділив конфіг на «секції» коментарями, тобто в одній секції правила для NAT, в іншій - кидок портів (PAT), у третій - дозволяємо порти сервера і т. д.

Розглянемо перше і друге правило (вони відрізняються тільки мережевими інтерфейсами):

iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE

Виходячи з нього, ми додаємо в таблицю (nat-t nat) нове правило для ланцюжка postrouting (-A POSTROUTING), яке буде останнім на момент виконання команди в ланцюжку (тобто - в кінець). Правило буде застосовуватися на вихідному інтерфейсі vlan332 (-o vlan332) і буде передаватися в MASQUERADE (-j MASQUERADE) ті NAT.

Говорячи людською мовою, - все, що буде виходити з інтерфейсу vlan332 має ховатися за NAT'ом. Це означає, що при виході з нашого маршрутизатора адресою відправника буде вказаний наш сервер, а не кінцевий комп'ютер користувача, з якого був надісланий запит. Коли прийде відповідь на запит, буде проведена зворотна процедура і пакет буде переданий початковому відправникові. Для чого це потрібно буде детально розписано в статті про NAT.

Перейдемо до наступної групи правил, а саме секції позначеної як "torrent". У цій секції вказані правила для перекидання портів (PAT - Port Adress Translation), тобто для того, щоб з боку Інтернету можна було підключитися до порту на комп'ютері за нашим роутером. Без цього не зможуть правильно працювати багато додатків, наприклад файлообмінні мережі torrent, DC і деякі додатки, що вимагають вхідних підключень з мережі Інтернет. Розберемо на прикладі перекидання (призначення) портів для Torrent клієнта

iptables -A PREROUTING -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5

Як і в попередньому правилі, ми вказуємо таблицю і ланцюжок (-A PREROUTING -t nat), вказуємо допустимий тип протоколу. У поточному правилі TCP (-p tcp) (в іншому правилі UDP, хоча їх можна вказати і в одному правилі, у мене це, на жаль, не вийшло навіть з офіційною літературою і рішення поки не знайшов).

Порт призначення 9000 (--dport 9000), вхідний інтерфейс vlan332. Дією DNAT (-j DNAT) ми вказуємо, що потрібно підмінити адреса одержувача на 172.30.2.5 (--to 172.30.2.5) тобто - наш комп'ютер. Виходить: всі вхідні з'єднання по протоколу TCP порт 9000 перенаправляти на IP 172.30.2.5.

Далі ми відкриємо кілька портів для доступу до нашого сервера. Ось правило, яке дозволить доступ до портів DNS сервера.

iptables -A INPUT -p tcp --dport 53 -j ACCEPT #DNS TCP

Вказуємо ланцюжок INPUT, протокол TCP порт під номером 53 (використовується для роботи служб DNS) і дія - дозволити. Ви можете помітити, що для DNS запитів використовується UDP і це буде правильно. Для передачі ж інформації про зонах (доменах) використовується TCP і так як мій сервер є первинним для декількох зон, я дозволив доступ через TCP.

Останнім правилом, як я говорив вище, має бути заборона всього іншого, що не потрапило під фільтри. Я написав iptables -A INPUT -i vlan332 -j DROP тобто всі вхідні пакети на інтерфейс vlan332 видаляти.

Так як у цього файрвола немає постійного конфига, то при перезавантаженні правила потрібно вводити вручну. Це не біда, так як є shell скрипти (аналог bat і cmd файлів в Windows) і при виконанні вони будуть запускати команди, у них прописані.

Для цього створимо файлик в каталозі etc за іменем firewall.sh командою nano /etс/firewall.sh тобто відкриємо його відразу в редакторі. Впишемо туди всі необхідні нам правила і збережемо його натиснувши Ctrl X.

Ось деякі правила робочого конфига, які можуть Вам стати в нагоді в повсякденному використанні. Перший рядок (#!/bin/sh) обов'язкове, так як вона вказує ніж потрібно інтерпретувати ці інструкції.

#!/bin/sh
PATH=/usr/sbin:/sbin:/bin:/usr/bin

# Видалити усі існуючі правила всіх таблиць і ланцюжків
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Дозволити будь-трафік
iptables -A INPUT -i lo -j ACCEPT#Петля (loopback)
iptables -A INPUT -i eth0 -j ACCEPT#Внутрішній інтерфейс в локалку
iptables -A INPUT -i eth2 -j ACCEPT#Внутрішній інтерфейс в локалку 2

#NAT
iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE#Включити NAT в бік Інтернету
iptables -t nat -A POSTROUTING -o vlan333 -j MASQUERADE#Включити NAT в бік провайдера (мережа провайдера)

#PORT FORWARDING
#Torrent
iptables -A PREROUTING -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5#Кидок портів на IP
iptables -A PREROUTING -t nat -p udp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5

#VPN з'єднання, дозвіл підключення через PPP і тп.
iptables -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p gre -m state --state RELATED,ESTABLISHED -j ACCEPT

#Відкриваємо порти сервера
iptables -A INPUT -p tcp --dport 23 -j ACCEPT #Дозволити доступ через SSH

#Все інше входить видаляти ("дропан" - відкидати)
iptables -A INPUT -i vlan332 -j DROP

# Включення форвардингу, без цього не буде відбуватися маршрутизація пакетів
echo 1 > /proc/sys/net/ipv4/ip_forward

Після цього робимо файл виконуваним, тобто:
chmod x /etс/firewall.sh (eXecute).

Щоб даний файл відпрацьовував автоматично при завантаженні, пропишемо шлях до нього у файлі «автозавантаження». Відкриваємо nano /etс/rc.local і дописуємо перед exit 0 рядок /etс/firewall.sh Якщо необхідно використовувати VLAN (віртуальні інтерфейси і мережі), то потрібно цю рядок прописати у файлі /etс/network/interfaces у вигляді up sh /etс/firewall.sh до інтерфейсу vlan, наприклад:

# VLAN to INET
auto vlan332
iface vlan332 inet static
address xxx.xxx.xxx.xxx
netmask 255.255.255.252
# gateway xxx.xxx.xxx.xxx
vlan_raw_device eth1
up sh /etс/firewall.sh

Це потрібно тому, що спочатку пройде «автозавантаження», і лише через деякий час піднімуться наші VLAN інтерфейси, а якщо користувача немає, то й правило не створиться.

На жаль, описати повністю роботу цього чудового файрвола у мене немає можливості, але у нього є відмінна документація російською (переклад оригінального керівництва розробника), ось її адреса.

Не складе великої праці, прочитавши навіть частина її або поставивши конкретні завдання, вирішити більшість питань, пов'язаних з цим файрволом і самостійним написанням правил.

Залишити свій відгук або побажання Ви можете в самому низу сторінки, а зв'язатися з автором статті можна за цією адресою:




Рекламний блок