Правило перенаправления PF не валидируется на Darwin.

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

Я работаю с pf на OSX 13.6.1 и хотел создать правило, чтобы все исходящие TCP пакеты к 146.59.110.108:1337 (пример) перенаправлялись на 127.0.0.1:1337, кроме тех, которые приходят с 127.0.0.1:7331, которые должны разрешаться и возвращаться на 146.59.110.108:1337.

Я создал эти 2 правила в /etc/pf.anchors/pf.conf

# Перенаправляет исходящий трафик на внешний сервер на локальный прокси
rdr on en0 inet proto tcp from any to 146.59.110.108 port 1337 -> 127.0.0.1 port 1337

# Разрешает трафик, уже перенаправленный через прокси (и выходящий сейчас с другого порта), достичь внешнего сервера
pass out on en0 inet proto tcp from 127.0.0.1 port 7331 to 146.59.110.108 port 1337

Существуют 2 проблемы:

  1. Правила трансформации должны быть размещены перед правилами фильтрации. Однако, если все, что изначально предназначалось для внешнего сервера, перенаправляется на localhost:1337, это вызовет бесконечный цикл, так как 2-е правило не будет срабатывать перед 1-м?
  2. Когда я запускаю pfctl -sr для проверки правил, показывается только правило pass, но не правило перенаправления.
    pass out on en0 inet proto tcp from 127.0.0.1 port = 7331 to 146.59.110.146 port = 1337 flags S/SA keep state
    ALTQ также отсутствует в ядре, однако я не думаю, что это влияет на результат.

Правда ли, что RDR работает только с NAT и не может перенаправлять пакеты, отправленные на внешний адрес, обратно на локальный интерфейс? И знает ли кто, как обойти это для исправления?

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

Введение

В случае работы с pf (Packet Filter) на операционной системе Darwin (macOS) могут возникнуть определённые сложности при настройке правил перенаправления трафика, особенно если требуется выполнять исключения для определённых диапазонов IP-адресов и портов. В вашем вопросе описывается задача перенаправления исходящего TCP-трафика на локальный адрес, а также использование фильтрации для исключений. Рассмотрим, как обращаться с проблемами, возникающими при этом.

Проблема 1: Порядок правил и зацикливание

Вы правильно подметили, что правила перенаправления (RDR) должны располагаться перед правилами фильтрации (pass). Если вы перенаправляете весь трафик, который направляется к 146.59.110.108:1337, на локальный адрес, вы действительно рискуете вызвать зацикливание, так как изначально перенаправленный трафик может вновь соответствовать первому правилу.

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

# Разрешить локальные исходящие пакеты с порта 7331 на внешний адрес
pass out on en0 inet proto tcp from 127.0.0.1 port 7331 to 146.59.110.108 port 1337

# Перенаправление исходящего трафика к серверу
rdr on en0 inet proto tcp from any to 146.59.110.108 port 1337 -> 127.0.0.1 port 1337

При таком порядке правила, pass будет проверяться перед rdr, что позволит избежать создания зацикливания.

Проблема 2: Не отображение правила RDR

При выполнении команды pfctl -sr вы не видите правила перенаправления. Это может быть связано с тем, что правила не были применены или синтаксически некорректны.

Чтобы убедиться, что ваши правила были правильно загружены, выполните следующие шаги:

  1. Проверьте синтаксис: Убедитесь, что ваш конфигурационный файл /etc/pf.anchors/pf.conf не содержит синтаксических ошибок. Вы можете сделать это с помощью следующей команды:

    sudo pfctl -nf /etc/pf.anchors/pf.conf
  2. Перезагрузите PF: Если синтаксис правильный, загрузите новые правила:

    sudo pfctl -f /etc/pf.anchors/pf.conf
  3. Проверьте статус: После перезагрузки проверьте статус правил снова с помощью:

    sudo pfctl -sr

Понимание RDR и NAT

Что касается вопроса о том, действительно ли RDR работает только с NAT и может ли он перенаправлять пакеты, направленные наружу, на локальный интерфейс – да, в общем случае, rdr в pf подразумевает применение для NAT. Однако в ситуации, когда вы правильно указываете порядок и исключаете конфликты с правилами pass, это может работать и в вашем случае.

Заключение

Использование pf на macOS требует тщательной проработки правил для минимизации конфликтов. Внимательное внесение изменений в порядок правил и их структурирование поможет избежать зацикливаний и позволит добиваться нужных результатов. При правильной настройке pf будет эффективно направлять трафик, как вы задумали.

Если у вас остались вопросы, не стесняйтесь обращаться за помощью.

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

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