Фильтр пакетов macOS (переадресация портов)

Я безуспешно пытаюсь перенаправить исходящий трафик на порт назначения 80 на локальный прокси-порт 127.0.0.1:8080.

/etc/pf.anchors/com.forwarding

rdr pass inet proto tcp from any to any port 80 -> 127.0.0.1 port 8080

/etc/pf.conf

scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
rdr-anchor "myproxy"
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
load anchor "myproxy" from "/etc/pf.anchors/com.forwarding"

Затем:

sudo sysctl net.inet.ip.forwarding=1
sudo pfctl -ef /etc/pf.conf

Локальный трафик 127.0.0.1:80 перенаправляется на 127.0.0.1:8080, а не внешний, в сторону интернета.

Для тех, кому не нужно вручную создавать прокси с нуля, чтобы освоить все части, есть приложение для этого: charlesproxy.com
Спасибо, но моя цель не сам прокси, а самое главное, чтобы это правило работало.
Отлично - я просто хотел, чтобы у людей, которые ищут простой прокси, была такая возможность. Знание — это мощное и глубокое знание, если эта сеть означает, что вы можете делать так много других вещей. С нетерпением жду ответа и, возможно, кое-что узнаю сам

Ответы (1)

Вы можете перенаправлять только входящий трафик. Правило rdr не влияет на любой исходящий трафик на порт 80.

Чтобы перенаправить исходящий трафик на порт 80, вы должны сначала перенаправить его на lo0, а затем перенаправить на порт прокси:

Порядок в конфигурационном файле обязательно следующий : rdr входящие пакеты , затем фильтрация пакетов (типа pass), но хронологически первым сработает 2-е правило (на en0), которое затем активирует первое правило (на lo0).

# Step "2". redirect those same packets that were routed to lo0 below
rdr pass log on lo0 proto tcp from any to any port 80 -> 127.0.0.1 port 8080
# Step "1". Route new IPv4 TCP connections leaving en0 to lo0
pass out on en0 route-to lo0 proto tcp from en0 to any port 80 keep state

в pf.conf это будет выглядеть так:

...
scrub-anchor "com.apple/*"
nat-anchor "com.apple/*"
rdr-anchor "com.apple/*"
rdr pass log on lo0 proto tcp from any to any port 80 -> 127.0.0.1 port 8080
dummynet-anchor "com.apple/*"
anchor "com.apple/*"
load anchor "com.apple" from "/etc/pf.anchors/com.apple"
pass out on en0 route-to lo0 proto tcp from en0 to any port 80 keep state

В приведенном выше примере я предполагаю, что en0 — ваш единственный исходящий en- интерфейс.

Выгрузите текущий pf.conf и остановите pf: sudo pfctl -d. Затем добавьте две дополнительные строки выше. После изменения pf.conf проверьте синтаксис файла, sudo pfctl -vnf /etc/pf.confкоторый должен привести к следующему выводу:

pfctl: Use of -f option, could result in flushing of rules
present in the main ruleset added by the system at startup.
See /etc/pf.conf for further details.

scrub-anchor "/*" all fragment reassemble
nat-anchor "/*" all
rdr-anchor "/*" all
rdr pass log on lo0 proto tcp from any to any port 80 -> 127.0.0.1 port 8080
anchor "/*" all
pass out on en0 route-to lo0 proto tcp from en0 to any port 80 flags S/SA keep state
dummynet-anchor "/*" all

и в случае успеха загрузите его с помощью sudo pfctl -e -f /etc/pf.conf.


Правильная конфигурация системы и прокси (и хорошо работающие приложения) не требуют таких правил pf!

Ага! это работает, большое спасибо за ваши объяснения, это мне очень помогает.