LinuxでIP電話をする(作成中)
作業手順
 
2004/1/21
written Komuro


■Linux+SwichingHUBでする理由

Bフレッツは、論理上100Mbpsは出る事になっている。
そして、Bフレッツ対応のブロードバンドルータがNTTから出ているわけですが(WebCaster 100)
最大30Mbpsの高速インターネット」と堂々と宣伝してるわけです。商売はこうで無くてはいけません(w

普通なら、なんやそれは!!
となると思いますが、わたしは営業もほんの少しかじった事があるので、これはこれで良いと思っています。

余談は置いておいて・・使う側からしてみれば納得はいきません。
そこで、Linuxは、チューニングにより速度が改善されるわけですから、100Mbps対応のHUBVoIPアダプタを刺して、Linux側でUPnPを再現させてあげれば、家内では、100Mbpsを保ちつつ、外にもある程度の速度を持って通信ができるようになります。

こういったことから、Linux+SwichingHUBでIP電話をしようと思い立ったわけです。
(実は新しくルータ買うのもったいないとか言うのも内心・・・)

使用している、スイッチングHUBは、プラネックスのFX-16HNという商品です。
細かいデータもこちらに表示されてますが、勉強不足で単位がわかりません(汗

そして、無職のため面接に行き不採用も頂きました(w
それもさておき商品は性能良いし3,4年たったような気がしますが異常はありません。

■必要なモジュール(2004/01/21現在)
upnpsdk-1.0.4.tar.gzをダウンロード。http://upnp.sourceforge.net
linuxigd-0.92.tgzをダウンロード。http://linux-igd.sourceforge.net
reaim-0.8.tar.gzをダウンロード http://reaim.sourceforge.net
■各モジュールの機能と必要と思われる用語
各モジュールの機能
 
UPnP ようは、UPnPに対応した機器であれば、伝送経路を問わずに情報交換が出来るというもの。無線だろうがLANだろうが電力線でもなんでも
UUID 世界中で重複することが無い事を保証した数値。
UPnP SDKをコンパイルする時に必要になってくる。
これらは、128bitのランダムな数値で構成されている。
linuxigd UPnP SDKとiptablesを使用し、Linuxルーター上でUPnPを実行するモジュール。
ReAIM AOL、ICQ、MSN などで、ファイル転送をする時に必要。IP電話とは直接には関係してないが、音声チャットの時も必要と思われる。
ICQでは、ダイヤル機能を持った特殊な通話もあるので、そういったときに必要になってくるかもしれないが、日本でのサービスは確認できなかった。

IP電話では特に必要ないので、インストール方法は省く。

IP電話で使われる用語
SIP Sesson Initiation Protocolの略。
VoIP通話を実現する手段を規定したプロトコル(国際標準規格)
VoIP
Voice over IPの略。
IPパケットに音声や発信、切断などの電話操作、接続先の電話番号などの接続先と交換する情報を載せ、IP網を経由して通話を実現する技術
■各種コンパイル

Intel UPnP SDKをコンパイルする(libupnp.so)

# tar zxvf upnpsdk-1.0.4.tar.gz
cd upnpsdk-1.0.4

vi src/ssdp/ssdplib.c の406行目(MSNを正しく動作させるために、以下の部分を書き換える)
SelfAddr.sin_addr.s_addr = inet_addr(SSDP_IP);

SelfAddr.sin_addr.s_addr = htonl(INADDR_ANY);

変更後、upnpsdk-1.0.4のディレクトリ上で
# gmake
# gmake install を行う。

※uuid.hが無いと言われてエラーが出る場合、e2fsprogs-develパッケージを入れなおすと、uuid.hがインストールされる。

UPnP Gatewayをコンパイルする

# tar zxvf linuxigd-0.92.tgz
# cd linuxigd
# gmake
# gmake install

作成されたファイル
/usr/bin/upnpd (daemon)
/etc/linuxigd (directory)


■ルーティングの設定
# route add -net 239.0.0.0 netmask 255.0.0.0 <内側(LAN側)のインターフェース>
# route add -net 239.0.0.0 netmask 255.0.0.0 eth1 (実際に追加したルーティング)

#route
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth1
239.0.0.0 * 255.0.0.0 U 0 0 0 eth1
127.0.0.0 * 255.0.0.0 U 0 0 0 lo
以下 ppp0は、外に設定されている。
 

UPnPはルーティングにマルチキャストアドレスを使用するので、ルーティングテーブルに静的ルーティングを設定する
マルチキャストアドレスとはクラスDのアドレスであり、このクラスには224.0.0.1から239.255.255.255の範囲のIPアドレスが含まれる。
クラスDはアドレス一つが、一つのホストグループを表します。

■FireWallの設定(とりあえず繋がったので自己流に判断)
//example(ルールででOUTPUTをDROPしてる場合に必要と思われる設定)
iptables -I OUTPUT -s $external_ip -d 239.255.255.250/32 -j ACCEPT
iptables -I OUTPUT -s $local_ip -d 239.255.255.250/32 -j ACCEPT


linux-igd/pmlist.cpp に下記の設定を追加する。: ///addPortForward に追記
特に必要ないと思われるが、どこのサイトもこう書いてあったので・・(うちは、変更してない)
sprintf(command, "/usr/sbin/iptables -I FORWARD -p %s -d %s --dport %d -j ACCEPT", prt, IntIP, IntPort);
system(command);
///delPortForward に追記
sprintf(command, "/usr/sbin/iptables -D FORWARD -p %s -d %s --dport %d -j ACCEPT", prt, IntIP, IntPort);
system(command);

//iptablesの設定(これを設定しない場合上記の改造が必要とも思われる)
//udpの5060は、IP電話へかける時に必要(VoIPアダプタが、102.168.1.201になってると仮定)
iptables -t nat -A PREROUTING -i ppp0 -p udp -m udp --dport 5060 -j DNAT --to-destination 192.168.1.201

//udp5090-5091は一般電話へかける際に必要
iptables -t nat -A PREROUTING -i ppp0 -p udp -m udp --dport 5090:5091 -j DNAT --to-destination 192.168.1.201

//VoIPを、グローバルから発信してるようにさせるため必要かと思った(いらないかもしれん)
iptables -t nat -A POSTROUTING -s 192.168.1.201/32 -o ppp0 -j SNAT --to [ppp0のIP]

2004/01/24日現在では、携帯電話への発信は不可、携帯からの着信も不可
※一部、ぷららでは、ドコモの携帯のみ対応すると発表している。今後、各プロバイダへの普及も見込まれると思われる。

■実行
#/usr/bin/upnpd ppp0 eth1

4〜5分で、VoIPのランプがつく。10分立ってもつかなければ、どこか設定がおかしい。
特に一般加入件と併用しなくても使うことは出来るが、アラームランプは始終点滅しまくる。
おそらく、一般回線をつなげば、アラームランプの点滅はなくなると思われ。
■UPnP関連の開発ライブラリ
http://www.soba-project.org/jp/
■参考ページ
http://kinneko.homelinux.net/wiki/LinuxUPnP
■後記
とりあえず動いたが、改めて見直していると、かもしれんという文章が多すぎる。
書いてて自分でもよく判ってないんです。



 
 
 
 
LinuxでIP電話をする
作業手順
 
2004/1/21
written Komuro