http://www.opennet.dev/tips/info/158.shtml
смотрите первый комментарий, он суть статья. Единственное что я бы сделал уточнение правил в виде указания исходящего интерфейса.
Это нужно чтобы не ломалась (шла без трансляции адресов) маршрутизация между внутренними подсетями. Собственно вариантов тут два - либо уточнять внешние, либо уточнять внутренние интерфейсы.
для двух внешних интерфейсов:
#ext0 1.1.1.1/24 шлюз 1.1.1.254
natd -a 1.1.1.1 -p 8668
#ext1 2.2.2.1/24 шлюз 2.2.2.254
natd -a 2.2.2.2 -p 8778
Создадим набор правил для ipfw:
ipfw 10 add divert 8668 ip from 3.3.3.0/24 to any out ext0
ipfw 11 add divert 8668 ip from 3.3.3.0/24 to any out ext1
ipfw 20 add divert 8778 ip from 4.4.4.0/24 to any out ext0
ipfw 21 add divert 8778 ip from 4.4.4.0/24 to any out ext1
## Внимание! Один из шлюзов (1.245 или 2.254) должен быть указан шлюзом по умолчанию,
## иначе пакеты не пойдут ни в ext0 ни в ext1
# по вкусу (при необходимости) можно еще добавить 28, 29 правила:
ipfw 28 add allow ip from 1.1.1.1 to 1.1.1.0/24 out via ext0
ipfw 29 add allow ip from 2.2.2.1 to 2.2.2.0/24 out via ext1
ipfw 30 add fwd 1.1.1.254 ip from 1.1.1.1 to any out via ext0
ipfw 31 add fwd 1.1.1.254 ip from 1.1.1.1 to any out via ext1
ipfw 40 add fwd 2.2.2.254 ip from 2.2.2.2 to any out via ext0
ipfw 41 add fwd 2.2.2.254 ip from 2.2.2.2 to any out via ext1
# тут уточняем, что пакет действительно пришел снаружи, а не наша локалка стучится на сервисы маршрутизатора по внешнему адресу (так бывает, например WWW-сервер :-) )
ipfw 50 add divert 8668 ip from any to 1.1.1.1 in via ext0
ipfw 60 add divert 8778 ip from any to 2.2.2.2 in via ext1
Разрешающие правила для исходящих пакетов нужно делать до дивертов, т.е. до 10 правила в вышеописанном примере, в виде skipto, для входящих снаружи - после 60 правила.