Я безуспешно пытаюсь перенаправить исходящий трафик на порт назначения 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, а не внешний, в сторону интернета.
Вы можете перенаправлять только входящий трафик. Правило 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!
bmike
аминович
bmike