作成開始 : 平成21年06月18日(木) 最終更新 : 平成22年10月16日(土)

tinydns のデータを同期させる。


平成21年 6月 5日(金)に立ち上がらなくなったWindows95がインストールされた PC-9821Ne ・・・・
もう、今更Windows95のインストールなんてしたくなかったので暫く寝かせていた。
しかし、このまま寝かせていると壊れてしまうと思い以前メールサーバー、DNSサーバー、NTPサーバー、DHCPサーバーとして使っている PC-9821 に実装されていた HDD があった。しかも、それには FreeBSDがインストールされている。

そこで、tinydns のデータを同期させてセカンダリDNSみたいにしてしまおうと思った。


1.同期の概念

mail.takaq.jp で tinydns の dnsデータである data.cdb が更新されたら、それを mail2.takaq.jp に転送して反映してしまおうというものです。
更新は手動で make した時と dhcp_dns で自動 make された時である。

2.環境条件

tinydns が双方にインストールされ稼動していること。
djbdns の dnscache と tinydns のインストール設定は「djbdnsでDNSキャッシュ・サーバーを試す! 」をご覧ください。
isc-dhcp3 のインストールと設定は「DHCPサーバーを試す 」をご覧ください。
dhcp_dns のインストールと設定は「DHCP (isc-dhcp) と DNS (djbdns [tinydns, dnscache]) と連携し Dynamic DNSを試す。」をご覧ください。

3.参考ページ

djbdnsjbdns by DJB にある「DNS サービスの複製を作る」です。
それによると・・・・・
第一のコンピュータ(mail.takaq.jp)で、 root で、 /service/tinydns/root/Makefile を編集して、 /service/tinydns/root/data を第一のコンピュータ(mail.takaq.jp)から第二のコンピュータ(mail2.takaq.jp)へ複写するようにする。
     remote: data.cdb
             rsync -az -e ssh data.cdb 1.8.7.201:/service/tinydns/root/data.cdb

     data.cdb: data
             /usr/local/bin/tinydns-data
もし rsync がなければ、こうする:
     remote: data.cdb
             scp data.cdb 1.8.7.201:/service/tinydns/root/data.cdb.tmp
             ssh 1.8.7.201 mv /service/tinydns/root/data.cdb.tmp \
             /service/tinydns/root/data.cdb

     data.cdb: data
             /usr/local/bin/tinydns-data
これで第一(mail.takaq.jp)のコンピュータでの変更はすべて第二のコンピュータ(mail2.takaq.jp)へ複製される。
この時点で、どちらのサーバーにも rsync はインストールされていません。
でも、scp はありました。ですので scp を使った方法で構築しました。

4.SSH で mail.takaq.jp から mail2.takaq.jp にログインする準備

私の環境では、/etc/tinydns/root の実行権は root になっているので mail2.takaq.jp に ssh を root でログインできるようにしておく必要があります。
まずは、mail2.takaq.jp の 以下を編集します。
・/etc/ssh/sshd_conf
PermitRootLogin no
     ↓
PermitRootLogin yes
これをしないと、ssh や scp で mail2.takaq.jp にログインできません。次のようになってしまいます。

root@mail2.takaq.jp's password:
Permission denied, please try again.
root@mail2.takaq.jp's password:
Permission denied, please try again.
root@mail2.takaq.jp's password:
Permission denied.
lost connection
そして、mail.takaq.jp から mail2.takaq.jp へ root でログイン確認してみます。
初めて接続する時は、そのホストを信用していいかどうかを聞いてきます。yesを入力すると、ホームディレクトリの.ssh/known_hostsにそのホストのRSA鍵を登録します。これ以降の接続時には、この登録された鍵がチェックされます。

mail# ssh mail2.takaq.jp
The authenticity of host 'mail2.takaq.jp (192.168.1.10)' can't be established.
RSA1 key fingerprint is 17:c6:1b:a3:60:13:53:f7:de:88:78:c3:3a:7c:c3:4f.
Are you sure you want to continue connecting (yes/no)? yes          →( yes にします)
root@mail2.takaq.jp's password:                             →(mail2.takaq.jp の root のパスワードを入力します。)
mail2#                                            →(ログインできました。)
次に scp で mail.takaq.jp から mail2.takaq.jp へ転送を確認します。
mail# scp -v takaq.txt mail2.takaq.jp:/service/tinydns/root/takaq.txt.tmp
Executing: program /usr/bin/ssh host mail2.takaq.jp, user (unspecified), command scp -v -t /service/tinydns/root/takaq.txt.tmp
root@mail2.takaq.jp's password:
Sending file modes: C0644 6 takaq.txt
takaq.txt 100% |*****************************| 6 00:00
mail#
・・・・となればOKです。
scp で ファイルをコピーしようとしたところ、最初次のようになり転送できませんでした。

