: :

ПнВтСрЧтПтСбВс

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

Правила

При прохождении пакета по цепочкам, будет проверяться его соответствие правилам, указанным в цепочке, если пакет попадает под правило, то будет выполнено цель указанная в этом правиле, если не попадает, то пакет перейдет к следующему правилу, порядок прохождения правил строго сверху вниз.

Перед тем как перейти к рассмотрению правил цель, научимся управлять 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

Было полезно