Linuxルータで VoIPアダプタを使う豆情報

Last update: February 4, 2012 JST

いきなりですが! 今日のその時は、VoIPアダプタの VoIPランプが点灯した時としました。
ちょっと、なにかの決め台詞みたい?

RedHatLinux8.0 を UPnP 対応にした時の備忘録。
ここのウェブサイトは RedHatLinux8.0 を用いて運用しています。 OCN からの連絡を機に OCN の IP電話「OCNドットフォン」サービスを申し込み、当初は ADSLモデム-NV3 をレンタルしたのですが、noip2(Linux用) との兼ね合いが悪く DynamicDNS が使用できませんでした。 そこで、既存の Linux環境を維持しつつ IP電話が使える VoIPアダプタをレンタルする事にしました。あなたが私と同じ環境ならすんなりとセットアップを完了するでしょう?

私の環境

フレッツ・ADSL (ADSL専用型 タイプ2)
OCNADSL「フレッツ」(ドットフォン付)
URL http://kogure.no-ip.com/ noip2でアドレスを自動更新しています。
ADSLモデム-MN3 192.168.0.1
Linuxルータ RedHatLinux8.0 eth0 192.168.0.100 ADSLモデム-MN3 に繋がる
eth1 192.168.1.100 ハブを介して Windows PC に繋がる
eth2 192.168.2.100 ハブを介して Mac に繋がる
eth3 192.168.3.100 ハブを介して Unix に繋がる
eth4 192.168.4.100 VoIPアダプタの WANポートに繋がる
ppp0 xxx.xxx.xxx.xxx PPPoE
VoIPアダプタ WANポート 192.168.4.20 Linuxルータの eth4 に繋がる
LANポート 192.168.100.1 VoIPアダプタ設定用PCに繋がる
電話機ポート 電話機
電話回線ポート 電話回線
尚、ファイアウォールは DROP が基本で必要なパケットのみを ACCEPT しています。


さて、必要なソフトをダウンロードします。

upnpsdk-1.0.4-1.i386.rpm linuxigd-0.92.tgz


始めに、upnpsdk-1.0.4-1.i386.rpm のインストールです。

[root@kathy akihito]# rpm -ihv upnpsdk-1.0.4-1.i386.rpm
Preparing... ########################################### [100%] 1:upnpsdk ########################################### [100%]


次に、linuxigd-0.92.tgz を展開して upnpd のインストールです。

[akihito@kathy src]$ tar zxvf linuxigd-0.92.tgz
linux-igd/ linux-igd/etc/ linux-igd/etc/gateconnSCPD.xml linux-igd/etc/gatedesc.skl linux-igd/etc/gatedesc.xml linux-igd/etc/gateicfgSCPD.xml linux-igd/etc/gateinfoSCPD.xml linux-igd/TODO linux-igd/CHANGELOG linux-igd/INSTALL linux-igd/LICENSE linux-igd/Makefile linux-igd/README linux-igd/SECURITY linux-igd/gate.cpp linux-igd/gate.h linux-igd/gateway.cpp linux-igd/gateway.h linux-igd/ipcon.cpp linux-igd/ipcon.h linux-igd/pmlist.cpp linux-igd/pmlist.h linux-igd/portmap.cpp linux-igd/portmap.h linux-igd/sample_util.cpp linux-igd/sample_util.h linux-igd/CREDITS
[akihito@kathy src]$ cd linux-igd/
addPortForward と delPortForward の関数内に赤字の部分を追加。着信できない不具合を解決します。
[akihito@kathy linux-igd]$ vi pmlist.cpp
※ pmlist.cpp の抜粋 int PortMapList::addPortForward(char *Proto, char *ExtIP, int ExtPort, char *IntIP,int IntPort, int Enabled, char *Desc) { char command[255]; sprintf(command, "/usr/sbin/iptables -I FORWARD -p %s -d %s --dport %d -j ACCEPT", Proto, IntIP, IntPort); system(command); sprintf(command, "/usr/sbin/iptables -t nat -A PREROUTING -p %s -d %s --dport %d -j DNAT --to %s:%d", Proto, ExtIP, ExtPort, IntIP, IntPort); system(command); return (1); } int PortMapList::delPortForward(char *Proto, char *ExtIP, int ExtPort, char* IntIP, int IntPort) { char command[255]; sprintf(command, "/usr/sbin/iptables -D FORWARD -p %s -d %s --dport %d -j ACCEPT", Proto, IntIP, IntPort); system(command); sprintf(command, "/usr/sbin/iptables -t nat -D PREROUTING -p %s -d %s --dport %d -j DNAT --to %s:%d", Proto, ExtIP, ExtPort, IntIP, IntPort); system(command); return (1); }
[akihito@kathy linux-igd]$ make
g++ -Wall -g -O2 -I/usr/include/upnp -c gate.cpp g++ -Wall -g -O2 -I/usr/include/upnp -c gateway.cpp g++ -Wall -g -O2 -I/usr/include/upnp -c sample_util.cpp g++ -Wall -g -O2 -I/usr/include/upnp -c ipcon.cpp g++ -Wall -g -O2 -I/usr/include/upnp -c portmap.cpp g++ -Wall -g -O2 -I/usr/include/upnp -c pmlist.cpp g++ -Wall -g -O2 gate.o gateway.o sample_util.o ipcon.o portmap.o pmlist.o -lpthread /usr/lib/libupnp.so -o upnpd make upnpd finished on Tue Feb 22 23:16:53 JST 2005
[akihito@kathy linux-igd]$ su
Password:
[root@kathy linux-igd]# make install


