Skip to content

Firewall And Packet Filtering

Firewall представляет собой барьер между доверенной внутренней сетью и недоверенной внешней, такой как Интернет. В основе архитектуры Файрвола лежит сложный функционал пакетной фильтрации Линукс.

Packet Filtering - ключевой механизм, который определяет судьбу отдельных пакетов данных, путешествующих по сети. Данный процесс регулируется тщательно разработанными правилами. Каждое правило служит директивой для Файрвола, пропусать или нет отдельно взятый пакет. Эти правила устанавливаются на основе ряда критериев, таких как: адреса источника/назначения, порты, протоколы; которые позволяют осуществлять детальный и точный контроль над сетевым трафиком.

Firewall - это механизм на основе железа или софта, позволяющий следить за входящим и исходящим сетевым трафиком. Работает опираясь на предустановленные правила безопасности, на основе которых те или иные потоки данных будут отброшены, либо пропущены. Обычно сетевые узлы, а иногда и приложения, изолированны файрволом от входящего и исходящего сетевого трафика. Файрвол защищает втуреннюю сеть от внешних угроз, использую различные техники. Основная задача - пропускать "хороший" трафик и отбрасывать "плохой".

netfilter

netfilter — это стандартный файрвол Linux, который находится в пространстве ядра ОС. Администратор может им управлять через такие утилиты как: iptables, nftables, firewalld, ufw.

Firewall Linux работает с такой единицей информации, как пакет.

Именно пакеты данныых принимаются, обрабытываются, отбрасываются, пересылаются. Решение как поступить с очередным пакетом принимается на основании правил.

  • Правило — состоит из критерия, действия и счетчика. Если пакет соответствует критерию, к нему применяется действие, и он учитывается счетчиком. Критерия может и не быть — тогда неявно предполагается критерий «все пакеты». Указывать действие тоже не обязательно — в отсутствие действия правило будет работать только как счетчик.

  • Цепочка — упорядоченная последовательность правил. Цепочки можно разделить на пользовательские и базовые.

    • Базовая цепочка — цепочка, создаваемая по умолчанию при инициализации таблицы. Каждый пакет, в зависимости от того, предназначен ли он самому хосту, сгенерирован им или является транзитным, должен пройти положенный ему набор базовых цепочек различных таблиц. Кроме того, базовая цепочка отличается от пользовательской наличием «действия по умолчанию» (default policy). Это действие применяется к тем пакетам, которые не были обработаны другими правилами этой цепочки и вызванных из нее цепочек. Имена базовых цепочек всегда записываются в верхнем регистре (PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING).
    • Пользовательская цепочка — цепочка, созданная пользователем. Может использоваться только в пределах своей таблицы. Рекомендуется не использовать для таких цепочек имена в верхнем регистре, чтобы избежать путаницы с базовыми цепочками и встроенными действиями.
  • Таблица — совокупность базовых и пользовательских цепочек, объединенных общим функциональным назначением. Имена таблиц (как и модулей критериев) записываются в нижнем регистре, так как в принципе не могут конфликтовать с именами пользовательских цепочек.

Netfilter использует четыре базовые таблицы, которые хранят правила, регулирующие три вида операций над пакетами. Каждая таблица содержит списки правил, называемые цепочками (chain). Файрвол использует стандартные цепочки для обработки пакетов, основываясь на предопределённых условиях. Администратор может создавать другие цепочки, которые будут использованы только в случаях, когда на них, прямо или косвенно, ссылается одна из стандартных цепочек.

