udpをばりばり投げるゲームとnatd

mpd+natd+ipfwで動いているうちのルータ*1の内側からbf1942の鯖を公開することになったから設定やってと言われた。昔やった設定ファイルがどこかに行ってしまったのでやり直した。
natd.conf

redirect_port udp 192.0.2.100:14567-15000 14567-15000
redirect_port tcp 192.0.2.100:22000 22000
redirect_port tcp 192.0.2.100:23000 23000
redirect_proto icmp 192.0.2.100
#↑必要ポートとして公開されてるのはこれだけ
#↓実際は14690とこっちが必要っぽい
redirect_port udp 192.0.2.100:60000-64000 60000-64000

ipfwにdivert行を追加してさらにこれを追加

BFSV=192.0.2.100
$IPFW add pass udp from any to $BFSV 14690
$IPFW add pass udp from me 14690 to any
$IPFW add pass udp from me to any 60000-64000
$IPFW add check-state

*2

ここまでやってnatdを起動してbf1942のサーバプログラムを192.0.2.100のマシンで起動させたのだけど外から見えない。tcpdumpで観察するとサーバから投げられたudpのパケットの送信元が192.0.2.100のままだった。
あれこれ悩んで仕方ないのでnatdで書き換える事に。
普段natdを使わない構成なので、rc.confに設定を書くのが嫌でファイルに書いて/usr/local/etcに突っ込んだ
natd.sh

/sbin/natd -n ng0 -f /usr/local/etc/natd.conf
#出て行くudpのパケットの送信元をng0にくっついてる奴に書き換える
/sbin/natd -p 9999 -n ng0 -reverse

でnatが2つ起動するので、ipfw

$IPFW add divert 9999 ip from 192.0.2.100 to any

を追加したら動いた。
普段はnatが要らないマシンなので、使わないときはipfwのdivert行をコメントにしておこう
昔やったときはnatdを二個も使わなかったんだけど、なんかおかしい気がするなぁ

*1:今はルータというより各種ゲートウェイとかproxy

*2:今気が付いたけど全然TCPを通してないのでサーバブラウザでは見えるけどゲームはできない気がする