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
Комментариев нет:
Отправить комментарий