Базовые таблицы:

  • filter: касается правил фильтрации (принять, отклонить, или проигнорировать пакет). Таблица filter содержит три стандартные цепочки:

    • INPUT: цепочка для входящих пакетов, обрабатывает трафик, поступающий непосредственно самому хосту.
    • OUTPUT: цепочка для исходящих пакетов, позволяет фильтровать трафик, исходящий от самого хоста.
    • FORWARD: цепочка для маршрутизируемых пакетов, позволяет фильтровать транзитный трафик.
  • nat (Network Address Translation): предназначена для операций stateful-преобразования сетевых адресов и портов обрабатываемых пакетов. Таблица nat тоже содержит три стандартные цепочки:

    • PREROUTING: в эту цепочку пакеты попадают до принятия решения о маршрутизации. По сути, термин «решение о маршрутизации» подразумевает деление трафика на входящий (предназначенный самому хосту) и транзитный (идущий через этот хост на другие хосты). Именно на данном этапе нужно проводить операции проброса (DNAT, REDIRECT, NETMAP).
    • POSTROUTING: через эту цепочку проходят все исходящие пакеты, поэтому именно в ней целесообразно проводить операции маскарадинга (SNAT и MASQUERADE).
    • OUTPUT: через эту цепочку проходят пакеты, сгенерированные процессами самого хоста. На данном этапе при необходимости можно повторить операции проброса, так локально сгенерированные пакеты не проходят цепочку PREROUTING и не обрабатываются ее правилами.
  • mangle: все цепочки таблицы mangle пакеты проходят раньше, чем одноименные цепочки таблиц nat и filter. Это позволяет классифицировать и маркировать пакеты и соединения в цепочках этой таблицы. Впоследствии эти маркировки могут быть использованы в цепочках двух других таблиц при принятии решений о фильтрации и трансляции адресов.

    • PREROUTING — позволяет модифицировать пакет до принятия решения о маршрутизации.
    • INPUT — позволяет модифицировать пакет, предназначенный самому хосту.
    • FORWARD — цепочка, позволяющая модифицировать транзитные пакеты.
    • OUTPUT — позволяет модифицировать пакеты, исходящие от самого хоста.
    • POSTROUTING — дает возможность модифицировать все исходящие пакеты, как сгенерированные самим хостом, так и транзитные.
  • raw: позволяет выполнять ручные модификации пакетов до того, как они дошли до системы отслеживания соединения. Предназначена для выполнения действий с пакетами до их обработки системой conntrack.

    • PREROUTING — в эту цепочку входящие пакеты попадают раньше, чем в любую другую из цепочек iptables, и до обработки их системой conntrack.
    • OUTPUT — аналогично для пакетов, сгенерированных самим хостом.

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

В процессе обработки пакета файрвол просматривает подходящую цепочку, правило за правилом, и, когда условия для некоего правила выполняются, он «перепрыгивает» (отсюда и опция -j — от слова «jump») к заданному действию для продолжения обработки пакета. В свою очередь, действия могут быть как терминальными, т.е. прекращающими обработку пакета в рамках данной базовой цепочки (например, ACCEPT, REJECT), так и нетерминальными, т.е. не прерывающими процесса обработки пакета (MARK, TOS). Если пакет прошел через всю базовую цепочку и к нему так и не было применено ни одного терминального действия, к нему применяется действие по умолчанию для данной цепочки (обязательно терминальное).

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

Допустимые действия в таблице filter:

  • ACCEPT: пропуск пакета, позволяет пакету следовать своим путём.
  • REJECT: отклоняет пакет, генерируя пакет-ошибку ICMP (Internet Control Message Protocol), который получит отправитель. Опция iptables --reject-with type позволяет задать тип выдаваемой ошибки.
  • DROP: удалить (проигнорировать) пакет, отправитель ничего не получит.
  • LOG: записать в системный журнал сообщение (через syslogd) с описанием пакета. Обратите внимание на то, что это действие не прерывает обработку пакета, выполнение цепочки продолжается со следующего правила. Именно поэтому логирование отклонённых пакетов требует наличия правил LOG и REJECT/DROP. Среди часто используемых параметров, касающихся логирования, можно отметить следующие:
  • ULOG: логирует сообщения с использованием ulogd. Такой подход может оказаться эффективнее чем syslogd при обработке большого количества сообщений. Обратите внимание на то, что это действие, как и LOG, не прерывает обработку пакета.
  • chain_name: переход к заданной цепочке и обработка её правил.
  • RETURN: прерывание обработки текущей цепочки и возврат к вызывающей цепочке. В том случае, если текущей цепочкой является одна из стандартных, вызывающей цепочки нет, поэтому вместо этого выполняется действие по умолчанию (заданное с помощью опции -P команды iptables).

