
Я новичок в iptables и пытаюсь собрать брандмауэр, цель которого — защитить веб-сервер. Ниже приведены правила, которые я составил на данный момент, и я хотел бы услышать, имеют ли правила смысл — и не упустил ли я что-нибудь важное?
Помимо порта 80 мне также необходимо открыть порты 3306 (mysql) и 22 (ssh) для внешних подключений.
Любые отзывы будут высоко оценены!
#!/bin/sh
# Clear all existing rules.
iptables -F
# ACCEPT connections for loopback network connection, 127.0.0.1.
iptables -A INPUT -i lo -j ACCEPT
# ALLOW established traffic
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# DROP packets that are NEW but does not have the SYN but set.
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
# DROP fragmented packets, as there is no way to tell the source and destination ports of such a packet.
iptables -A INPUT -f -j DROP
# DROP packets with all tcp flags set (XMAS packets).
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# DROP packets with no tcp flags set (NULL packets).
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# ALLOW ssh traffic (and prevent against DoS attacks)
iptables -A INPUT -p tcp --dport ssh -m limit --limit 1/s -j ACCEPT
# ALLOW http traffic (and prevent against DoS attacks)
iptables -A INPUT -p tcp --dport http -m limit --limit 5/s -j ACCEPT
# ALLOW mysql traffic (and prevent against DoS attacks)
iptables -A INPUT -p tcp --dport mysql -m limit --limit 25/s -j ACCEPT
# DROP any other traffic.
iptables -A INPUT -j DROP
решение1
Попробуйте shorewall, который обеспечивает разумный брандмауэр из коробки. Разрешите доступ из сети для нужных вам служб. Есть примеры наборов правил для одного, двух и трех интерфейсов. Документация хорошая и активно поддерживается.
Я ожидаю, что вы захотите ограничить адреса, которые могут получить доступ к MySQL, что легко сделать. Вы также можете защитить SSH с помощью port knocking, когда порт закрыт, если вы недавно не зондировали другой порт.
решение2
- Вы действительно хотите разрешить ICMP.
- 5/сек, вероятно, недостаточно для HTTP
- Я не вижу смысла в правилах для пакетов XMAS/NULL
- Также не вижу причин для специального правила НОВЫХ пакетов.
ETA: 5. Наличие такого рода ограничений скорости делает DoS-атаки действительно простыми. Мне просто нужно отправлять 1 SYN-пакет в секунду на ваш сервер, чтобы запретить ВАМ доступ по ssh.
решение3
Я бы подумал об использовании чего-то вроде NARC для настройки правил iptables:
В этом пакете уже реализованы некоторые разумные настройки по умолчанию, которым вы можете доверять.
решение4
Фильтр исходящей связи с сервера в интернет также важен. Особенно рекомендуется разрешить SMTP только для одного сервера.
Я управляю межсетевыми экранами Mikrotik и привык делать, например:
- Отбрасывать входящие пакеты из Интернета с адресом назначения из частного диапазона
- Отменить сканирование портов (более 5 проверок портов в секунду)
- SSH на другой порт (неизвестность, я знаю, но это работает!:-) ) и ограничение исходных IP-адресов
- Отключить трансляции для маршрутизатора
- Отменить TCP RST
И еще несколько. Я бы рекомендовал прочитать это:http://wiki.mikrotik.com/wiki/Дмитрий_на_брандмауэреСинтаксис Mikrotik прост и содержит полезные указания для новичков.