Коллективным разумом на nag.ru пришли к такому скрипту:
#Some variables
IP123="XXX.YYY.ZZZ" < - 3 первых байта внешних адресов (99.124.65)
GRAYIP="XXX.YYY" <- 2 первых байта серой подсети (172.16)
OUT_VLAN="vlanX" <- Выходной интерфейс (vlan99)
NATIPFW_RULE=30000 <- Номер правила в ipfw
TABLE_NAT_IN=100 <- Номер таблицы серых подсетей
TABLE_NAT_OUT=101 <- Номер таблицы реальников
#Null0 routed NAT network
/sbin/route add -net $IP123.0/24 -blackhole
#Ipfw::NAT config with table
/sbin/ipfw table $TABLE_NAT_IN flush
/sbin/ipfw table $TABLE_NAT_OUT flush
IP4=1
SEGIP3=0
NATBASE=1000
while [ $IP4 -le 254 ]
do
NATNUM=`expr $NATBASE + $IP4`
/sbin/ipfw nat $NATNUM config ip $IP123.$IP4 reset unreg_only same_ports deny_in
/sbin/ipfw table $TABLE_NAT_OUT add $IP123.$IP4 $NATNUM
/sbin/ipfw table $TABLE_NAT_IN add $GRAYIP.$SEGIP3.0/24 $NATNUM
IP4=`expr $IP4 + 1`
SEGIP3=`expr $SEGIP3 + 1`
done
/sbin/ipfw add $NATIPFW_RULE nat tablearg ip from "table($TABLE_NAT_IN)" to any out via $OUT_VLAN
/sbin/ipfw add $NATIPFW_RULE nat tablearg ip from any to "table($TABLE_NAT_OUT)" in via $OUT_VLAN