Настройка iptables 2

После долгих мучений подобрал оптимальные для себя настройки iptables для вебсервера под ubuntu(httpd+mail+dns+ftp+ssh). Конечно, такая защита спасет только от примитивного ddos’а и сканирования, но все-таки лучше чем ничего. Разрешаем трафик только на определенные порты, ограничиваем количество запросов в секунду, ставим защиту от сканирования портов и флуда. Все остальные пакеты будут дропаться.

Настройка iptables

Сами настройки iptables с комментариями под катом.

#!/bin/sh
MODPROBE=/sbin/modprobe

# Очищаем правила
iptables -F
iptables -X

# Разрешаем SSH
iptables -A INPUT -i eth0 -p tcp --dport 1443 -j ACCEPT

# Назначение глобальных политик
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD

# Загружаем модули, погнали:
# Модуль для отслеживания состояния соединений
$MODPROBE nf_conntrack
# Модуль для отслеживания по ipv4, ipv6 пока не используем
$MODPROBE nf_conntrack_ipv4

# Изменение параметров SYSCTL
# Увеличение размера очередей
echo 32000000 > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
# Время ожидания до закрытия соединения
echo 14400 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
# Время ожидания до посылки FIN пакета
echo 60 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_fin_wait
# Время ожидания до посылки FIN пакета
echo 10 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_sent
# Для защиты от syn флуда
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Увеличиваем размер backlog очереди
echo 1280 > /proc/sys/net/ipv4/tcp_max_syn_backlog
# Число начальных SYN и SYNACK пересылок для TCP соединения
echo 4 > /proc/sys/net/ipv4/tcp_synack_retries
echo 4 > /proc/sys/net/ipv4/tcp_syn_retries
#Сколько секунд ожидать приема FIN до полного закрытия сокета
echo 10 > /proc/sys/net/ipv4/tcp_fin_timeout
# Как часто посылать сообщение о поддержании keep alive соединения
echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
# Сколько пакетов проверки keepalive посылать, прежде чем соединение будет закрыто.
echo 2 > /proc/sys/net/ipv4/tcp_keepalive_probes
# Зaпрещаем TCP window scaling
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
# Запрещаем selective acknowledgements, RFC2018
echo 0 > /proc/sys/net/ipv4/tcp_sack
# Запрещаем TCP timestamps, RFC1323
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
# Уличиваем размер буфера для приема и отправки данных через сокеты.
echo 1048576 > /proc/sys/net/core/rmem_max
echo 1048576 > /proc/sys/net/core/rmem_default
echo 1048576 > /proc/sys/net/core/wmem_max
echo 1048576 > /proc/sys/net/core/wmem_default
# Через какое время убивать соединеие закрытое на нашей стороне
echo 1 > /proc/sys/net/ipv4/tcp_orphan_retries

# Защита от скана #
# Silently Drop Stealth Scans
# All of the bits are cleared
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# SYN and FIN are both set
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# SYN and RST are both set
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# FIN and RST are both set
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
# FIN is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
# PSH is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
# URG is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP

# Уже установленные соединения и соединения, порожденные установленными принимаем
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Блокируем людей, которые постучались на левые порты
iptables -N scan
iptables -A scan -m recent --rcheck --name badscan --seconds 86400 -j DROP
iptables -A scan -m recent --name badscan --remove
iptables -A scan -p tcp -m multiport --dport 139,445 -m recent --name badscan --set -j DROP
iptables -A INPUT -i eth0 -j scan

iptables -A OUTPUT -p icmp --icmp-type timestamp-reply -j DROP

# Разрешаем петлю
iptables -A INPUT -i lo -j ACCEPT

# Открываем порты
# FTP
iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
# SMTP
iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
# DNS
iptables -A INPUT -i eth0 -p udp --sport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 53 -j ACCEPT

iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT

# HTTP и защита от множественных запросов.
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 80 -m limit --limit 100/sec --limit-burst 100  -j ACCEPT
# POP
iptables -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
# IMAP
iptables -A INPUT -i eth0 -p tcp --dport 143 -j ACCEPT
# SSH
iptables -A INPUT -i eth0 -p tcp --dport 1443 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 1443 -j ACCEPT
# Proftpd (порты для пассивного режима)
iptables -A INPUT -i eth0 -p tcp --dport 49152 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 49153 -j ACCEPT

# ICMP
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 6 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 6 -j ACCEPT

2 thoughts on “Настройка iptables

  1. Reply Evgeny Фев 27,2013 1:00 пп

    Хороший набор правил, scan-badscan возьму на заметку.

    Увидел несколько лишних.

    9 iptables -A INPUT -i eth0 -p tcp —dport 1443 -j ACCEPT
    стирается правилом 15 iptables -F INPUT

    99 iptables -A INPUT -i eth0 -p udp —sport 53 -j ACCEPT
    100 iptables -A INPUT -i eth0 -p tcp —sport 53 -j ACCEPT
    Если правильно понимаю, под это правило попадают только DNS-ответы.
    Они должны быть пропущены раньше правилом на строке 79.

    113 iptables -A INPUT -i eth0 -p udp —dport 1443 -j ACCEPT
    Не нужно, т.к. SSH работает по tcp.

    115 iptables -A INPUT -i eth0 -p tcp —dport 49152 -j ACCEPT
    116 iptables -A INPUT -i eth0 -p tcp —dport 49153 -j ACCEPT
    Нужно загрузить модуль nf_conntrack_ftp, тогда будет срабатывать правило на строке 79.

  2. Reply aprogrammer Сен 11,2014 8:33 пп

    Так же можно использовать psad (http://sysadm.pp.ua/linux/xtables-addons.html) или же это — http://sysadm.pp.ua/linux/iptables-antiscan.html

Leave a Reply