Допустимые действия в таблице nat:

  • MASQUERADE — подменяет адрес источника для исходящих пакетов адресом того интерфейса, с которого они исходят, то есть осуществляет маскарадинг. Такая операция позволяет, например, предоставлять доступ в Интернет целым локальным сетям через один шлюз. Пример MASQUERADE
  • SNAT (Source Network Address Translation) — работает аналогично MASQUERADE, однако позволяет указать адрес «внешнего» интерфейса (опция --to-source). Такой подход позволяет экономить процессорное время шлюза, так как в случае с MASQUERADE для каждого пакета адрес внешнего интерфейса определяется заново. Приминимо для статического адреса шлюза. Пример SNAT
  • DNAT (Destination Network Address Translation) — подменяет адрес назначения для входящих пакетов, позволяя «пробрасывать» адреса или отдельные порты внутрь локальной сети. Дополнительные опции описывают то, какие именно изменения нужно выполнить, включая опцию --to-destination address:port, которая позволяет задать новый IP-адрес назначения, и, при необходимости, порт. Пример DNAT
  • REDIRECT — подменяет номер порта в TCP- или UDP-пакете, а также подменяет адрес назначения на свой собственный, прозрачно перенаправляет пакет на заданный порт самого файрвола. Это действие можно использовать для установки прозрачного веб-прокси, который работает без дополнительных настроек на стороне клиента, так как клиент полагает, что он подключён к получателю, в то время как обмен данными, на самом деле, идёт через прокси. Опция --to-ports port(s) позволяет указать порт или диапазон портов, на которые должны быть перенаправлены пакеты.
  • SAME — в зависимости от цепочки (PREROUTING или POSTROUTING) может работать как DNAT или SNAT. Однако, при указании (в параметре --to-ip) одного или нескольких диапазонов IP-адресов, определяет для каждого нового соединения подставляемый адрес не случайно, а базируясь на IP-адресе клиента. Таким образом, адрес для подмены остается постоянным для одного и того же клиента при повторных соединениях (что не выполняется для обычных DNAT/SNAT). В некоторых случаях это бывает важным.
  • NETMAP — позволяет «пробросить» целую сеть.

Путешествие пакета по ядру Линукс.

  1. В первую очередь пакет проходит через PREROUTING цепочки таблиц. Первая таблица на его пути - raw таблица, цепочка правил PREROUTING, затем - таблица mangle и ее цепочка PREROUTING, и на конец - цепочка PREROUTING таблицы nat.
  2. Далее происходит маршрутизация пакета. Если пакет идет на локальный процесс хоста, он попадает в цепочку INPUT. Если же пакет идет на другой хост, он отправляется в цепочку FORWARD.
  3. Пакет пришел на INPUT. Сначала он проходит через цепочку правил INPUT таблицы mangle, следом идет цепочка INPUT таблицы filter, затем таблица security, далее по порядку идет цепочка INPUT таблицы nat. Если пакет прошел проверку и удовлитворил условия какого-нибудь правила, он пересылается на локальный сокет, а затем попадает в искомый процесс.
  4. Если пакет требуется переслать, он попадает сначала в цепочку FORWARD таблицы mangle, затем таблицы filter, и в конце, таблицы security.
  5. Пакеты сгенерированные локальными процессами, отпраляются в цепочку OUTPUT таблицы raw, далее таблицы mangle, затем таблицы nat, следующая таблица filter, завершается путешествие таблицей security. После этого пакет отправляется в цепочки POSTROUTING.
  6. В цепочки POSTROUTING попадают пакеты из цепочек OUTPUT и FORWARD. Сначала идут цепочки POSTROUTING таблицы mangle, затем таблицы nat. И, после всего этого, пакет может благополучно покинуть хост!


iptables

iptables - ПО для управления netfilter из пространства пользователя в Linux.

Общий синтаксис

Синтаксис команд iptables

Обращение к стаблицам

iptables -t - обращение к определенноой таблице цепочек.

iptables -t
# Обращение к определенной таблице по имени
iptables -t <table_name>
iptables -t nat -n -L

# Если имя таблицы не указано, используется таблица filter
iptables -L

Листинг содержимого

iptables -L - листинг цепочек и правил.

iptables -L
# Вывод всех цепочек правил
iptables -L

# Вывод правил в цепочке INPUT (входящие пакеты)
iptables -L INPUT

# Вывод правил с номерами в цепочке INPUT
iptables -L --line-numbers INPUT

# Вывод правил в цепочке FORWARD (маршрутизируемые пакеты)
# Флаг -n отключает разрешение имен, будут только ip-адреса
iptables -n -L FORWARD

Создание и удаление цепочек

iptables -N, iptables -X - создание и удаление цепочек правил.

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

iptables -N
# Создает новую цепочку правил
iptables -N <new_chain_name>