mail# scp takaq.txt mail2.takaq.jp:/service/tinydns/root/takaq.txt.tmp
root@mail2.takaq.jp's password:
2009年 6月15日 月曜日 21時45分28秒 JST
mail# Write failed flushing stdout buffer.
write stdout: Broken pipe


調べたところ、mail2.takaq.jp の root の .cshrc の最後に date を書いていたためと分かりました。
date をリマークしたらOKになりました。
echo とか書いていてもだめなようです。
とりあえず ssh、scp はできるようになりましたが、毎回パスワードを聞かれてしまいます。
これではスクリプトで自動実行ができません。
次は、接続時にパスワードを求められないようにしてみました。

5.SSH でパスワードを求められないようにする。

実験したサーバーは、SSH protocol version 1です。SSH protocol version 2 については他のサイトを参照ください。
(1) RSA キーを mail.takaq.jp で生成します。
mail# ssh-keygen
Generating public/private rsa1 key pair.
Enter file in which to save the key (/root/.ssh/identity):
Enter passphrase (empty for no passphrase):             -> (何も入力しないでEnterします。)
Enter same passphrase again:                       -> (何も入力しないでEnterします。)
Your identification has been saved in /root/.ssh/identity.
Your public key has been saved in /root/.ssh/identity.pub.
The key fingerprint is:
18:14:b4:30:0f:3e:3a:9c:58:f8:eb:44:9c:bc:a0:29 root@mail.takaq.jp
mail# cd .ssh
mail# pwd
/root/.ssh
mail# ll
total 4
-rw------- 1 root wheel 533 Jun 16 22:21 identity
-rw-r--r-- 1 root wheel 337 Jun 16 22:21 identity.pub
-rw-r--r-- 1 root wheel 664 Jun 15 21:12 known_hosts
(2)公開キー(identity.pub)をリモートホスト (mail2.takaq.jp) にコピーします。
mail# scp identity.pub root@mail2.takaq.jp:
root@mail2.takaq.jp's password:                     -> (ここは mail2.takaq.jp の rootパスワードです)
identity.pub 100% |*****************************| 337 00:00
(3) リモートホスト (mail2.takaq.jp) にログインし、authorized_keys ファイルを生成します。
mail2# ll
total 9
-rw-r--r-- 2 root wheel 948 6/15 22:53 .cshrc
-rw------- 1 root wheel 2312 6/16 20:26 .history
-rw-r--r-- 1 root wheel 142 1/28 2002 .klogin
-rw-r--r-- 1 root wheel 297 1/28 2002 .login
-rw-r--r-- 2 root wheel 251 1/28 2002 .profile
drwx------ 2 root wheel 512 6/16 21:56 .ssh
-rw-r--r-- 1 root wheel 337 6/16 22:24 identity.pub
mail2# cd .ssh
mail2# touch authorized_keys
mail2# chmod 600 authorized_keys
mail2# cat ../identity.pub >> authorized_keys
mail2# rm -i ../identity.pub             ->(コピーしてきた identity.pub は不要なので削除します。)
remove ../identity.pub? y
mail2#
(4)動作確認してみます。
mail# ssh mail2.takaq.jp
mail2#                     ->(パスワード要求なしでログインできました)
mail# scp takaq.txt mail2.takaq.jp:/service/tinydns/root/takaq.txt.tmp
takaq.txt 100% |*****************************| 6 00:00        ->(パスワード要求なしで転送できました。)
mail#

6.自動同期を設定する。

(1) /etc/tinydns/root に syncro.sh として下記ファイルを作成します。
scp data.cdb root@mail2.takaq.jp:/service/tinydns/root/data.cdb.tmp
ssh root@mail2.takaq.jp mv /service/tinydns/root/data.cdb.tmp \
/service/tinydns/root/data.cdb
chmod +x syncro.sh で実行可能形式にします。(Makefileで ./syncro.sh でもいいかと)
(2) /etc/tinydns/root/Makefile 内の data.cdb: data セクションに ./syncro.sh を追加します。
data.cdb: data
/usr/local/bin/tinydns-data
./syncro.sh                         -> (ここです)
/usr/local/bin/svc -h /service/dnscache

db.takaq.jp: static.takaq.jp dhcp.takaq.jp
@echo "# DO NOT EDIT THIS FILE DIRECTLY" > db.takaq.jp
cat static.takaq.jp dhcp.takaq.jp >> db.takaq.jp

