Since 4/22'98
フレッツADSLとなった現在も、LAN環境は Debian GNU/Linux + ISDN接続の時と変わらず
PPPoEで接続
+---------------------------+ +-----------------------+
| Host1(Server)192.168.0.11 |-----| NTT ADSL (PPPoEモデム)|----→Internet
| Gateway2000 P5-133 | +-----------------------+
| Celeron 500MHz | +---------------+
+--| Debian GNU/Linux (Server) |====| ALPS MD-4000J |
| +---------------------------+ +---------------+
| +---------------------------+ (プリンター)
| | Host3 192.168.0.13 |
|+-| Gateway GP6-450 | +---------------+
|| | Celeron 1.1GHz |====| ALPS MD-5000 |
HUB || | Windows2000 / Debian | +---------------+
+-----++ +---------------------------+ (プリンター)
|Corega|
|FSW-8L|
+---++++
|||| +---------------------------+
|||| | Host2 192.168.0.12 |
|||+-| Skeleton |
||| | PentiumIII 550MHz |
||| | Windows98 |
||| +---------------------------+
||| +---------------------------+
||| | Mac1 192.168.0.14 |
||+--| iMac |
|| | PowerPC G3 500MHz |
|| | MacOS J1-9.1 |
|| +---------------------------+
|| +---------------------------+
|| | Mac2 DHCP |
|+---| Performa 5260 |
| | PowerPC 100MHz |
| | MaOS 8.6 |
| +---------------------------+
| +---------------------------+
| | Host6 192.168.0.15 |
+----| PC-9801 DS2 |
| Cx486SRx2 16x2MHz |
| FreeBSD 2.2.2 RELEASE |
+---------------------------+ (2003.3現在)
Win2000( Host3 ) に接続した MD-5000(プリンター)は、Win98( Host2 ) としか共有できないが、Linux( Host1 ) に接続した MD-4000J は、Samba と Netatalk, Ghostscript により、全てのパソコンで共有しています。
ISDN ではルータとなるパソコンに LANカードが1枚あればインターネットに接続できるのですが、ADSL ではモデムとルータを LANカードで接続するために、LAN側のカードの他にもう1枚の LANカードが必要になります。
ISDN の時代から余っていた 10BASE-T のカードを利用することもなく取り付けていましたが、ADSL になった今その LANカードがやっと有効に活用されることになったのです。
ADSLモデムとパソコンを接続するには PPPoE(PPPオーバー・イーサネット)というドライバーが必要です。
フレッツADSL を申し込むと NTT(東/西)から Windows版や Macintosh版の他に Linux版のドライバーの入った CD-ROM が送られて来ます。
この CD-ROM を使う他に選択肢は Debianパッケージによる方法、Roaring Penguin Software (PPPoE) からソースドライバーを導入する方法がありました。
下調べ程度に各README には目を通したのですが、どれを見てもそれぞれ設定の方法が違っているようでした。
先ずはインターネット接続に成功したのは Debianパッケージの PPP と PPPoE 。
ともかく繋がった時の設定内容がどの README とも異なるもので、結果よければと素直に納得できない状況で接続していました。
(ともかく繋がっていないとDebianパッケージの更新もできないわけで、仕方ないです)
どうも Debian の Slink から Potato に移行した時の古い設定やら PPPxP 以前の PPP の設定やらが複雑に絡んでいたようです。
私としては TkPPxP のように GUI でかつ Linux の起動中に接続のオン・オフが出来るようにしたいのに Linux 起動と同時に接続されてしまう。
オフには出来るものの Linux を再起動しないと再接続ができないという状況でした。(単に方法を知らないだけかもですが)
しかも、接続状況を確認するには、ifconfig を打つとか、全てコマンドによることになる。
この状況から抜けたのが Roaring Penguin Software (PPPoE) からソースドライバーを導入する方法でした。
では、なぜ初めから使わなかったかというと、以前ダウンロードした rp-pppoe-3.0.ta.gz が tar xvzf で展開できなかったのです。
で、久々にそのページを覗いてみると、 rp-pppoe-3.1.ta.gz とバージョンが変わっていました。なんと、このバージョンでは難なく展開できたのです。
ついでに、PPP のソースもダウンロードしておきました。
先ずは、Debian パッケージの PPP と PPPoE をアンインストールします。
これを実行すると、外部のサーバーとは接続できないわけで、インストールが成功するまで、元に戻すことも出来ません。
しかし、Debian パッケージのままでいたら、インターネットに接続は出来るけどなんだか分からないという不満がありました。
というわけで、rp-pppoe-3.1 で接続できなければ、Debian パッケージに戻すわけにも行かないという背水の陣に追い込まれた状況であります。
rp-pppoe-3.1 のインストールですが、先ずは ppp を適当なディレクトリで
この時、/etc/network/interfaces に eth1 と ppp0 の設定を追加しておきます。
この設定に関しては、
島田さんのページを参考にしました。この設定後、# ifup eth1 で eth1 を有効にしておきます。
ただし、いろいろ試した結果 ppp0 の設定に関しては、追加しないというか、削除しておいてもなぜかちゃんと動いていました。
ここまではいいのですが、当初、DNS Setup の意味がよく分からず、選択肢 'From Server' 'Specify' 'Do not Adjust' の内で、'Specify'を選んで、プロバイダのプライマリ、セカンダリのDNSサーバーを書き込んだのですが、後でとんでもないことに気が付きました。
ともかく、この後、GUIのコントロール画面から Start ボタンをクリックすると、当たり前といえば当たり前ですが、すんなりとインターネットに繋がりました。GUI なので、通信状況もグラフでリアルタイムに表示されています。
後で、気が付いたこと
ファイアウォールの設定例はこちらに。
この後、rp-pppoe-3.1 を ./go により、コマンドタイプもインストールしてみました。こちらもインストール完了とともに、設定モードに入ります。ここで設定した内容も /etc/ppp 以下に書き込まれ ./go-gui によって設定されたファイルは別名でバックアップされます。
こちらをインストールした場合、OS の再起動時に自動接続されます。adsl-stop で切断、そして adsl-start で再接続されます。
Webサーバーを稼動するにあたり、いちいち IPアドレスを打ち込むのでは誰も来てくれません。しかも、ダイアルアップのため接続のたびにその IPアドレスは変わってしまいます。
そこで、以前より http://www.dyn.to/ により、ダイナミックDNS という手法で、グローバルなドメイン名を付けています。このドメイン名は、IPアドレスが変わっても同じ名前で、我が Webサーバーにアクセスできることになります。
そのドメイン名と変化する IPアドレスを関連つけるため、IPアドレスの変更があったら、DNSサーバーのテーブルを更新する作業が必要になります。この更新作業を自動化するために、先にも紹介した 島田さんのページを参考にしました。
IPアドレスをチェックして IPアドレスが変わっていたら、http://www.dyn.to/ に接続して、DNSテーブルを更新するというスクリプトで、cron を使って定期的にチェックするというものです。
(こうした自動化スクリプトを利用して常時接続させるには GUI による操作は特に必要ではなく、結局のところコマンドタイプのままで利用しています。)
その中で紹介されている方法で起きた問題。
自動化するスクリプト自体は問題ないのですが、http://www.dyn.to/ で紹介されている dyndyn というテーブル更新のためのスクリプトが、ターミナル上で実行する分にはちゃんと働いてくれるのに、cron で実行されるとエラーになってしまうというものです。
島田さんになぜでしょうと相談したところ、更新スクリプトのバックで働いている Lynx のバグだということでした。そのまま引用させていただくと、
> これは、Lynx が、コンソールを持たないプロセスから実行されると発生するバグです。
> 以下にパッチがあります。
> http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=78948&repeatmerged=yes
> Debian GNU/Linux をお使いでしたら、apt-get source lynx-ja でソース・パッ
>ケージをゲットしてバッチを当てて、dpkg-buildpackage -uc -us -rfakeroot
>してパッケージを作ってインストールします。
> それで dselect などで lynx-ja をホールドしておきます。
せっかく、親切で適切なアドバイスをいただいたのですが、自信がなかったので、他にも方法はないかと、例えば、Lynx ではなく、W3M で代用できないかとか、調べてみましたが、-dump というページを stdout に出力するオプションはあるものの、ID とパスワードをスクリプトから入力する方法が分からず、これも断念でした。
そういえば、もうひとつ http://www.dyn.to/ のページには、dynto.pl という Perlで書かれたスクリプトがありました。これは、ブラウザに依存しないのでうまく行きそうです。
これもひとつ問題がありました。
Perl はほとんどのディストリビューションに標準で備わっています。ところが、Perlの他に LWP というモジュールが必要とのこと。FreeBSD であれば、ports の /usr/ports/www/p5-libwww がそのページで紹介がありましたが、Linux の場合は何なんだろうということで戸惑ったもののやっと分かったことは、Debian パッケージでは、libwww-perl を導入すればよいと分かったことでやっと解決しました。
時は移ってもう1年以上たっているんですね。我がサーバーの環境も変わって無料の日本語ダイナミックDNSサイト:http://ddo.jp にも登録することにしました。
先の pppcontinue.sh も書き換える必要があります。
ddo.jp のサイトに
wget -O - 'http://ddo.jp/dnsupdate.php?dn=ドメイン&pw=パスワード '
で更新できるとありました。
先ずは、/usr/local/bin/ddo-update を作って次のスクリプトを書き込んでみました。
#!/bin/sh # 2003/01/23 wget -O - 'http://ddo.jp/dnsupdate.php?dn=ドメイン&pw=パスワード 'これだけ書き込んで実行属性をつけておきます。"ドメイン"は取得したドメインの hayakawa.ddo.jp の場合 hayakawa です。
〜前略〜
# IP アドレスを格納しておくためのファイル。
IPFILE=/var/local/run/$ppp.ip
〜中略〜
if [ $RESULT -eq 0 ]; then
# 接続状態にある
if [ -f $IPFILE ]; then
OLD_IP=`cat $IPFILE`
if [ $CURRENT_IP != $OLD_IP ]; then
echo -n "[`LC_ALL=C date "$DATE_FMT"`]: " >> $LOG
echo "Different IP address has been given." >> $LOG
echo "Try to update the DNS." >> $LOG
/usr/local/sbin/dynto.pl >> $LOG 2>&1 ### 注目!
if [ $? -eq 0 ]; then
echo $CURRENT_IP > $IPFILE
echo "Old IP address was [$OLD_IP]." >> $LOG
echo "Wrote new IP address [$CURRENT_IP] into $IPFILE." >> $LOG
fi
echo "----------------------------" >> $LOG
fi
else
echo -n "[`LC_ALL=C date "$DATE_FMT"`]: " >> $LOG
echo "$IPFILE does not exist." >> $LOG
echo "Try to update the DNS." >> $LOG
/usr/local/sbin/dynto.pl >> $LOG 2>&1 ### 注目!
if [ $? -eq 0 ]; then
echo $CURRENT_IP > $IPFILE
echo "Wrote new IP address [$CURRENT_IP] into $IPFILE." >> $LOG
fi
echo "----------------------------" >> $LOG
fi
fi
このスクリプトに /usr/local/sbin/ddo-update >> $LOG 2>&1
/usr/local/sbin/dynto.pl >> $LOG 2>&1
/usr/local/sbin/ddo-update >> $LOG 2>&1 # 追加
のように、2ヶ所ある /usr/local/sbin/dynto.pl >> $LOG 2>&1 の行の下に書き加えるだけで、一見うまく行ったような気がしたのですが、これだとどちらかの更新に失敗すると失敗した方のIPアドレスが更新されないまま残ってしまいます。
〜前略〜
# IP アドレスを格納しておくためのファイル。
IPFILE=/var/local/run/$ppp.ip
IPFILE2=/var/local/run/$ppp.ip2 # 追加
〜中略〜
if [ $RESULT -eq 0 ]; then
# 接続状態にある
if [ -f $IPFILE ]; then
OLD_IP=`cat $IPFILE`
if [ $CURRENT_IP != $OLD_IP ]; then
echo -n "[`LC_ALL=C date "$DATE_FMT"`]: " >> $LOG
echo "Different IP address has been given." >> $LOG
echo "Try to update the DNS." >> $LOG
/usr/local/sbin/ddo-update >> $LOG 2>&1
if [ $? -eq 0 ]; then
echo $CURRENT_IP > $IPFILE
echo "Old IP address was [$OLD_IP]." >> $LOG
echo "Wrote new IP address [$CURRENT_IP] into $IPFILE." >> $LOG
fi
echo "----------------------------" >> $LOG
fi
else
echo -n "[`LC_ALL=C date "$DATE_FMT"`]: " >> $LOG
echo "$IPFILE does not exist." >> $LOG
echo "Try to update the DNS." >> $LOG
/usr/local/sbin/ddo-update >> $LOG 2>&1
if [ $? -eq 0 ]; then
echo $CURRENT_IP > $IPFILE
echo "Wrote new IP address [$CURRENT_IP] into $IPFILE." >> $LOG
fi
echo "----------------------------" >> $LOG
fi
fi
# 以下 IPFILE2 用に追加修正
if [ $RESULT -eq 0 ]; then
# 接続状態にある
if [ -f $IPFILE2 ]; then
OLD_IP=`cat $IPFILE2`
if [ $CURRENT_IP != $OLD_IP ]; then
echo -n "[`LC_ALL=C date "$DATE_FMT"`]: " >> $LOG
echo "Different IP address has been given." >> $LOG
echo "Try to update the DNS." >> $LOG
/usr/local/sbin/dynto.pl >> $LOG 2>&1
if [ $? -eq 0 ]; then
echo $CURRENT_IP > $IPFILE2
echo "Old IP address was [$OLD_IP]." >> $LOG
echo "Wrote new IP address [$CURRENT_IP] into $IPFILE2." >> $LOG
fi
echo "----------------------------" >> $LOG
fi
else
echo -n "[`LC_ALL=C date "$DATE_FMT"`]: " >> $LOG
echo "$IPFILE does not exist." >> $LOG
echo "Try to update the DNS." >> $LOG
/usr/local/sbin/dynto.pl >> $LOG 2>&1
if [ $? -eq 0 ]; then
echo $CURRENT_IP > $IPFILE2
echo "Wrote new IP address [$CURRENT_IP] into $IPFILE2." >> $LOG
fi
echo "----------------------------" >> $LOG
fi
fi
このように2段構えのスクリプトとしてみました。
#! /bin/bash
export PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
# ログ・ファイルを設定。
LOG=/var/local/log/pppcontinue.log
# ログに記述する日付のフォーマット。
DATE_FMT="+%Y-%m-%d %a %T (%Z)"
# ADSL のインターフェースを設定。
# ETH_PPP=eth1
PPP=ppp0
# IP アドレスを格納しておくためのファイル。
IPFILE=/var/local/run/$PPP.ip
# IPFILE2=/var/local/run/$PPP.ip2 # ひとつを調べるだけで用は足せそうなのでこの行は不要でしょう
# PPP の IP アドレスを調べる。
CURRENT_IP=`/usr/local/sbin/getipaddress.sh $PPP 2> /dev/null`
RESULT=$?
if [ $RESULT -eq 0 ]; then
# 接続状態にある
if [ -f $IPFILE ]; then
OLD_IP=`cat $IPFILE`
if [ $CURRENT_IP != $OLD_IP ]; then
echo -n "[`LC_ALL=C date "$DATE_FMT"`]: " >> $LOG
echo "Different IP address has been given." >> $LOG
echo "Do nothing." >> $LOG
else
echo -n "[`LC_ALL=C date "$DATE_FMT"`]: " >> $LOG
echo "Same IP address is maintained." >> $LOG
echo "Try to update the DNS." >> $LOG
/usr/local/bin/ddo-update >> $LOG 2>&1
if [ $? -eq 0 ]; then
echo "It Succeeded." >> $LOG
fi
/usr/local/bin/dynto.pl >> $LOG 2>&1
if [ $? -eq 0 ]; then
echo "It Succeeded." >> $LOG
fi
fi
echo "----------------------------" >> $LOG
fi
fi
/etc/crontab は次のような一行を追加しておきました。一週間に一度、土曜の18時11分に実行する。18 11 * * 6 root /usr/local/sbin/dddcontinue.sh
Debian を POTATO から Woody に変更し、カーネルも 2.2系から 2.4系にグレードアップしました。カーネルは kernel 2.2.22 から kernel 2.4.18へ。kernel 2.4系は iptables が標準となっています。
従前の rp-pppoe は、./go により比較的簡単に PPP接続が実現しますが、ファイアウォールは ipchains が前提となっています。
この機会に ipchains から iptables に移行して、PPP接続環境も Debian パッケージの ppp および pppoe に変更することにしました。
Debian パッケージの利用ですが、先ず、kernel 2.4.18 のソースから ppp や pppoe その他の モジュールを有効にして再構築してから Debian パッケージの ppp および pppoe をインストールしました。
iptables については、TLEC(iptables の設定方法)を参考にしました。
rp-pppoe では adls-start で回線接続されますが、Debian パッケージの場合、前出の島田さんの例では、/etc/network/interfaces に
iface ppp0 inet ppp provider dsl-providerの2行を追加して ifup ppp0 , ifdown ppp0 によって、回線を接続、切断するようにしていますが、もうひとつの方法として、 pon , poff による方法があります。
/etc/network/interfaces に ppp0 の記述をして、/etc/ppp/ppp_on_boot をリネームして無効にすると、システムの起動によって ppp0 が有効にならないので、前述の pppcontinue.sh スクリプトによる起動を待つことになります。切断、接続には ifdown ppp0 , ifup ppp0 を使います。
/etc/network/interfaces から ppp0 の記述を削除して、/etc/ppp/ppp_on_boot を有効にするとシステムの起動と同時に ppp0 が有効になり回線接続されます。その後の切断、接続には poff 、 pon を使います。
/usr/bin/pon はスクリプトで、次のような記述があります。
if [ -z "$1" -a -x /etc/ppp/ppp_on_boot ]; then exec /etc/ppp/ppp_on_boot fi/etc/ppp/ppp_on_boot があれば、それを実行します。/etc/ppp/ppp_on_boot は/etc/ppp/ppp_on_boot.dsl のシンボリックリンクになっていて、/etc/ppp/ppp_on_boot.dsl に記述された /sbin/ifconfig eth1 up と /usr/sbin/pppd call dsl-provider が実行されます。
# 切断状態にある ・・・省略・・・ ifdown $PPP >> $LOG 2>&1 echo "Done." >> $LOG echo "Down $ETH_PPP." >> $LOG ifdown $ETH_PPP >> $LOG 2>&1 echo "Done." >> $LOG sleep 1 echo "Up $ETH_PPP." >> $LOG ifup $ETH_PPP >> $LOG 2>&1 echo "Done." >> $LOG echo "Up $PPP." >> $LOG ifup $PPP >> $LOG 2>&1 echo "Done." >> $LOG次のように変更しました。
# 切断状態にある ・・・省略・・・ echo "Up $PPP." >> $LOG pon >> $LOG 2>&1 echo "Done." >> $LOGただし、この部分はまだ試行錯誤中です。
なお、TLEC(iptables の設定方法) を参考に、/etc/network/interfaces には、eth1 の設定に続けて、
pre-up /etc/network/iptables.up
up /etc/network/flets.up
post-down /etc/network/iptables.down
down /etc/network/flets.down
を記述しておけば、eth1 の有効化に伴い、pre-up 、up に続くスクリプトが実行され、スクリプトに記述された iptables の設定が有効になります。iptables の設定については、別途、こちらに書く予定です。
(なお、既記載分も予告なく訂正、削除、追加する場合があります。)