# удаляет пустую или неиспользуемую цепочку
iptables -X <chain_name>

Политика цепочки

iptables -P - задание политики по умолчанию для всей цепочки. Только стандартные цепочки могут иметь политики.

iptables -P
# Общий синтаксис задания политики по умолчанию
iptables -P <chain_name> <action>

# Все входящие пакеты будут отклонятся,
# только пакеты напрямую разрешенные другими правилами пройдут через файрвол 
iptables -P INPUT DROP

Уапрвление правилами

iptables -A, iptables -I, iptables -D, iptables -F - управление правилами внутри цепочки.

Чтение и применение правил внутри цепочки происходит сверху вниз.

Это важно учитывать при добавлении новых правил в цепочку. Первое подходящие для пакета правило будет применено, остальные правила не будут просмотрены!

iptables -A
# Общий синтаксис добавления нового правила вниз цепочки
iptables -A <chain_name> <rule>

# Добавляет правило, которое разрешает весь входящий tcp трафик на 22 порт
iptables -A INPUT -p tcp --dport 22 -j ACCEPT 
iptables -I
# Общий синтаксис добавления нового правила в определенное место цепочки
iptables -I <chain_name> <rule_num> <rule>

# Добавляет правило в самый верх цепочки, которое разрешает весь входящий tcp трафик на 22 порт
iptables -I INPUT -p tcp --dport 80 -j ACCEPT

# Добавляет правило на 2 место цепочки, которое разрешает весь входящий tcp трафик на 8080 порт
iptables -I INPUT 3 -p tcp --dport 8080 -j ACCEPT
iptables -D
# Общий синтаксис удаления правила на основании его содержимого
iptables -D <chain_name> <rule>
iptables -D INPUT -p tcp --dport 80 -j ACCEPT

# Общий синтаксис удаления правила на основании его номера
iptables -D <chain_name> <rule_num>
iptables -D INPUT 2
iptables -F
# Общий синтаксис удаления всех правил из цепочки
iptables -F <chain_name>

# Удалит все правила из цепочки OUTPUT
iptables -F OUTPUT

# Удалит все правила всех цепочек из таблицы
iptables -F

iptables rules

Общий синтаксис правил, можно представить в следующем виде: conditions -j action action_options

conditions - условие. В правиле может быть несколько условий, в этом случае условия объединеются (по правилам логического И). Результат объединения, как минимум, налагает на правило те же ограничения, что и каждое отдельное условие.

Логическое отрицание условий. Если поставить перед условием восклицательный знак !, это приведёт к трансформации его в обратное условие.

  • Флаг -p <protocol> соответствует полю протокола IP-пакета. Наиболее часто используемые значения для этого условия — tcp, udp, icmp, и all. Если протокол не указан, подразумевается «любой протокол». Это условие может быть дополнено условиями, касающимися TCP-портов, с помощью выражений вида:

    • --source-port <port>, --sport <port>.
    • --destination-port <port>, --dport <port>.
  • Флаг -s <address> или -s <network/mask> позволяет фильтровать пакеты по адресу отправителя. В качестве адреса может выступать IP-адрес (возможно с маской), имя хоста из /etc/hosts, или доменное имя. Настойчиво не рекомендуется использовать доменные имена, для разрешения (резолва) которых требуются DNS-запросы, т.к. на этапе конфигурирования фаервола DNS может работать некорректно.

  • Флаг -d <address> или -d <network/mask> позволяют системе реагировать на адреса пунктов назначения пакетов.

  • Флаг -i <interface> реагирует на пакеты, которые приходят с указанного сетевого интерфейса. Данный критерий можно использовать в цепочках PREROUTING, INPUT и FORWARD.

  • Флаг -o <interface> позволяет отбирать пакеты, которые уходят на заданный интерфейс. Критерий можно использовать в цепочках FORWARD, OUTPUT и POSTROUTING.

  • Флаг -m conntrack используется для загрузки дополнительных модулей, с помощью которых можно делать разный "штуки" в iptables. В этом примере используется модуль conntrack для отслеживания соединений.

  • Флаг --ctstate <state> фильтрует пакеты по их состоянию в соединении. Используется совместно с флагом -m conntrack.

    • NEW - пакет, запрашивающий новое соединение,
    • ESTABLISHED - пакет, принадлежащий существующему соединению,
    • RELATED - описывает пакет, инициирующий новое соединение, являющееся частью уже существующего соединения

