Введение
Продолжаем серию статей, посвященных использованию межсетевого экрана iptables.
Iptables – это стандартный файрвол, поставляемый в большинство дистрибутивов Linux по умолчанию. В предыдущей статье мы рассмотрели основные определения и принцип работы iptables, понимание которых обязательно для практического использования инструмента. В данной статье мы изучим основные команды файрвола и напишем наши первые правила.
Замечание:
Для создания правил iptables нам потребуется возможность выполнения команд с повышением привилегий до суперпользователя root. Поэтому для настройки межсетевого экрана нужно зайти в систему под учетной записью root (что не является лучшей практикой с точки зрения безопасности), либо использовать команду sudo перед каждой командой настройки iptables для повышения привилегий пользователя. Мы будем применять второй вариант.
Основные команды iptables
Вывод текущих правил в табличном виде выполняется при помощи вызова команды iptables с ключом -L:
Вывод:
Output:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
В выводе представлены 3 стандартных цепочки (INPUT, OUTPUT, FORWARD) и действие по умолчанию (default policy) для каждой цепочки – ACCEPT. Как видим, у нас пока нет боевых правил. По умолчанию iptables идет без предустановленных правил и пропускает весь трафик.
Вывод текущих настроенных правил в виде строк выполняется при помощи вызова команды iptables с ключом -S:
sudo iptables -S
Более подробно
Вывод:
Output:
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
Ключ -P указывает на действие, применяемое к пакету по умолчанию.
Построчный вывод полезен тем, что каждая строка вывода — это полноценная команда в iptables (например, мы можем получить такой вывод уже на настроенном сервере и использовать его для настройки другого сервера, сделав небольшие правки).
Для очистки всех правил используется ключ -F:
sudo iptables -F
Тут стоит отметить важность политик по умолчанию, так как они не удалятся после применения этой команды. Поясним подробней. Допустим у нас есть только удаленный доступ к серверу и в политике iptables по умолчанию выставлено действие DROP. В результате чего после очистки всех правил повторное подключение к серверу будет невозможно. Поэтому, если у нас нет физического доступа или консольного подключения к серверу, то перед сбросом всех правил необходимо убедиться, что действие по умолчанию – ACCEPT. Это позволит нам удаленно подключиться к серверу, создать разрешающее удаленную сессию первое правило. После этого для повышения безопасности можно уже выставить политику по умолчанию – DROP.
Чтобы задать действие по умолчанию ACCEPT и выполнить последующую очистку правил вводим:
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F
Создание первого правила iptables
Это будет правило, о котором мы говорили выше. Оно позволит принимать текущее SSH-соединение между нами и сервером. Синтаксис команды, добавляющей это правило, следующий:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED, RELATED -j ACCEPT
На первый взгляд выглядит запутанно. Разберем подробней команду:
-A INPUT
: флаг -A (append) – добавляет правило в конец цепочки INPUT-m conntrack
: этот параметр вызывает модуль conntrack для отслеживания информации о соединениях.–ctstate ESTABLISHED, RELATED
: выделяем все соединения в состоянии ESTABLISHED (выделяется трафик по уже существующим соединениям) и RELATED (трафик по новым соединениям, но связанных с уже открытыми).-j ACCEPT
: действие (target) – то, что будет произведено с пакетом, если он попал под критерий. В нашем случае это ACCEPT.
После применения этого правила можем увидеть изменения в выводе:
sudo iptables -L
Output:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Теперь мы можем менять действия в политике по умолчанию на DROP.
Другие правила iptables
Добавим еще два правила, разрешающие SSH-соединения (по умолчанию на 22 порт) и WEB-подключения на 80 порт.
Приведем синтаксис этих правил:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Разберем новые параметры:
-p tcp
: фильтруем пакеты, использующие протокол TCP–dport
: выделяем TCP-пакеты с портом назначения 22 и 80.
Также есть еще одно правило, которое связано с понятием “петли” (loopback-интерфейса). Используется loopback-интерфейс для взаимодействия служб и приложений в пределах одной локальной системы, без надобности отправления пакетов на сетевой интерфейс.
Правило выглядит так:
sudo iptables -I INPUT 1 -i lo -j ACCEPT
Разберем его:
- Ключ
-I
(insert) указывает вставить правило в цепочку на 1-ое место. Порядковый номер вставки указывается за именем цепочки INPUT (напоминаем, что флаг -A добавляет правило в конец) -i lo
– указываем интерфейс loopback и разрешаем трафик через него.
Мы составили 4 правила, на основании которых iptables будет разрешать трафик на сервер. Но поскольку мы не создали ни одного запрещающего правила, то все соединения с сервером будут по-прежнему разрешены.
Есть два способа реализации блокирования нежелательного трафика:
- Политика запрета по умолчанию.
Достигается написанием правила:
sudo iptables -P INPUT DROP
Тут надо помнить об опасности потери удаленного доступа к серверу. Желательно его применять, когда есть консольный доступ к серверу.
- Добавление запрещающего правила в конец цепочки.
sudo iptables -A INPUT -j DROP
Тут уже нет опасности потери удаленного подключения к серверу, но есть особенность добавления правил. Новые правила необходимо добавлять в цепочку перед запрещающим правилом. Достигается это путем ввода набора из трех правил: удаление запрещающего правила, добавление нового правила, добавление запрещающего правила в конец.
sudo iptables -D INPUT -j DROP
sudo iptables -A INPUT "MY_NEW_RULE"
sudo iptables -A INPUT -j DROP
Также можно вставить новое правило до запрещающего правила, используя порядковый номер. Для этого сперва узнаем нумерацию имеющихся правил:
sudo iptables -L --line-numbers
Потом на основании вывода вставляем правило под нужным порядковым номером:
sudo iptables -I INPUT 4 "MY_NEW_RULE"
Более подробно о том как читать и удалять правила в iptables читайте в этой статье.
Сохранение правил iptables
По умолчанию правила iptables не хранятся в постоянной памяти и сбрасываются после перезагрузки. С одной стороны это может быть удобно, в случае потери SSH-подключения к серверу. С другой — часто важна автоматическая загрузка составленных правил после перезагрузки сервера. Один из способов сохранения правил — использование пакета iptables-persistent.
Он стандартно устанавливается из репозиториев Ubuntu:
sudo apt-get update
sudo apt-get install iptables-persistent
Во время установки iptables-persistent попросит подтверждение о сохранении имеющихся правил. Если в последующем мы изменили или добавили правила, то сохраняем их:
sudo invoke-rc.d iptables-persistent save
Вывод
В этой статье мы познакомились с базовыми командами и написали простейшие правила фильтрации в iptables. Изучив их, вы сможете разрабатывать более сложные цепочки фильтрации трафика и улучшать безопасность вашего сервера. В следующей статье мы рассмотрим как выводить, читать и удалять правила iptables, а также производить сброс счетчика пакетов.
sudo iptables -A INPUT -m conntrack –ctstate ESTABLISHED, RELATED -j ACCEPT
2022-04-13 at 12:09между “ESTABLISHED, RELATED” пробел уберите пожалуйста, а то ругается “iptables v1.8.4 (legacy): Bad ctstate “””
Георгий, спасибо, помогли.
2022-11-26 at 07:19