Налаштування фаервола за допомогою iptables на ubuntu
Розміщення серверів в надійних дата-центрах Європи. Відкрийте хмарний VPS / VDS сервер на швидких SSD за 1 хвилину!
Кращий хостинг:
- захистить дані від несанкціонованого доступу в охоронюваному європейському ЦОДі
- прийме оплату хоч в bitcoin.
- дозволить поставити свій дистрибутив
- захист від DDos-атак
- безкоштовний backup
- Uptime 99,9999%
- ЦОД - TIER III
- провайдер - TIER I
Підтримаємо російською мовою 24/7/365 Працюємо з юрособами і фізособами. Вам прямо зараз потрібно 24 ядра і 72 Gb RAM. Будь ласка!
Наші вигідні тарифи доведуть, що дешевий хостинг ви ще не знали!
Хвилинна справа: виберіть конфігурацію, оплатіть і CMS на VPS готова.
Money Back - 30 днів!
Банківськими картами, електронною валютою, через термінали Qiwi, Webmoney, PayPal, Новоплат і ін.
Задайте питання в службу підтримки 24/7/365
Знайдіть відповіді в нашій базі і познайомтеся з рекомендаціями
вступ
Надійний фаєрвол - один з найважливіших аспектів захисту будь-якої сучасної ОС. Більшість дистрибутивів Linux містять кілька різних інструментів фаервола. Даний посібник присвячено одному з найбільш популярних - iptables.
Отже, iptables - це стандартний фаєрвол, включений до більшості дистрибутивів Linux за замовчуванням (для його заміни розробляється nftables). Насправді, iptables - це призначений для користувача інтерфейс для управління системою netfilter, яка, в свою чергу, обробляє вхідні та вихідні стеком Linux. iptables порівнює кожен вступник пакет з набором встановлених правил, а потім вирішує, що з ним робити далі.
Базові команди iptables
Даний розділ містить основні команди, за допомогою яких можна створити складний набір правил і управляти інтерфейсом iptables в цілому.
Запам'ятайте. команди iptables потрібно запускати з root-привілеями. Це означає, що потрібно виконати одну з наступних дій:
- увійти в систему як користувач root;
- використовувати su або sudo -i, щоб розгорнути оболонку root;
- починати все команди з sudo (рекомендований спосіб в Ubuntu).
У цьому посібнику застосовується останній варіант.
sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Як можна бачити, список містить три ланцюжки за замовчуванням (INPUT, OUTPUT і FORWARD), в кожній з яких встановлена політика за замовчуванням (на даний момент це ACCEPT). Також можна бачити назви стовпців. Але в даному списку немає самих правил, оскільки Ubuntu поставляється без набору правил за замовчуванням.
sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
Щоб реплицировать конфігурації, потрібно тільки ввести sudo iptables на початку кожного рядка результату. (В залежності від конфігурацій, ця процедура може виявитися трохи складнішою при віддаленому підключенні; якщо правила, які дозволяють поточне з'єднання, ще не встановлені, не варто встановлювати політику DROP).
Щоб скинути поточні правила (якщо такі є), наберіть:
sudo iptables -F
Знову ж таки, на даному етапі політика за замовчуванням дуже важлива, тому що вона не зміниться за допомогою попередньої команди незважаючи на те, що всі правила будуть видалені з ланцюжків.
Перш ніж скинути правила при віддаленому підключенні необхідно переконатися, що в ланцюжках INPUT і OUTPUT встановлена політика ACCEPT. Це робиться так:
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F
Створивши правила, що дозволяють віддалене підключення, можна встановити політику DROP. Отже, перейдемо безпосередньо до створення правил.
Створення правил iptables
Як вже було сказано вище, цей посібник сконцентровано на роботі з ланцюжком INPUT, оскільки вона відповідає за вхідний трафік. Для початку потрібно розглянути вже згадане правило - правило, яке дозволяє поточний SSH-підключення.
Воно виглядає так:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED, RELATED -j ACCEPT
Звичайно, спочатку воно може здатися неймовірно складним; щоб зрозуміти дане правило, ознайомтеся з його компонентами:
Дане правило потрібно помістити в початок, щоб переконатися, що вже існуючі з'єднання збігаються з правилами, прийняті і виходять з ланцюга, не досягнувши правил DROP.
Запитавши список правил, можна побачити зміни:
sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all - anywhere anywhere ctstate RELATED, ESTABLISHED
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Ознайомившись з базовим синтаксисом, створіть ще кілька правил, які приймають з'єднання.
Ухвалення інших важливих підключень
Раніше iptables отримав команду не скидати всі поточні з'єднання, а також вжити всіх сполуки, що мають до них відношення. Тепер потрібно створити правила, які беруть з'єднання, які не відповідають вищезазначеним критеріям.
Залиште відкритими два порти: порт SSH (в даному керівництві використовується порт за замовчуванням - 22; якщо дане значення було змінено, не забудьте ввести нове значення); крім того, припустимо, що на даному комп'ютері веб-сервер запущений на порту 80 за замовчуванням (не додавайте це правило, якщо це не так).
Отже, рядки, які потрібно використовувати для створення таких правил, виглядають так:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Як бачите, вони дуже схожі на перше правило; можливо, вони мають навіть більш просту структуру. Нові опції:
- -ptcp. дана опція пропускає пакети, що використовують TCP (потоко-орієнтований протокол, який використовується більшістю додатків, оскільки забезпечує надійний зв'язок).
- -dport. дана опція доступна при використанні прапора -p tcp. Вона вказує входить порт, з яким повинен збігтися порт пакета. Перше правило пропускає пакети TCP, спрямовані на порт 22, а друге правило приймає TCP-трафік, що йде на порт 80.
Тепер потрібно створити ще одне правило ACCEPT, щоб переконатися, що сервер працює належним чином. Як правило, сервіси взаємодіють шляхом обміну пакетами; для цього вони використовують мережевий псевдоінтерфейс кільцевої зв'язку - так званий loopback device, який направляє трафік назад на його джерело, а не на інші комп'ютери.
Тобто, якщо сервісу 1 необхідно встановити зв'язок з сервісом 2, прослуховуючих з'єднання на порту 4555, то сервіс 1 відправляє пакет на порт 4555 за допомогою loopback device. Така поведінка потрібно дозволити, оскільки воно є важливою умовою правильної роботи багатьох програм.
Для цього додайте наступне правило:
sudo iptables -I INPUT 1 -i lo -j ACCEPT
Воно трохи відрізняється від попередніх правил; розгляньте його докладніше:
- -IINPUT 1. прапор -I говорить iptables вставити (insert) правило. Даний прапор відрізняється від прапора -А (який просто вносить правило в кінець ланцюжка); він вказує ланцюжок, в яку потрібно внести правило, і розташування правила в ній. В даному випадку, правило потрібно вставити в самий початок ланцюга INPUT, внаслідок чого всі правила пересунутися на одну позицію. Це правило потрібно розмістити на початку ланцюжка, оскільки воно є одним з основних правил і не повинно залежати від інших.
- -ilo. даний компонент правила пропускає пакети, які використовують інтерфейс lo ( «lo» - це інша назва для loopback device). Це означає, що будь-який пакет, який використовує даний інтерфейс, повинен бути прийнятий.
sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED, ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Створення правил DROP
Отже, на даний момент було створено 4 правила, які приймають пакети, грунтуючись на певні критерії. Проте, зараз сервер все одно не блокує ніяких інших пакетів.
Якщо пакет проходить по ланцюжку INPUT і не відповідає жодному з чотирьох правил, буде виконана політика за замовчуванням (ACCEPT), яка так чи інакше прийме даний пакет. Тепер її потрібно змінити.
Це можна зробити двома способами, які мають досить суттєві відмінності.
Перший спосіб - відредагувати політику за замовчуванням ланцюжка INPUT; для цього наберіть:
sudo iptables -P INPUT DROP
Дана політика буде відстежувати і скидати все пакети, які не відповідають жодному з правил ланцюжка INPUT. Одним з наслідків цього типу конструкції є те, що вона буде скидати пакети навіть після скидання самих правил.
Звичайно, це підвищує рівень безпеки сервера; тим не менш, це може спричинити за собою серйозні наслідки, якщо у користувача немає іншого способу підключитися до сервера. Найчастіше хостинг-провайдери надають веб-консоль для підключення до сервера в разі виникнення подібних проблем. Така консоль працює як віртуальне локальне з'єднання, тому iptables не відреагує на неї.
Можна зробити так, щоб сервер автоматично скидав з'єднання, якщо правила видалені. Це зробить сервер більш захищеним і важкодоступним. Також це означає, що можна вносити правила в кінець ланцюжка, і при цьому всі небажані пакети будуть скинуті.
Альтернативний підхід полягає в наступному: в кінець ланцюжка потрібно внести правило, скидає всі невідповідні пакети, при цьому зберігаючи політику ACCEPT.
Щоб повернути ланцюжку INPUT політику ACCEPT, наберіть:
sudo iptables -P INPUT ACCEPT
Тепер можна внести в кінець цього ланцюжка правило, яке буде скидати все невідповідні пакети:
sudo iptables -A INPUT -j DROP
У нормальних робочих умовах результат буде точно такий же, як при використанні політики DROP. Це правило скидає кожен пакет, який досягає його, що запобігає потраплянню на сервер пакетів, які не відповідають встановленим правилам.
В основному, другий підхід застосовується у разі необхідності зберегти політику ACCEPT, яка приймає трафік. Тобто, навіть якщо всі правила скинуті, користувач може отримати доступ до машини в мережі. Цей підхід дозволяє виконати дії за умовчанням без необхідності змінювати політику, яка буде застосовуватися до порожньої ланцюжку.
Звичайно, це також означає, що будь-яке правило, яке необхідно внести в кінець ланцюжка, має перебувати перед правилом скидання. Це можна зробити, або тимчасово видаливши правило скидання:
sudo iptables -D INPUT -j DROP
sudo iptables -A INPUT новое_правіло
sudo iptables -A INPUT -j DROP
або вставивши нове правило в кінець ланцюга (але перед правилом скидання), вказавши номер рядка. Щоб внести правило в рядок 4, наберіть:
sudo iptables -I INPUT 4 новое_правіло
Якщо правил багато, обчислити номер рядка вручну досить проблематично; в такому випадку iptables може пронумерувати рядки:
sudo iptables -L --line-numbers
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all - anywhere anywhere
2 ACCEPT all - anywhere anywhere ctstate RELATED, ESTABLISHED
3 ACCEPT tcp - anywhere anywhere tcp dpt: ssh
4 ACCEPT tcp - anywhere anywhere tcp dpt: http
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
Це дозволяє переконатися, що правило було внесено в потрібний рядок.
Збереження налаштувань iptables
За замовчуванням всі незбережені правила діють до наступного перезавантаження сервера; відразу ж після перезавантаження не збережені правила будуть втрачені.
У деяких випадках це корисно, оскільки дає можливість користувачам, випадково заблокували себе, отримати доступ до сервера. Проте, в більшості випадків все ж зручніше зберегти правила і завантажувати їх при запуску сервера.
Це можна зробити декількома способами; найпростіший з них - використовувати пакет iptables-persistent, який можна завантажити зі сховищ Ubuntu за замовчуванням:
sudo apt-get update
sudo apt-get install iptables-persistent
Під час інсталяції пакет уточнить, чи потрібно зберегти поточні правила для подальшої автоматичної завантаження; якщо поточні правила були протестовані (дозволяють створювати SSH-підключення) і відповідають всім вимогам, їх можна зберегти.
Так само пакет запитає, чи потрібно зберегти існуючі правила IPv6 (вони встановлюються за допомогою утиліти ip6tables, яка контролює надходять пакети IPv6 майже таким же чином).
По завершенні установки з'явиться новий сервіс під назвою iptables-persistent, який буде запускатися при перезавантаженні сервера і відновлювати встановлені правила.
Даний посібник допомагає налаштувати фаєрвол відповідно до вимог користувача. Звичайно, існує ще безліч подібних утиліт, і деякі з них можуть виявитися простіше у використанні; все ж, iptables - один із кращих інструментів, хоча б тому що він демонструє деякі основні структури netfilter і включений в багато системи.