: | : |
‹ | › | |||||
Пн | Вт | Ср | Чт | Пт | Сб | Вс |
2018-05-01 07:58:42 4327 1
Использование утилиты iptables для управления пакетным фильтром линукс Netfilter
iptables — утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux, начиная с версии 2.4. Для использования утилиты iptables требуются привилегии суперпользователя (root).
Структура
iptables представляет собой набор таблиц, которые состоят из цепочек, а цепочки в свою очередь состоят из набора правил, которые и применяются к сетевым пакетам.
Таблицы
iptables имеет четыре таблицы:
- Filter - исползуется для фильтрации пакетов, содержит цепочки:
- INPUT - пакеты, которые предназначены для самого сервера;
- FORWARD - пакеты, которые будут машрутизированы (принадлежат другом интерфейсу);
- OUTPUT - пакеты, которые сгенирированы самим сервером и будут отправлены на другой хост.
- NAT - используется главным образом для преобразования сетевых адресов (Network Address Translation). Через эту таблицу проходит только первый пакет из потока. Преобразования адресов автоматически применяется ко всем последующим пакетам. Это один из факторов, исходя из которых мы не должны осуществлять какую-либо фильтрацию в этой таблице.
Содержит цепочки:- PREROUTING - преобразование адреса назначания пакета (DNAT);
- POSTROUTING - преобразования адреса источника пакета (SNAT);
- OUTPUT - преобразование для локально сгенерированных пакетов.
- MANGLE - предназначена только для внесения изменения в некоторые заголовки пакетов – TOS,TTL, MARK.
Содержит цепочки:- PREROUTING;
- INPUT;
- FORWARD;
- OUTPUT;
- POSTROUTING.
- RAW - применяется до передачи пакета механизму определения состояний (state machine, connection tracking – система трассировки соединений, при помощи которой реализуется межсетевой экран на сеансовом уровне (stateful firewall), позволяет определить, к какому соединению или сеансу принадлежит пакет, анализирует все пакеты кроме тех, которые были помечены NOTRACK в таблице raw).
Содержит цепочки:- PREROUTING;
- OUTPUT
Схема проходения пакета по iptables

