ошибка конфигурации nftables

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

Я настраиваю 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;
    }
}

Анализ проблемы:

  1. Цепочка input:

    • Вы указали правило для входящих соединений, которое принимает пакеты с IP-адресом 53.75.121.201 только из порта 22. Возможно, вы ожидаете получение пакетов ssh с бэкап-сервера, а нужно принимать соединения к вашему серверу. В обычной ситуации входящие SSH-пакеты будут иметь dport 22, а не sport 22.
  2. Цепочка output:

    • Правило определяет, что исходящие SSH-соединения разрешены только к IP-адресу 53.75.121.201 на порт 22, что, в принципе, корректно для вашего намерения отправки файлов на бэкап-сервер через scp.
  3. Общая проблема:

    • Также вы завершаете цепочку 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, чтобы убедиться в том, как применяются правила в вашем сетевом трафике. Важно помнить, что даже незначительная ошибка может нарушить весь процесс фильтрации, поэтому тщательная проверка конфигурации — это ключ к успеху.

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

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