Как посмотреть правила iptables
В данном случае для демонстрации возможностей iptables используется операционная система Debian 10.2. Для возможности выполнения команды iptables необходимо, чтобы пользователю были предоставлены привилегии суперпользователя с помощью команды sudo. В связи с этим все команды будут выглядеть как sudo iptables или sudo ip6tables для IPv6.
Примечание: Для того, чтобы пользователю было позволено предоставлять привилегии суперпользователя, этого пользователя надо добавить в файл sudoers с помощью специального редактора visudo. Посмотрим на скриншот с результатом выполнения команды:
Существуют две версии утилиты для настройки брандмауэра Linux: iptables и ip6tables. Iptables используется для протокола IPv4, а ip6tables для протокола IPv6. Соответственно команда вывести все цепочки правил для межсетевого экрана имеет два варианта синтаксиса.
Для протокола IPv4:
Для протокола IPv6:
В дальнейшем рассмотрим только вариант для протокола IPv4, вариант для протокола IPv6 использует такой же синтаксис.
Выводимая на экран информация разбита на столбцы и строки. У каждого столбца свое наименование. С помощью дополнительных параметров команды sudo iptables -L можно добавлять дополнительные столбцы в выводимой таблице правил iptables. Рассмотрим название столбцов в стандартном выводе sudo iptables -L:
- target – выполняемое действие с пакетом при соответствии его данному правилу
- prot – протокол передачи данных, при котором применяется данное правило
- opt – дополнительные опции для правила
- source – IP адрес, подсеть, домен узла источника пакета, попадающего под выполнение данного правила
- destination – IP адрес, подсеть, домен узла назначения пакета, попадающего под выполнение данного правила
1. Список правил из цепочки
Команда чтобы вывести на экран конкретную цепочку правил выглядит следующим образом:
sudo iptables
Например просмотр правил iptables из цепочки OUTPUT:
2. Список правил из таблицы
По умолчанию выводится содержимое таблицы фильтрации пакетов filter. Команда вывода содержимого конкретно указанной таблицы выглядит следующим образом:
sudo iptables
Например:
Вот список всех таблиц правил iptables:
- filter – таблица по умолчанию. Используется для фильтрации пакетов. Содержится в цепочках INPUT, FORWARD, OUTPUT
- raw – используется редко. Пакет проверяется на соответствие условиям данной таблицы до передачи системе определения состояний (conntrack), например, для того, чтобы не обрабатываться с помощью данной системы (действие NOTRACK). Система определения состояний позволяет фильтровать пакеты на уровне взаимодействия сеансов приложений. То есть фильтрует пакеты по сеансу связи – новый сеанс связи (NEW), уже установленный сеанс связи (ESTABLISHED), дополнительный сеанс связи к уже существующему (RELATED). Данная система позволяет реализовать высокоуровневый межсетевой экран, который вместо работы с пакетами работает с сеансами связи в рамках приложений. Содержится в цепочках PREROUTING и OUTPUT.
- mangle – содержит правила модификации обрабатываемых IP-пакетов. Например, изменение полей заголовков IP-пакетов, содержащих служебную информацию. Используется редко. Содержится в цепочках PREROUTING, INPUT, FORWARD, OUTPUT,
- nat – предназначена для подмены адреса отправителя или получателя. Данная таблица применяется только к первому пакету из потока протокола передачи данных по сети, к остальным пакетам потока пакетов выбранное действие применяется далее автоматически. Таблицу используют, например, для трансляции адресов отправителя и получателя, для маскировки адресов отправителя или получателя. Это делается в основном в двух случаях. Первый – когда необходимо организовать доступ к сети Интернет нескольким компьютерам, расположенным за данным компьютером. Второй – когда необходимо спрятать (замаскировать) в целях безопасности отправителя или получателя информации, передаваемой по сети Интернет. Содержится в цепочках PREROUTING, OUTPUT, POSTROUTING.
3. Номера правил в iptables
Следующая команда позволяет нам вывести номера правил iptables, которые потом можно использовать для управления ими на экран:
sudo iptables —line-numbers -n
Например:
4. Просмотр правил со статистикой пакетов
Чтобы посмотреть таблицу правил со счетчиком переданного (полученного) количества байтов (bytes) и пакетов (pkts) используется следующая команда:
sudo iptables -n -v
Например:
Удалить iptables правило
В своей статье «Удалить iptables правило» я хочу рассказать как можно удалять правила с iptables. На наглядных примерах, я покажу как пользоваться iptables на вашем сервере.
Вывести правила.
Для начала смотрим какие правила и цепочки у нас имеются:
Праметры: -L — Вывести все правила. -n — Отображать IP адрес с портом в числах (не используя DNS сервера для определения имен. Ускоряет отображение).
можно еще использовать параметр -v — Данная опция, выводит дополнительную информацию. Этот параметр показывает имя интерфейса, его опции, TOS маски, отображает суффиксы ‘K’, ‘M’ or ‘G’.
Так же можно вывести список правил с нумерацией строк: —line-numbers — вывод пронумерованных правил.
Удалить правила файрвола.
Для цепочки INPUT.
Можно просмотреть правила для конкретной цепочки:
Можно удалить и по-другому, если знаете IP адрес источника:
Для цепочки POSTROUTING.
Выполняем поиск удобным для вас способом:
Чтобы удалить используем:
Для цепочки OUTPUT.
Можно удалить и по-другому, если знаете IP адрес:
Например, нужно удалить порт с правил iptables, можно сделать это так:
Тема «Удалить iptables правило» подошла к завершению.
Создание правил
Теперь, когда вы создали таблицу и цепочку, вы можете, наконец, добавить правила для брандмауэра. Давайте добавим правило для разрешения SSH.
Здесь следует отметить, что как только мы добавили его в таблицу семейства inet, это единственное правило будет обрабатывать как пакеты IPv4, так и пакеты IPv6.
Глагол add будет добавлять правило в конец цепочки. Также вы можете использовать глагол insert, чтобы добавить правило в начало цепочки.
Мы добавили два правила, а теперь давайте посмотрим, как будет выглядеть полный набор правил.
Обратите внимание, что правило http должно отрабатывать раньше правила ssh, поскольку мы использовали выше глагол insert. Также вы можете добавить правило в произвольное место в цепочке
Есть два способа сделать это
Также вы можете добавить правило в произвольное место в цепочке. Есть два способа сделать это.
- Используйте index, чтобы указать на индекс в списке правил. Использование add добавит новое правило после указанного индекса. Если же вы используете insert, то новое правило будет добавлено перед правилом с заданным индексом. Значения индексов начинаются с 0.
- Используйте handle, чтобы указать правило, до или после которого нужно вставлять другое правило. Для вставки после используйте глагол add. Чтобы вставить до правила, используйте insert. Вы можете получить handle правил, добавив флаг –handle при выводе правил.
В nftables handle правил стабилен и не изменится до тех пор, пока правило не будет удалено. Так ссылка на правило получается надежнее, чем просто индекс, который может поменяться при вставке другого правила.
Также вы можете получить handle правила во время создания, используя сразу два флага –echo и –handle. Правило будет выведено в CLI вместе с его handle.
Настройка netfilter/iptables для подключения нескольких клиентов к одному соединению.
Давайте теперь рассмотрим наш Linux в качестве шлюза для локальной сети во внешнюю сеть Internet. Предположим, что интерфейс eth0 подключен к интернету и имеет IP 198.166.0.200, а интерфейс eth1 подключен к локальной сети и имеет IP 10.0.0.1. По умолчанию, в ядре Linux пересылка пакетов через цепочку FORWARD (пакетов, не предназначенных локальной системе) отключена. Чтобы включить данную функцию, необходимо задать значение 1 в файле /proc/sys/net/ipv4/ip_forward:
netfilter:~# echo 1 > /proc/sys/net/ipv4/ip_forward
Чтобы форвардинг пакетов сохранился после перезагрузки, необходимо в файле /etc/sysctl.conf раскомментировать (или просто добавить) строку net.ipv4.ip_forward=1.
Итак, у нас есть внешний адрес (198.166.0.200), в локальной сети имеется некоторое количество гипотетических клиентов, которые имеют адреса из диапазона локальной сети и посылают запросы во внешнюю сеть. Если эти клиенты будут отправлять во внешнюю сеть запросы через шлюз «как есть», без преобразования, то удаленный сервер не сможет на них ответить, т.к. обратным адресом будет получатель из «локальной сети». Для того, чтобы эта схема корректно работала, необходимо подменять адрес отправителя, на внешний адрес шлюза Linux. Это достигается за счет (маскарадинг) в , в .
netfilter:~# iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT netfilter:~# iptables -A FORWARD -m conntrack --ctstate NEW -i eth1 -s 10.0.0.1/24 -j ACCEPT netfilter:~# iptables -P FORWARD DROP netfilter:~# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Итак, по порядку сверху-вниз мы разрешаем уже установленные соединения в цепочке FORWARD, таблице filter, далее мы разрешаем устанавливать новые соединения в цепочке FORWARD, таблице filter, которые пришли с интерфейса eth1 и из сети 10.0.0.1/24. Все остальные пакеты, которые проходят через цепочку FORWARD — отбрасывать. Далее, выполняем маскирование (подмену адреса отправителя пакета в заголовках) всех пакетов, исходящих с интерфейса eth0.
Примечание. Есть некая общая рекомендация: использовать правило -j MASQUERADE для интерфейсов с динамически получаемым IP (например, по DHCP от провайдера). При статическом IP, -j MASQUERADE можно заменить на аналогичное -j SNAT —to-source IP_интерфейса_eth0. Кроме того, SNAT умеет «помнить» об установленных соединениях при кратковременной недоступности интерфейса. Сравнение MASQUERADE и SNAT в таблице:
Кроме указанных правил так же можно нужно добавить правила для фильтрации пакетов, предназначенных локальному хосту — как описано в . То есть добавить запрещающие и разрешающие правила для входящих и исходящих соединений:
netfilter:~# iptables -P INPUT DROP netfilter:~# iptables -P OUTPUT DROP netfilter:~# iptables -A INPUT -i lo -j ACCEPT netfilter:~# iptables -A OUTPUT -o lo -j ACCEPT netfilter:~# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT netfilter:~# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT netfilter:~# iptables -A OUTPUT -p icmp -j ACCEPT netfilter:~# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 netfilter:~# iptables -A OUTPUT -p TCP --sport 32768:61000 -j ACCEPT netfilter:~# iptables -A OUTPUT -p UDP --sport 32768:61000 -j ACCEPT netfilter:~# iptables -A INPUT -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT netfilter:~# iptables -A INPUT -p UDP -m state --state ESTABLISHED,RELATED -j ACCEPT
В результате, если один из хостов локальной сети, например 10.0.0.2, попытается связаться с одним из интернет-хостов, например, 93.158.134.3 (ya.ru), при , их исходный адрес будет подменяться на внешний адрес шлюза в цепочке POSTROUTING таблице nat, то есть исходящий IP 10.0.0.2 будет заменен на 198.166.0.200. С точки зрения удаленного хоста (ya.ru), это будет выглядеть, как будто с ним связывается непосредственно сам шлюз. Когда же удаленный хост начнет ответную передачу данных, он будет адресовать их именно шлюзу, то есть 198.166.0.200. Однако, на шлюзе адрес назначения этих пакетов будет подменяться на 10.0.0.2, после чего пакеты будут передаваться настоящему получателю в локальной сети. Для такого обратного преобразования никаких дополнительных правил указывать не нужно — это будет делать все та же операция MASQUERADE, которая помнит какой хост из локальной сети отправил запрос и какому хосту необходимо вернуть пришедший ответ.
Примечание: желательно негласно принято, перед всеми командами iptables очищать цепочки, в которые будут добавляться правила:
netfilter:~# iptables -F ИМЯ_ЦЕПОЧКИ
История
Связь (некоторых) различных компонентов Netfilter
Расти Рассел начал проект netfilter / iptables в 1998 году; он также был автором предшественника проекта, ipchains . По мере развития проекта в 1999 году он основал Netfilter Core Team (или просто coreteam ). Создаваемое ими программное обеспечение (в дальнейшем именуемое netfilter ) использует лицензию GNU General Public License (GPL), а в марте 2000 года оно было объединено с версией 2.4. x основной ветки ядра Linux .
В августе 2003 года председателем основной команды стал Харальд Велте. В апреле 2004 года, после того как проект преследовал тех, кто распространяет программное обеспечение проекта, встроенное в маршрутизаторы, не соблюдая GPL, немецкий суд вынес исторический судебный запрет против Sitecom Germany, которая отказалась следовать условиям GPL (см. ). В сентябре 2007 года новым председателем основной группы был избран Патрик МакХарди, который руководил разработкой в течение последних лет.
До IPTables, преобладающие пакеты программного обеспечения для создания межсетевых экранов Linux были IPCHAINS в Linux ядра 2.2.x и IPFWADM в Linux ядра 2.0.x, в свою очередь , была основана на BSD «s IPFW . И ipchains, и ipfwadm изменяют сетевой код, чтобы они могли управлять пакетами, поскольку ядру Linux не хватало общей структуры управления пакетами до появления Netfilter.
В то время как ipchains и ipfwadm сочетают фильтрацию пакетов и NAT (в частности, три конкретных вида NAT , называемые маскарадингом , переадресацией портов и перенаправлением ), Netfilter разделяет операции с пакетами на несколько частей, описанных ниже. Каждый из них подключается к перехватчикам Netfilter в разных точках для доступа к пакетам. Подсистемы отслеживания соединений и NAT являются более общими и более мощными, чем рудиментарные версии в ipchains и ipfwadm.
В 2017 году была добавлена инфраструктура разгрузки потоков IPv4 и IPv6 , что позволило ускорить пересылку программных таблиц потоков и поддержку аппаратной разгрузки.
Примеры настройки Iptables
Чтобы закрепить навыки настройки Iptables, рекомендуется протестировать утилиту в разных режимах. Например, отобразить список правил, очистить его, установить параметры по умолчанию или удалить их.
Список правил
Просмотр правил Iptables осуществляется командой:
$ iptables –L
Также есть возможность указать нужную цепочку, например:
$ iptables -L INPUT
Очистка правил
При любых ошибках в работе Iptables, чтобы исключить нарушение функционирования ядра перед другими действиями, требуется очистить правила, «обнулить» вводные данные. Выполняется эта процедура командой:
$ sudo iptables –F
Если речь идет об определенной цепочке, то она будет выглядеть иначе:
$ sudo iptables -F Input
Перечисленные действия выполняются для таблицы filter, которая подключена изначально.
Правила «по умолчанию»
Задаются правила «по умолчанию» вручную. Пример команд:
$ sudo iptables -p INPUT ACCEPT $ sudo iptables -p OUTPUT ACCEPT $ sudo iptables -p FORWARD DROP
Здесь мы разрешаем все цепочки INPUT и OUTPUT, запрещаем FORWARD.
Блокировка пакетов
Заблокировать пакеты можно действием DROP. Оно позволяет включать фильтрацию по разным признакам вроде IP-адреса, маске сети, порту и пр.
Пример:
$ sudo iptables -A INPUT -s 20.20.20.20 -j DROP
Блокируются входящие пакеты на IP 20.20.20.20.
$ sudo iptables -A OUTPUT -s 20.20.20.20 -j DROP
Теперь мы заблокировали пакеты, исходящие на IP 20.20.20.20.
Есть возможность указать маску сети, например, 20.20.20.0/255. Тогда правила будут применяться ко всем IP, входящим в указанный диапазон. Если же требуется заблокировать подключение строго по определенному протоколу, вводится команда:
$ sudo iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
Она блокирует все входящие соединения по SSH.
Удаление правил
При удалении правил в Iptables вводится команда с опцией -D. Но перед этим может понадобиться просмотреть перечень правил:
$ sudo iptables -L
Пример удаления правила:
$ sudo iptables -A OUTPUT -s 10.10.10.10 -j DROP
Если требуется полное удаление правил, применяется команда:
$ sudo iptables –F
Сохранение правила Iptables
Теперь остается опробовать режим сохранения правил
Важно учитывать, что он действует до перезагрузки компьютера. После этой процедуры необходимо задавать их заново
В Ubuntu процесс требует ввода команды:
$ sudo /sbin/iptables-save
Для операционных систем на ядре Red Hat и CentOS она выглядит иначе:
$ sudo /sbin/service iptables save
Ничего сложного в настройке и управлении Iptables нет. Основные функции понятны даже новичкам, поэтому утилита и остается стандартом де-факто для всех систем на базе Linux.
Что такое Iptables?
Операционные системы Linux, на которых чаще всего и функционируют серверы (виртуальные машины), имеют встроенный инструмент защиты – программный фильтр Iptables. Все сетевые пакеты идут через ядро приложения и проходят проверку на безопасность для компьютера. Сценария всего два – или данные передаются дальше на обработку, или полностью блокируются.
Виды пакетов
Информационные пакеты фильтруются исходя из назначения. Под контроль попадают все данные, входящие на сервер, исходящие из него или проходящие через него как маршрутизатор (например, если компьютер используется в качестве прокси). Такой подход создает сплошной защитный экран (файрвол), через который практически нереально проникнуть с вредоносными целями.
Настройка Iptables для чайников
Описания пакетов:
- Input. Обрабатываются входящие подключения вроде подключения по протоколу SSH или при отправке на веб-сайт каких-либо файлов.
- Forward. Цепочка формируется при активации проходящего соединения, когда информация предназначена «третьему» компьютеру, а текущий сервер выполняет роль маршрутизатора.
- Output. Исходящие пакеты данных, например, при запуске какого-либо сайта в браузере или при проверке скорости соединения и доступности PING.
В реальной работе сервера постоянно формируется минимум два вида пакетов – Input и Output. Ведь на каждый запрос пользователя положено дать ответ: сначала о поступлении данных на сервер, а затем и о результате обработки. Если «принято решение» отказать в доступе, об этом также сообщается на удаленное рабочее место. Иначе запрос зависнет, и пользователь будет видеть пустой экран.
Правила и действия Iptables
На каждый тип пакетов распространяется определенный набор правил, и их следует учитывать при настройке программы Iptables. Большая часть запросов проходит в виде последовательных цепочек в различных комбинациях. Если ошибиться на этом этапе, приложение будет функционировать со сбоями и блокировать «полезные» запросы.
Примеры действий:
- ACCEPT – пропустить пакет данных далее по цепочке;
- DROP – полностью удалить пакет;
- REJECT – отклонить запрос и направить пользователю ответ с информацией об этом;
- LOG – инициируется запись в лог-файл об обработанном пакете;
- QUEUE – отправка данных на компьютер пользователя.
Правила проверки устанавливаются в зависимости от характера соединения. Возможен мониторинг IP-адреса, порта подключения, отправителя, заголовка. Если пакет не проходит хотя бы по одному критерию, осуществляется действие ACCEPT (сквозное пропускание пакета, который не требуется блокировать файрволом). Фильтрация возможна на двух этапах:
- prerouting – система только получила пакет, и нет команды «что с ним делать»: обрабатывать на сервере, возвращать пользователю или пропускать насквозь;
- postroutnig – обработка после оценки «пункта назначения».
Трансляция сетевых адресов
Каждое соединение имеет набор исходных адресов и адресов для ответа , которые изначально начинаются одинаково. NAT в Netfilter реализуется путем простого изменения адреса ответа и, где необходимо, порта. Когда пакеты получены, их кортеж соединения также будет сравниваться с парой адресов ответа (и портами). Отсутствие фрагментации также является требованием для NAT. (При необходимости пакеты IPv4 могут быть рефрагментированы с помощью обычного стека IPv4, не являющегося фильтром Netfilter.)
Помощники NAT
Подобно помощникам отслеживания соединений, помощники NAT будут выполнять проверку пакетов и заменять исходные адреса ответными адресами в полезной нагрузке.
Автозагрузка правил iptables
1. Загрузка правил с помощью скрипта
Сохраненные правила с помощью утилиты iptables-save можно восстанавливать с помощью скрипта, запускаемого при каждом запуске операционной системы. Для этого необходимо выполнить следующие действия:
Сохранить набор правил межсетевого экрана с помощью команды:
Для запуска набора правил при старте операционной системы перед включением сетевого интерфейса мы создаем новый файл с помощью команды:
Заметим — в сети есть много вариантов места размещения скрипта на локальной машине, но я считаю именно размещение в папке if-pre-up.d наиболее верным, так как при этом скрипт будет выполнятся перед включением сетевого интерфейса. Добавляем в данный файл следующий скрипт:
Сохраняем файл iptables Ctrl+O. Выходим из editor Ctrl+X. Устанавливаем необходимые права для созданного файла:
Перезагружаем компьютер и проверяем результат для таблицы filter с помощью команды:
Для обеспечения безопасности необходимо, чтобы конфигурация iptables применялась до запуска сетевых интерфейсов, сетевых служб и маршрутизации. Если данные условия не будут соблюдены — появляется окно уязвимости между загрузкой операционной системы и правил защиты межсетевого экрана. Для реализации такого варианта защиты можно использовать пакет iptables-persistent.
2. Автозагрузка правил iptables-persistent
По умолчанию данный пакет не установлен в операционной системе. Данный вариант реализации автозапуска конфигурации возможен в операционных системах Debian, Ubuntu. Для установки пакета требуется выполнить команду:
Этот пакет впервые стал доступен в Debian (Squeeze) и Ubuntu (Lucid). Используемые этим пакетом правила iptables хранятся в следующих директориях:
- /etc/iptables/rules.v4 для набора правил протокола IPv4;
- /etc/iptables/rules.v6 для набора правил протокола IPv6.
Но они должны быть сохранены в понятном утилите iptables-persistent виде.
Требования к формату данных файлах не задокументированны, что создает некоторые сложности для создания этих файлов вручную. Их можно создать с помощью dpkg-reconfigure:
Или можно использовать iptables-save и ip6tables-save:
Если мы были внимательны при установке пакета, то мы должны были заметить в Debian 10 и последних версиях Ubuntu пакет-зависимость для iptables-persistent: netfilter-persistent, устанавливаемых с нужным нам пакетом. Можно по адресу https://packages.ubuntu.com посмотреть содержимое пакета iptables-persistent, и мы заметим, что на текущий момент пакет называется iptables-persistent, а основные файлы уже относятся к пакету netfilter-persistent.
Утилита netfilter-persistent тоже позволяет управлять автозагрузкой правил. Вот её синтаксис:
sudo netfilter-persistent
Где может принимать следующие значения:
- start — вызывает все плагины с параметром start, для загрузки правил в netfilter;
- stop — если настроена конфигурация сброса настроек Netfilter при остановке плагина, сбрасывает все настройки firewall на значения по умолчанию. Иначе просто выдает предупреждение;
- flush — плагины вызываются с параметром flush, что приводит к сбросу правил межсетевого экрана на значения по умолчанию;
- save — вызывает плагины с параметром save, позволяя сохранить значения правил брандмауэра в файлы на диске;
- reload — не задокументированный параметр, возникали случаи когда параметр start не срабатывал, помогал вызов этого параметра для загрузки правил из файла на диске;
Значит, чтобы сохранить правила мы можем вызвать следующую команду:
Для загрузки же сохраненных правил мы можем использовать команду:
Замечание После установки netfilter-persistent система при использовании iptables и формата хранения файлов, связанного с ним, начинает при работе выдавать предупреждение
Это связано с наличием новой утилиты настройки и редактирования правил Netfilter — nftables, для миграцию на эту утилиту старых правил iptables можно использовать автоматический транслятор правил iptables-translate. Но это уже тема для отдельной статьи.
Удалить одно правило iptables по номеру строки
Также можно удалить одно правило — например, по номеру строки
Так выводится пронумерованный список правил:
iptables -L —line-numbers
iptables -L —line-numbers Chain INPUT (policy ACCEPT) num target prot opt source destination 1 f2b-sshd tcp — anywhere anywhere multiport dports ssh 2 ACCEPT tcp — anywhere anywhere tcp dpt:domain 3 ACCEPT udp — anywhere anywhere udp dpt:domain 4 f2b-sshd tcp — anywhere anywhere multiport dports ssh 5 ispmgr_deny_ip all — anywhere anywhere 6 ispmgr_allow_ip all — anywhere anywhere 7 ispmgr_allow_sub all — anywhere anywhere 8 ispmgr_deny_sub all — anywhere anywhere 9 ACCEPT all — anywhere anywhere ctstate RELATED,ESTABLISHED 10 ACCEPT tcp — anywhere anywhere ctstate NEW multiport dports heathview:35999 11 ACCEPT tcp — anywhere anywhere ctstate NEW multiport dports ftp-data:ssh,smtp,http,https,pop3,imap,urd,submission,imaps,pop3s,domain,mysql,postgres,44477 12 ACCEPT tcp — anywhere anywhere ctstate NEW multiport dports vlsi-lm 13 ACCEPT udp — anywhere anywhere ctstate NEW multiport dports domain 14 ACCEPT all — anywhere anywhere state RELATED,ESTABLISHED 15 ACCEPT icmp — anywhere anywhere 16 ACCEPT all — anywhere anywhere 17 ACCEPT tcp — anywhere anywhere state NEW tcp dpt:ssh
Затем одно из них удаляется с указанием таблицы, и цепочки (iptables -t TABLE -D INPUT номер_строки)
Сейчас удалим девятое правило из списка
iptables -t nat -D INPUT 9
Также можно удалять правила применяя ключ -D
Команда приведенная ниже разрешит обращения по перечисленным портам
iptables -A INPUT -p tcp -m conntrack —ctstate NEW -m multiport —dports 20:22,25,80,443 -j ACCEPT
С ключом -D правило будет удалено
iptables -D INPUT -p tcp -m conntrack —ctstate NEW -m multiport —dports 20:22,25,80,443 -j ACCEPT
Каждый раз необходимо выполнять iptables-save
Если нужно отредактировать несколько правил или их довольно много проще сначала сохранить все правила в файл, отредактировать его, затем загрузить их вновь
Также читайте про сохранение правил iptables после перезагрузки
Запуск утилиты Iptables
Перед активацией приложение требуется установить из стандартного репозитория Linux. Так, для инсталляции в Ubuntu подойдет команда:
$ sudo apt install iptables
В дистрибутиве, базируемом на ядре Fedora, она выглядит несколько иначе:
$ sudo yum install iptables
Общий синтаксис запуска программы выглядит следующим образом:
$ iptables -t таблица действие цепочка дополнительные_параметры
Перечень основных действий, для выполнения которых используется Iptables:
- -A – добавить правило в цепочку;
- -C – проверить применяемые правила;
- -D – удалить текущее правило;
- -I – вставить правило с указанным номером;
- -L – вывести правила текущей цепочки;
- -S – вывести все активные правила;
- -F – очистить все правила;
- -N – создать цепочку;
- -X – удалить цепочку;
- -P – установить действие «по умолчанию».
В качестве дополнительных параметров используются опции:
- -p – вручную установить протокол (TCP, UDP, UDPLITE, ICMP, ICMPv6, ESP, AH, SCTP, MH);
- -s – указать статичный IP-адрес оборудования, откуда отправляется пакет данных;
- -d – установить IP получателя;
- -i – настроить входной сетевой интерфейс;
- -o – то же самое в отношении исходящего интерфейса;
- -j – выбрать действие при подтверждении правила.
Устройство фильтра iptables
Для iptables в общем виде правила выглядят так:
iptables command [target/jump]
Не обязательно ставить описание действия (target/jump) последним в строке, но лучше придерживаться именно такой нотации для удобочитаемости правил.
Если в правило не включается спецификатор , то по умолчанию предполагается использование таблицы filter, если же предполагается использование другой таблицы, то это требуется указать явно. Спецификатор таблицы также можно указывать в любом месте строки правила, однако, более или менее, стандартом считается указание таблицы в начале правила.
Далее, непосредственно за именем таблицы должна стоять команда управления фильтром. Если спецификатора таблицы нет, то команда всегда должна стоять первой. Команда определяет действие iptables, например: вставить правило, или добавить правило в конец цепочки, или удалить правило и т.п. Тело команды в общем виде выглядит так:
Ключ указывает на то, что нужно сделать с правилом, например, команда -А указывает на то, что правило нужно добавить в конец указанной цепочки.
указывает, в какую цепочку нужно добавить правило. Стандартные цепочки — INPUT, OUTPUT, FORWARD, PREROUTING и POSTROUTING. Они находятся в таблицах фильтра. Не все таблицы содержат все стандартные цепочки.
Раздел задает критерии проверки, по которым определяется, подпадает ли пакет под действие этого правила или нет. Здесь можно указать самые разные критерии — IP-адрес источника пакета или сети, сетевой интерфейс и т.д.
указывает, какое действие должно быть выполнено при условии выполнения критериев в правиле. Здесь можно передать пакет в другую цепочку правил, «сбросить» пакет и забыть про него, выдать на источник сообщение об ошибке и т.д.
Когда пакет приходит на сетевое устройство, он обрабатывается соответствующим драйвером и далее передается в фильтр в ядре ОС. Далее пакет проходит ряд таблиц и затем передается либо локальному приложению, либо переправляется на другую машину.
Видео
Онлайн курс «DevOps практики и инструменты»
Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.
Проверьте себя на вступительном тесте и смотрите программу детальнее по .
Решение проблем
Работа с Docker
nftables может создавать помехи сетевой работе контейнеров Docker (возможно, и другим средствам виртуализации тоже). В частности, политика цепочки блокирует пакеты, источником которых является docker. Если вы не хотите удалять эту цепочку, то сделайте следующее:
- Установите пакет ; он содержит iptables-совместимый интерфейс nftables, который docker сможет использовать.
- Модифицируйте цепочку таблицы :
-
chain forward { type filter hook forward priority security; policy drop; mark 1 accept }
-
- Добавьте цепочку DOCKER-USER в таблицу , чтобы помечать (mark) пакеты docker:
-
table ip filter { chain DOCKER-USER { mark set 1 } }
-
Теперь сгенерированные контейнером docker пакеты будут маркироваться и пересылаться дальше, поскольку docker уже их отфильтровал (цепочка в docker использует политику ).
Отключение Selinux и Firewalld в CentOS/RHEL системах
Если вы хотите начать использовать iptables в CentOS или других Red Hat производных системах, то перед настройкой необходимо отключить Selinux и firewalld.
Для отключения selinux отредактируем файл /etc/sysconfig/selinux.
# Открываем файл для редактирования nano /etc/sysconfig/selinux # Находим строку SELINUX=enforced, заменяем на disabled SELINUX=disabled # Сохраняем и выходим.
Firewalld — надстройка над iptables, играющая роль брандмауэра, применяется в RHEL системах по умолчанию. Так как управлять фаерволом мы будем при помощи собственных правил, то firewalld необходимо отключить.
# Останавливаем firewalld и удаляем его из автозагрузки systemctl stop firewalld systemctl disable firewalld