Вопрос или проблема
В целях тестирования я создал следующий 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, важно удостовериться, что все параметры и настройки были учтены правильно. В данном случае, проблема может быть связана с несколькими факторами, которые стоит рассмотреть:
-
Приоритеты цепочек и хуков: Первым делом, нужно убедиться, что все правила и политики действительно применяются к нужным хукам и цепочкам. Ваша конфигурация, по крайней мере на первый взгляд, устанавливает
policy drop
для всех цепочек в таблицеt_IP
. Однако, стоит проверить, не используются ли где-то другие таблицы или цепочки, которые могли бы отменять эти правила. -
Правильность написания синтаксиса: Хотя конфигурация выглядит правильно, всегда стоит перепроверить наличие синтаксических и логических ошибок. Попробуйте загрузить конфигурацию и убедитесь, что нет ошибок при ее применении с помощью команды
nft -f /path/to/nftables.conf
. -
Логи и диагностика: Проверьте логи, которые генерируются правилами, содержащими
log prefix
, чтобы убедиться, что цепочки действительно обрабатывают пакеты. Это поможет выяснить, реально ли правила не срабатывают или пакеты каким-то образом обходят ваши правила. -
Проверка загрузки конфигурации: Убедитесь, что конфигурация действительно загружена и активно применяется после перезапуска сервиса nftables. Это можно сделать, выполнив
nft list ruleset
и проверив, что все ожидаемые правила и политики присутствуют. -
Проверка самого SSH-сервера: Возможно, SSH-сервер настроен на проброс портов через другой интерфейс или маршрут, который вы не учли. Убедитесь, что SSH действительно находится под управлением правил и проверок этой конкретной конфигурации.
-
Взаимодействие с другими правилами: Необходимо убедиться, что нет других сетевых инструментов или программ, которые параллельно реализуют свои собственные правила, что может изменять поведение, ожидаемое от правил nftables.
-
Документация и совместимость: Убедитесь, что ваша версия ядра Linux и nftables поддерживает все используемые вами функции правил. Иногда обновления или конфликты версий могут вызвать неожиданное поведение.
Для получения более конкретной информации рекомендуется детально изучить документацию по nftables и сетевой подсистеме Linux, а также обратиться к сообществу или специалистам, имеющим опыт работы с nftables. Это может помочь раскрыть менее очевидные моменты, которые могли быть упущены.