Попробуй так:table1="table(55,1)"
${fwcmd} table 55 flush
${fwcmd} table 55 add (все сети которые к роутеру подключены) 1
${fwcmd} table 55 add (все сети которые к роутеру подключены) 1
и т.д.
table2="table(65,1)"
${fwcmd} table 65 flush
${fwcmd} table 65 add (приватные сети которые надо натить) 1
${fwcmd} table 65 add (приватные сети которые надо натить) 1
и т.д.
А тут прописываешь
${fwcmd} add divert natd all from ${table2} to not ${table1} out via fxp0
${fwcmd} add divert natd all from not ${table1} to me in via fxp0
Так ты natd максимально разгрузишь от пакетов которые его не касаются.
И если ты будешь еще правила ipfw вешать то надо в sysctl параметр прописать чтобы после ната пакеты дальше по цепочке шли. Параметр не помню, но он есть в инете.