seraphyの日記

日記というよりは過去を振り返るときのための単なる備忘録

UPnPによる探索を通すためのファイアウォール設定

PerlNet::UPnP::ControlPointを使って、ルータの情報を取りに行くための簡単なPerlスクリプトを書いてみた。


中身は、ほとんど
http://www.geekpage.jp/programming/perl-network/get-ppp-external-ipaddr.php
と同じようなもの。(参考にさせていただきました。)


テスト環境ではうまくいって、CentOS5.4実機に乗せてみたら何も返ってこない。

ファイアウォールをあけなきゃいけないと、UPnPが使っているのは1900番(ssdp)なので他のhttpとかftpとかと同じ感じにacceptの設定してみた。



でも動かない。


ファイアウォールを停止させれば動くのは確認したので間違いなくファイアウォール関係だと思う。

そのマシンはルータとして使っているわけでもなんでもない、ローカルネット内のただのマシンだから、いっそファイアウォールを外してしまおうか、という誘惑にかられてしまったが、こんなしょうもないたいした重要性もないPerlスクリプトのためにファイアウォールを破壊するのもどうかと思いとどまる。



仕方ないので

yum install wireshark

して、wiressharkを導入。

/usr/sbin/tshark -D 1 -w tshark.cap

でパケットを見てみるが、慣れぬことはするものではないというか、案の定、よくわからない。
ICMPにreject応答があるように見えるので、ファイアウォールの1900番がうまく開いていない??



いろいろネットをさまよって、ようやく探せました。

http://d.hatena.ne.jp/name-3333/20090618


/etc/sysconfig/iptablesに一文追加。

-A INPUT -m state --state NEW -m udp -p udp --src 192.168.1.0/24 --sport 1900 -j ACCEPT


うまく取れたよ。
感謝!!


しかし、GoogleUPnPファイアウォールをキーワードで探すと、UPnPでNATを操作する方法とか、そんなのばかりでてきて自分自身のファイアウォール越えの記事がなかなかみつからなくて難儀しました。(あっても、1900あければいいよ、とサラリと書いているだけたったりして。)

ネットワークの知識があって、iptablesの書き方とか仕組みとかに熟知していればなんのことはないのだろうけれど。