[[gentoo]] Gentoo Linuxで作ったIPマスカレード・ルータに,UPnP機能を追加してVoIPアダプタをつなげたときのメモです. * 必要なもの(使ったもの) [#o8fa83c7] - UPnP SDK 1.3.1 (http://upnp.sourceforge.net/) - linux-igd 0.95 (http://sourceforge.net/projects/linux-igd/) linux-igdの以前のバージョンでは,iptablesのパスが,ハードコーディングされていたのですが,今は,設定ファイル(/etc/upnpd.conf)で設定できます.~ 同様に,追加先のnetfilterのチェインも,設定ファイルで変更することが出来ます. * UPnP SDKとlinux-igdのインストール [#z0dce908] まず,UPnP SDK 1.3.1 はGentooのパッケージに含まれていますので,単にemergeします. emerge upnp linux-igd は,0.92までしか含まれていない上に,0.92もMaskedなので,ソースからコンパイルしてインストールします.~ http://sourceforge.net/projects/linux-igd/ から0.95をダウンロードします. アーカイブを展開して, # cd linuxigd-0.95 # make # make install でインストールできます. # make HAVE_LIBIPTC=1 で,iptablesコマンドではなく,libiptc を使うようになるようですが,どうもそれをやると,upnpd のプロセスが増殖してしまうようなので,やめました. * linux-igdの設定 [#edb8a387] 設定は,''/etc/upnpd.conf'' で行います. まず,iptablesコマンドの場所が違うので,設定します iptables_location = "/sbin/iptables" filterテーブルのFORWARDチェインのPOLICYがDROPになっているなど,ルールが無いとDROPされてしまう場合は,insert_forward_rulesをyesにします.(デフォルトでyesになってます) insert_forward_rules = yes linux-igdは,デフォルトで,natテーブルのPREROUTINGと,filterテーブルのFORWARDチェインにルールを追加するようになっています.~ 他にいろいろとnetfilterにルールを設定して,upnpdが自動で追加削除するルールは切り離したかったので,別のユーザ定義チェインにルールを設定するようにしました. 手動操作と,自動操作がぶつかったらまずいですから. forward_chain_name = upnp_fw prerouting_chain_name = upnp_prerouting あとは,FOWARDチェインと,PREROUTINGチェインから,このユーザ定義へ飛ぶようにしておきます. VoIPアダプタなどが,IGD(Internet Gateway Device)にDNATの設定を要求してきたとき,そのルールの持続時間を特に指定していなかった場合,適応する持続時間です.~ とりあえず,1時間を設定しておきました.~ ちなみに,デフォルトでは0秒で,設定する必要はないのかもしれませんが,念のため設定してあります. duration = 01:00 ここで,気を付けないといけないのは, duration = 1:00 とすると,''1秒''になってしまうということです.~ 私が使っているVoIPアダプタはNTTのレンタルのものです. これは,持続時間を指定してきません.~ 最初,duration = 3:00 としていたので,3秒でDNATのルールが消滅し,ちゃんと動きませんでした. なお,VoIPアダプタは30分間隔でルールの再生をするので,それより長ければ問題ないはずです. 設定は以上です.他の設定はそのままでも問題ないはずです. * 起動 [#i71405b8] /usr/sbin/upnpd ppp0 eth0 で,動きだします. 起動スクリプトを書くなら,こんな感じです. pppに依存しているので,need net.ppp0 とします. NICの名前は,固定ですがまあいいですよね. ''/etc/init.d/upnpd'' depend() { need net.ppp0 } start() { ebegin "Starting upnpd" start-stop-daemon --start --quiet --exec /usr/sbin/upnpd -- ppp0 eth0 eend $? "Failed to start upnpd" } stop() { ebegin "Stopping upnpd" start-stop-daemon --stop --quiet --exec /usr/sbin/upnpd eend $? }