Вопрос или проблема
Я работаю с 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 проблемы:
- Правила трансформации должны быть размещены перед правилами фильтрации. Однако, если все, что изначально предназначалось для внешнего сервера, перенаправляется на localhost:1337, это вызовет бесконечный цикл, так как 2-е правило не будет срабатывать перед 1-м?
- Когда я запускаю
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
вы не видите правила перенаправления. Это может быть связано с тем, что правила не были применены или синтаксически некорректны.
Чтобы убедиться, что ваши правила были правильно загружены, выполните следующие шаги:
-
Проверьте синтаксис: Убедитесь, что ваш конфигурационный файл
/etc/pf.anchors/pf.conf
не содержит синтаксических ошибок. Вы можете сделать это с помощью следующей команды:sudo pfctl -nf /etc/pf.anchors/pf.conf
-
Перезагрузите PF: Если синтаксис правильный, загрузите новые правила:
sudo pfctl -f /etc/pf.anchors/pf.conf
-
Проверьте статус: После перезагрузки проверьте статус правил снова с помощью:
sudo pfctl -sr
Понимание RDR и NAT
Что касается вопроса о том, действительно ли RDR работает только с NAT и может ли он перенаправлять пакеты, направленные наружу, на локальный интерфейс – да, в общем случае, rdr
в pf
подразумевает применение для NAT. Однако в ситуации, когда вы правильно указываете порядок и исключаете конфликты с правилами pass
, это может работать и в вашем случае.
Заключение
Использование pf
на macOS требует тщательной проработки правил для минимизации конфликтов. Внимательное внесение изменений в порядок правил и их структурирование поможет избежать зацикливаний и позволит добиваться нужных результатов. При правильной настройке pf
будет эффективно направлять трафик, как вы задумали.
Если у вас остались вопросы, не стесняйтесь обращаться за помощью.