Ubuntu: iptables базовая настройка для защиты web сервера

Есть обычный VDS на Ubuntu с установленными nginx/php-fpm/mysql и т.п. Нам требуется обеспечить минимальную безопасность ограничив сетевые подключения файрволом - закроем все входящие порты кроме перечисленных. Для этого создадим скрипт с командами iptables и настроим его запуск при поднятии сетевого интерфейса.
touch /etc/firewall.sh
chmod u+x /etc/firewall.sh
chmod 644 /etc/firewall.sh
nano /etc/firewall.sh
Правила ниже. Писал для себя, если нужны подробности - пишите в комментарии. Измените название своего сетевого интерфейса в переменной IF_INET:
#!/bin/sh

IF_INET="eth0"
IPT="/sbin/iptables"

# Удаляем все старые правила
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X

# Настраиваем политики по умолчанию (исходящие соединения не ограничиваем, остальные рубим)
$IPT -P OUTPUT ACCEPT
$IPT -P INPUT DROP 
$IPT -P FORWARD DROP

# Тут список разных правил для блокировки пакетов с неверными TCP-флагами
$IPT -N common-check
$IPT -F common-check
$IPT -A common-check -m state --state INVALID -j DROP
$IPT -A common-check -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$IPT -A common-check -p tcp ! --syn -m state --state NEW -j DROP
$IPT -A common-check -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPT -A common-check -p tcp --tcp-flags ALL ALL -j DROP
$IPT -A common-check -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
$IPT -A common-check -p tcp --tcp-flags ALL NONE -j DROP
$IPT -A common-check -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A common-check -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPT -A INPUT -j common-check

# Добавим немного безопасности
# Защита от сканеров портов:
$IPT -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
$IPT -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP
# Защита от Ping of death:
$IPT -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type echo-request -j DROP
# Ограничиваем количество соединений к веб серверу с 1 хоста до 30
$IPT -I INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 30 -j REJECT
$IPT -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j REJECT

# Разрешаем все операции с loopback интерфейса
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A FORWARD -o lo -j ACCEPT

# Поддерживаем уже установленные соединения
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Глобальные настройки
# Ping
$IPT -A INPUT -i $IF_INET -p icmp --icmp-type echo-request -j ACCEPT
# SSH
$IPT -A INPUT -i $IF_INET -p tcp --dport 22 -j ACCEPT
# DNS (в моем случае)
$IPT -A INPUT -i $IF_INET -p udp --dport 53 -j ACCEPT
# Доступ к nginx
$IPT -A INPUT -i $IF_INET -p tcp --dport 80 -j ACCEPT
$IPT -A INPUT -i $IF_INET -p tcp --dport 443 -j ACCEPT
# FTP-доступ к серверу
$IPT -A INPUT -i $IF_INET -p tcp --dport 21 -j ACCEPT
$IPT -A INPUT -i $IF_INET -p tcp --dport 20 -j ACCEPT
$IPT -A INPUT -i $IF_INET -p tcp --dport 49152:59000 -j ACCEPT
Запускаем скрипт. Проверяем:
iptables -L -n -v

Как добавить в автозагрузку!
Если у вас Ubuntu 16 и старше: открываем /etc/network/interfaces и прописываем в секции сетевого интерфейса внизу строчку для автозапуска при загрузке или поднятии интерфейса:
post-up /etc/firewall.sh
Если у вас Ubuntu 18 и позже (в качестве сетевого менеджера netplan): используем Systemd.
nano /lib/systemd/system/firewall.service
[Unit]
Description=Firewall
After=multi-user.target

[Service]
Type=idle
ExecStart=/etc/firewall.sh

[Install]
WantedBy=multi-user.target
Обнвляем конфигурацию, добавляем новый скрипт в автозагрузку и стартуем сервис:
sudo systemctl daemon-reload
sudo systemctl enable firewall.service
sudo systemctl start firewall.service

Комментариев нет:

Отправить комментарий