Первичная настройка IPTables для веб-сервера — на примере CentOS

Всем доброго времени суток и прочих разностей.

Продолжу, пожалуй, тему серверов, авось кому-то пригодится зачем-то куда-то где-то. Сегодня кратенько хочется поговорить про IPTables, чтобы создать буквально самую простейшую базовую фильтрацию от различного типа атак, да и просто прикрыть порты, чтобы не брутфорсили и всё такое.

firewall

Кому-то сие может пригодится для небольшой настройки своего, допустим, VPS'а (если он у Вас есть), а кому-то просто поможет обезопасить систему от лишней ереси.. И хотя конечно мануал будет краткий и не охватит все аспекты, но в качестве базы подойдет вполне.

Рассказывать буду на примере CentOS, но, в общем-то, оно применимо и для других систем.

Приступим.


Базовая защита с помощью IPTables

IPTables — простой фаервол, установленный на большинстве дистрибутивов Linux. Мануалы Linux'ов гласят, что IPT — это инструмент управления пакетными фильтрами IPv4 и NAT, то есть, это инструмент фильтрации и блокировки интернет-трафика. Короче есть почти везде и используется частенько.

Давайте приступим. Все команды указаны для SSH, но их результирующую можно в общем-то добавлять ручками в сам список iptables непосредственно через редактор. Смотрите как Вам удобнее, по мне проще SSH'шем.

Для начала порой есть смысл выполнить:

iptables -F

Сие сбрасывает правила фаерволла как таковые.

Можно не выполнять, если IPTables уже был кем-то настроен и Вы боитесь потерять сделанные настройки. К слову, при определенных правилах маршрутов может сделать сервер недоступным и придется обращаться к хостеру для отключения IPTables. В общем можно, но с осторожностью.

Базовые правила фильтрации ереси (сначала идет команда, потом мой комментарий, комментарий забивать в консоль не надо):

iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
#блокирует нулевые пакеты

iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
#сброс пакетов XMAS

iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
#защита от syn-flood

Базовая защита SSH (на этом примере можно защищать FTP и другие порты):

-A INPUT -s ВАШ_IP -p tcp -m tcp --dport 22 -j ACCEPT
#разрешает доступ по SSH (при условии, что порт 22-ой) с ВАШ_IP, где ВАШ_IP - это IP-адрес с которого нужен доступ (строку можно повторять нужное число раз, перечисляя разные IP-шники)

-A INPUT -p tcp --dport 22 -j DROP
#запрещает доступ по SSH со всех IP, кроме указанных в строке выше

Разрешаем порты для нужных сервисов (на примере нескольких базовых):

iptables -A INPUT -i lo -j ACCEPT
#разрешает трафик на локальный интерфейс. localhost часто используется для размещения, например, базы данных, к которой подключаются веб-сайт и почтовый сервер, т.е таким образом, сервер имеет доступ к базе данных, но взломать её через интернет сложно.

iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
#разрешает трафик на 80-ый и 443-ий порты, т.е веб-сервер, т.е http и https

Почта (если сервер не выступает как почтовый, то можно не разрешать):

iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
#разрешает smtp-трафик

iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT
#разрешает pop-трафик

iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT
#разрешает imap-трафик

Разрешаем исходящие соединения, в целях, например, использования ping и других внутренних приложений:

iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#если не собираетесь использовать, то можно не указывать, но тогда есть вероятность того, что не будут работать, скажем, обновления из интернета

По аналогии разрешите доступ ко всем нужным портам, в частности, со своего IP-адреса. Порты могут быть любыми, в частности, если на сервере есть панель, то не забудьте разрешить доступ к её порту, а то не попадете туда через веб-морду.

Проделав всё необходимое, собственно, остается лишь:

iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
#закрываем остальные порты наглухо и разрешаем исходящие соединения c сервера

iptables -L -n
#проверяем заданные правила, мало ли что-то забыли

iptables-save | sudo tee /etc/sysconfig/iptables
#сохраняем изменения

service iptables restart
#перезагружаем iptables для принятия изменений

Совсем базово как-то так. Думаю, что при включении банальной логики, у Вас получится настроить необходимый минимум

Послесловие

Такие дела. Пользуйтесь на здоровье.

Если есть вопросы, дополнения и всё такое прочее, то то велком в комментарии.

Sonikelf's Project's логотип Sonikelf's Project's логотип Космодамианская наб., 32-34 Россия, Москва (916) 174-8226
Toscha_sv

Эх, давно я линуксы не крутил:-)

Sonikelf

По осени самое то :)

tvark

По декабрю Андрюха тоже :))

9lifes

класс

Andrew

Спасибо!