Iptables — это инструмент межсетевого экрана, который доступен в Linux. Его могут эффективно использовать как опытные пользователи, так и те, кто только начинает осваивать Linux. В данном материале раскрыты основные настройки конфигурации этого мощного файрвола.
Что такое iptables?
Согласно нашему обсуждению, iptables функционирует как утилита межсетевого экрана. Настройка этой утилиты осуществляется в командной строке. С помощью специальных правил iptables можно разрешать или запрещать трафик. При попытке установления соединения с вашей машиной, iptables последовательно проверяет разработанные вами правила, чтобы определить, как с ними поступить. Если подходящих правил нет, применяется действие по умолчанию.
В большинстве случаев iptables предустановлен в Linux-дистрибутивах. Чтобы обновить или установить его в базовую систему, используйте следующую команду:
sudo apt-get
install iptables
Хотя имеются графические инструменты-конкуренты iptables, такие как Firestarter, работа в командной строке не слишком сложна для понимания. Однако особое внимание стоит уделять настройки через удаленное ssh-соединение. Неправильная команда может перекрыть доступ к серверу, и тогда потребуется физически обратиться к машине для исправления.
Типы правил
В iptables существует три ключевых типа правил: input, forward и output.
Input — обрабатывает входящие соединения. Например, при попытке подключения по SSH, iptables сверит IP-адрес с цепочкой правил, чтобы определить, разрешить или отклонить доступ.
Forward — управляет трафиком, который направлен на другие системы. Это актуально для маршрутизаторов, которые передают данные на конечного адресата. Эти правила не понадобятся, если вы не настроили маршрутизацию или NAT.
Output — отвечает за исходящую передачу данных. Например, при отправке ping на сайт 1cloud.ru, iptables проанализирует правила на наличие разрешения для ping, чтобы потом либо разрешить, либо заблокировать соединение.
Изучите данный аспект: Для успешного выполнения ping или использования других протоколов требуется двусторонняя коммуникация. Ошибки в настройке ssh-соединений — частая проблема новичков, забывающих создать правило для обработки ответных пакетов.
Поведение по умолчанию
Перед началом настройки, необходимо определиться с поведением правил по умолчанию. Как iptables должен реагировать на трафик, неопределенный в правиле?
Текущие настройки политики iptables можно увидеть с помощью команды:
iptables
–L
Мы также использовали grep для более четкой фильтрации результата. Как видно на изображении, все цепочки по умолчанию позволяют принимать трафик, что обычно предпочтительнее, если настройки не изменялись. Чтобы вернуть исходные настройки после внесения изменений, используйте:
iptables
--policy INPUT ACCEPT
iptables
--policy OUTPUT ACCEPT
iptables
–-policy FORWARD ACCEPT
Начав с разрешения всего трафика, можно затем блокировать определенные IP-адреса и порты. Однако, иногда бывает полезнее сделать наоборот: изначально заблокировать все и выбрать, что разрешить.
iptables
--policy INPUT DROP
iptables
--policy OUTPUT DROP
iptables
–-policy FORWARD DROP
Действия с соединениями
После определения базового поведения iptables, приступайте к созданию специфических правил для обработки различных соединений. Ниже мы рассмотрим основные действия, которые можно применять к трафику.
- Accept — разрешает соединение;
- Drop — невидимо блокирует запросы, источник запроса не получает информацию о блокировке;
- Reject — отклоняет соединение с уведомлением об ошибке. Полезно, если требуется дать понять, что соединение заблокировано целенаправленно.
Ответ на ping демонстрирует каждое из этих действий следующим образом:
-
Соединение разрешено:
-
Соединение проигнорировано:
-
Соединение отклонено:
Разрешаем и блокируем конкретные соединения
После настройки поведения цепочек по умолчанию, перейдем к созданию правил для определенных соединений. Мы предположим, что по умолчанию они будут отклонены, но можно также настроить разрешение или игнорирование трафика.
Командой iptables -A можно добавлять правила в уже существующие цепочки. Iptables будет проверять правила последовательно с начала списка до тех пор, пока не найдет подходящее. Командой iptables -I [цепочка] [номер] можно добавить новое правило в определенное место списка.
Соединения с одного IP-адреса
Для блокировки всех соединений с IP-адреса 10.10.10.10, используйте следующее правило:
iptables
-A INPUT -s 10.10.10.10 -j DROP
Чтобы заблокировать соединения из IP-диапазона 10.10.10.0/24, также можно использовать записи подсети через слэш или в полном виде:
iptables
-A INPUT -s 10.10.10.0/24 -j DROP
или
iptables
-A INPUT -s 10.10.10.0/255.255.255.0 -j DROP
Соединения на конкретный порт
Чтобы заблокировать SSH-соединения от хоста с адресом 10.10.10.10, воспользуйтесь следующим правилом:
iptables
-A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
Вместо "SSH" можно указывать другие протоколы или номера портов. Флаг -p tcp указывает на использование TCP-протокола. Если соединение использует UDP, то над следует использовать -p udp.
Чтобы заблокировать SSH-соединения от любых IP-адресов, используйте:
iptables
-A INPUT -p tcp --dport ssh -j DROP
Состояния соединений
Как уже упоминалось, многие протоколы требуют двухсторонней связи. К примеру, для разрешения SSH-соединений щначения по SSH, понадобятся правила в input- и output-цепочках. Если вы хотите запретить только исходящие соединения, используйте состояния соединений. Они позволяют учитывать активные сеансы. В примере ниже разрешены входящие SSH-соединения от 10.10.10.10, но запреты к этому адресу также стоят. Однако, система может инициировать SSH-сеанс, если он начат изнутри:
iptables
-A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables
-A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT
Сохранение изменений
Сделанные изменения в правилах будут утрачены после перезапуска iptables, поэтому их необходимо сохранить через специальную команду. В зависимости от вашего Linux-дистрибутива соответствующая команда может отличаться.
В системах на Ubuntu:
=sudo
/sbin/iptables-save
В Red Hat / CentOS:
=/sbin/service
iptables save
Или
=/etc/init.d/iptables
save
Другие команды
Чтобы вывести текущее состояние правил iptables, используйте:
iptables
-L
Параметры -v добавят детализацию по пакетам и байтам, а -n выведет цифровые значения для хост-имён, протоколов и сетей.
Чтобы удалить все текущие правила, используйте:
iptables
-F