作成開始 : 平成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.参考ページ
djbdns の jbdns 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 にログインできません。次のようになってしまいます。
[email protected]'s password:
Permission denied, please try again.
[email protected]'s password:
Permission denied, please try again.
[email protected]'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 にします)
[email protected]'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
[email protected]'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
[email protected]'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 [email protected]
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 [email protected]:
[email protected]'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 [email protected]:/service/tinydns/root/data.cdb.tmp
ssh [email protected] 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 にします。
【戻る】