
Недавно случилась у меня оказия столкнуться на работе с этой замечательной системой, и пришлось разбираться с пакетным фильтром, который покорил с первого взгляда мое сердце старого параноика.
Именно о нем то и будет мой вопрос.
Краткая предыстория.
Исходная конфигурация выглядит классически и примерно вот так:
LAN1 --- OpenBSD Box --- Internet VPN --- OpenBSD Box --- LAN2+
Существует 2 офиса между которыми, средствами IPsec, проложен VPN тоннель. Все замечательно работает, пакетики ходят, интернет во всю ширь и вообще все замечательно. Однако настал черный день, когда ширины канала стало катастрофически нехватать и к openBSD box'у был подведен второй интернет канал. От начальства было получено ЦУ оставить ВПН где он и был, а весь остальной траффик (ну или по крайности www, pop3 и аську) пустить по второму каналу. То есть сваять что-то похожее на:
LAN1 --- OpenBSD Box --- ext_if1 -- Internet VPN --- OpenBSD Box --- LAN2+
....................\__ ext_if2 --- Other Internet
За отсутствием опыта было решено применить то что ближе всего к телу, то есть средства PF. Однако.

Был исходный конфиг:
Пример "неполучания":Каналы vr0 и vr1 разсположены в одной сети, имеют один gateway. (Прописываем в hostname.vr1, разумеется.) Подрубаем второй канал к интерфейсу vr1. Открываем pf.conf и в макросах меняем vr0 на vr1. Траффик не идет. Ни ВПН (что логично), ни асечно \ WWW \ пинговый. Подрубаем канал к ноуту, пишем те же настройки - инет есть.# vi /etc/pf.conf
#Macross
ext_if1 = "vr0"
#ext_if2 = "vr1" # just added
int_if = "vr2"
remote_gw = "a.b.c.d"
remote_nets = "{10.10.0.0/24, 10.0.2.0/24, 10.205.1.0/24, 10.0.4.0/24}"
tcp_services = "{ 22 }"
icmp_types = "echoreq"
# Options
set block-policy return
set loginterface $ext_if1
set skip on {lo0, enc0, vr2}
scrub in
# nat/rdr
nat on $ext_if inet from !($ext_if1) -> ($ext_if1:0)
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr pass on $int_if proto tcp to port ftp -> 127.0.0.1 port 8021
# pf
block in
pass out keep state
anchor "ftp-proxy/*"
antispoof quick for { $ext_if1 $ext_if2 lo $int_if }
#vpn exchange
pass in on $ext_if1 proto esp from $remote_gw to $ext_if1
pass out on $ext_if1 proto esp from $ext_if1 to $remote_gw
pass in on $ext_if1 proto udp from $remote_gw to $ext_if1 port {isakmp, ipsec-nat-t}
pass out on $ext_if1 proto udp from $ext_if to $remote_gw port {isakmp, ipsec-nat-t}
pass in on enc0 proto ipencap from $remote_gw to $ext_if1 keep state (if-bound)
pass out on enc0 proto ipencap from $ext_if1 to $remote_gw keep state (if-bound)
pass in on enc0 from $remote_nets to $int_if:network keep state (if-bound)
pass out on enc0 from $int_if:network to $remote_nets keep state (if-bound)
#SSH allow
pass in on $ext_if inet proto tcp from any to ($ext_if) \
port $tcp_services flags S/SA keep state
pass in on $int_if inet proto tcp from any to ($int_if) \
port $tcp_services flags S/SA keep state
#PING allow
pass in inet proto icmp all icmp-type $icmp_types keep state
Вопрос нумбер 1 - где собака порылась. Почему не хочет пахать vr1?

Вопрос нумбер 2. Что нужно вписать в pf.conf чтобы перенаправить ввв траффик, допустим на ext_if2.
Тема меня изрядно задолбала, так что имею возможность и даже желание поставить человеку, который поможет разобраться, что-то пенистое или горючее.
