из того, что вижу (и на что рекомендую обращать внимание в будущем при написании) - выводы того, что мы хотим (в скрипте) и того, что получаем - отличаются. и это сразу повод смотреть в отличия более внимательно :)плюс, если разбить правило ната на несколько, будет проще по счетчикам смотреть, что и как. ну и для упрощения понимания можно первыми ставить правила ната на уходящий от нас трафик, а потом в конце обрабатывать входящий - можно будет отказаться от skip
$int_lan="192.168.0.0/16"
ipfw nat 10 config if $net deny_in same_port reset
ipfw nat 20 config if $net redirect_port tcp 192.168.2.31:21 21 192.168.2.31:20 20 192.168.2.31:30000-31000 30000-31000
ipfw nat 30 config if $net redirect_port tcp 192.168.2.60:25 25
ipfw nat 40 config if $net redirect_port tcp 192.168.1.58:443 443
#-------rules network -------
#allow networks
$cmd 0001 allow all from any to any via $lan
# а имеет ли смысл правило 2 ? дмз же нужна, что бы изолировать сервисы, а вы разрешаете все - по хорошему вам надо разрешить пользоватлеям из локалки доступ к необходимым сервисам в дмз и доступ из дмз наружу.
$cmd 0002 allow all from any to any via $dmz
$cmd 0004 allow all from any to any via lo0
# разрешаем прохождение трафика снаружи к сервисам внутри
$cmd 0040 nat 20 tcp from any to me 20,21,30000-31000 via $net
$cmd 0041 nat 30 tcp from any to me 25 via $net
$cmd 0041 nat 40 tcp from any to me 443 via $net
# разрешаем пользователям локальной сети и дмз уходить наружу
$cmd 50 nat 10 from $int_lan to any via $net
# правила 60 и 61 не нужны. опять же, два правила можно заменить одним при использовании allow all вместо allow tcp allow udp
# и у вас тут как-то странно - вроде как почтовик то в дмз(.2), то в .1
$cmd 100 allow tcp from 192.168.1.58 443 to any keep-sate
# разрешаем пакетам снуружи попадать на нат - оно должно быть последним перед полным запретом
$cmd 10000 nat 10 ip from any to me via $net