rp-pppoeを使ったプロバイダーの使い分け(複数プロバイダー登録)
sorry Japanese only
最終更新日 2004/07
page size = Mbyte

それほどでもないけど、送信量もまあまあ凄いんで、プロバイダーの負荷分散をかねて、自動切り替えスクリプトを作ってみました。

日 nifty
月 iij
火 iij
水 nifty
木 nifty
金 iij
土 iij

こんな感じで、勝手に繋ぎ直すスクリプトです。
現在接続している側を判断 => 切断 => 別のプロバイダーへ接続 => dyndnsを更新
と処理を行います。

後々は、転送量を判断して勝手に繋ぎ変え。って言うのも良いかな?と思っています。

まずは adsl-startコマンドを使って niftyと iijが使えるようにセッティングします。

/etc/pppディレクトリーにある pppoe.confへ Fletsに接続する IDを書き込みますが、USER=の行へそれぞれのプロバイダーの Login名を書き込んだファイルを作成します。
私の場合、nifty,iijそれぞれの Login IDの書かれた niftyと iijというファイルを用意しました。
UNIX再起動した場合は、adsl-start pppoe.confが実行されるので、上で作成したファイルのどちらをデフォルトで使うかを決め、デフォルトで接続したい側へリンクしておきます。
[root]# ln -s pppoe.conf nifty
(pppoe.confが実体ファイルで、niftyというファイルはリンクで作成しました)

同じディレクトリーにある pap-secretsと chap-secretsは
[root]# cat pap-secrets
"niftyのID@nifty.com" *      "niftyのパスワード"
"iijのID@iij.ad.jp"   *      "iijのパスワード"
の様に記述します。最初分からず、2個ファイルを作ったりしてはまりました。

ここまでで、まず正常に繋がるかの確認をします。
[root]# adsl-start nifty
[root]# adsl-status nifty
[root]# adsl-stop nifty
[root]# adsl-start iij
[root]# adsl-status iij
[root]# adsl-stop iij

一通り正常にコマンドが通ることを確認します。

あとは、以下のような切り替えスクリプトを作り
[root]# cat pppoe-change.sh 
#!/bin/bash
#

#現在接続している IPアドレスを調べる
#
ipnow=`ifconfig ppp0 | grep inet |  awk '{print $1}'|cut -f 2 -d ":"`

#現在接続している HOST名を調べる
#
hostnow=`nslookup $ipnow | grep Name | awk '{print $2}'`

#nifty iijどちらが接続しているかを調べる
#
connnow=` ps ax | grep adsl-connect | awk '{print $7}' `
echo $connnow | grep "/etc/ppp/" > /dev/null
if [ $? = 0 ]
then 
 connnow=`echo $connnow | cut -f 4 -d "/" `
fi

#日付,転送量などを logに書き出し
#
echo $connnow $ipnow $hostnow >> /var/log/ppp-status.log
date >> /var/log/ppp-status.log
snmpget 127.0.0.1 -c net_work ifOutOctets.3 ifInOctets.3 >> /var/log/ppp-status.log
ifconfig ppp0 | grep "RX bytes" >> /var/log/ppp-status.log

#切断処理
#
/usr/sbin/adsl-stop /etc/ppp/$connnow >> /var/log/ppp-status.log
echo >> /var/log/ppp-status.log

#切断成功したかを調べる
#
ls -l /var/run | grep adsl | grep start > /dev/null
if [ $? = 1 ]
then
#切断成功していたら違う側のプロバイダーに接続
#
 if [ $connnow = "iij" ]
 then
  /usr/sbin/adsl-start /etc/ppp/nifty >> /var/log/ppp-status.log
  connnew="nifty"
 else
  /usr/sbin/adsl-start /etc/ppp/iij >> /var/log/ppp-status.log
  connnew="iij"
 fi
#dyndnsを更新
#
 /usr/local/DiCE/diced -e0 >> /var/log/ppp-status.log
else
#切断成功していなかったら ERRORを残す
#
 echo **** ERROR still connect $connnow >> /var/log/ppp-status.log
fi

#logに区切りを追加
#
echo --------------------------------------------- >> /var/log/ppp-status.log

上の shスクリプトを cronから起動するようにします

日,月,水,金曜日の朝 5:40分に実行すればいいかな?って事で、crontabは以下のようにしました。

[root]# crontab -l
40 5 * * 0,1,4,6 /usr/local/bin/pppoe-change.sh

ちなみに、上記スクリプトにてはき出される ppp-status.logは以下のように記録されます。

[root]# cat /var/log/ppp-status.log
nifty 202.233.247.214 ntkgsm008022.kgsm.nt.ftth.ppp.infoweb.ne.jp
2004年  8月 10日 火曜日 20:19:38 JST
interfaces.ifTable.ifEntry.ifOutOctets.3 = Counter32: 3473533932
interfaces.ifTable.ifEntry.ifInOctets.3 = Counter32: 1795708219
          RX bytes:273172 (266.7 Kb)  TX bytes:3684811 (3.5 Mb)
Killing pppd (22938)
Killing 
adsl-connect (22886)
.. Connected!
=-=-=- DiCE DynamicDNS Client -=-=-=
Version 0.19 for Japanese
Copyright(c) 2001 sarad

* 8/10 20:19 IPアドレスが変わりました >210.130.111.248
  dyndns-miya0 は更新保護中です (実行予定: 20:46)
+ 8/10 20:19 にdyndns-miya0が実行されました
  IPアドレスを更新しました
---------------------------------------------

12713
戻る