пятница, 15 апреля 2011 г.

Сетевая фильтрация пакетов на базе iptables



Чтобы настроить сетевой фильтр iptables в Debian выполняем следующие действия:

1. Создаем скрипт netfilter в каталоге /etc/init.d/:
user@server:~$ su
Пароль:
root@server:/home/igorek# nano /etc/init.d/netfilter

Преамбула:
необходимо настроить сетевой фильтр так чтобы по умолчанию были запрещены все соединения, как входящие, так и исходящие, кроме тех, которые имеют флаг ESTABLISHED. Это относится как к udp так и tcp пакетам.

В дальнейшем мы будем разрешать соединения, NEW через соответствующие правила. Естественно мы разрешаем прохождение сетевого трафика по интерфейсу обратной петли, а для ssh настраиваем скрытый порт, который открывается только при получении icmp пакета определенной длинны и времени жизни.

2. Копируем правила в файл:


#!/bin/bash

# Местонахождение iptables
IPT=/sbin/iptables
# Номера непривилегированных портов
UNPRIPORTS="1024:65535"
FTPPORTS="49000:49500"

# Очистка цепочек правил iptables
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -X

# Используем политику запретить все (default deny)
iptables -P INPUT   DROP
iptables -P OUTPUT  DROP
iptables -P FORWARD DROP

# Отбрасывать все пакеты, которые не могут быть идентифицированы и поэтому не могут иметь определенного статуса.
iptables -A INPUT -m state --state INVALID -j DROP

# разрешаем прохождение входящих  tcp/udp-пакетов принадлежащих к уже установленым соединениям
iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -m state --state ESTABLISHED -j ACCEPT

# разрешаем прохождение исходящих tcp/udp-пакетов принадлежащих к уже установленым cоединениям
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p udp -m state --state ESTABLISHED -j ACCEPT

# Разрешаем прохождение любого трафика по интерфейсу обратной петли
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Разрешаем использовать следующие порты:

# 1. УПРАВЛЕНИЕ СЕРВЕРОМ
# SSH на порте 5681.
# iptables -A INPUT -p tcp --dport 5681 -j ACCEPT
# SSH с port knocking и защитой от bruteforce.Размер пакета:
# icmp 113 байт (случайные данные)+8 байт (icmp заголовок)+ 20 байт (ip заголовок)
# ttl для пакета более 88 сек.

# Если пришёл icmp пакет длиной не 141 байт, то добавляем его ip в таблицу BLOCK для блокировки
iptables -A INPUT -p icmp --icmp-type echo-request -m length ! --length 141                    -m recent --name BLOCK --set
# Если пришел icmp пакет длиной 141 байт и временем жизни более 65, то добавляем его ip в таблицу OPEN
iptables -A INPUT -p icmp --icmp-type echo-request -m length   --length 141 -m ttl --ttl-gt 65 -m recent --name OPEN  --set
# Разрешаем доступ к порту SSH (22) для ip из таблицы OPEN в течении 20 секунд после добавления в таблицу
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name OPEN  --rcheck --seconds 30 -j ACCEPT
# Блокируем доступ к порту SSH (22) для ip из таблицы BLOCK в течении 60 секунд после добавления в таблицу
iptables -A INPUT -p tcp --dport 22 -m recent                      --name BLOCK --rcheck --seconds 60 -j DROP

# Webmin на порте 10000
# Разрешаем доступ к порту Webmin (22) для ip из таблицы OPEN в течении 20 секунд после добавления в таблицу
iptables -A INPUT -p tcp --dport 10000 -m state --state NEW -m recent --name OPEN  --rcheck --seconds 1000 -j ACCEPT
# Блокируем доступ к порту Webmin (22) для ip из таблицы BLOCK в течении 60 секунд после добавления в таблицу
iptables -A INPUT -p tcp --dport 10000 -m recent                      --name BLOCK --rcheck --seconds 60 -j DROP

# 2. СЛУЖЕБНЫЕ
# DNS
iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT # маленькие запросы
iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT # большие запросы
# Traceroute
iptables -A OUTPUT -p udp --dport 33200:33800 -m state --state NEW -j ACCEPT
# SSH
iptables -A OUTPUT -p tcp -m tcp --dport ssh --sport $UNPRIPORTS -j ACCEPT
# FTP в активном режиме
iptables -A OUTPUT -p tcp -m tcp --sport $UNPRIPORTS --dport ftp -j ACCEPT
iptables -A INPUT  -p tcp -m tcp --sport ftp-data --dport $UNPRIPORTS -j ACCEPT #! --syn

# HTTP
iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
# HTTPS
iptables -A OUTPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
# Почта 25, 143, 587 порт
iptables -A OUTPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state NEW -m tcp --dport 113 -j ACCEPT
iptables -A OUTPUT -p tcp -m state --state NEW -m tcp --sport 143 -j ACCEPT
# iptables -A OUTPUT-p tcp -m state --state NEW -m tcp --sport 587 -j ACCEPT


# 3. ЗАДАЧИ СЕРВЕРА
# FTP сервер активный режим
iptables -A INPUT -p tcp -m state --state NEW -m tcp --sport $UNPRIPORTS --dport ftp -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --sport ftp-data --dport $UNPRIPORTS -j ACCEPT
# FTP сервер пассивный режим
iptables -A INPUT -p tcp -m state --state NEW,RELATED -m tcp --dport $FTPPORTS -j ACCEPT

# Почта 25, 110, 143, 465, 587, 993, 995 порт
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 465 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT
# HTTP 80 порт
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
# HTTPS 443 порт
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 4949 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 465 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 2000 -j ACCEPT
# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 10000 -j ACCEPT

# 4. ДРУГОЕ
# Разрешаем использовать ICMP пакеты (ping...)
iptables -A INPUT  -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT

# Записываем отброшенные пакеты в файл /var/log/ulog/syslogemu.log
#iptables -A OUTPUT -j ULOG
#iptables -A INPUT -j ULOG


Сохраняем!

Так как пока сервер не выполняет каких либо зада, а настраивается особенных правил для входящих соединений не применяется. Статья будет обновляться по мере необходимости.

3. Добавляем файлу права на исполнение:
root@mail:/home/igorek# chmod +x /etc/init.d/netfilter

4. Устанавливаем пакет sysv-rc-conf
root@mail:/home/igorek# aptitude install sysv-rc-conf

5. Редактируем загрузку служб в sysv-rc-conf. Устанавливаем крестик между netfilter и "S". После этого наш сетевой фильтр будет загружаться с системой.

6. Перезагружаемая на всякий случай и проверяем командой iptables -L:
root@mail:/home/igorek# iptables -L

За идею спасибо http://www.blogger.com/profile/16253756937078146873

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

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