わが家のルータは FreeBSD 5.4RELEASE を入れた PC をルータにしています。 今までは ppp (with NAT) + ipfw で NAT ルータ機能を実現していましたが、 これだと PS3 を繋いだときに NAT Type3 と言われてしまいます。 NAT Type3 だと AV チャットや通信ゲームで制限がでてしまうということ で(実際、通信対戦で問題が出ているので) UPnP 対応することにしました。
もちろん FreeBSD で実現する方向です。といってもすでに機能は実装されているので、利用するだけです。FreeBSD で UPnP をつかうためには
1) ppp with NAT + ipfw から ppp without NAT + ipf + ipnat に移行
2) upnpd, linuxigd のプログラムをいれる
が必要です。
1) はパケットフィルタのルールを ipfw から ipf 用に書き直すのが少々面倒なのですが、仕方ありません。
1-1) カーネルの再構築
options IPFIREWALL options IPFIREWALL_VERBOSE options IPFIREWALL_FORWARD options IPFIREWALL_VERBOSE_LIMIT=0
を抜いて、
options IPFILTER options IPFILTER_DEFAULT_BLOCK options IPFILTER_LOG
を追加し、再構築。
1-2) ipf.rules, ipnat.rules を作成 (詳細は割愛)
注意点として デフォルト DENY のルールで運用している場合には、UPnP 自身で用いるポートを開けておくことを忘れないように。(ここではまった)
UDP 1900 TCP 2869 TCP 5000
1-3) /etc/rc.conf の修正
ppp_nat="YES" -> ppp_nat="NO"
ipfilter_enable="YES" ipfilter_rules="/etc/ipf.rules" ipfilter_flags="" ipmon_enable="YES" ipmon_flags="-D /var/log/ipflog" ipnat_enable="YES" ipnat_flags="" ipnat_rules="/etc/ipnat.rules" static_routes="upnp" route_upnp="239.0.0.0/8 -interface bge0"
を追加
1-4) rc.local の修正
/sbin/ipnat -CF -f /etc/ipnat.rules
*注: ipnat は rc.conf にかかれているので起動時に設定されるのですが、わが家の環境では起動タイミングが早いらしく、rc.conf の設定から呼び出されるタイミングでは NAT がうまく動きませんでした。そのため、ipnat を遅延させて呼び出すために rc.local に追加しています。
2-1) upnpd のインストール
# cd /usr/ports/devel/upnp # make # make install
2-2) linuxigd のインストール
# cd /usr/ports/net/linuxigd # make # make install
2-3) 起動スクリプトの修正
# cd /usr/local/etc/rc.d # cp linuxigd.sh.sample linuxigd.sh # chmod +x linuigd.sh (スクリプトの修正。EXT_IF, INT_IF の変数を適切に設定)
これで無事、PS3 のネットワーク接続テストで UPnP あり、NAT Type2 として認識されました。めでたし。