あと、upnpd を起動する前に環境を整えます。
私の Linuxルータの eth4 は、VoIPアダプタに繋がれましたが、INPUT 及び FORWARD のパケットをドロップしていましたので、始めの4つの操作が必要でした。 わかるまで苦労しました。

私の Linuxルータは始めの4つも必要になりました。
[root@kathy linux-igd]# /sbin/iptables -A INPUT -p tcp -i eth4 --dport 2869 -j ACCEPT
[root@kathy linux-igd]# /sbin/iptables -A INPUT -p udp -i eth4 --dport 1900 -j ACCEPT
[root@kathy linux-igd]# /sbin/iptables -A INPUT -p udp -i eth4 --dport domain -j ACCEPT
[root@kathy linux-igd]# /sbin/iptables -A FORWARD -i eth4 -j ACCEPT
[root@kathy linux-igd]# ln -s /sbin/iptables /usr/sbin/iptables
[root@kathy linux-igd]# /sbin/route add -net 239.0.0.0 netmask 255.0.0.0 eth4
eth4 は VoIPアダプタの WANポートが繋がる NIC です。 2869 と 1900 のポートは upnpd と VoIPアダプタが会話するので開けておきます。 domainポートは、VoIPアダプタ(のDNSサ−バのIPアドレスを 192.168.4.100 に設定)が名前解決の為に 使用するから開けておきます。


さて、いよいよ その時です!

[root@kathy linux-igd]# /usr/bin/upnpd ppp0 eth4
少し待つと、VoIPアダプタの VoIPランプが点灯するでしょ?





おまけ。起動スクリプトを自作してみました!
ちょっと強引です。この起動スクリプトは私の環境のみ作動保証ですから、参考にする場合赤字部分を注意して下さい。

[root@kathy akihito]# vi upnpd.sh
#!/bin/sh # chkconfig: 345 98 80 # description: Starts and stops the UPnP daemon # # Written by KOGURE Akihito and tested on Redhat 8.0 # 27-02-2005 # # Source function library. . /etc/rc.d/init.d/functions RETVAL=0 start() { if [ -f /var/lock/subsys/upnpd ]; then echo "UPnP daemon already started" && exit 0 fi /sbin/route add -net 239.0.0.0 netmask 255.0.0.0 eth4 echo -n $"Starting UPnP daemon: " daemon /usr/bin/upnpd ppp0 eth4 touch /var/lock/subsys/upnpd echo RETVAL=$? } stop() { if [ -f /var/lock/subsys/upnpd ]; then echo -n $"Stopping UPnP daemon: " killproc upnpd -TERM rm -f /var/lock/subsys/upnpd /sbin/route del -net 239.0.0.0 netmask 255.0.0.0 eth4 echo /etc/rc.d/init.d/iptables restart RETVAL=$? else echo "UPnP daemon is not running" && exit 0 fi return $RETVAL } restart() { stop start } case "$1" in start) start ;; stop) stop ;; restart) restart ;; *) echo $"Usage: $0 {start|stop|restart}" exit 1 esac exit $?
[root@kathy akihito]# cp upnpd.sh /etc/rc.d/init.d/upnpd
[root@kathy akihito]# chmod 755 /etc/rc.d/init.d/upnpd
[root@kathy akihito]# /sbin/chkconfig --add upnpd
[root@kathy akihito]# /sbin/chkconfig --list upnpd
upnpd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
[root@kathy akihito]# /etc/rc.d/init.d/upnpd start
Starting upnpd ppp0 eth4: [ OK ]
[root@kathy akihito]# ps ax | grep "upnpd"
4696 ? S 0:00 /usr/bin/upnpd ppp0 eth4 4761 pts/1 R 0:00 grep upnpd
[root@kathy akihito]# /etc/rc.d/init.d/iptables status | grep "192.168.4.20"
DNAT udp -- anywhere xxxx-xxxxxxxxx.xxxx.ocn.ne.jpudp dpt:5060 to:192.168.4.20:5060 DNAT udp -- anywhere xxxx-xxxxxxxxx.xxxx.ocn.ne.jpudp dpt:5090 to:192.168.4.20:5090 DNAT udp -- anywhere xxxx-xxxxxxxxx.xxxx.ocn.ne.jpudp dpt:5091 to:192.168.4.20:5091 ACCEPT udp -- anywhere 192.168.4.20 udp dpt:5091 ACCEPT udp -- anywhere 192.168.4.20 udp dpt:5090 ACCEPT udp -- anywhere 192.168.4.20 udp dpt:5060





インストール等で参考になったサイトです。

UPnPルーターにしてみる(Redhat9) Linuxルータの下流でフレッツADSL/BフレッツのIP電話を使う方法 シェルスクリプトを読んでみる 私、次のサイトで紹介されている情報、好みです。 WAN側保守機能 (telnetを使用)


home  ご感想は Kogure Akihito へ。 back top next