Ознакомившись с базовыми понятиями об использовании iptables можно приступать к настройке защиты вашего web-сервера.
1. Просматриваем уже имеющиеся правила iptables
Изначально они не установлены и имеют режим ACCEPT, убеждаемся в этом командой:
sudo iptables -L -n -v
или
sudo iptables -vnL
В большинстве случаев вывод будет похож на нижеследующий:
Chain INPUT (policy ACCEPT 123K packets, 456M bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 789K packets, 901G bytes)
pkts bytes target prot opt in out source destination
Если что-то не так, то изучаем правила и сохраняем их. После чего удаляем все имеющиеся правила, если они есть.
2. Очищаем имеющиеся правила
iptables -F
3. Защита ssh
3.0 Разрешаем доступ по ssh
Разрешить SSH доступ во избежание его блокировании и потери контроля над сервером. Любимым решением (по мнению авторов большинства подобных статей) для этого была бы команда:
eth0 нужно заменить на имя вашего рабочего интерфейса
iptables -A INPUT -p tcp -i eth0 --dport 22 -j ACCEPT
Но разрешая доступ на SSH в самом начале, мы потом не сможем наложить на SSH правила по его защите от перебора паролей (Bruteforce). Почему? Потому, что правила в iptables применяются последовательно! И все другие ограничения которые бы мы наложили на 22 порт ниже текущего правила, уже не имели бы своей силы.
Итак, сначала защита самого SSH потом его доступ, потом остальная конфигурация.
3.1 Разрешаем доступ по ssh
3. Сохранение, восстановление и автоматическое восстановление правил iptables после перезагрузки на UBUNTU 20.04 LTS / 21.04 LTS / 22.04 в 2023 году
Т.к. каждый раз, после перезагрузки вашего сервера правила iptables будут сбрасываться, то вам нужно настроить их автоматическое сохранение и восстановление при перезагрузке.
3.1 Сохранение правил iptables в файл
Сохранить правила iptables можно в любую доступную папку, но лучше, конечно, использовать для этого системную директорию, например, директорию для конфигурационных файлов /etc/ или под-папку в ней, например, /etc/iptables-config/.
Для сохранения правил межсетевого экрана Netfilter в linux можно использовать пакет iptables-save. Данный пакет записывает текущую конфигурацию в файл с указанным именем. Существуют две версии данного пакета:
- iptables-save для протокола IPv4;
- ip6tables-save для протокола IPv6.
Синтаксис команд одинаковый, поэтому мы рассмотрим вариант ipv4.
iptables-save [-m modprobe] [-c] [-t таблица] [-f имя файла]
Возможные опции:
- -m modprobe: Указывает путь к программе modprobe. По умолчанию iptables-save проверяет /proc/sys/kernel/modprobe для определения пути к исполняемому файлу. modprobe — утилита управления модулями ядра. Существует несколько вариантов данной утилиты. Данный параметр можно проигнорировать;
- -c: включает в поток вывода программы все счетчики количества переданных байтов и пакетов;
- -t таблица: выводит в поток вывода только одну таблицу, которая была явно указана. При отсутствии флага выводит все таблицы настроек firewall;
- -f имя файла: Указывает имя файла записи настроек. Если файл не указан, то вывод происходит в поток вывода на экран STDOUT.
Предварительно необходимо создать директорию /etc/iptables-conf/:
sudo mkdir /etc/iptables-conf/
В самом простом варианте команда будет выглядеть, например, следующим образом:
Вариант сохранения правил №1
sudo iptables-save -f /etc/iptables-conf/iptables_rules.ipv4
Вы можете использовать свою папку, имя файла и расширение.
Вариант сохранения правил №2
Возможно использование другого, более привычного всем синтаксиса команды:
В данном варианте команды iptables-save выводит оформленные правила в поток вывода на экран STDOUT, который мы перенаправляем в указанный нами файл.
sudo iptables-save > /etc/iptables-conf/iptables_rules.ipv4
Результат этих команд будет одинаковым.
3.2 Восстановление ранее сохраненных правил iptables из файла
Для ручного восстановления настроек можно использовать вызов утилиты iptables-restore. Она восстанавливает настройки брандмауэра Netfilter с указанного файла или из потока ввода STDIN, если файл не задан явно. Рассмотрим синтаксис iptables-restore:
iptables-restore [-chntvV] [-w секунды] [-W миллисекунды] [-M modprobe] [-T таблица] [имя файла]
Основные опции:
- -c: восстанавливает значения всех счетчиков пакетов и байтов;
- -n: позволяет не сбрасывать содержимое правил обновляемой таблицы правил iptables. Если не указан — все текущие правила обновляемой таблицы сбрасываются. Получается, что правила из файла дописываются в конец таблиц рабочей конфигурации, если указан этот параметр;
- -t: происходит только сборка и тестирование набора правил из файла, без обновление рабочей таблицы правил iptables;
- -v: выводит дополнительную отладочную информацию в течении восстановления набора правил;
- -V: выводит номер версии программы;
- -w секунды: дождаться монопольной блокировки фильтра пакетов ядра linux xtables. Применяется, чтобы предотвратить одновременное выполнение нескольких экземпляров утилиты. Опция заставляет ждать программу в течении некоторого времени возможности монопольной блокировки xtables;
- -W миллисекунды: интервал ожидания для каждой попытки запуска пакета в монопольном режиме. Часто многие приложения системы критичны к времени запуска и выполнения, поэтому длительное ожидания для монопольной блокировки xtables часто является неприемлемым. Данный параметр в миллисекундах задает максимальное время такого ожидания. По умолчанию равно 1 секунде. Применяется только совместно с ключом -w;
- -M modprobe: Указывает путь к программе modprobe. По умолчанию iptables-restore проверяет /proc/sys/kernel/modprobe для определения пути к исполняемому файлу. modprobe — утилита управления модулями ядра. Существует несколько вариантов данной утилиты. Данный параметр можно проигнорировать;
- -T таблица: Восстанавливает только таблицу правил с указанным именем, даже если поток данных содержит другие таблицы;
- /путь/имя_файла: путь до файла с восстанавливаемыми таблицами правил в файловой системе
Пример использования команды iptables-restore:
sudo iptables-restore -vV /etc/iptables-conf/iptables_rules.ipv4
Или вариант восстановления правил из файла без сброса содержимого текущих таблиц Netfilter:
sudo iptables-restore -nvV /etc/iptables-conf/iptables_rules.ipv4
3.3 Автоматическое восстановление ранее сохраненных правил iptables из файла
Сохраненные правила с помощью утилиты iptables-save можно восстанавливать с помощью скрипта, запускаемого при каждом запуске операционной системы. Для этого необходимо выполнить следующие действия:
Сохранить набор правил межсетевого экрана с помощью команды:
sudo iptables-save > /etc/iptables-conf/iptables_rules.ipv4
Для запуска набора правил при старте операционной системы перед включением сетевого интерфейса мы создаем новый файл с помощью команды:
sudo nano /etc/network/if-pre-up.d/iptables
Заметим — в сети есть много вариантов места размещения скрипта на локальной машине, но я считаю именно размещение в папке if-pre-up.d наиболее верным, так как при этом скрипт будет выполнятся перед включением сетевого интерфейса.
Добавляем в данный файл следующий скрипт:
#!/bin/sh
/sbin/iptables-restore < /etc/iptables-conf/iptables_rules.ipv4
Устанавливаем необходимые права для созданного файла:
sudo chmod +x /etc/network/if-pre-up.d/iptables
Перезагружаем компьютер и проверяем результат для таблицы filter с помощью команды:
sudo iptables -vnL
Для обеспечения безопасности необходимо, чтобы конфигурация iptables применялась до запуска сетевых интерфейсов, сетевых служб и маршрутизации. Если данные условия не будут соблюдены — появляется окно-интервал уязвимости между загрузкой операционной системы и восстановлением правил защиты межсетевого экрана.
Образец базовых правил, которые подходят для большинства серверов на базе UBUNTU 20.04 LTS / 21.04 LTS / 22.04 в 2023 году
Не стоит забывать, что перед использованием нужно осознавать то, что они делают и то, чего они не делают, а вам нужно!
# разрешаем все соединения на петлевом интерфейсе lo
iptables -A INPUT -i lo -j ACCEPT
# разрешаем все установленные и связанные соединения:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#отбрасываем все соединения с значением "INVALID"
iptables -I INPUT -m state --state INVALID -j DROP
#разрешаем входящий ICMP трафик (ping)
iptables -A INPUT -p icmp -j ACCEPT
#разрешаем себе доступ к SSH на порту 22:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#разрешаем себе доступ к FTP на порту 21:
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#открываем HTTP (80) порт tcp.
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#открываем HTTPS (443) порт tcp.
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
### !!! действие по умолчанию !!! ###
#разрешаем OUTPUT любых пакетов сервером
iptables -P OUTPUT ACCEPT
### !!! действие по умолчанию !!! ###
#запрещаем FORWARD любых пакетов сервером
iptables -P FORWARD DROP
### !!! действие по умолчанию !!! ###
#запрещаем INPUT любых пакетов сервером
iptables -P INPUT DROP