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
ここまでやって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を二個も使わなかったんだけど、なんかおかしい気がするなぁ