data: db.*
@echo "# DO NOT EDIT THIS FILE DIRECTLY" > data
cat db.* >> data
はじめ、dhcp.takaq.jp が変わっても data.cdb, data, db.takaq.jp が更新されませんでした。
そこで・・・
./syncro.sh を単独で実行したら mail2.takaq.jp にdata.cdb が移されてので syncro.sh は正常に実行されていました。
では、Makefileかと思い単独で make してみました。そしたら・・・・

mail# make
"Makefile", line 3: Need an operator
make: fatal errors encountered -- cannot continue
mail#


・・・だって、なんだこりゃー

・・・・でググったら以下を発見しました。

リスト 1. 依存関係ルールの形式

target: dependencies
instructions


初めて makefile を書く場合に突き当たる大きな問題は、この構造を見るとわかります。
いや、見えないと言うべきかもしれません。インデントはタブであり、空白の連続ではないのです。
このフォーマットで空白を使ったファイルに対して Berkeley make が発行するエラー・メッセージは、あまり助けになりません。


なので、viでMakefileを開いて :! set list にしたら、なるほど「TAB」でなく「SPACE」だった。
タブにして make したら・・・

mail# make
cat static.takaq.jp dhcp.takaq.jp >> db.takaq.jp
cat db.* >> data
/usr/local/bin/tinydns-data
./syncro.sh
data.cdb 100% |*****************************| 5760 00:00
/usr/local/bin/svc -h /service/dnscache


おぉーう、やっとOKです。
やったあー、mail2.takaq.jp の data.cdb も同期しています。

7.実行確認

mail.takaq.jp で make しても確認できますが、dhcp_dns が動いているので DHCP接続したPCか他のネットワーク機器(うちではカラオケ)を接続して確認しました。
その際、dhcpのリース期間を短く設定してテストするとよいでしょう。
わが家のカラオケはdhcpサーバーで設定したリース期間に関係なく5分くらいでリース更新要求を出すのでテストには最適でした。

ちゃんと同期していますね♪


平成22年10月16日(土) 追記

PC9821 Ne はすでに電源すら入らなくなってしまったので、別のDOS/V機に環境を構築していました。
上の記事を書いたPCは FreeBSD 4.5 だったのですが、別のDOS/V機のは FreeBSD 4.11 です。
かなり設定内容が違っていたので結構ハマリました。

なので、結果だけ記録残して次回はスムーズにいけるようにしたいと思います。
なお、コンピュータ名は上の記事に合わせて、同期元が mail.takaq.jp 同期先が mail2.takaq.jp とします。
1.mail2.takaq.jp でリモートからの接続を許可する設定(もしかしたらディフォルト値の場合はリマーク外さなくても良かったかな?)
ファイル : /etc/ssh/sshd_config
Port 22
                    sshd が Listen するポートを指定する。デフォルト値は 22。
Protocol 2,1
                    sshd がサポートするプロトコルバージョンを指定する。デフォルト値は 2,1(バージョン 1 と 2 両方をサポート)。
PermitRootLogin yes
                    ssh を使用したroot のログイン許可するか設定する。
                    yes | without-password | forced-commands-only | no のいずれかを指定する。デフォルト値は yes。
RSAAuthentication yes
                    RSA 認証を許可するか設定する。デフォルト値は yes。
PubkeyAuthentication yes
                    公開鍵認証を許可するか設定する。デフォルト値は yes。
AuthorizedKeysFile .ssh/authorized_keys
                    ユーザ認証に使用する公開鍵ファイルを指定する。デフォルト値は .ssh/authorized_keys。
PasswordAuthentication yes
                    パスワード認証を許可するか設定する。デフォルト値は yes。
PermitEmptyPasswords yes
                    空のパスワードを許可するか設定する。デフォルト値は no

※もしかしたら 「PermitEmptyPasswords yes」だけリマーク外せばでよかったのかも・・・・
2.RSA キーの mail.takaq.jp での生成
コマンド : ssh-keygen -t rsa
例によって、passphrase はEnterのみ入力します。
すると、/root/.ssh に id_rsa と id_rsa.pub が出来上がります。
これ以降の作業は上の記事と同じです。ただし「identity.pub」を「id_rsa.pub」に読み替えてください。
あと、もし /root/.ssh が無かった時は他のSSHサーバーに接続して相手のRSA鍵を受け入れれば作成されます。
または、 mkdir して パーミッションを 700 にします。

戻る

サイトトップへ