Добрый день!)
При поиске небольшой инструкции по настройке 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
- Перезагрузить ПК.