我が家には1Fと2Fに電話機があり、それぞれAsteriskにより内線番号が割り振られています。
最近は家の電話なんてかかってこないので、すっかりほったらかしでボヤーン状態でしたが、たまには使ってみるかと思ったものの
「そういえば、IP-PBXなのに、我が家の内線転送ってどうやるんだ?」
そんな疑問が浮上した今日この頃です。

屋根裏の自宅鯖FreeBSDからVPSのRockyLinux、そしてRaspberry Pi5へ。
我が家には1Fと2Fに電話機があり、それぞれAsteriskにより内線番号が割り振られています。
最近は家の電話なんてかかってこないので、すっかりほったらかしでボヤーン状態でしたが、たまには使ってみるかと思ったものの
「そういえば、IP-PBXなのに、我が家の内線転送ってどうやるんだ?」
そんな疑問が浮上した今日この頃です。
なんというか、クラスCなどのipを管理する場合のゾーン作成において、1から254まで全部書くのも面倒だなぁ、と思ったら便利なのあるんですな。
“named9で$GENERATEの巻き” の続きを読む
そういえば、RT58iを使っていてルータ自身がSSH2に対応したようなので、さっそくログインできるように設定してみます。
まず、ログインできるユーザを作成します。これは以前のRT57iやRT55iなどには無い機能でした。
ユーザを作成しておかないとSSHDを有効にしてもログインできないので注意。
[ログインするユーザを作成する]# login user kenti password
SSHといえば、、、FreeBSDやLinuxでもそうですが、初回に1度だけkeyを作ってあげないといけません。
seedは適当な数字を入れます。
[公開鍵/秘密鍵を作成する]# sshd host key generate 123
Generating public/private dsa key pair …
|*******
Generating public/private rsa key pair …
|*******
最後に、sshdを有効にします。
[SSHDを有効にして保存]# sshd service on
# save
設定後、TeraTermやPuttyなどでsshログインします。
(SSH2に対応したクライアントから接続してくださいな。)
RT58i BootROM Ver. 1.00
RT58i Rev.9.01.13 (Mon Nov 20 11:55:02 2006)
Copyright (c) 1994-2006 Yamaha Corporation.
Copyright (c) 1998-2000 Tokyo Institute of Technology.
Copyright (c) 2000 Japan Advanced Institute of Science and Technology, HOKURIKU.
Copyright (c) 2002 RSA Security Inc. All rights reserved.
Copyright (c) 1997-2004 University of Cambridge. All rights reserved.
Copyright (C) 1997 – 2002, Makoto Matsumoto and Takuji Nishimura, All rights reserved.
Copyright (c) 1995 Tatu Ylonen , Espoo, Finland All rights reserved.
Copyright (c) 1998-2004 The OpenSSL Project. All rights reserved.
Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) All rights reserved.
00:a0:de:11:22:33, 00:a0:de:44:55:66
Memory 32Mbytes, 2LAN, 1BRI
[RT58i]>
これで、 telnetd none すれば良い感じになりますね。
先日、サービス無停止のプロバイダ切り替え方法について書いてみましたが、あれは固定IP1での話でした。
今回は、固定IP8などの複数IPを使用している際の無停止切り替えや、冗長化構成にする方法を書いてみます。

