>Эти правила , насколько понимаю , включают балансировку между двумя
>провайдерами , а как быть , если нужно просто направить все пакеты
>из
>$int_net1 на $gw1 , а из $int_net2 на $gw2 ? Я решал такую же проблему. Нужно было сделать NAT из внутренней сети к двум разным провайдерам. Сделать так чтобы всё шло правильным маршрутом автоматически не получилось. Ведь действительно как роутер должен угадывать какому из двух провайдеров сейчас отправлять пакет?
Поэтому работает такой подход:
Делаем NAT:
nat on $proc from $internal_net to any -> ($proc)
Теперь нужно сделать чтобы это шло через нужный шлюз, а не тот, что указан в таблице роутинга:
pass in quick on $internal from $internal_net to $internal
pass in on $internal route-to ($proc $proc_gw) from $internal_net to any
Первая строчка нужна чтобы связь с самим роутером не была потеряна. Вторая строчка говорит, что всё из внутренней сети должно идти через шлюз $proc_gw.
Вот объявления переменных:
corbina_tun = "tun0"
corbina_loc = "xl0"
proc = "fxp0"
internal = "vr0"
corbina_tun_gw = "Unknown"
corbina_loc_gw = "10.83.0.17"
proc_gw = "217.117.116.129"
internal_net = "vr0/29"
Если нужно теперь отправить что-то через второй шлюз, то надо дописать правила на те случаи когда нужно пользоваться вторым шлюзом. Эти правила должны быть и для NAT и для pass in .. route-to .....
Далее идут непрверенные мысли:
Возможно автоматически всё можно сделать строчками типа вот этих:
pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 \
to any
pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 \
to any
которые я взял из http://www.openbsd.org/faq/pf/pools.html. Но эти строчки ловят идущие не туда пакеты и направляют их куда надо (я так предполагаю), а надо напрямую написать правила pass out для одного и того же интерфейса типа:
pass out on $ext_if1 route-to ($ext_if1 $ext_gw1) from $ext_if1 \
to any
pass out on $ext_if2 route-to ($ext_if2 $ext_gw2) from $ext_if2 \
to any
Эти строчки отличаются от предыдущих!