iptables examples

MASQUERADE example

Есть хостовый компьютер, который выполняет функцию роутера. У него 2 сетевые карты: eth_loc смотрит в локальную сеть (192.168.1.0/24), eth_inet смотрит в итнернет. Нужно настроить таблицы iptables таким образом, чтобы компьютеры из локальной сети могли ходить в интернет используя маскарадинг.

iptables MASQUERADE
# Включаем IP forwarding. Разрешаем шлюзу передавать транзитный трафик
echo 1 > /proc/sys/net/ipv4/ip_forward # Временно
sysctl -w net.ipv4.ip_forward=1 # Постоянно

#
# Вносим изменения в таблицу filter
# Разрешаем исходящие соединения из LAN
iptables -A FORWARD \
  -i eth_loc \
  -o eth_inet \
  -s 192.168.1.0/24 \
  -m conntrack --ctstate NEW,ESTABLISHED,RELATED \
  -j ACCEPT

# Разрешаем ответы из интернета
iptables -A FORWARD \
  -i eth_inet \
  -o eth_loc \
  -d 192.168.1.0/24 \
  -m conntrack --ctstate ESTABLISHED,RELATED \
  -j ACCEPT

# (Рекомендуется) Закрываем остальной FORWARD
iptables -P FORWARD DROP

#
# Вносим изменения в таблицу nat
# Делаем маскарадинг
iptables -t nat -A POSTROUTING \
  -s 192.168.1.0/24 \
  -o eth_inet \
  -j MASQUERADE

Теперь все запросы из локальной сети могут выходить в интернет, при этом ip-адреса исходящих пакетов будут заменены на внешний ip хоста. Если забыть про маскарадинг соединения, пакеты дойдут до интернет-сервера, но обратно вернуться не смогут из-за локального ip.

При использовании MASQUERADE, ядро определяет ip-адрес для интерфейса eth_inet для каждого пакета, а также сбрасывает все conntrack-записи. Все это сильно замедляет пересылку пакетов. Поэтому, если у хоста есть статический ip-адрес лучше использовать SNAT

SNAT example

Есть хостовый компьютер, который выполняет функцию роутера. У него 2 сетевые карты: eth_loc смотрит в локальную сеть (192.168.1.0/24), eth_inet смотрит в итнернет, имеет статический ip 100.101.102.103. Нужно настроить таблицы iptables таким образом, чтобы компьютеры из локальной сети могли ходить в интернет используя SNAT.

iptables SNAT
# Включаем IP forwarding. Разрешаем шлюзу передавать транзитный трафик
sysctl -w net.ipv4.ip_forward=1

#
# Вносим изменения в таблицу filter
# Разрешаем исходящие соединения из LAN
iptables -A FORWARD \
  -i eth_loc \
  -o eth_inet \
  -s 192.168.1.0/24 \
  -m conntrack --ctstate NEW,ESTABLISHED,RELATED \
  -j ACCEPT

# Разрешаем ответы из интернета
iptables -A FORWARD \
  -i eth_inet \
  -o eth_loc \
  -d 192.168.1.0/24 \
  -m conntrack --ctstate ESTABLISHED,RELATED \
  -j ACCEPT

# (Рекомендуется) Закрываем остальной FORWARD
iptables -P FORWARD DROP

#
# Вносим изменения в таблицу nat
# Делаем подмену адреса у исходящих пакетов
iptables -t nat -A POSTROUTING \
  -s 192.168.1.0/24 \
  -o eth_inet \
  -j SNAT --to-source 100.101.102.103

# Происходит явная подмена source-IP на фиксированный внешний адрес хоста --to-source 100.101.102.103

SNAT предпочтительнее MASQUERADE при статическом IP, так как не требует динамического определения адреса интерфейса, работает быстрее и не сбрасывает существующие соединения при изменении состояния интерфейса.

DNAT example

Есть хостовый компьютер, который выполняет функцию роутера. У него 2 сетевые карты: eth_loc смотрит в локальную сеть (192.168.1.0/24 ), eth_inet смотрит в итнернет, имеет статический ip 100.101.102.103. В локальной сети есть хост с адресом 192.168.1.10, на нем работает веб-приложение на 80 порте, к которому нужно предоставить доступ из сети интернет.

Для решения данной задачи подходит DNAT в связке с SNAT. Такую же технологию применяет Docker для предоставления доступа к своим контейнерам извне.

iptables DNAT
# Включаем IP forwarding. Разрешаем шлюзу передавать транзитный трафик
sysctl -w net.ipv4.ip_forward=1

#
# Вносим изменения в таблицу filter
# Разрешаем входящий трафик из интернета
iptables -A FORWARD \
  -i eth_inet \
  -o eth_loc \
  -d 192.168.1.10 \
  -p tcp --dport 80 \
  -m conntrack --ctstate NEW,ESTABLISHED,RELATED \
  -j ACCEPT

# Разрешаем ответный трафик от локального хоста
iptables -A FORWARD \
  -i eth_loc \
  -o eth_inet \
  -s 192.168.1.10 \
  -p tcp --sport 80 \
  -m conntrack --ctstate ESTABLISHED,RELATED \
  -j ACCEPT

# (Рекомендуется) Закрываем остальной FORWARD
iptables -P FORWARD DROP

#
# Вносим изменения в таблицу nat
# Добавляем правило в цепочку PREROUTING
iptables -t nat -A PREROUTING \
  -i eth_inet \
  -d 100.101.102.103 \
  -p tcp --dport 80 \
  -j DNAT --to-destination 192.168.1.10:80
# Все пакеты приходящие на 80 порт внешнего сетевого интерфейса, будут перенаправлены
# на хост в локальной сети -j DNAT --to-destination 192.168.1.10:80

# Включаем SNAT для исходящих пакетов от локального хоста
iptables -t nat -A POSTROUTING \
  -s 192.168.1.10 \
  -o eth_inet \
  -j SNAT --to-source 100.101.102.103 # подменяем ip ответных пакетов

DNAT применяется для изменения адреса назначения пакета и используется при пробросе портов и публикации внутренних сервисов во внешнюю сеть.

web-server example

Имеем веб-сервер в интернете, хотим настроить файрвол таким образом, чтобы к нему можно было получать доступ по HTTP/HTTPS, а также подключаться по SSH для управления.

iptables for web-server
# Loopback
iptables -A INPUT -i lo -j ACCEPT

# Уже установленные соединения
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# SSH, лучше поменять порт
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Еще надежнее разрешить доступ по SSH только определенных ip, белый лист
iptables -A INPUT -p tcp --dport 22 -s 1.2.3.4 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

# HTTP / HTTPS
iptables -A INPUT -p tcp --dport 80,443 -j ACCEPT

# Политики по умолчанию
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

brute-force example

Конфигурируем файрвол зашищать от брутфорс атаки (перебор паролей) на уровне ядра. Если какой-то ip-адрес пытается несколько раз подряд залогинится на сервер в течении определенного времени, он блокируется. SSH работает на альтернативном порту.

iptables for brute-force ssh
# Разрешаем уже установленные соединения
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Жёсткий лимит против сканеров
iptables -A INPUT -p tcp --dport 22000 \
  -m conntrack --ctstate NEW \
  -m hashlimit \
  --hashlimit 30/min \
  --hashlimit-burst 30 \
  --hashlimit-mode srcip \
  --hashlimit-name SSH_FLOOD \
  -j ACCEPT

# Мягкий лимит для обычных пользователей
iptables -A INPUT -p tcp --dport 22000 \
  -m conntrack --ctstate NEW \
  -m hashlimit \
  --hashlimit 6/min \
  --hashlimit-burst 6 \
  --hashlimit-mode srcip \
  --hashlimit-name SSH_USER \
  -j ACCEPT

iptables -A INPUT -p tcp --dport 22000 -j DROP

nftables


ip_forward

Маршрутизация IP и форвардинг

  • IP-forwarding — это процесс пересылки IP-пакетов от узла-отправителя к узлу–получателю в IP-сети с произвольной топологией на основе решения задачи о маршрутизации.
  • IP-routing – это процесс решающий задачу выбора наилучшего маршрута.
  • Node (сетевой узел) — любое устройство имеющее сетевой интерфейс с настроенным протоколом TCP/IP;
  • Host (хост) — узел, не обладающий возможностями маршрутизации пакетов;
  • Router (маршрутизатор) — узел, обладающий возможностями маршрутизации (перенаправление дейтаграмм из одной сети в другую), обычно такой узел имеет несколько сетевых-интерфейсов (со своими MAC- и IP-адресами), подключенными к разным IP-сетям.

