Netfilter не блокирует пакеты, как должно?

Вопрос или проблема

В целях тестирования я создал следующий nftables.conf на машине с ядром 6.1.0 и nftables 1.0.6:

table netdev t_NETDEV_enp0s3 {
  chain enp0s3-ingress-filter {
    type filter hook ingress device "enp0s3" priority filter; policy drop;
    ether type 0x0806 arp ptype 0x0800 accept
    ether type 0x0800 accept
    log prefix "foo: " drop
  }
} 

table ip t_IP {

  chain prerouting-nat {
    type nat hook prerouting priority dstnat; policy drop;
    log prefix "ip4-prerouting-nat:" drop;
  }
  chain prerouting-filter {
    type filter hook prerouting priority filter; policy drop;
    log prefix "ip4-prerouting-filter:" drop;
  }

  chain input-nat {
    type nat hook input priority dstnat; policy drop;
    log prefix "ip4-input-nat:" drop;
  }
  chain input-filter {
    type filter hook input priority filter; policy drop;
    log prefix "ip4-input-filter:" drop;
  }

  chain forward-filter {
    type filter hook forward priority filter; policy drop;
    log prefix "ip4-forward-filter:" drop;
  }

  chain output-nat {
    type nat hook output priority srcnat; policy drop;
    log prefix "ip4-output-nat:" drop;
  }
  chain output-filter {
    type filter hook output priority filter; policy drop;
    log prefix "ip4-output-filter:" drop;
  }
  chain output-route {
    type route hook output priority mangle; policy drop;
    log prefix "ip4-output-route:" drop;
  }

  chain postrouting-nat {
    type nat hook postrouting priority srcnat; policy drop;
    log prefix "ip4-postrouting-nat:" drop;
  }
  chain postrouting-filter {
    type filter hook postrouting priority filter; policy drop;
    log prefix "ip4-postrouting-filter:" drop;
  }
}

Я понимаю, что эти правила не имеют смысла; они являются частью тестового сценария.

Когда они активны, я ожидаю, что никакие пакеты IPv4 не смогут попасть к любому приложению, работающему на машине. Согласно мануалу nft (в разделе “VERDICT STATEMENT”) (выделено мной):

accept Завершить оценку набора правил и принять пакет. Пакет всё ещё может быть отброшен позже другим крюком, например, если он принят в крюке forward, его всё равно можно отбросить позже в крюке postrouting, или другой базовой цепочкой forward, которая имеет более высокий приоритет и оценивается позже в процессе обработки.

drop Завершить оценку набора правил и отбросить пакет. Отбрасывание происходит мгновенно, дальнейшие цепочки или крюки не оцениваются. Невозможно принять пакет позже в другой цепочке снова, так как они больше не оцениваются для пакета.

Однако пакеты действительно поступают в приложения на этой машине. Например, там работает SSH сервер, и я могу удаленно подключиться через этот сервер по сети. Согласно моему пониманию, этого не должно быть возможным по следующим причинам:

  • Все цепочки в t_IP имеют политику drop и не содержат никаких правил, так что они должны вести себя так, как если бы было установлено явное решение drop для всех пакетов, проходящих через эту цепочку.

  • Я настроил одну цепочку, как описано выше, для каждой возможной комбинации (согласно мануалу nft) типа крюка и цепочки, которая поддерживается в IP семье.

  • Это означает, что каждый пакет IPv4 должен проходить через как минимум одну из этих цепочек после прохождения через цепочку ingress, поскольку ingress – это первый крюк, а другие крюки обрабатываются позже (согласно документации).

  • Это в свою очередь означает, что каждый пакет IPv4 должен быть отброшен (если цитата выше не является ошибочной), потому что решение drop в каждой цепочке в t_IP перекрывает решение accept из цепочки ingress.

Дополнительные подсказки:

  • IPv6 полностью отключен на этой машине (с помощью обычного параметра ядра).
  • enp0s3 назначен единственный IP адрес.
  • SSH сервер слушает только на этом IP адресе.
  • Следовательно, невозможно добиться доступа к SSH серверу другим способом, кроме как через enp0s3 / IPv4.

Кто-нибудь может объяснить, почему сервер SSH доступен, то есть почему пакеты не отбрасываются до достижения локальных приложений?

.

Ответ или решение

Если вы обратили внимание, что пакеты не отбрасываются, как ожидалось, при помощи конфигурации nftables, важно удостовериться, что все параметры и настройки были учтены правильно. В данном случае, проблема может быть связана с несколькими факторами, которые стоит рассмотреть:

  1. Приоритеты цепочек и хуков: Первым делом, нужно убедиться, что все правила и политики действительно применяются к нужным хукам и цепочкам. Ваша конфигурация, по крайней мере на первый взгляд, устанавливает policy drop для всех цепочек в таблице t_IP. Однако, стоит проверить, не используются ли где-то другие таблицы или цепочки, которые могли бы отменять эти правила.

  2. Правильность написания синтаксиса: Хотя конфигурация выглядит правильно, всегда стоит перепроверить наличие синтаксических и логических ошибок. Попробуйте загрузить конфигурацию и убедитесь, что нет ошибок при ее применении с помощью команды nft -f /path/to/nftables.conf.

  3. Логи и диагностика: Проверьте логи, которые генерируются правилами, содержащими log prefix, чтобы убедиться, что цепочки действительно обрабатывают пакеты. Это поможет выяснить, реально ли правила не срабатывают или пакеты каким-то образом обходят ваши правила.

  4. Проверка загрузки конфигурации: Убедитесь, что конфигурация действительно загружена и активно применяется после перезапуска сервиса nftables. Это можно сделать, выполнив nft list ruleset и проверив, что все ожидаемые правила и политики присутствуют.

  5. Проверка самого SSH-сервера: Возможно, SSH-сервер настроен на проброс портов через другой интерфейс или маршрут, который вы не учли. Убедитесь, что SSH действительно находится под управлением правил и проверок этой конкретной конфигурации.

  6. Взаимодействие с другими правилами: Необходимо убедиться, что нет других сетевых инструментов или программ, которые параллельно реализуют свои собственные правила, что может изменять поведение, ожидаемое от правил nftables.

  7. Документация и совместимость: Убедитесь, что ваша версия ядра Linux и nftables поддерживает все используемые вами функции правил. Иногда обновления или конфликты версий могут вызвать неожиданное поведение.

Для получения более конкретной информации рекомендуется детально изучить документацию по nftables и сетевой подсистеме Linux, а также обратиться к сообществу или специалистам, имеющим опыт работы с nftables. Это может помочь раскрыть менее очевидные моменты, которые могли быть упущены.

Оцените материал
Добавить комментарий

Капча загружается...