Вопрос или проблема
Я настраиваю nftables почти в первый раз. Я хочу применить строгие правила на одном сервере, чтобы разрешить только исходящие ssh на один резервный сервер (scp). Я применил следующий набор правил, но соединение ssh завершилось по тайм-ауту. Если я сбрасываю правила, оно сразу начинает работать. В чем проблема?
table inet ssh_backup {
chain input {
type filter hook input priority filter; policy drop;
iif "lo" accept
iif "lo" ip saddr != 127.0.0.0/8 drop
ip saddr 53.75.121.201 tcp sport 22 accept
}
chain output {
type filter hook output priority filter; policy drop;
oif "lo" accept
oif "lo" ip daddr != 127.0.0.0/8 drop
ip daddr 53.75.121.201 tcp dport 22 accept
}
chain forward {
type filter hook output priority filter; policy drop;
}
}
Ответ или решение
Ваша ситуация с настройкой nftables может быть связана с несколькими ошибками в вашем конфигурационном файле. nftables — это мощный инструмент для фильтрации пакетов в Linux, который позволяет управлять входящими и исходящими соединениями на основе различных критериев. Рассмотрим детально, в чем может быть проблема и как её можно исправить.
Теория:
nftables управляет сетевым трафиком с помощью таблиц, цепочек и правил. У вас настроены три цепочки: input
, output
и forward
. При описании конфигурации ключевыми моментами являются:
- наличие правильных интерфейсов (iif/oif), которые обрабатываются каждой цепочкой;
- корректное определение источника и назначения адресов;
- правильное использование приоритетов и политик (policy) для обработки пакетов.
Ошибки в конфигурации могут быть связаны с использованием неправильных интерфейсов, отсутствием необходимых правил для организации трафика, или ошибочным пониманием логики цепочек nftables
. Например, если политика цепочки установлена на "drop" по умолчанию, то пакеты, не соответствующие ни одному правилу, будут отброшены. Давайте рассмотрим вашу существующую конфигурацию и подчеркнем ключевые моменты, требующие исправления.
Пример:
Рассмотрим исходную конфигурацию и выявим основные проблемы:
table inet ssh_backup {
chain input {
type filter hook input priority filter; policy drop;
iif "lo" accept
iif "lo" ip saddr != 127.0.0.0/8 drop
ip saddr 53.75.121.201 tcp sport 22 accept
}
chain output {
type filter hook output priority filter; policy drop;
oif "lo" accept
oif "lo" ip daddr != 127.0.0.0/8 drop
ip daddr 53.75.121.201 tcp dport 22 accept
}
chain forward {
type filter hook output priority filter; policy drop;
}
}
Анализ проблемы:
-
Цепочка input:
- Вы указали правило для входящих соединений, которое принимает пакеты с IP-адресом
53.75.121.201
только из порта 22. Возможно, вы ожидаете получение пакетов ssh с бэкап-сервера, а нужно принимать соединения к вашему серверу. В обычной ситуации входящие SSH-пакеты будут иметьdport 22
, а неsport 22
.
- Вы указали правило для входящих соединений, которое принимает пакеты с IP-адресом
-
Цепочка output:
- Правило определяет, что исходящие SSH-соединения разрешены только к IP-адресу
53.75.121.201
на порт 22, что, в принципе, корректно для вашего намерения отправки файлов на бэкап-сервер через scp.
- Правило определяет, что исходящие SSH-соединения разрешены только к IP-адресу
-
Общая проблема:
- Также вы завершаете цепочку
forward
с хукомoutput
, что не имеет смысла, так какforward
используется для пакетов, которые проходят через ваш сервер до другого узла. Хукoutput
должен быть использован для пакетов, которые непосредственно исходят из вашего сервера.
- Также вы завершаете цепочку
Применение:
Поправьте правила цепочки input и forward:
table inet ssh_backup {
chain input {
type filter hook input priority filter; policy drop;
iif "lo" accept
iif "lo" ip saddr != 127.0.0.0/8 drop
# Правило должно принимать пакеты, приходящие НА ssh-порт вашего сервера
tcp dport 22 ip saddr 53.75.121.201 accept
}
chain output {
type filter hook output priority filter; policy drop;
oif "lo" accept
oif "lo" ip daddr != 127.0.0.0/8 drop
# Здесь, как и прежде, мы отправляем данные на сервер, поэтому это правило корректно
ip daddr 53.75.121.201 tcp dport 22 accept
}
# Удалите цепочку forward или скорректируйте её в контексте, если действительно нужна маршрутизация
# Например, если сервер является промежуточным звеном между двумя другими сетями.
}
Заключение:
Ваши проблемы могут быть связаны не только с неправильными правилами, но и с более тонкими аспектами конфигурации, такими как установленные интерфейсы, которые обрабатываются каждой цепочкой. Убедитесь, что интерфейсы соответствуют реальной инфраструктуре, и проверьте корректность всех адресов и портов. Используйте инструменты отладки, такие как nft list ruleset
, чтобы убедиться в том, как применяются правила в вашем сетевом трафике. Важно помнить, что даже незначительная ошибка может нарушить весь процесс фильтрации, поэтому тщательная проверка конфигурации — это ключ к успеху.