Firewall, маршрутизатор та NAT

Захищаємо свій комп'ютер, налаштовуємо маршрутизатор та NAT
Поговоримо про тему, яка, думаю, буде цікава багатьом Linux-користувачам-початківцям.
Що таке netfilter та iptables? Netfilter - міжмережевий екран (брандмауер), вбудований в ядро Linux версій 2.4 та 2.6. Він виконує такі функції:
- Фільтрування трафіку
- NAT
iptables - утиліта для управління цим самим netfilter'ом.
iptables (від IP-таблиці) управляє таблицями та ланцюжками, які містять певні нами правила, під обробку яких потрапить кожен пакет даних. Наприклад, є таблиця NAT, яка містить правила NAT'а. Є таблиця FILTER, яка містить правила фільтрації трафіку.
Весь шлях пакету виглядає так: 1. Пакет даних надходить у ядро (від іншого комп'ютера у мережі, запущеної в нас програми, і т.д.) 2. Відбуваються дії, званіпре-маршрутизацією. Використовується таблиця NAT. 3. Відбувається фільтрація - ряд правил, за якими пакет буде відкинуто, або пропущено далі. Використовується таблиця FILTER. 4. Відбуваються дії, які називаютьпост-маршрутизацією. Використовується таблиця NAT. 5. Пакет передається до пункту призначення.
Пункти 2 і 4, нам цікаві, якщо наша машина є маршрутизатором і ми використовуємо NAT. Пункт 3 – цікавий для фільтрації трафіку. Тепер розкладемо все по поличках.
Основи iptables Як було сказано - iptables управляє набором таблиць (table). У кожній таблиці є набір ланцюжків (chain). Кожен ланцюжок - упорядкований набір правил обробки пакета. У кожній linux-системі існує чотири таблиці:
- FILTER
- NAT
- MANGLE
- RAW
- INPUT - служить для фільтраціївхідноготрафікуна нашумашину. Наприклад у цей ланцюжок потрапляє трафік з Internet, наш поштовий сервер. Саме вона цікава найбільше новачкам.
- OUTPUT - служить для фільтраціївихідноготрафікувід нашоїмашини. У цей ланцюжок потрапить трафік від нашого поштового сервера до Інтернету. Має менше інтересу, використовують її для обмеження користувачів комп'ютера від відвідування певних ресурсів, і т.д.
- FORWARD - служить для фільтраціїпроходитьтрафікучерез нашу машину. Цікавить, якщо наша машина ємаршрутизатором.
- Заборонити доступ з комп'ютера 192.168.0.1 на мій комп'ютер, порти 25, 80 і 110.
- Повністю заборонити доступ з комп'ютера 10.0.0.1 на мій комп'ютер
- Дозволити доступ
А ці правила для ланцюжка FORWARD таблиці FILTER:
- Заборонити прохід будь-якого трафіку з мережі 192.168.2.0/24 на сервер ICQ
- Дозволити прохід будь-якого трафіку з інтернету на комп'ютери з мережі 192.168.2.0/24
- Дозволитипрохід будь-якого трафіку з комп'ютерів 192.168.2.0/24 в інтернет
- Заборонити прохід будь-якого трафіку
Фільтрація трафіку Що нам залишається? Перекласти наші висновки з людської форми, в мову iptables.
iptables -tтаблиця-Aланцюжокправило-jдія
Розберемо. Тут "iptables" – бінарник. "-t" - від table, вказівка таблиці, з якою хочемо працювати. "-A" скорочення від append - додати в такий то ланцюжок, таке правило. "-j" - від jump, виконати таку дію. Якщо вам потрібна таблиця FILTER, її можна не вказувати, оскільки вона мається на увазі за умовчанням.
Наприклад, додамо такі правила:
Подивитися на результати наших зусиль можна наступною командою:
Розберемо й цю команду. "-L" – вивести список правил. "-n" - не робити DNS-резолвінг. "-line-numbers" - вивести поряд з кожним правилом його порядковий номер.
Ви запитаєте - а що якщо пакет дійде до низу ланцюжка, і так не відповість жодному з правил? Все дуже просто – у кожного ланцюжка є дія за умовчанням. ACCEPT, DROP, чи аналогічне. У виведенні списку правил, ви можете його помітити (policy, поруч із назвою ланцюжка).
Керувати правилами в таблиці також дуже просто.
Додати якесь правило на кінець ланцюжка INPUT:
Вставити деяке правило в позицію 3 ланцюжка INPUT:
видалитиправило номер 2 з ланцюжка INPUT:
Очистити весь весь ланцюжок INPUT:
Уважний читач цієї статті та man-а вже здогадався як керувати маршрутизацією трафіку. Все те саме, тільки вже не в ланцюжку INPUT, а в ланцюжку FORWARD. Наприклад, створимо ряд правил:
Все просто, правда? Припустимо, що у мережній карті eth1 ми маємо підключену локальну мережу, а в карті eth0 – інтернет від провайдера. Першим правилом ми забороняємо прохід з нашої мережі (-s 192.168.2.0/24) трафіку на сервер icq (-d login.icq.com) до мережі eth0 (-o eth0, відoutput). Другим і третім правилом ми дозволяємо прохід трафіку з нашої (-s 192.168.2.0/24) мережі в інтернет (-o eth0), і з інтернету в нашу мережу (-d 192.168.2.0/24 -o eth1). Наприкінці ми забороняємо маршрутизацію будь-якого іншого трафіку.
Але, не забувайте, що для функціонування маршрутизації система повинна бути налаштована належним чином, а саме повинна бути включена функція IP-форвардингу:
Суть не змінюється, є правила в ланцюжках, що складаються з улов'я та дії.
Ланцюжок POSTROUTING (пост-маршрутизація), служить для зберігання правил, прохід за якими буде виконуватися після процесу маршрутизації (вибору маршруту, проходу ланцюжком FORWARD). Ланцюжок PREROUTING (пре-маршрутизація) - навпаки, до процесу маршрутизації. Для звичайного NAT'а користувачів нам цікавий ланцюжок POSTROUTING.
Реальний приклад від початку до кінця Є якась організація, яка має linux-сервер, із встановленим на ньому web і поштовим сервером. Інтерфейс eth0 – дивиться в інтернет, eth1 – у локальну мережу. Доступ на POP3 має бути лише з локальної мережі клієнта – 192.168.1.0/24. При цьому, у всіх комп'ютерів, крім вахтового (192.168.1.59), повинен бути доступ в інтернет.
Все, що нам потрібневиконати для отримання цієї мети, можна поєднати в один скрипт:
На останок На останок скажу як зберегти налаштування iptables, щоб вони не загубилися після перезавантаження.
Ну і зовсім насамкінець: