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 したらうまく動いたという報告がメーリングリストにある。しかし、開発者はこのオプションを試したことがないとのこと