Правила
При прохождении пакета по цепочкам, будет проверяться его соответствие правилам, указанным в цепочке, если пакет попадает под правило, то будет выполнено цель указанная в этом правиле, если не попадает, то пакет перейдет к следующему правилу, порядок прохождения правил строго сверху вниз.
Перед тем как перейти к рассмотрению правил цель, научимся управлять iptables
Просмотр правил (опция -L):
sudo iptables -t filter -L
С помощью опци -t мы задаем правила какой таблицы мы хотим посмотреть (если ее не указывать, то по-умолчанию берется таблица filter)
Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT udp -- anywhere anywhere udp dpt:domain ACCEPT tcp -- anywhere anywhere tcp dpt:domain Chain FORWARD (policy ACCEPT) target prot opt source destination DOCKER-ISOLATION all -- anywhere anywhere ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED Chain OUTPUT (policy ACCEPT) target prot opt source destination ACCEPT udp -- anywhere anywhere udp dpt:bootpc
Где:
- target - цель;
- prot - протокол;
- opt - опции для правила;
- source - адрес источника пакета;
- destination - адрес назначения пакета;
- policy - политика по-умолчанию (цель, которая будет применена к пакету в этой цепочке, если пакет не совпадет ни с одним правилом)
Опция -v добавляет в вывод счетчик правила
sudo iptables -L -v
.... Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 1 328 DOCKER-ISOLATION all -- any any anywhere anywhere ....
- pkts - количество пакетов, попавших под правило;
- bytes - количество байт.
Опция -n - указывает не преобразовывать ip-адреса в доменные имена
Опция --line-numbers добавляет в вывод номера правил в цепочках (очень полезно, когда вам необходимо узнать номер правила, для его удаления или для замены, или вставки нового правила)
sudo iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53 2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 3 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67 ...
Опция -S формирует вывод только правил в формате, как они были заданы (так как они хранятся в файле iptables.conf)
sudo iptables -S
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N DOCKER -N DOCKER-ISOLATION -A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT -A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT -A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
Переходим к управлению iptables
Создание новой пользовательской цепочки:
sudo iptables -N user_chain
Переименование цепочки:
sudo iptables -E user_chain rename_user_chain
Удалить цепочку:
sudo iptables -X new_user_chain
Переходим к управлению правилами
Добавить правило в конец цепочки:
iptables -A chain rule
sudo iptables -A INPUT -d 172.16.0.1 -j ACCEPT
Вставить правило в цепочку:
iptables -I chain rule_number rule
sudo iptables -I INPUT 2 -s 192.168.10.0/24 -j REJECT
Замена правила в цепочке:
iptables -R chain rule_number rule
sudo iptables -R INPUT 2 -s 192.168.10.0/24 -j DROP
Удаление правила из цепочки:
iptables -D chain rule_number
ИЛИ
iptables -D chain rule
sudo iptables -D INPUT 2
ИЛИ
sudo iptables -D INPUT -s 192.168.10.0/24 -j DROP
Очистка всех правил в таблице или цепочке:
iptables -F -t table [chain]
sudo iptables -F -t nat PREROUTING
Очищаем все записи в таблице nat в цепочке PREROUTING, если не указывать цепочку, то бует очищена вся таблица.
Установка политики по-умолчанию для цепочки:
iptables -P chain target
sudo iptables -P FORWARD -j DROP
Обнуление счетчиков iptables:
sudo iptables -Z
Рассмотрим сохранение и восстановление правил созданных нами.
Сохраним текущию настройку iptables в файл /etc/iptables.conf
sudo iptables-save > /etc/iptables.conf
Для восстановления настроек iptables, например после перезагрузки:
sudo iptables-restore < /etc/iptables.conf
Для сохранения настроек iptables и их восстановления после перезагрузки, можно для debian систем добавить в файл конфигурации сети секции с post-up скрипт для восстановления iptables
cat /etc/network/interfaces
post-up iptables-restore < /etc/iptables.conf
Для систем основанных на RedHat, CentOS:
sudo service iptables save
Переходим к рассмотрению параметров правил и целей iptables
Виды целей указываемых в правилах:
- ACCEPT - принять пакет;
- REJECT - отбросить пакет и отправить специальное сообщение источнику пакета;
- DROP - "молча" отбросить пакет (не передавая сообщения);
- DNAT - используется для переназначения адреса назначения, может применяться только в цепочках PREROUTING и OUTPUT таблица nat, или в пользовательский цепочках, но вызванных из указанных ранее цепочек.Если первый пакет соединения попадает под правило, то и последующие пакеты соединения будут преобразованы. Сопровождается указанием опции --to-destination;
- SNAT - используется для переназначения адреса источника, используется в цепочке POSTROUTING таблицы nat, если первый пакет соодинения попадает под правило, то и все последующие пакеты этого соединения так же будут преобразованы. Указывается опция --to-source;
- MASQUERADE - тоже самое что и SNAT, только не указывается опция с указание адреса на который необходимо произвести преобразование. Используется обычно если адрес динамический и получен по DHCP, тогда в пакете будет произвелдена замена адреса источника на адрес интерфейса, с которого уходит пакет;
- REDIRECT - используется для перенаправления пакетов на другой порт локальной машины, удобно для прокси-сервера. Используется в цепочках PREROUTING и OUTPUT таблицы nat;
- LOG - служит для журналирования;
- MARK - используется для установки меток для отдельных пакетов. Используется только в таблице mangle. Метка пакета существует только в период времени пока пакет не покинул брандмауэр, т.е. метка не передается по сети;
- QUEUE - ставит пакет в очередь на обработку пользовательскому процессу;
- RETURN - прекращает движение пакета в текущей цепочке и возвращает его в вызывающую цепочку, на след правило от куда он был вызван. Если цепочка лежит на верхнем уровне, к пакету будет применена политика по-умолчанию;
- TOS - устанавливает значение в поле Type-of-Service пакета;
- TTL - используется для изменения поля Time-to-Live пакета.
Параметры правил
-s , --source - фильтраци на основании адреса источника пакета, возможно указание адреса и сети, а так же инверсия.
sudo iptables A INPUT -s 192.168.1.1 -j DROP
sudo iptables A INPUT -s ! 192.168.20.0/24 -j ACCEPT
-d, --destination - фильтрация пакета на основании адреса назначения, все как и для source
sudo iptables -A FORWARD -d 172.20.1.1 -j DROP
-i , --in-interface - правило для входящего трафика на указанном интерфейсе.
DROP весь входящий трафик на интерфейсе eth1
sudo iptables A INPUT -i eth1 -j DROP
-o , --out-interface - правило для исходящего трафика на указанном интерфейсе.
-p, --protocol - Правило для протокола, имя протокола должно быть указано, например tpc,udp,icmp и присутствовать в файле /etc/protocols
sudo iptables -A INPUT -p tcp -j ACCEPT
Параметры протокола TCP:
- --sport , --source-port - фильтрация на основании порта приложения источника пакета.
sudo iptables -A INPUT -p tcp --sport 3310 -j ACCEPT
- --dport , --destination-port - фитрация на основании порта приложения назначения пакета.
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- --tcp-flags - фильрация на основании TCP-флагов
sudo iptables -A INPUT -p tcp --tcp-flags SYN,ACK
Параметры UDP:
Аналогично с TCP, но без фильтрации по флагам.
Параметры ICMP:
- --icmp-type - фильтрация на основании типа ICMP-пакета
sudo iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
СУществуют параметры, которые могут использоваться при подключении модулей (опция -m)
Модуль addtype - фильтрация на основании типа адреса
Два параметра моуля src-type и dst-type, тип адреса источника и назначения соответственно.
sudo iptables -A INPUT -m addtype --src-type UNICAST -j ACCEPT
sudo iptables -A FORWARD -m addtype --dst-type BROADCAST -j DROP
Модуль connmark - фильтрация на основании метки
sudo iptables -A INPUT -m connmark mark 3 -j ACCEPT
Модуль ip range - возможность указания диапозона адресов
--src-range и dst-range - диапозон адресов источника и назначения соответственно
sudo iptables -A INPUT -m iprange --dst-range \
192.168.0.10-192.168.0.20 -j DROP
Модуль length - диапозон размеров пакета
sudo iptables -A INPUT -p tcp -m length 1200:1500 -j ACCEPT
Модуль limit - ограничение количества пакетов в единицу времени
Указываем количество пакетов за единицу времени:
sudo iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/s -j DROP
Указание количество пакетов с счетчиком, каждый раз когда количество лимита превышенно, счетчик увеличивается, после того как счетчик превысит значение, сработает правило
sudo iptables -A INPUT -p tcp --dport 22 -m limit \
--limit 2/s --limit-burst 5 -j DROP
Модуль mac - фильтрация по MAC-адресам
sudo iptables -A INPUT -m mac --mac-source 00:50:56:c0:00:08 -j DROP
Модуль mark - фильтрация на основании метки
sudo iptables -A INPUT -m mark --mark 5 -j ACCEPT
Модуль multiport - фильтрация по списку портов
sudo iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
Модуль owner - фильтрация на основании владельца пакета
--cmd-owner - по имени сервиса
sudo iptables -A INPUT -m owner --cmd-owner httpd
--uid-owner - фильт по UID пользователя, сгенерировавшего пакет
sudo iptables -A INPUT -m owner --uid-owner 99
--gid-owner - фильтрация по GID владельца
--pid-owner - фильтрация по PID
Модуль state - фильтрация на основании состояния пакета
sudo iptables -A INPUT -m state ESTABLISHED,RELATED
Типы состояний:
- NEW - первый пакет соединени, открывающий соединение;
- RELATED - пакет открывающий новый сеанс, но связанный с уже установленным соединением;
- ESTABLISHED - пакет, часть уже установленного соединения;
- INVALID - пакеты с неправильным или неустановленным состоянием.
Параметы определяемые для целей iptables
Цель DNAT - указываем адрес и порт, на значения которых будет изменен адрес и порт назначения в пакете
--to-destination ip:port
В пакете пришедший на интерфейс eth0 на порт 80 по протоколу TCP, будет изменен адрес и порт назначения
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
-j DNAT --to-destination 192.168.10.100:8080
Цель LOG
-
--log-level - указание уровень события
sudo iptables -A INPUT -s 172.20.1.1 -j LOG --log-level debug
-
--log-prefix - добавление префикса к сообщениям в лог-файле
sudo iptables A INPUT -s 172.20.1.1 -j LOG --log-prefix "log router"
-
--log-tcp-options - записывать в лог различные опци заголовка TCP
sudo iptables -A INPUT -p tcp -j LOG --log-tcp-options
Цель SNAT
--to-source - указание адреса и порта, на которые будут заменены адрес и порт источника в пакете
В пакета отправленных с интерфейса eth1 и имеющий адреса источника из сети 172.20.1.0/24 изменить адреса источника на адрес 172.123.0.1 и порты в диапозоне от 1024 до 5000
sudo iptables -t nat -A POSTROUTING -o eth1 -s 172.20.1.0/24 \
-j SNAT --to-source 174.123.0.1:1024-5000
Цель REDIRECT
--to-ports - указание порта или диапозона портов, на который будет перенаправлен пакет на этой же машине
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 \
-j REDIRECT --to-ports 8080
Цель MARK
--set-mark - установка метки на пакет
sudo iptables -t mangle PREROUTING -p tcp --dport 555 \
-j MARK --set-mark 10
Цель REJECT
--reject-with - выполняет REJECT c указанным ответом, доступные значения: icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited, icmp-host-prohibited
sudo iptables- A FORWARD -d 172.20.1.1 -j REJECT \
--reject-with icmp-host-unreachable
Существую и другие модули и параметры, которые можно посмотреть в документации по iptables. Мы рассмотрели только самые основные и часто используемые.
Введите ответ:
+
=
Valentin88
2018-07-24 07:57:02
Было полезно