Фундаментальная разница между хостом и маршрутизатором заключается в том, что хост никогда не перенаправляет дейтаграммы с одного своего интерфейса на другой, но, IP-уровень на узле может быть сконфигурирован таким образом, чтобы выполнять функции маршрутизации (ip-forwarding), в дополнение к тому, что он работает в качестве сетевого интерфейса, иначе дейтаграммы, не предназначенные хосту, будут молча удалены.

В целом процесс IP-пересылки одинаков в сетях любого размера и представляет собой серию отдельных операций прямой или косвенной маршрутизации пакетов.

Если целевая сеть непосредственно подключена к маршрутизатору, то для отправки пакетов используется прямая пересылка, иначе - косвенная пересылка через посредника.

Пути доступа к удаленной сети маршрутизатор узнаёт с помощью маршрутизации статической (информацию вручную вводит администратор) или динамической (местоположение сетей определяется из информации от соседних маршрутизаторов).

Процесс прямой IP-пересылки.

Когда один узел IP-сети отправляет пакет другому узлу, то в заголовке IP указываются IP-адрес отправителя и IP-адрес получателя. Отправка пакета происходит следующим образом:

  1. Отправитель определяет, находится ли получатель в той же самой IP-сети, что и отправитель (локальной), или в другой IP-сети (удаленной). Для этого отправитель производит поразрядное умножение IP-отправителя и IP-получателя на маску подсети-отправителя. Если результаты совпадают, значит, оба узла находятся в одной подсети.
  2. Если узлы в одной IP-сети, то отправитель проверяет ARP-кэш на наличие MAC-адреса получателя. Если нужная запись имеется, то дальше отправка пакетов производится напрямую узлу-получателю на канальном уровне. Если нужной записи нет, то отправитель посылает ARP-запрос с IP-адресом получателя, ответ помещает в ARP- кэш и передача пакета также производится на канальном уровне (между сетевыми адаптерами компьютеров).
  3. Если отправитель и получатель расположены в разных IP-сетях, то отправитель посылает данный пакет сетевому узлу, который указан в таблице маршрутизации как наилучший или который в конфигурации отправителя указан как DefaultGateway. Основной шлюз всегда находится в той же IP-сети, что и узел-отправитель, поэтому взаимодействие происходит на канальном уровне (после выполнения ARP-запроса).

Маршрутизация транзитных IP-пакетов (не предназначенных для этого компьютера), или IP-форвардинг, является опциональной возможностью IP-стека Linux. По умолчанию функция форвардинга не активируется, и система не пересылает транзитные пакеты через свои интерфейсы, а только обрабатывает адресованные ей пакеты. Включение форвардинга IP-пакетов производится через параметр net.ipv4.ip_forward интерфейса sysctl. Если значение этого параметра равно 0, то форвардинг отключен, если же значение параметра не равно 0, форвардинг включен:

ip_forward
sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0

# пересылка трафика между интерфейсами включается командой:
echo 1 > /proc/sys/net/ipv4/ip_forward

# Или при помощи команды sysctl
sysctl net.ipv4.ip_forward=1

# Чтобы настройка сохранилась после перезагрузки, необходимо указать в /etc/sysctl.conf строку:
net.ipv4.ip_forward = 1

В процессе маршрутизации для выбора интерфейса и следующего узла для доставки пакета (next hop) ядро использует таблицу маршрутизации. Эта таблица представляет список критериев, в соответствии с которыми выбирается следующий узел. В частности, в таблице маршрутизации фигурируют следующие условия: адрес сети получателя пакета, маска подсети получателя пакета, IP-адрес следующего узла, метрика маршрута и служебные поля (например, тип и возраст записи). Таблица маршрутизации используется не только в IP-форвардинге, но и даже при простой отсылке IP-пакета для выбора интерфейса, через который будет производиться отсылка пакета.

Запись о сети с адресом 0.0.0.0 и маской подсети 0.0.0.0 называют маршрутом по умолчанию, или default route. Узел, чей адрес указан в поле gateway для маршрута по умолчанию, называют маршрутизатором по умолчанию, или default gateway или default router. В системе может быть произвольное количество маршрутов по умолчанию, но они должны быть как минимум с разными метриками. Для просмотра таблицы маршрутизации можно воспользоваться командой route. Эта команда позволяет оперировать с таблицей маршрутов, добавляя и удаляя из нее записи.