« freeshell.org 復旧 | メイン | 戦争回避の可能性 »

Linux を UPnP 対応ルーターに

先日、古~いノートパソコン(486DX/4 75MHz)に Linux をインストールして、自宅のファイアーウォール・ルーターにしました。懐かしい CPU が現役でカタコトと動いているのを見るのは、楽しいです。その時に、Linux を UPnP 対応ルーターにできることがわかり、設定してみました。上手く動いているようなので、設定方法のメモ書きを載せておきます。ある程度 Linux の知識がある方なら、簡単だと思います。

●Linux-IGD インストールメモ

使用したカーネルのバージョンは2.4.19。コンパイルに必要なライブラリーなどは適宜インストール。

1. Linux SDK for UPnP のインストール

Open Source Linux SDK for UPnP Devices 1.0

アーカイブを展開し、Windows Messenger に対応するために、src/ssdp/ssdplib.c の406行目を
SelfAddr.sin_addr.s_addr = inet_addr(SSDP_IP);
から
SelfAddr.sin_addr.s_addr = htonl(INADDR_ANY);
に書き換える。

make
make install

でインストール。

2. Linux-IGD のインストール

現在の最新版(0.92)にはバグ(メモリーリーク)があるので、CVS で開発版を落としたほうが良い。

Linux UPnP Internet Gateway Device

make
make install

でインストール。Linux-IGD は /usr/sbin/ に iptables コマンドがあるのを前提に動作するので、もし違う場所に iptables があれば、以下のコマンドでリンクしておく。

ln -s /sbin/iptables /usr/sbin/iptables

ログの設定。/etc/syslog.conf をチェックし、

*.=debug /var/log/debug

を必要に応じて追加する。


3. ネットワークの設定

以下のコマンドを実行。int_if は LAN 側のインターフェース。

route add -net 239.0.0.0 netmask 255.0.0.0 int_if
(route add -net 239.0.0.0 netmask 255.0.0.0 eth0 など)

iptables の設定で、FORWARD のデフォルトを ACCEPT に設定する(重要)。FORWARD のフィルターは、最小限にしておく。以下の設定を参考に。$EXTIF は インターネット側、$INTIF は LAN 側のインターフェース。必要に応じてeth0 や ppp0 などに置き換える。

iptables -P INPUT DROP
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD ACCEPT
iptables -F FORWARD
iptables -t nat -F

iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

iptables -N log_drop
iptables -A log_drop -p icmp -j LOG --log-level warning --log-prefix "DROP " -m limit --limit 1/s
iptables -A log_drop -j LOG --log-level warning --log-prefix "DROP "
iptables -A log_drop -j DROP

iptables -N global-in
iptables -A global-in -p tcp --dport ssh -j ACCEPT
iptables -A global-in -p tcp --dport www -j ACCEPT
iptables -A global-in -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A global-in -j log_drop

iptables -N global-out
iptables -A global-out -p udp --dport 137:139 -j DROP
iptables -A global-out -p tcp --dport 137:139 -j DROP
iptables -A global-out -p udp --dport 445 -j DROP
iptables -A global-out -p tcp --dport 445 -j DROP
iptables -A global-out -d 10.0.0.0/8 -j log_drop
iptables -A global-out -d 172.16.0.0/12 -j log_drop
iptables -A global-out -d 192.168.0.0/16 -j log_drop

iptables -A INPUT -i $INTIF -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

iptables -I INPUT -i $EXTIF -j global-in
iptables -I FORWARD -o $EXTIF -j global-out
iptables -I OUTPUT -o $EXTIF -j global-out


4. Linux-IGD を起動

以下のコマンドで起動する。

upnpd ext_if int_if
(例・upnpd ppp0 eth0)

/var/log/debug をチェックして、Linux-IGD が問題なく起動していることを確認。
次に、LAN 内の Windows を起動。Windows XP であれば、コントロールパネルのネットワークを設定するところに、Linux-IGD のアイコンが見える。

iptalbes -L -t nat

を実行し、NAT テーブルを確認しておく。

MSN Messenger (あるいは Windows Messenger)を起動したあと、Linux で

iptalbes -L -t nat

を実行して、新たに NAT が設定されていれば OK 。
音声通話ができるかどうか、確認する。

これまでの設定を rc.local などに書き込んで作業完了。

5. うまく動かないときのチェックポイント

  • Windows2000 では、UPnP を通して音声を送るために DirectX 8.1 が必要

  • MSN Messengaer のバージョンは、4.6か4.7が良い?(未確認) YAMAHA のルーターのサポートページには、MSN Messenger 5.0 が UPnP に対応していないとの情報あり

  • Linux SDK for UPnP をデバッグオプションをつけて make したらうまく動いたという報告がメーリングリストにある。しかし、開発者はこのオプションを試したことがないとのこと

トラックバック

このエントリーのトラックバックURL:
http://monado.s88.xrea.com/blog/mt-tb.cgi/81

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)