UPnPによる探索を通すためのファイアウォール設定
PerlのNet::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
うまく取れたよ。
感謝!!
しかし、GoogleでUPnPとファイアウォールをキーワードで探すと、UPnPでNATを操作する方法とか、そんなのばかりでてきて自分自身のファイアウォール越えの記事がなかなかみつからなくて難儀しました。(あっても、1900あければいいよ、とサラリと書いているだけたったりして。)
ネットワークの知識があって、iptablesの書き方とか仕組みとかに熟知していればなんのことはないのだろうけれど。