Найти тему
Alexey Knyazev

Настройка iptables в Ubuntu/Debian.

Добрый день!)

При поиске небольшой инструкции по настройке firewall в Ubuntu/Debian подобных системах прошерстил кучу мануалов и сделать для себя вытяжку из прочитанного (для освежения памяти). Итак приступим)

Функции firewall в системе выполняет фильтрация пакетов по заданным правилам средствами iptables. Правила задаются в аргументах команды iptables. Для установки собственных правил firewall будем использовать исполняемый файл /etc/iptables.sh.

Создадим собственные правила.

1. Очистим существующую таблицу правил.

iptables -F

iptables -X

2. Выделим основные FORWRD (проходящие), INPUT(входящие), OUTPUT(исходящие) правила для пакетов и политик для них:

iptables -P FORWARD ACCEPT

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

- для правила FORWARD – политика ACCEPT – принимать все;

- для правила INPUT – политика DROP – не принимать все;

- для правила OUTPUT – политика ACCEPT – принимать все;

3. Для снижения нагрузки добавим дополнительные правила для пакетов tcp_p,upd_p, icmp_p (для перенаправления протоколов TCP, UDP, ICMP в свои цепочки соответственно), allowed, bad_tcp:

iptables -N tcp_p

iptables -N udp_p

iptables -N icmp_p

iptables -N allowed

iptables -N bad_tcp

4. Создадим правила для созданных цепочек:

-Для bad_tcp, будут фильтроваться(сбрасываться) и записываться в лог пакеты SYN/ACK со статусом NEW и сброшенным битом SYN :

iptables -A bad_tcp -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset

iptables -A bad_tcp -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"

iptables -A bad_tcp -p tcp ! --syn -m state --state NEW -j DROP

- Для allowed. Первая строка пропускает все пакеты SYN. Вторая пропускает все пакеты со статусом ESTABLISHED, RELATED. Последняя строка сбрасывает все остальные TCP пакеты (не существующие пакеты, со сброшенным SYN).

iptables -A allowed -p tcp --syn -j ACCEPT

iptables -A allowed -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A allowed -p tcp -j DROP

-Для tcp_p. Обрабатываются TCP пакеты и дополнительно перенаправляются в цепочку allowed. После параметра --dport указываем разрешенный порт:

iptables -A tcp_p -p TCP -s 0/0 --dport 21 -j allowed

iptables -A tcp_p -p TCP -s 0/0 --dport 22 -j allowed

iptables -A tcp_p -p TCP -s 0/0 --dport 80 -j allowed

iptables -A tcp_p -p TCP -s 0/0 --dport 113 -j allowed

iptables -A tcp_p -p TCP -s 0/0 --dport 631 -j allowed

- для udp_p.

iptables -A udp_p -p UDP -s 0/0 --source-port 2074 -j ACCEPT

iptables -A udp_p -p UDP -s 0/0 --source-port 4000 -j ACCEPT

- для icmp_p. Разрешаем ECHO.

iptables -A icmp_p -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT

iptables -A icmp_p -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT

- правила цепочки INPUT для интерфейсов сетевых карт.

- фильтруем «плохие» пакеты

iptables -A INPUT -p tcp -j bad_tcp_p

- для локальной петли lo – разрешаем входящие пакеты с любых адресов (0/0), настраиваем логирование.

iptables -A INPUT -p tcp -j bad_tcp

iptables -A INPUT -p ALL -i lo -s 0/0 -j ACCEPT

iptables -A INPUT -p ALL -d 0/0 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -p TCP -j tcp_p

iptables -A INPUT -p UDP -j udp_p

iptables -A INPUT -p ICMP -j icmp_p

iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level 7 --log-prefix "IPT INPUT packet died: "

- правила цепочки OUPUT для интерфейсов сетевых карт.

- фильтруем «плохие» пакеты

iptables -A OUTPUT -p tcp -j bad_tcp_p

iptables -A OUTPUT -p ALL -s 0/0 -j ACCEPT

iptables -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level 7 --log-prefix "IPT OUTPUT packet died: "

- правила цепочки FORWRD для интерфейсов сетевых карт.

- фильтруем «плохие» пакеты

iptables -A FORWARD -p tcp -j bad_tcp

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

Итоговый скрипт сохраним в /etc/iptables.sh

iptables -F

iptables -X

iptables -P FORWARD ACCEPT

iptables -P INPUT DROP

iptables -P OUTPUT ACCEPT

iptables -N tcp_p

iptables -N udp_p

iptables -N icmp_p

iptables -N allowed

iptables -N bad_tcp

#bad_tcp

iptables -A bad_tcp -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset

iptables -A bad_tcp -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"

iptables -A bad_tcp -p tcp ! --syn -m state --state NEW -j DROP

#allowed

iptables -A allowed -p tcp --syn -j ACCEPT

iptables -A allowed -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A allowed -p tcp -j DROP

#tcp_p

iptables -A tcp_p -p TCP -s 0/0 --dport 21 -j allowed

iptables -A tcp_p -p TCP -s 0/0 --dport 22 -j allowed

iptables -A tcp_p -p TCP -s 0/0 --dport 80 -j allowed

iptables -A tcp_p -p TCP -s 0/0 --dport 113 -j allowed

iptables -A tcp_p -p TCP -s 0/0 --dport 631 -j allowed

#udp_p

iptables -A udp_p -p UDP -s 0/0 --source-port 2074 -j allowed

iptables -A udp_p -p UDP -s 0/0 --source-port 4000 -j ACCEPT

#icmp_p

iptables -A icmp_p -p ICMP -s 0/0 --icmp-type 8 -j DROP

iptables -A icmp_p -p ICMP -s 0/0 --icmp-type 11 -j DROP

#INPUT

iptables -A INPUT -p tcp -j bad_tcp

iptables -A INPUT -p ALL -i lo -s 0/0 -j ACCEPT

iptables -A INPUT -p ALL -d 0/0 -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -p TCP -j tcp_p

iptables -A INPUT -p UDP -j udp_p

iptables -A INPUT -p ICMP -j icmp_p

iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level 7 --log-prefix "IPT INPUT packet died: "

#OUTPUT

iptables -A OUTPUT -p tcp -j bad_tcp

iptables -A OUTPUT -p ALL -s 0/0 -j ACCEPT

iptables -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level 7 --log-prefix "IPT OUTPUT packet died: "

#FORWARD

iptables -A FORWARD -p tcp -j bad_tcp

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

Настроить автоматическую загрузку/выгрузку правил iptables

- создать файл /etc/network/if-post-down.d/iptablessave для сохранения таблицы со следующим содержимым:

#!/bin/sh

iptables-save > /etc/iptables.rules

if [ -f /etc/iptables.downrules ]; then

iptables-restore < /etc/iptables.downrules

fi

exit 0

- создать файл /etc/network/if-pre-up.d/iptablesload для загрузки таблицы:

#!/bin/sh

iptables-drestore < /etc/iptables.rules

exit 0

- сделать файлы исполняемыми

chmod +x /etc/network/if-post-down.d/iptablessave

chmod +x /etc/network/if-pre-up.d/iptablesload

chmod +x ./iptables.sh

- Выполнить скрипты

/etc/iptables.sh

/etc/network/if-post-down.d/iptablessave

- Перезагрузить ПК.