Однією з першочергових завдань після установки системи є коректна настройка iptables для фільтрації трафіку. Політика по-замовчуванню дозволяє все, що не заборонено. Це не найвдаліший метод в плані безпеки, тому що в такому режимі сервер схильний до дії зловмисників.
Можна, наприклад, зайнятися скануванням відкритих на сервері портів. На основі цього можливо визначення використовуваних сервісів, їх версії, назви і версії операційної системи. Далі - підбір вразливостей до них. Або деякі icmp - повідомлення можуть видати зайву інформацію.
Загалом, опис того, навіщо потрібно налаштовувати мережевий екран, гідно окремої статті, яких незліченна безліч. І вже якщо ви читаєте цю статтю, то безумовно знаєте, навіщо вам це потрібно. ;)
Як і всі статті на сайті, ця інструкція написана на основі особистого досвіду, а-ля «я роблю так», хтось інший так.
Зміст статті:
- Установка необходимых компонентов 1 Установка необхідних компонентів
- Редактирование правил для ip версии 4 2 Редагування правил для ip версії 4
Установка необхідних компонентів
І так, в системі вже присутній головний зі списку необхідних інструмент - iptables. Але цього не достатньо. Також знадобляться фільтр tarpit і iptables-persistent, щоб завантажувати правила при старті системи.
# Aptitude install iptables-persistent xtables-addons-dkms
Під час установки persistent буде задано два питання про збереження поточних правил. Можна відповісти «Так» і тоді в папці / etc / iptables / rules / будуть створені потрібні файли з правилами, які ми відредагуємо.
Редагування правил для ip версії 4
Відкриваємо файл /etc/iptables/rules.v4 в улюбленому редакторі. Ви побачите рядки, що встановлюють політику за замовчуванням для ланцюжків. У всіх значеннях вона матиме значення accept. Для ланцюжка FORWARD встановлюємо політику DROP. Ми ж не роутер і не комп'ютер, що перенаправляє трафік кудись ще. :) Решта не міняємо.
* filter : INPUT ACCEPT [0: 0] : FORWARD DROP [0: 0] : OUTPUT ACCEPT [0: 0] COMMIT
Всі інші правила будемо додавати перед рядком COMMIT. І в першу чергу додаємо правило, яке дозволяє локальний трафік.
-A INPUT -i lo -j ACCEPT
Далі правило, яке дозволяє все вже встановлені активні сполуки як для tcp, так і для udp протоколів. Це потрібно для правильної роботи мережі, так як без нього відповіді на вихідні з'єднання будуть відхилятися.
-A INPUT -m state --state RELATED, ESTABLISHED -p all -j ACCEPT
Тепер необхідно додати правило, яке дозволяє установку нових вхідних з'єднань до певних сервісів. У мене це web-сервер і поштовий, а також ssh.
Важливе зауваження! Завжди додавайте дозволяє правило для ssh, щоб потім не втратити доступ до сервера після застосування правил.
Сюди можна додавати і інші порти, розділяючи комою. Розширення multiport дозволяє вказати кілька портів, щоб не плодити майже однакові правила для кожного окремо. ;)
-A INPUT -m state --state NEW -p tcp -m multiport --dport 22,25,80,443 -j ACCEPT
Якщо у вас на сервері тільки один сервіс, для якого потрібно відкрити один порт, то правило буде таким:
-A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT
Також вам може знадобитися відкрити якісь udp порти. Відмінність від вищенаведених правил буде тільки в тому, що замість -p tcp слід вказати -p udp.
А при додаванні наступного правила знадобиться фільтр tarpit, який ми встановили з пакетом xtables-addon-dkms. Якщо коротко, то він створює пастку для вхідних з'єднань, не посилаючи нічого у відповідь, але утримуючи з'єднання, що витрачає ресурси підключився клієнта, але не сервера. Детальніше про tarpit можна дізнатися на сайті OpenNET. А поки додаємо правило для всіх інших вхідних з'єднань.
-A INPUT -p tcp -m tcp -j TARPIT
Важливо мати на увазі, що пастка працює тільки з tcp. Подібним чином можна реалізувати бан по ip на рівні iptables, замість стандартного drop. На жаль, для udp він не придатний. Тому забороняємо всі інші входять udp - пакети, для яких не створили виключення раніше.
-A INPUT -p udp -j DROP
І беремося за icmp. Тут в якості типу icmp можна вказати як код, так і еквівалентну йому назву. У мене - код. :)
Дозволяємо входять луна-відповіді на випадок, якщо пінгуем якийсь інший хост з сервера.
-A INPUT -p icmp --icmp-type 0 -j ACCEPT
Потім входять icmp - повідомлення про недоступність адресата.
-A INPUT -p icmp --icmp-type 3 -j ACCEPT
І що входять луна-запити, якщо хтось пінг наш сервер.
-A INPUT -p icmp --icmp-type 8 -j ACCEPT
А також повідомлення про закінчення часу дії пакета.
-A INPUT -p icmp --icmp-type 11 -j ACCEPT
Це необхідний мінімум повідомлень для коректної роботи мережі. Можливо, вам знадобляться інші коди . Як їх вирішити, ви вже знаєте. :)
Тепер беремося за створення правил для вихідних icmp повідомлень. Ці правила виглядають схожими, але ланцюжком буде вже OUTPUT. Тому описувати їх немає сенсу.
-A OUTPUT -p icmp --icmp-type 0 -j ACCEPT -A OUTPUT -p icmp --icmp-type 3 -j ACCEPT -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT -A OUTPUT -p icmp --icmp-type 11 -j ACCEPT -A OUTPUT -p icmp --icmp-type 12 -j ACCEPT
Крім дванадцятого. Воно дозволяє відправку повідомлення про невірний параметрі (помилка в IP-заголовку або відсутня необхідна опція).
Всі інші вихідні ICMP забороняємо, щоб сервер не бовкнув зайвого.
-A OUTPUT -p icmp -j DROP
На цьому все. Зберігаємо файл /etc/iptables/rules.v4, активуємо правила командою:
cat /etc/iptables/rules.v4 | iptables-restore -c