[ルータを別にした、マルチホーミング的なネットワーク構成]
RT1とRT2では、特に複雑なことはしていません。いわゆるunnumbered接続で、複数固定IP運用を行うPPPoE接続、専用線接続などによる運用をしていると仮定します。
肝心なのは、その先をL2SWで接続し、結果1台のサーバへ接続してしまいます。
サーバ(FreeBSD6.0R)の設定例
kenti.jp > ifconfig
vge0: flags=8843<up,broadcast,running,simplex,multicast> mtu 1500
options=1b<rxcsum,txcsum,vlan_mtu,vlan_hwtagging>
inet6 fe80::202:----:f---:e--%vge0 prefixlen 64 scopeid 0x1
inet 20x.112.8.66 netmask 0xfffffff8 broadcast 20x.112.8.71
inet 6x.11.12.114 netmask 0xfffffff8 broadcast 6x.11.12.119
ether 00:--:--:--:--:--
media: Ethernet autoselect (1000baseTX )
status: active
vge1: flags=8843<up,broadcast,running,simplex,multicast> mtu 1500
options=1b<rxcsum,txcsum,vlan_mtu,vlan_hwtagging>
inet6 fe80::202:----:f---:---%vge1 prefixlen 64 scopeid 0x1
inet 192.168.11.1 netmask 0xffffff00 broadcast 192.168.11.255
ether 00:--:--:--:--:--
media: Ethernet autoselect (1000baseTX )
status: active
lo0: flags=8049<up,loopback,running,multicast> mtu 16384
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet 127.0.0.1 netmask 0xff000000
</up,loopback,running,multicast></rxcsum,txcsum,vlan_mtu,vlan_hwtagging></up,broadcast,running,simplex,multicast></rxcsum,txcsum,vlan_mtu,vlan_hwtagging></up,broadcast,running,simplex,multicast>
※20x.112.8.66を実IP、6x.11.12.114をaliasとして割り当てます。 デフォルトゲートウェイは、RT1の20x.112.64.65に向けますが、設定に関わらずRT2(6x.11.12.112/29)からのパケットも返事できます。
本来であれば「NICをグローバルIP毎に分けたほうがいいのではないか?」等ありますが、それだとルーティングについてそれぞれのNIC毎に設定が必要なことと、フィルタ等の設定が必要になります。ですので、グローバルIP2つを敢えて1つのNICにぶら下げます。
また、この方法は私自身が過去に経験した手法の中で、プロバイダ切り替えの際などには重宝しました。
実際には、このサーバでサービスを提供するのではなく、あくまでこのサーバをクラスタサーバに見立てて、NATなどで下位サーバ(192.168.11.2)にwebなどのサービス処理をやらせるとセキュリティ上いいのかもしれません。(もちろん、このサーバ自身でサービスを運用しても十分に回線冗長化を考慮したサービスサーバになります。)
また、これはサーバでなくともルータで代用ができる…かもしれませんが、そんな感じです。
先日、So-netからさくらインターネットへ我が家のサーバを切り替える際に、IPアドレスを変更するためDNS参照がうまくできるような構成にし、webサービスなどを停止せずに、旧IPアドレス→新IPアドレスへ切り替える方法について書いてみます。
今回は、固定IP1の方法についてです。
“サービス無停止のプロバイダ切り替え方法について。” の続きを読む
debian(Linux)をネットワークインストールするため、PCにインストールをしているもののスループットがとても遅く、インストールがなかなか終わらないので、ちょっと調べてみました。
“[RT57i]スループットについて” の続きを読む
なるだけ、自分の携帯から発信したくない…自宅の家電話から発信したい…ということで、ちょっと以下のような「Asteriskによる無課金コールバックシステム」を作ってみました。
条件として、以下のような環境が必要です。
・050番号 ・NTTひかり電話 または、 ・050番号その1 ・050番号その2 といった環境です。 (ようは、外部に発信できるSIP registerが2つあればということです。) 以下の説明は、050番号その1とその2の方法で書いてみます。
{extensions.conf} [fromiptel1] exten => ${IPTEL1},1,System(echo "${CALLERIDNUM}"|perl /var/bin/ipout.pl& ) exten => ${IPTEL1},2,busyこのエクステンションで(1)の動作をします。ようは、かかってきた番号だけをスクリプトに渡し、あとは着信せずビジーにします。こうすることで課金が発生しません。
[callbackmenu] exten => s,1,SetVar(CNT=1) exten => s,2,Ringing exten => s,3,Wait,1 exten => s,4,Answer exten => s,5,Wait,1 exten => s,6,Background(vm-enter-num-to-call) exten => s,7,WaitExten(10) exten => s,8,GotoIf($[${CNT} >= 3]?11:9) exten => s,9,SetVar(CNT=$[${CNT} + 1]) exten => s,10,Goto(s,6) exten => s,11,playback(tt-monkeysintro) exten => s,12,Hangup exten => s,13,Congestion include => ipout2 include => inner exten => i,1,Wait(1) exten => i,2,GotoIf($[${CNT} >= 3]?6:3) exten => i,3,SetVar(CNT=$[${CNT} + 1]) exten => i,4,Playback(pbx-invalid) exten => i,5,Goto(s,7) exten => i,6,playback(tt-monkeysintro) exten => i,7.Hangup exten => i,8,Congestionここまでで(2)のIVRを行います。
[ipout2] exten => _0.,1,SetCallerId,050xxxx1234 exten => _0.,2,Dial(SIP/${EXTEN}@iptel2,60,r) exten => _0.,3,Congestionここで(3)の動作となり、050番号その2で発信します。
自動発信について、Asteriskは、 /var/spool/asterisk/outgoing/ 内に以下のようなフォーマットのテキストを入れることで、自動発信を行います。
# Channel: SIP/200 Callerid: 100 MaxRetries: 1 RetryTime: 60 WaitTime: 30 Set: LANGUAGE()=jp Context: default Extension: 201 Priority: 1
この内容で、Asteriskから内線200を呼び、extensionsのdefault→201,1を実行します。
(CallerIDが100にしてあるので、内線200には100から電話がきた、ということになります。)
そこで、今回の「かかってきた番号に対して、コールバックする」という仕組みを考えた場合、以下のような単純なスクリプトが出来ると思います。(ベタなPerlで作成しました…。)
{/var/bin/ipout.pl}
#!/usr/local/bin/perl
#コールバックを受け付ける携帯のセット。複数ある場合は|で区切る。
$callphone = '080ABCD1234|090ABCD1234|0901234ABCD';
$time = time;
#asterisk setting
$file = '/var/spool/asterisk/outgoing/ipcall.' . $time;
$callno = ;
$callerid = '050xxxx1234'; #IP電話その2の番号
$retry = '1';
$rtime = '10';
$wtime = '20';
$context = 'callbackmenu';
$ext = 's';
$pr = '1';
#callno check.
if($callno !~ /^[0-9]+$/){exit 1;} #電話番号に数字以外のものがあれば終了
if($callno !~ /$callphone/ ){exit 1;} #コールバックを受け付ける電話番号以外なら終了
#Time Wait...
sleep 10;
#File Write.
open(OUTFILE, ">$file");
print OUTFILE '#' . "\n";
print OUTFILE "Channel: SIP/iptel2/$callno\n";
print OUTFILE "Callerid: $callerid\n";
print OUTFILE "MaxRetries: $retry\n";
print OUTFILE "RetryTime: $rtime\n";
print OUTFILE "WaitTime: $wtime\n";
print OUTFILE "Set: LANGUAGE()=jp\n";
print OUTFILE "Context: $context\n";
print OUTFILE "Extension: $ext\n";
print OUTFILE "Priority: $pr\n";
close(OUTFILE);
一応イタズラ防止のため、$callphone にセットされていない電話番号にはコールバックしない、等の安全措置を入れてあります。
いろいろと遊べるかもしれませんね…。
オープンソースであるIP-PBXのAsteriskを使用して、自宅のひかり電話と、プロバイダで契約している050番号(IP電話)をまとめ、内線毎に鳴り分ける方法を書いてみたいと思います。
筆者の環境として、
・RT-200KI(NTT東日本レンタル) ・YAMAHA RT57 ・FreeBSD6.0 + Asterisk1.2.4
を使用し、zaptel(物理的な外線接続、電話機接続)は使用せず、SIP通信だけを行わせます。
接続は、以下の通り。
{接続図}
(internet)——(ONU)—-[RT-200KI]====[YAMAHA RT57]—–ClientPCなど
※2009/9/22追記 – 上記接続図では説明が不十分のため、図解を入れました。

