Видел несколько похожих тем но так и не нашел решения.Дано - стоит машинка FreeBSD 9.0 + PF
2 сетевые карты, одна снаружи с белым IP, вторая внутри шлюзом у всех машинsysctl ip.forwarding включен
gateway_enable="YES" стоитпроблема: работает NAT, работает форвард снаружи - не работает форвард изнутри на локальный порт машины
Конкретно - перехват порта 80 с заворачиванием на squid, но это в данном случае не важно т.к. не работает никакой перехват - например проброс на локальный адрес на порт 22 тоже не работаетПо результатам tcpdump - пакеты на внутреннем интерфейсе видны, а на lo0 уже ничего нет
'pfctl -sa' правило редиректа показывает (fxp0 - внутренняя карточка) :
rdr pass on fxp0 inet proto tcp from 192.168.200.0/24 to any port = http -> 192.168.200.1 port 3127
[ Evaluations: 27 Packets: 21 Bytes: 1040 States: 4 ]
[ Inserted: uid 0 pid 82759 State Creations: 8 ]пробую с машины 192.168.200.8, с нее разрешил вообще все (см ниже конфиг)
Конфиг PF:
ext_if="xl0"
int_if="fxp0"
internal_net=$int_if:networktcp_services="{ 13671 }"
allowed_ports="{5190, 2041, 2042, 2043, 2044}"
web_ports="{80, 8080, 443}"
icmp_types="echoreq"table <remote> {ИПшники}
table <priv> {ИПшники тех кто не все}set block-policy drop
set loginterface $ext_ifset skip on ng
nat on $ext_if from $internal_net to any -> ($ext_if)
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"rdr pass on $ext_if proto tcp from <remote> to $ext_if port 81 -> 192.168.200.1 port 81
rdr pass on $ext_if proto tcp from <remote> to $ext_if port 443 -> 192.168.200.7
rdr pass on $int_if proto tcp to !($int_if) port ftp -> 127.0.0.1 port 8021
rdr pass on $int_if proto { tcp } from $internal_net to any port 80 -> 192.168.200.1 port 3127pass quick log from 192.168.200.8 to any
antispoof quick for { lo $int_if }
anchor "ftp-proxy/*"
block in log on $ext_ifpass in quick on $int_if from any to any
pass out quick on $int_if from any to anypass out quick on $ext_if from ($ext_if) to any
pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services
pass in on $ext_if inet proto tcp from <remote> to 192.168.200.7 port 443 synproxy statepass out quick on $ext_if proto udp from $internal_net to any port 123 keep state
pass out quick on $ext_if from <priv> to anypass out on $ext_if proto {tcp, udp} from $internal_net to any port $allowed_ports
UPDATE:
а) при написании правила редиректа в виде
rdr pass on $int_if proto { tcp } from $internal_net to any port 87 -> 192.168.200.1 port 3127
Редирект при обращении на сам хост 192.168.200.1 на порт 87 работает нормально - идет коннект на висящий на машинке Сквид ('telnet 192.168.200.1 87' с машины внутри сети)
А вот например 'telnet ya.ru 87' виснет на connecting to ya.ru...б) при написания редиректа на лупбэк:
rdr pass on $int_if proto { tcp } from $internal_net to any port 87 -> 127.0.0.1 port 3127
уже не работает ничего, ни на саму машину ни наружуIP-адрес ya.ru резолвится нормально, проверил
машина имеет полные права ходить везде (pass quick log from 192.168.200.8 to any - в правилах)
>[оверквотинг удален]
> int_if="fxp0"
> internal_net=$int_if:network
> tcp_services="{ 13671 }"
> allowed_ports="{5190, 2041, 2042, 2043, 2044}"
> web_ports="{80, 8080, 443}"
> icmp_types="echoreq"
> table <remote> {ИПшники}
> table <priv> {ИПшники тех кто не все}
> set block-policy drop
> set loginterface $ext_ifДобавьте set state-policy if-bound
> set skip on ng
Если это интерфейс mpd, то это вы зря. Лучше up/down скриптами добавлять\удалять правила для ВПНа.
>[оверквотинг удален]
> nat-anchor "ftp-proxy/*"
> rdr-anchor "ftp-proxy/*"
> rdr pass on $ext_if proto tcp from <remote> to $ext_if port
> 81 -> 192.168.200.1 port 81
> rdr pass on $ext_if proto tcp from <remote> to $ext_if port 443
> -> 192.168.200.7
> rdr pass on $int_if proto tcp to !($int_if) port ftp -> 127.0.0.1
> port 8021
> rdr pass on $int_if proto { tcp } from $internal_net to any
> port 80 -> 192.168.200.1 port 3127Отвыкайте от этой плохой привычки втупую разрешать трафик в правилах nat/rdr. Вы же теряете контроль над ним. Лично я дополнительно прописываю потом разрешающие правила на внешний интерфейс с разрилчными лимитами. Например, доступ к рабочему столу виндовой машины в локальной сети
rdr on $ext_if inet proto tcp from any to ($ext_if) port 3389 -> 10.11.1.2 port 3389
pass in quick on $ext_if inet proto tcp from <me> to !(self) port 3389 (max 10)Теперь конкретно о вашей проблеме. Допустим, сквид или чето-там висит на 127.0.0.1:3128 и вы хотите перенаправить весь трафик от пользователей локальной сети с портом назначения 80 на локальный проксик (получается transparent proxy),
тогда:
rdr on $int_if inet proto tcp from ($int_if:network) to !(self) port 80 -> 127.0.0.1 port 3128
pass in log quick on $int_if inet proto tcp from ($int_if:network) to 127.0.0.1 port 3128
>[оверквотинг удален]
> - идет коннект на висящий на машинке Сквид ('telnet 192.168.200.1 87'
> с машины внутри сети)
> А вот например 'telnet ya.ru 87' виснет на connecting to ya.ru...
> б) при написания редиректа на лупбэк:
> rdr pass on $int_if proto { tcp } from $internal_net to any
> port 87 -> 127.0.0.1 port 3127
> уже не работает ничего, ни на саму машину ни наружу
> IP-адрес ya.ru резолвится нормально, проверил
> машина имеет полные права ходить везде (pass quick log from 192.168.200.8 to
> any - в правилах)
Сделал как вы писали:
rdr on $int_if inet proto tcp from ($int_if:network) to !(self) port 80 -> 127.0.0.1 port 3127
pass in log quick on $int_if inet proto tcp from ($int_if:network) to 127.0.0.1 port 3127
(3127 - не опечатка, у меня сквид на 3127 слушает на транспарент-прокси)sockstat | grep 3127
squid squid 1380 13 tcp4 *:3127 *:*
(слушает на всех интерфейсах опять же для отладки, когда заработает - повешу только на 127.0.0.1)Но увы, эффекта нет - tcpdump на внутреннем интерфейсе видит приходящие пакеты
10:51:41.416794 IP 192.168.200.8.51199 > www.yandex.ru.http: Flags [S], seq 3312057733, win 8192, options [mss 1460,nop,nop,sackOK], length 0
10:51:42.805104 IP 192.168.200.8.51201 > yandex.ru.http: Flags [S], seq 493083439, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0а вот на lo0 - нет ни одного пакета.
>[оверквотинг удален]
> squid squid 1380
> 13 tcp4 *:3127
> *:*
> (слушает на всех интерфейсах опять же для отладки, когда заработает - повешу
> только на 127.0.0.1)
> Но увы, эффекта нет - tcpdump на внутреннем интерфейсе видит приходящие пакеты
> 10:51:41.416794 IP 192.168.200.8.51199 > www.yandex.ru.http: Flags [S], seq 3312057733,
> win 8192, options [mss 1460,nop,nop,sackOK], length 0
> 10:51:42.805104 IP 192.168.200.8.51201 > yandex.ru.http: Flags [S], seq 493083439, win
> 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0Но у меня-то работает. Причем еще и ALTQ есть. Что-то делаете не так.
Давайте весь конфиг.
Вот весь текущий конфиг: (У меня тоже жила себе Free6.4, работала...)
Ядро сейчас стоковое - компилил свое но пока откатился чтобы исключить эту возможную причину. Система ставилась сразу 9.0, + делался апдейт через cvsup самой системы и портовext_if="xl0"
int_if="fxp0"
internal_net=$int_if:networktcp_services="{ 13671 }"
allowed_ports="{5190, 2041, 2042, 2043, 2044}"
web_ports="{80, 8080, 443}"
icmp_types="echoreq"table <remote> {IP}
table <priv> {IP, IP, IP}set block-policy drop
set loginterface $ext_if
set state-policy if-boundset skip on ng
nat on $ext_if from $internal_net to any -> ($ext_if)
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"rdr pass on $ext_if proto tcp from <remote> to $ext_if port 81 -> 192.168.200.1
rdr pass on $ext_if proto tcp from <remote> to $ext_if port 443 -> 192.168.200.7rdr pass on $int_if proto tcp to !($int_if) port ftp -> 127.0.0.1 port 8021
rdr on $int_if inet proto tcp from ($int_if:network) to !(self) port 80 -> 127.0.0.1 port 3127
pass in log quick on $int_if inet proto tcp from ($int_if:network) to 127.0.0.1 port 3127pass quick log from 192.168.200.8 to any
antispoof quick for { lo $int_if }
anchor "ftp-proxy/*"
block in log on $ext_if
pass in quick on $int_if from any to any
pass out quick on $int_if from any to anypass out quick on $ext_if from ($ext_if) to any
pass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services
pass in on $ext_if inet proto tcp from <remote> to 192.168.200.7 port 443 synproxy statepass out quick on $ext_if proto udp from $internal_net to any port 123 keep state
pass out quick on $ext_if from <priv> to any
pass out on $ext_if proto {tcp, udp} from $internal_net to any port $allowed_portsА у вас какая версия фряхи? Видел посты с похожей на мою проблемой при апгрейде с 8-ки на 9-ку
>[оверквотинг удален]
> $tcp_services
> pass in on $ext_if inet proto tcp from <remote> to 192.168.200.7 port
> 443 synproxy state
> pass out quick on $ext_if proto udp from $internal_net to any port
> 123 keep state
> pass out quick on $ext_if from <priv> to any
> pass out on $ext_if proto {tcp, udp} from $internal_net to any port
> $allowed_ports
> А у вас какая версия фряхи? Видел посты с похожей на мою
> проблемой при апгрейде с 8-ки на 9-куУ меня 9. Дело в том, что в 9-ке не обовсех ошибках сообщает парсер pfctl. На эти грабли в свое время, как только вышла 9-ка наступил. Мелочная ошибка в синтаксисе, pfctl -nf /etc/pf.conf ошибки не выдает, правила загружаются, но инет не работает. Я даже PR запостил по этому поводу.
Вот если упорядочить и упростить ваши правила, то получится что-то типа этого.
ext_if="xl0"
int_if="fxp0"
internal_net=$int_if:networktcp_services="{ 13671 }"
allowed_ports="{5190, 2041, 2042, 2043, 2044}"
web_ports="{80, 8080, 443}"
icmp_types="echoreq"table <remote> {IP}
table <priv> {IP, IP, IP}set block-policy drop
set loginterface $ext_if
set state-policy if-boundset skip on ng
nat on $ext_if from $internal_net to any -> ($ext_if)
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"rdr on $ext_if proto tcp from <remote> to $ext_if port 81 -> 192.168.200.1
rdr on $ext_if proto tcp from <remote> to $ext_if port 443 -> 192.168.200.7rdr on $int_if inet proto tcp from ($int_if:network) to !($int_if) port ftp -> 127.0.0.1 port 8021
rdr on $int_if inet proto tcp from ($int_if:network) to !($int_if) port 80 -> 127.0.0.1 port 3127## antispoofing
antispoof quick for { lo $int_if }
## At first block all
block in
block out## Allow rules
## ext_ifpass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services
pass in quick on $ext_if inet proto tcp from <remote> to 192.168.200.1 port 81
pass in quick on $ext_if inet proto tcp from <remote> to 192.168.200.7 port 443pass out quick on $ext_if inet from $ext_if to any
## int_if
anchor "ftp-proxy/*"
pass in log quick on $int_if inet proto tcp from ($int_if:network) to 127.0.0.1 port 3127
pass in quick on $int_if from ($int_if:network) to any
pass out quick on $int_if from any to ($int_if:network)Непонятно это.
pass out quick on $ext_if proto udp from $internal_net to any port 123 keep state
Так не получится, т.к. после ната на внешнем интерфейсе локальных адресов уже нет. Выход таков. Тегировать пакеты на внутреннем ифейсе а потом выпускать их на внешнем. Как это делать читайте в FAQe на openbsd.orgpass out quick on $ext_if from <priv> to any
pass out on $ext_if proto {tcp, udp} from $internal_net to any port $allowed_ports
Сейчас попробую ваши причесанные правила.
Судя по всему у меня проблема с недопониманием НАТа, свято верил что на внешнем интерфейсе можно по отправителю из локальной сети фильтровать :)
Посмотрел на дамп, понял всю глубину своего заблуждения...UPDATE
прописал ровно ваш конфиг без последних трех бесполезных правил. Проброса внутри так и нет.
Не может быть такого что в стоковом ядре нужно что-то включить через sysctl например?У меня возникло смутное дежавю - разве при перенаправлении в дампе нет в скобках указания куда оно идет? На вашей системе дамп выглядит так же? (хотя возможно путаю с записами таблицы состояний)
tcpdump -i fxp0 -vv | grep 192.168.200.8
192.168.200.8.63629 > www.yandex.ru.http: Flags [S], cksum 0x8cfb (correct), seq 3067585866, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0pfctl -sn
nat on xl0 inet from 192.168.200.0/24 to any -> (xl0) round-robin
nat-anchor "ftp-proxy/*" all
rdr-anchor "ftp-proxy/*" all
rdr on xl0 inet proto tcp from <remote> to [IP] port = hosts2-ns -> 192.168.200.1
rdr on xl0 inet proto tcp from <remote> to [IP] port = https -> 192.168.200.7
rdr on fxp0 inet proto tcp from (fxp0:network) to ! (fxp0) port = ftp -> 127.0.0.1 port 8021
rdr on fxp0 inet proto tcp from (fxp0:network) to ! (fxp0) port = http -> 127.0.0.1 port 3127pfctl -ss | grep 192.168.200.8
fxp0 udp 255.255.255.255:1947 <- 192.168.200.8:60474 NO_TRAFFIC:SINGLE
fxp0 udp 192.168.200.255:1947 <- 192.168.200.8:60474 NO_TRAFFIC:SINGLE
fxp0 tcp 127.0.0.1:3127 (93.158.134.3:80) <- 192.168.200.8:63707 CLOSED:SYN_SENT
fxp0 tcp 127.0.0.1:3127 (93.158.134.203:80) <- 192.168.200.8:63711 CLOSED:SYN_SENT
fxp0 tcp 127.0.0.1:3127 (213.180.193.3:80) <- 192.168.200.8:63712 CLOSED:SYN_SENTpfctl -sr
block drop in quick on ! lo inet6 from ::1 to any
block drop in quick on ! lo inet from 127.0.0.0/8 to any
block drop in quick inet from 127.0.0.1 to any
block drop in quick on ! fxp0 inet from 192.168.200.0/24 to any
block drop in quick inet from 192.168.200.1 to any
block drop in quick inet6 from ::1 to any
block drop in quick on lo0 inet6 from fe80::1 to any
block drop in quick on fxp0 inet6 from [fe80:IPv6] to any
block drop in all
block drop out all
pass in on xl0 inet proto tcp from any to (xl0) port = ssh-nst flags S/SA keep state (if-bound)
pass in quick on xl0 inet proto tcp from <remote> to 192.168.200.1 port = hosts2-ns flags S/SA keep state (if-bound)
pass in quick on xl0 inet proto tcp from <remote> to 192.168.200.7 port = https flags S/SA keep state (if-bound)
pass out quick on xl0 inet from [IP] to any flags S/SA keep state (if-bound)
anchor "ftp-proxy/*" all
pass in log quick on fxp0 inet proto tcp from (fxp0:network) to 127.0.0.1 port = 3127 flags S/SA keep state (if-bound)
pass in quick on fxp0 from (fxp0:network) to any flags S/SA keep state (if-bound)
pass out quick on fxp0 from any to (fxp0:network) flags S/SA keep state (if-bound)
>[оверквотинг удален]
> port = https flags S/SA keep state (if-bound)
> pass out quick on xl0 inet from [IP] to any flags S/SA
> keep state (if-bound)
> anchor "ftp-proxy/*" all
> pass in log quick on fxp0 inet proto tcp from (fxp0:network) to
> 127.0.0.1 port = 3127 flags S/SA keep state (if-bound)
> pass in quick on fxp0 from (fxp0:network) to any flags S/SA keep
> state (if-bound)
> pass out quick on fxp0 from any to (fxp0:network) flags S/SA keep
> state (if-bound)Вы же клиент никак не настраивали? Прокси не прописывали? Тут не надо все прозрачно.
У меня подозрения, что сам прокси не работает. Попробуйте прописать клиенту прокси, повесить его на внутренний адрес и проверти его работу, а уже потом прозрачно.
Уменя внутри несколько сетевых в мосте. Редирект ДНС на внешний и НТТР на локалхост на прокси. Все работает отлично.
rdr on bridge0 inet proto tcp from (bridge0:network) to ! (self) port = domain -> 193.58.251.251 port 53
rdr on bridge0 inet proto udp from (bridge0:network) to ! (self) port = domain -> 193.58.251.251 port 53
rdr on bridge0 inet proto tcp from (bridge0:network) to ! (self) port = http -> 127.0.0.1 port 31280
Нет, клиент не настраивал никак. Клиент - и браузер и просто telnetСам прокси работает, через него в инет все ходят исправно. И сокстат его показывает, и коннект на него напрямую есть:
C:\Users\user>telnet ya.ru 80
Connecting To ya.ru...Could not open connection to the host, on port 80: Connect
failedC:\Users\user>telnet 192.168.200.1 3127
все хорошо, есть коннект, на запрос Сквид выдает страницуUPDATE
На самой Фре - локально ничего не коннектится...[]# telnet 192.168.200.1 3128
Trying 192.168.200.1...
telnet: connect to address 192.168.200.1: Operation not permitted
telnet: Unable to connect to remote hosttelnet 127.0.0.1 25
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Operation not permitted
telnet: Unable to connect to remote hosttelnet 192.168.200.1 25
Trying 192.168.200.1...
telnet: connect to address 192.168.200.1: Operation not permitted
telnet: Unable to connect to remote hostТе же самые порты (25, 110, 3127, 3128 ...) из внутренней сети работают на ура
UPDATE2
Добавил в конфиг set skip on lo0 - telnet 127.0.0.1 3127 поехал
но с внешнего клиента так и не коннект
>[оверквотинг удален]
> Trying 127.0.0.1...
> telnet: connect to address 127.0.0.1: Operation not permitted
> telnet: Unable to connect to remote host
> telnet 192.168.200.1 25
> Trying 192.168.200.1...
> telnet: connect to address 192.168.200.1: Operation not permitted
> telnet: Unable to connect to remote host
> Те же самые порты (25, 110, 3127, 3128 ...) из внутренней сети
> работают на ура
> Добавил set skip on lo0 - эффекта нетПравила правильно перегружаете? pfctl -F rules /etc/pf.conf и pfctl -F nat /etc/pf.conf ?
Ну не знаю. Пробуйте на виртуалке отладить. Поочереди исключая все возможные ошибки.
>[оверквотинг удален]
>> telnet: Unable to connect to remote host
>> telnet 192.168.200.1 25
>> Trying 192.168.200.1...
>> telnet: connect to address 192.168.200.1: Operation not permitted
>> telnet: Unable to connect to remote host
>> Те же самые порты (25, 110, 3127, 3128 ...) из внутренней сети
>> работают на ура
>> Добавил set skip on lo0 - эффекта нет
> Правила правильно перегружаете? pfctl -F rules /etc/pf.conf и pfctl -F nat
> /etc/pf.conf ?Так правильнее -)
pfctl -F rules -f /etc/pf.conf
.....
делаю просто pfctl -f /etc/test.conf (чтобы если что накосячу - при ребуте обратно все встало)
Такой вызов ведь очищает старые правила и грузит новые - или у меня снова недостаток знаний? :))
Смотрел по выводу 'pfctl -sr' вроде правила подменяютсяДля очистки совести сделал полный флаш
pfctl -F all -f /etc/pfc.cnf
но результата так и нет
(заапдейтил старый пост - telnet после set skip on lo0 стал подключаться на 127.0.0.1 но в общем и все)Виртуалка - да, уже поднята под это дело...
Если интересно - отпишусь по результатам
Приколы нашего городка :)
На свежеустановленной виртуалке с ровно тем же конфигом (копипаст кроме ессно имен интерфейсов) редирект работаетЯдро то же стоковое, осталось только одно отличие - я на живом сервере обновлял World, конфы там все брал дефолтные т.к. делал это сразу еще на пустой машине
sysctl net.inet - существенных отличий не нашел, нет такого чтобы где-то было 1 где-то 0
Печально - но проблема так и не решилась обновлением исходников и пересборкой ядра и мира ...
> Печально - но проблема так и не решилась обновлением исходников и пересборкой
> ядра и мира ...Хм... Как обновляли, пересобирали?..
Обновил через cvsup
(часть конфига)
*default release=cvs tag=RELENG_9
src-allдалее - по хэндбуку
make buildworld
make buildkernel (сначала скомпилил и поставил GENERIC)
make installkernel
reboot
make installworld
mergemasterкогда убедился что все завелось (но не завелось то что мне нужно :) ) - собрал кастомное ядро на основе стандартного, сильно не допиливал - убрал ненужные дрова сети и добавил pf и ALTQ в ядро
>[оверквотинг удален]
> make buildworld
> make buildkernel (сначала скомпилил и поставил GENERIC)
> make installkernel
> reboot
> make installworld
> mergemaster
> когда убедился что все завелось (но не завелось то что мне нужно
> :) ) - собрал кастомное ядро на основе стандартного, сильно не
> допиливал - убрал ненужные дрова сети и добавил pf и ALTQ
> в ядроЕсли быть точным, то хронология такова:
1. cd /usr/src
2. make buildworld
3. make buildkernel KERNCONF=Имя_конфига_ядра_указанного_в_опции_ident
4. make installkernel KERNCONF=Имя_конфига_ядра_указанного_в_опции_ident
5. reboot (in single user mode: boot -s from the loader prompt).
6. mergemaster -p
7. make installworld
8. make delete-old
9. mergemaster -iUF
10. reboot
11. make delete-old-libs
Странно - в хэндбуке эти шаги опущены
8. make delete-old
11. make delete-old-libs
В остальном все именно так и делал (про KERNCONF= скипнул т.к. без этой опции кастомное ярдо не собрать все равно никак )ну да не суть
mergemaster -p я скипнул т.к. а) делал его при первом обновлении и б) сервак на удаленке, физического доступа у меня к нему нет соотв. в сингл-юзер его выводить не стоит :)Есть у меня мысль как буду физически у сервака поиграться интерфейсами, может просто поменять местами или другие сетевые платы поставить... Других идей пока больше нет
Переписал конфу - сделал с тегированием пакетов, но счастье не произошло... проброс снаружи так и есть, проброса изнутри так и нет.Физически пока не добрался до сервака чтобы с интерфейсами поиграться
Как бы это дело подебагить - что происходит с пакетом после его прихода на внутренний интерфейс, почему он теряется... ?
конфа стала такой:
ext_if="xl0"
int_if="fxp0"
internal_net="192.168.200.0/24"tcp_services="{ PORT }"
allowed_ports="{5190, 2041, 2042, 2043, 2044}"
web_ports="{80, 8080, 443}"
icmp_types="echoreq"table <remote> {IP}
table <priv> {IP, IP, IP }set block-policy drop
set loginterface $ext_ifset skip on lo
scrub in
nat on $ext_if from !($ext_if) tagged USER_TRAFFIC -> ($ext_if:0)
nat on $ext_if from !($ext_if) tagged PRIV_TRAFFIC -> ($ext_if:0)nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"rdr pass on $ext_if proto tcp from <remote> to $ext_if port 80 tag REMOTE_WEB -> 192.168.200.7
rdr pass on $ext_if proto tcp from <remote> to $ext_if port 443 tag REMOTE_HTTPS -> 192.168.200.7rdr pass on $int_if proto tcp from $int_if:network to !($int_if) port ftp -> 127.0.0.1 port 8021
rdr pass on $int_if proto tcp from $int_if:network to !($int_if) port 80 -> 127.0.0.1 port 3127
rdr pass on $int_if proto tcp from $int_if:network to !($int_if) port 81 -> 127.0.0.1 port 8181block all
antispoof quick for { lo $int_if }
anchor "ftp-proxy/*"
pass quick on lo0
pass out quick on $int_if from any to $int_if:network
pass in quick on $int_if from $int_if:network to $int_ifpass out quick on $ext_if from ($ext_if) to any
pass in quick on $ext_if tagged REMOTE_WEB synproxy state
pass in quick on $ext_if tagged REMOTE_HTTPS synproxy statepass in on $ext_if inet proto tcp from any to ($ext_if) port $tcp_services
pass in on $int_if inet proto tcp from $int_if:network to !($int_if) port $allowed_ports tag USER_TRAFFIC
pass in on $int_if from <priv> to !($int_if) tag PRIV_TRAFFICpass in on $ext_if from <remote> to any