1. Насамперед очистимо існуючу таблицю правил:
-A INPUT -p tcp -i eth0 --dport 22 -j ACCEPT
Але дозволяючи доступ на SSH на самому початку, ми потім не зможемо накласти на SSH правила щодо його захисту від перебору паролів (Bruteforce). Чому? тому, що правила в iptables застосовуються послідовно! І всі інші обмеження які б ми наклали на 22 порт нижче поточного правила, вже не мали б своєї сили.
Отже, спочатку захист самого SSH потім його доступ, потім інша конфігурація.
2.1 Для качественой захисту від брутфорса, будемо використовувати додатковий модуль який можна встановити і конфігурувати так:
# Aptitude install module-assistant xtables-addons-source
# Module-assistant prepare
# Module-assistant auto-install xtables-addons-source
# Depmod -a
2.2 Після успішної установки доп. модулів, вводимо правила для захисту SSH:
# Iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --update --seconds 20 -j TARPIT
# Iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --set -j ACCEPT
# Iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit 1 / hour --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name SSH - -hashlimit-htable-expire 60000 -j ACCEPT
# Iptables -A INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN, RST, ACK SYN -j DROP
2.3 Тепер після захисту, можна відкрити SSH:
# Iptables -A INPUT -p tcp -i eth0 --dport 22 -j ACCEPT
3. Коли все готово для того щоб ми не втратили доступ, прописуємо політики за замовчуванням:
# Iptables -P INPUT DROP
# Iptables -P FORWARD ACCEPT
# Iptables -P OUTPUT ACCEPT
Отже, ланцюжком DROP, ми ріжемо все Вхідні з'єднання, іншими словами політику ми будемо налаштовувати за принципом - заборонено все, крім явно дозволеного.
Політики FORWARD і OUTPUT я залишаю відкритими, так як на мій погляд вони менш небезпечні в плані безпеки. хоча ніхто не заважає порізати і їх. Так, і не забудьте, якщо ви хочете все політики поставити в ланцюжки DROP, то додайте до правила яке дозволяє входить доступ по ssh, правило дозволяють вихідний трафік по 22 порту, інакше ви втратите віддаленої доступ. (Iptables -A OUTPUT -p tcp -i eth0 -dport 22 -j ACCEPT)
4. Тепер приступаємо до прописування основних правил для нашого веб-сервери.
- Дозволяємо ходіння трафіку по localhost:
# Iptables -A INPUT -i lo -j ACCEPT
- Робимо захист від Dos атак:
Захист від SYN-flood:
# Iptables -A INPUT -p tcp --syn -m limit --limit 1 / s -j ACCEPT
# Iptables -A INPUT -p tcp --syn -j DROP
Захист від сканерів портів:
# Iptables -A INPUT -p tcp --tcp-flags SYN, ACK, FIN, RST RST -m limit --limit 1 / s -j ACCEPT
# Iptables -A INPUT -p tcp --tcp-flags SYN, ACK, FIN, RST RST -j DROP
Захист від Ping of death:
# Iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1 / s -j ACCEPT
# Iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
- Дозволяємо трафік для необхідних служб
# Iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
# Iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
# Iptables -A INPUT -i eth0 -p udp --sport 53 -j ACCEPT
# Iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
# Iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
# Iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 3 -j ACCEPT
# Iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 11 -j ACCEPT
# Iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 12 -j ACCEPT
Отже, що я дозволив:
порт 21 - ftp
порт 80 - http
порт 443 - https
порт 25 - smtp
порт 53 - dns
І плюс необхідні типи icmp пакетів. Так само не забуваємо. що відкритий ssh порт 22.
5. Налаштовуємо стандартні вихідні і вхідні потоки
# Iptables -A INPUT -m state --state RELATED, ESTABLISHED -j ACCEPT
# Iptables -A OUTPUT -m state --state RELATED, ESTABLISHED -j ACCEPT
6. Зберігаємо наші нові правила і прописуємо їх в конфігураційний файлик, щоб вони не потерли після перезавантаження системи.
# Iptables-save
# Iptables-save> /etc/iptables.conf
Подивитися поточну таблицю фільтрації можна так:
7. Автоматичний запис і відновлення правил
додаємо в кінець файлу interfaces наступні рядки:
pre-up iptables-restore post-down iptables-save> /etc/iptables.conf
Тепер при відключенні машини правила самі будуть зберігатися, а при включенні - відновлюватися.
* Видалення певних правил.
За допомогою наступної команди дивимося номер правила, яке нам тут необхідно видалити:
# Iptables -L INPUT --line-number
Запам'ятаємо номер і видалимо правило під номером 2
# Iptables -D INPUT 2