RT58iでSSHをためす

そういえば、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 すれば良い感じになりますね。

Postfix+postgreSQL+courier-imapによるバーチャル運用(その1)

qmail+vpopmailにて運用したことがある人であれば、「Unixの実アカウントを使わずにメールの運用ができれば…」と考えている方もたくさんいると思います。
そこで、PostfixとPostgreSQLとcourier-imapを使い、qmail+vpopmailのような環境を構成してみたいと思います。
(まとめになかなか時間がかかりました。。。)
“Postfix+postgreSQL+courier-imapによるバーチャル運用(その1)” の続きを読む

ロードバランサーいらずの冗長化構成を考える。

先日、サービス無停止のプロバイダ切り替え方法について書いてみましたが、あれは固定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の方法についてです。
“サービス無停止のプロバイダ切り替え方法について。” の続きを読む

29歳というターニングポイント。

思えばサッカーの中田英寿選手が、ホームページで引退表明をした2006年7月3日、自分は勤めている会社の社長へ退職願を出しに行っていたのでした。
友人もまた、今の職場を辞めて別の会社へ行きますとか、奇遇にも同時期にそういった方が多かった今日この頃でした。

来年は30だよ、求人票を見ても軽く「30歳くらいまで歓迎~」みたいなことが書いてあったり、動けるときに動いておかないといけないというのもあるし、なにより自分の人生一度きり。自分で切り開いていかないといけませんね。大事です。

さて、今後はもっと忙しくなるのかな…。10年後に自分は何をしているだろうか。

Asteriskで無課金コールバックを試してみる。

なるだけ、自分の携帯から発信したくない…自宅の家電話から発信したい…ということで、ちょっと以下のような「Asteriskによる無課金コールバックシステム」を作ってみました。

条件として、以下のような環境が必要です。

・050番号 ・NTTひかり電話
または、
・050番号その1 ・050番号その2

といった環境です。
(ようは、外部に発信できるSIP registerが2つあればということです。)
以下の説明は、050番号その1とその2の方法で書いてみます。
通話のながれ
(1)携帯→050番号その1に電話→ビジーで通話が切れる
(2)050番号その1から携帯に着信→応答すると、IVRメニューに接続される
(3)IVRからAsterisk内にある内線電話を呼んだり、050番号その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 にセットされていない電話番号にはコールバックしない、等の安全措置を入れてあります。
いろいろと遊べるかもしれませんね…。