設定は以下の通りです。
RT-200KI(NTT東日本rental)
IPアドレスは、192.168.11.253とする。
[電話設定→IP端末1] 電話番号:024-xxx-xxxx 内線番号:3 端末属性:IP端末(音声) ユーザ名:0003 パスワード:password[電話設定→内線番号一覧] 上記の内線番号3を、「収容端末選択」にて「有効」にすること。
Asterisk1.2.6
IPアドレスは、192.168.11.2 とします。
{sip.conf}
[general]
language=jp
context=default
bindport=5060
bindaddr=0.0.0.0
srvlookup=no
disallow=all
allowguest=no
allow=ulaw
allow=alaw
allow=gsm
dtmfmode=inband
defaultexpirey=3600
externip=(固定IPを利用している場合はIPを書くか、)
externhost=(またはダイナミックDDNS名を書く)
nat=never
; ひかり電話(RT-200KI)で設定した内容にてレジストする
register => 3:password:0003@192.168.11.253/024938xxxx
; プロバイダのIP電話(我が家の場合はso-net)の設定内容でレジストする
register => 050ABCD1234@so-net.ne.jp:PASSWORD:USERNAME@voipAA.so-net.ne.jp/050ABCD1234
[ntttel]
type=friend
username=0003
secret=password
host=192.168.11.253
canreinvite=no
dtmfmode=inband
disallow=all
allow=ulaw
allow=alaw
context=fromntttel
insecure=very
[iptel]
type=friend
username=USERNAME
secret=PASSWORD
host=voipAA.so-net.ne.jp
fromdomain=so-net.ne.jp
fromuser=050ABCD1234
canreinvite=no
dtmfmode=inband
disallow=all
allow=ulaw
allow=alaw
context=fromiptel
insecure=very
[201]
type=friend
username=201
secret=password
host=dynamic
canreinvite=no
dtmfmode=inband
[202]
type=friend
username=202
secret=password
host=dynamic
canreinvite=no
dtmfmode=inband
{extension.conf}
[general]
static=yes
writeprotect=yes
[globals]
Clock=117
IPTEL=050xxxxyyyy
NTTTEL=024xxxyyzz
NTTRT=3
[fromiptel]
exten => ${IPTEL},1,Ringing
exten => ${IPTEL},2,Wait,5
exten => ${IPTEL},3,Answer
exten => ${IPTEL},4,Wait,1
exten => ${IPTEL},5,Background(vm-enter-num-to-call)
exten => ${IPTEL},6,WaitExten(5)
exten => ${IPTEL},7,Goto(${IPTEL},4)
include => inner
exten => i,1,Wait(1)
exten => i,2,Playback(pbx-invalid)
exten => i,3,Goto(${IPTEL},6)
[fromntttel]
exten => ${NTTTEL},1,Dial(SIP/201&SIP/202,30)
exten => ${NTTTEL},2,HangUp
;
;
[ipout]
exten => _050.,1,SetCallerId,${IPTEL}
exten => _050.,2,Dial(SIP/${EXTEN}@iptel,60,r)
exten => _050.,3,Congestion
include => nttout
[nttout]
exten => _0.,1,SetCallerId,${NTTRT}
exten => _0.,2,Dial(SIP/${EXTEN}@ntttel,60,r)
exten => _0.,3,Congestion
[dtmf-debug]
exten => s,1,Ringing
exten => s,2,Wait,10
exten => s,3,Answer
exten => s,4,WaitExten(1)
exten => _X,1,SayDigits(${EXTEN})
exten => _X,2,Goto(s,4)
exten => t,1,Goto(s,4)
[default]
include => ipout
include => nttout
include => inner
[inner]
; ip-in-debug
exten => 111,1,Goto(fromiptel,${IPTEL},1)
; 386 dtmf test
exten => 386,1,Goto(dtmf-debug,s,1)
; Speaking Clock
exten => ${Clock},1,Answer()
exten => ${Clock},2,Wait(1)
exten => ${Clock},3,setvar(FutureTime=$[${EPOCH} + 5])
exten => ${Clock},4,SayUnixTime(${FutureTime},,PHM)
exten => ${Clock},5,playback(beep)
exten => ${Clock},6,Goto(${Clock},3)
; 200: Exho test
exten => 200,1,Answer()
exten => 200,2,Wait(1)
exten => 200,3,Playback(demo-echotest)
exten => 200,4,Playback(beep)
exten => 200,5,Echo
exten => 200,6,Playback(beep)
exten => 200,7,playback(vm-goodbye)
exten => 200,8,Hangup
; Local SIP Telephones 201-208
exten => 201,1,Dial(SIP/201,30,tT)
exten => 201,2,Answer()
exten => 201,3,Voicemail(${EXTEN})
exten => 201,4,Hangup
exten => 201,102,Answer()
exten => 201,103,Voicemail(${EXTEN})
exten => 201,104,Hangup
exten => 202,1,Dial(SIP/202,30,tT)
exten => 202,2,Answer()
exten => 202,3,Voicemail(${EXTEN})
exten => 202,4,Hangup
exten => 202,102,Answer()
exten => 202,103,Voicemail(${EXTEN})
exten => 202,104,Hangup
exten => 203,1,Dial(SIP/203,60,tT)
exten => 203,2,Answer()
exten => 203,3,Voicemail(${EXTEN})
exten => 203,4,Hangup
exten => 203,102,Answer()
exten => 203,103,Voicemail(${EXTEN})
exten => 203,104,Hangup
exten => 204,1,Dial(SIP/204,60,tT)
exten => 204,2,Answer()
exten => 204,3,Voicemail(${EXTEN})
exten => 204,4,Hangup
exten => 204,102,Answer()
exten => 204,103,Voicemail(${EXTEN})
exten => 204,104,Hangup
exten => 205,1,Dial(SIP/205,60,tT)
exten => 205,2,Answer()
exten => 205,3,Voicemail(${EXTEN})
exten => 205,4,Hangup
exten => 205,102,Answer()
exten => 205,103,Voicemail(${EXTEN})
exten => 205,104,Hangup
; For Voicemail Recording
exten => 201*1,1,Answer()
exten => 201*1,2,Voicemail(201)
exten => 201*1,3,Hangup
exten => 202*1,1,Answer()
exten => 202*1,2,Voicemail(202)
exten => 202*1,3,Hangup
exten => 203*1,1,Answer()
exten => 203*1,2,Voicemail(203)
exten => 203*1,3,Hangup
exten => 204*1,1,Answer()
exten => 204*1,2,Voicemail(204)
exten => 204*1,3,Hangup
exten => 205*1,1,Answer()
exten => 205*1,2,Voicemail(205)
exten => 205*1,3,Hangup
; For Voicemail Playback
exten => 298,1,Answer()
exten => 298,2,VoicemailMain()
exten => 298,3,Hangup
exten => 299,1,Answer()
exten => 299,2,VoicemailMain(s${CALLERIDNUM])
exten => 299,3,Hangup
; MeetMe
exten => 300,1,Ringing
exten => 300,2,Wait,5
exten => 300,3,Answer()
exten => 300,4,Meetme(300|M)
exten => 300,5,Hangup
exten => 301,1,Ringing
exten => 301,2,Wait,5
exten => 301,3,Answer()
exten => 301,4,MeetMe(|scdpM)
exten => 301,5,Hangup
;
exten => i,1,Answer()
exten => i,2,Wait(1)
exten => i,3,Playback(pbx-invalid)
exten => i,4,Congestion
[YAMAHA RT57]
IPは、192.168.11.1とします。
sip use on sip server 1 192.168.11.2 register udp sip:201@192.168.11.2 201 password sip server display name 1 201 sip server 2 192.168.11.2 register udp sip:202@192.168.11.2 202 password sip server display name 2 202以下は、201がアナログポート1、202がアナログポート2、というように分けてます。 analog arrive number display 1 on analog rapid call 1 off analog sip call myname 1 sip:201 analog sip call display name 1 201 analog sip call myname 2 sip:202 analog sip call display name 2 202
以上で、YAMAHA RT57に接続した電話機毎に、ひかり電話と050番号を鳴り分けさせることができます。
YAMAHA RT57を使用しているが、先日ルータにて「認証失敗回数オーバー」で接続出来ないでいたので、以下のコマンドを投入してみました。
pppoe auto disconnect off pppoe call prohibit auth-error count off
Bフレッツの故障などがあると、よくこけているんですよね。。。
職場での話なのですが、要はエロサイトばかりを見ておらっしゃる方がいたので対策をするため、透過Proxyの構築をしてみました。