2013年9月24日火曜日

rubyでhttpclientを作ってみる(mechnize)

自分の家のルータの設定がwebインターフェースしかないので、自動設定をしようとhttpclientを作ってみることにした。言語はrubyで、いろいろ探してみたら、mechanizeというツールであれば、cookieとレスポンスのパースができそうなので、これでやってみる。

環境は、
 ・Windows8上で作る
 ・rubyは2.0.0(32bit)を使う
で進める。で進める前にいろいろ調べたら、rubyの開発環境ではgemでインストールすると、
依存関係のライブラリを最新でインストールする動きらしく、うまく動かないことがあるらしい。
開発するプロジェクトごとのライブラリを簡易にする方法としてbundlerというものがあった。
それはこちらで環境をつくってみた。

1.環境準備
 
 まずはプロジェクト用おnフォルダを作成する。
 >mkdir d:\program\hc_mechanize
  >cd d:\program\hc_mechanize

 次にbundle環境を作成する。

  >bundle init

 Gemfileを変更し、mechanizeを設定する。

  >vim Gemfile
 ==
 gem "mechanize"
 ==

 でインストール(d:\program\hc_mechanize\gem)する。

 >bundle install --path gem

 問題なくインストール完了。

2.サンプルコードで試してみる

 mechanizeのサイトのRubyforgeのサンプルをそのまま動かしてみる。

 >vim hc.rb
 ==
 require 'rubygems'
 require 'mechanize'

 a = Mechanize.new
 a.get('http://rubyforge.org/') do |page|
   # Click the login link
   login_page = a.click(page.link_with(:text => /Log In/))

   # Submit the login form
   my_page = login_page.form_with(:action => '/account/login.php') do |f|
     f.form_loginname  = ARGV[0]
     f.form_pw         = ARGV[1]
   end.click_button

   my_page.links.each do |link|
     text = link.text.strip
     next unless text.length > 0
     puts text
   end
 end
 ==

 で実行!

 >bundle exec ruby hc.rb
 D:/tools/pik/install/Ruby-200-p195/lib/ruby/2.0.0/net/http.rb:918:in `connect': SSL_connect returned=1 errno=0 state=SSL
v3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)
  ・
  ・
  ・

 なんかエラーでた。SSL証明書のチェックでこけているらしい。
  調べたら、どうもデフォルトのCAファイルの場所が問題らしいので、caをダウンロードして、パス
 を明示的に指定してみる。

 >vim hc.rb
 ==
  ・
  ・
 a = Mechanize.new
 a.agent.http.ca_file = 'D:/program/hc_mechanize/cacert.pem' #modified
 a.get('http://rubyforge.org/') do |page|
  ・
  ・
 ==

 >bundle exec ruby hc.rb
 Log In
 Support
 New Account
 RubyForge
 Home
 My Page
 Project Tree
 Code Snippets
 Project Openings
 [Lost your password?]
 [New Account]
 [Resend confirmation email to a pending account]

 となって成功!

3.実際のスクリプトを作成してみる

 と、ここで実際のルータのページを見てみたところ、、リンクにjavascriptが使われていた。
 まぁサンプルが見当たらなかったですが、適当にカスタマイズしながら、調べながら進めてみ
 たが、どうにもこのリンクをクリックできない。で、今一度mechanizeを調べてみたら、、なんと
 javascriptはサポートしていないとのこと(ブラウザ依存するから?)。しょっぱなから躓いた。

 気を取り直して調べてみたところ、ブラウザのJavascriptを実装できるツールとして、watir
 というものがあるらしい。といことで次回に持越し・・

2013年9月22日日曜日

Windows8にrubyを入れてみる(その2)

rubyの環境にライブラリ(gem)管理を簡易化するためのbundlerというツールを入れてみる。これを入れると、
 ・他の環境で同じものを作るときも容易にgemリも合わせて環境構築ができる。
 ・通常のgemでは、依存関係を最新のものでカバーされてしまうらしい。また同じ環境で同じgem
  でも異なるバージョンのgemを使い分けたいときなどにも対応できる。
ということができるようです。
つまり、rubyをpikでバージョン管理し(Linuxだとrbenv)、gemをbundlerで管理ってことですね。
便利そうです。ということで入れてみます。

条件は以下の通り。
 ・Windows8
 ・rubyは2.0.0
 ・アプリAのためのgemのセットを作る
です。

1.bundlerのインストール

 まずはbundlerをインストールしてみる。

  >gem install bundler
  Fetching: bundler-1.3.5.gem (100%)
  Successfully installed bundler-1.3.5
  Parsing documentation for bundler-1.3.5
  Installing ri documentation for bundler-1.3.5
  1 gem installed

 で簡単だけど終了。

2.アプリA用の設定をする

 アプリA用フォルダ(d:\program\a)を作成し、そこを基点にgem環境を作る。

  >mkdir d:\program\a
  >cd d:\program\a
  >bundle init
  d:\program\a>bundle init
  Writing new Gemfile to d:/program/a/Gemfile

 gemfileが作成されたので、これを修正し、必要なgemを記載する。今回必要なgemとしてはこの
 あとに作る予定のアプリで使う、mechanizeを入れてみる。以下設定内容。

  Gemfile
  ===
  # A sample Gemfile
  source "https://rubygems.org"

  # gem "rails"
  gem "mechanize"
  ===

 そのあとで、インストールをする。この時bundlerの--pathオプションを使うと、gemのインストール
 先を指定することができる。もし間違ったら、ディレクトリごと削除すればよいだけなので、便利
 らしい。

  >bundle install --path gem
  Fetching gem metadata from https://rubygems.org/..........
  Fetching gem metadata from https://rubygems.org/..
  Resolving dependencies...
  Installing unf_ext (0.0.6)
  Installing unf (0.1.2)
  Installing domain_name (0.5.13)
  Installing http-cookie (1.0.2)
  Installing mime-types (1.25)
  Installing net-http-digest_auth (1.4)
  Installing net-http-persistent (2.9)
  Installing mini_portile (0.5.1)
  Installing nokogiri (1.6.0)
  Installing ntlm-http (0.1.1)
  Installing webrobots (0.1.1)
  Installing mechanize (2.7.2)
  Using bundler (1.3.5)
  Your bundle is complete!
  It was installed into ./gem

  >

  無事インストールができた!

3.bundle環境でのアプリの実行

 bundle環境でアプリを実行するには

  >bundle exec [アプリ名]

 とするらしい。これはアプリを作成した時に改めて試そう。

4.設定ファイルをgitで管理

 bundlerで他の環境でも同一の環境を作るには、アプリA用フォルダ直下に作成されている
 「Gemfile」と「Gemfile.lock」を管理すればよいらしい。Gemfile.lockにはインストールされたgem
 の依存関係やバージョン情報が記載されている。

  >notepad .gitignore
  ===
  .bundle
  gem
  ===
  >git init
  Reinitialized existing Git repository in d:/program/a/.git/

  >git add -A
  warning: LF will be replaced by CRLF in Gemfile.
  The file will have its original line endings in your working directory.
  warning: LF will be replaced by CRLF in Gemfile.lock.
  The file will have its original line endings in your working directory.

  >git commit -m "ruby 2.0.0 initial commit"
  [master (root-commit) a39b353] ruby 2.0.0 initial commit
  warning: LF will be replaced by CRLF in Gemfile.
  The file will have its original line endings in your working directory.
  warning: LF will be replaced by CRLF in Gemfile.lock.
  The file will have its original line endings in your working directory.
   3 files changed, 41 insertions(+)
   create mode 100644 .gitignore
   create mode 100644 Gemfile
   create mode 100644 Gemfile.lock

  >git log
  commit a39b35337544c6abbe16272350bcd5be897d00ac
  Author: Chikayuki Hayashi <hayachi617@gmail.com>
  Date:   Sun Sep 22 03:31:02 2013 +0900

      ruby 2.0.0 initial commit
  >

 これでgitにUPされた。めでたし。

Windows8にrubyを入れてみる

httpclientを作成してみようと思い、何で作ろうか考えたのだが、javaは以前作成したことがあるので、別の言語を使った見ようと思う。
で、vagrantやchefで最近rubyを使うことがあるので、折角なのでrubyをチャレンジしてみる。
(ちなみに本職はインフラエンジニアですが、開発は十数年前にやったっきりで、あとはちょっとしたツールを作っているだけ。趣味みたいな程度です)。

で、vagrantでもrubyがインストールされているので、まずは複数バージョンを入れる方法を
調べてみたところ、windows環境ではpikというツールでできそうなので、やってみた。

現行の状態は、vagrantでインストールされたruby環境があるので、そこからスタートする。
ちなみに、バージョンは、1.9.3のようでした。(rubyのパスは環境変数に通してある)

  >ruby -v
  ruby 1.9.3p448 (2013-06-27) [i386-mingw32]

1.pikをインストールする

  d:\tools\pikにpikをインストールする。

  >gem install pik
  >mkdir d:\tools\pik
  >install_pik  d:\tools\pik

 で、d:\tools\pikを環境変数pathに通しておく。

2.rubyをインストールしてみる

 rubyの現時点の最新の安定バージョンの2.0をインストールしてみる。
  インストールパスを指定したいので、

  >pik config downloads=D:\Tools\pik\download
  >pik config installs=D:\Tools\pik\install

  で設定。内容を確認する

  >pik config
  ** CURRENT CONFIGURATION **
  
  193: ruby 1.9.3p448 (2013-06-27) [i386-mingw32] *
       path: D:\HashiCorp\Vagrant\embedded\bin
  
  ** GLOBAL CONFIGURATION **
  
  ---
  download_dir: D:\tools\pik\download
  install_dir: D:\tools\pik\install

 OKっぽい。次にインストールできるモジュールを確認してみる。

  >pik list -r
  ---
  DevKit:
    3.4.5r3: http://rubyforge.org/frs/download.php/66888/devkit-3.4.5r3-20091110.7z
  IronRuby:
    0.3.0: http://rubyforge.org/frs/download.php/53552/ironruby-0.3.0.zip
    0.5.0: http://rubyforge.org/frs/download.php/57126/ironruby-0.5.0.zip
       ・
       ・
       ・
  Ruby:
       ・
       ・
       ・
    2.0.0-p0: http://rubyforge.org/frs/download.php/76807/ruby-2.0.0-p0-i386-mingw32.7z
    2.0.0-p195: http://rubyforge.org/frs/download.php/76957/ruby-2.0.0-p195-i386-mingw32.7z
  >

 ということで、ruby 2.0.0-p195をインストールみる

  >pik install ruby 2.0.0-p195

 で無事インストール完了。

 3.rubyを切り替えてみる

  使うバージョンのrubyを切り替えてみる。

  >pik use 200
  >ruby -v
  ruby 2.0.0p195 (2013-05-14) [i386-mingw32]

  >pik use 193
  >ruby -v
  ruby 1.9.3p448 (2013-06-27) [i386-mingw32]

 おぉー。ばっちり。で、最後に各種設定情報を確認してみる。

  >pik info
  C:\Users\chika>pik info
  pik 0.2.8

  ruby:
  interpreter:  "ruby"
  version:      "2.0.0"
  date:         "2013-05-14"
  platform:     "i386-mingw32"
  patchlevel:   "195"
  full_version: "ruby 2.0.0p195 (2013-05-14) [i386-mingw32]"
  
  homes:
  gem:          "D:\Tools\pik\install\Ruby-200-p195\lib\ruby\gems\2.0.0"
  ruby:         "D:\tools\pik\install\Ruby-200-p195"
  
  binaries:
  ruby:         "D:\tools\pik\install\Ruby-200-p195\bin"
  irb:          "D:\tools\pik\install\Ruby-200-p195\bin\irb.bat"
  gem:          "D:\tools\pik\install\Ruby-200-p195\bin\gem.bat"
  rake:         "D:\tools\pik\install\Ruby-200-p195\bin\rake.bat"
  
  environment:
  GEM_HOME:     ""
  HOME:         "C:/Users/xxxx"
  IRBRC:        ""
  RUBYOPT:      ""
  
  file associations:
  .rb:
  .rbw:

  >

終了。

2013年9月15日日曜日

Windows8 Proにvargrantを入れてみる(その1)

Hyper-V環境でCentOS環境の構築を試行錯誤することがあるので、便利そうなvargrantを
入れてみることにした。環境は以下の通り。


  • ホストOSはWindows8 Pro 64bit
  • 仮想ソフトは、VirtualBox 4.2.18(Hyper-Vはサポートされていないらしい)
  • GestOSはCentOS6.4 x64でサーバ名はsvr11とする。
  • ついでに、chef solo + knife soloを使ってソフトウェア構築

で試してみる。


1.VirtualBoxをインストール


  https://www.virtualbox.org/wiki/Downloads

 
 からダウンロードして、インストールする。すでにHyper-Vが入っている環境でもあり、インストール時のオプション
 としては、こちらを参考にして、Networkのオプション(BridgeとHost-Only)のチェックを外してみた。

2.vagrantのインストール


 http://downloads.vagrantup.com/


 2013/9/14時点では、1.3.1が最新バージョンだった(Vagrant_1.3.1.msi)。

 今回は「D:\HashiCorp\Vagrant\」にインストールする。
 インストール後に再起動要求された。

3.作業用ターミナルをセットアップ


 vagrantには、mintty.exeが含まれている。ここを参考にして環境整備。

 mintty.exeのショートカットを作成し、リンクに
  D:\HashiCorp\Vagrant\embedded\bin\mintty.exe /bin/bash --login
 を設定。
 あと環境設定として、上記ショートカットから起動したターミナルの中で、以下を実施。

 mintty# cat << __EOF__ > ~/.minttyrc

 mintty# BoldAsFont=no
 mintty# Locale=ja_JP
 mintty# Charset=UTF-8
 mintty# FontHeight=12
 mintty# Columns=100
 mintty# Rows=34
 mintty# Transparency=medium
 mintty# Term=xterm-256color
 mintty# RightClickAction=paste
 mintty# OpaqueWhenFocused=no
 mintty# PgUpDnScroll=yes
 mintty# __EOF__

4.MinGW(MinimalistGnu for Windows)

 chef solo + knife soloのためには、sshとrsyncが必要になる。そのためにvagrantでインストールされる

 MinGWでは含まれないバージョン管理機能を追加でインストールする必要がある。
 ので結局MinGWをインストールする。今回インストールしたのは最新版の0.6.1-beta-20130910-1。 
 インストール先はd:\tools\mingwとした。
 今回vagrantで使うため、上記インストール後に、インストールモジュールをvagrant配下にコピーする。

 mintty# cp -r /d/tools/mingw/. /D/HashiCorp/Vagrant/embedded/


 次に上記ディレクトリを変えたので、mingw-getの動作設定の変更をする(参考にさせて
 もらったのはこのサイトです)。
 以下のファイル2つに対して、
   D:\Tools\MinGW\var\lib\mingw-get\data\defaults.xml
   D:\Tools\MinGW\var\lib\mingw-get\data\profile.xml
  以下の設定変更をする。

  <sysroot subsystem="MSYS" path="%R/msys/1.0" />

 こちらを
  <sysroot subsystem="MSYS" path="/HashiCorp/Vagrant/embedded" />

 に変更する。そのうえで、sshとrsyncをインストールする。minttyを起動し、以下実施


  mintty# mingw-get update

  mintty# mingw-get upgrade
  mintty# mingw-get install msys-openssl msys-openssh
  mintty# mingw-get install msys-rsync msys-tar

5.vagrantで仮想OSを構築する

  まずはテンプレートとなるboxをダウンロードする。boxはこちらにあります。
  今回はCentOS6.4 x86_64を作成する。

  mintty# vagrant box add centos64_x86_64  http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
  mintty# mkdir -p ~/vagrant/centos_svr11
  mintty# cd ~/vagrant/centos_svr11
  mintty# vagrant init centos64_x86_64
  mintty# vagrant up

  これで仮想環境が起動できているはず。。が、うまく動かず、ゲストOS起動時にCPUの仮想化
 機構が使えないので、64bitOSが起動できないという旨のエラーがでてしまう。BIOSを確認した
 が問題なく有効になっている(というかそもそもHyper-Vも使えていたわけだし)。
 ちなみにVirtualBoxのマネージャーで新規OSを構築しようとしても64bitOSが選択できない。
 やはり何か問題があるようで、いろいろ探し回ってみたがこれといった情報も見つからない。
 
 ということで、試しにHyper-Vの機能を無効化してみたところ、、うまくいった。やはりHyper-V
 との相性は今一つということでしょうかね(どちらか選べと)。Hyper-Vで作成した環境を移行
 するかどうか、悩みどころです。とりあえずいったんVirtualBoxで進める(NICもHostOnlyが使え
 たほうが楽、、)

6.ゲストOSに接続してみる

 MinGWで入れたsshで接続してみる。

  mintty# vagrant ssh-config --host svr11 >> ~/.ssh/config

 これでsshで接続するための設定ファイルが出来上がり。

  mintty# ssh svr11

  Last login: Sun Sep 15 13:57:27 2013 from 10.0.2.2
  Welcome to your Vagrant-built virtual machine.
  [vagrant@localhost ~]$

 でログインができた!ちなみにWindows8にインストールしていたteratermで接続してみると、、
    127.0.0.1:2222
  あてで、アカウントはvagrant/vagrantでログインができました。(パスワードは即変更で、、)

(2013/10/8追記)
proxy環境の場合は、、

  mintty#  export HTTP_PROXY=xx.xx.xx:8080

で設定すればOK。


(2013/10/9追記)
ネットワーク環境のせいか

#vagrant box add centos64_x86_64  http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box

Downloading or copying the box...
An error occurred while downloading the remote file. The error9)
message, if any, is reproduced below. Please fix this error and try
again.

Recv failure: Connection was reset
  

というエラーが出てしまうことがあるので、その場合は別途BOXをブラウザなどでダウンロードし、ローカルのファイルからADDすることで解決した。

#vagrant box add centos64_x86_64  /d/hashicorp/vagrant/images/CentOS-6.4-x86_64-v20130427.box



2013年9月1日日曜日

DNSスレーブを構築してみる(CentOS6.4+Bind9.8)

前回のDNSサーバ(CentOS6.4+Bind9.8)の構築の続き。

スレーブサーバを立ててみる。とはいっても簡単そう。
・前回構築したsvr1をマスター
・svr2にスレーブを構築する
を想定。

1.パッケージをインストールする

# yum -y install bind bind-utils bind-chroot

2.設定をコピー&変更する


以下のファイルをsvr1からコピーする

・/etc/sysconfig/named
・/etc/named.conf
・/etc/named.rfc1912.zones
・/etc/named/named.root.hints
・/etc/named/named.local.hayachi617.com.zone

上記のゾーンファイルを一部修正する(いらないかもしれないけど)

# vi /etc/named/named.local.hayachi617.com.zone
>>
zone "hayachi617.com" {
                type slave;
                masters { 192.168.0.49;};
                file "hayachi617.com.slave.db";
};

zone "0.168.192.in-addr.arpa" {
                type slave;
                masters { 192.168.0.49;};
                file "0.168.192.in-addr.arpa.slave.db";
};
<<

3.chroot対応として、rsyslogの設定変更(変更分を記載)

# vi /etc/rsyslog.conf
>>
$AddUnixListenSocket /var/named/chroot/dev/log
<<
# service rsyslog reload

4.サービスの起動

ここまでで設定は一通り完了しているはずなので、サービスを起動してみる。

# chkconfig named on

# service named start

ちなみに、svr1の時と同じくchroot設定が有効か?チェックしてみると、同じだった。

# df -ha

Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/VolGroup-lv_root
                      8.5G  3.0G  5.1G  37% /
proc                     0     0     0   -  /proc
sysfs                    0     0     0   -  /sys
devpts                   0     0     0   -  /dev/pts
tmpfs                 935M     0  935M   0% /dev/shm
/dev/sda1             485M   32M  428M   7% /boot
none                     0     0     0   -  /proc/sys/fs/binfmt_misc
/etc/named            8.5G  3.0G  5.1G  37% /var/named/chroot/etc/named
/var/named            8.5G  3.0G  5.1G  37% /var/named/chroot/var/named
/etc/named.conf       8.5G  3.0G  5.1G  37% /var/named/chroot/etc/named.conf
/etc/named.rfc1912.zones
                      8.5G  3.0G  5.1G  37% /var/named/chroot/etc/named.rfc1912.zones
/etc/rndc.key         8.5G  3.0G  5.1G  37% /var/named/chroot/etc/rndc.key
/usr/lib64/bind       8.5G  3.0G  5.1G  37% /var/named/chroot/usr/lib64/bind
/etc/named.iscdlv.key
                      8.5G  3.0G  5.1G  37% /var/named/chroot/etc/named.iscdlv.key
/etc/named.root.key   8.5G  3.0G  5.1G  37% /var/named/chroot/etc/named.root.key


5.その他の設定

ルートヒントの情報を更新しておく。

# dig @a.root-servers.net . ns > /var/named/named.ca

設定再読み込みで完了。

# service named reload

最後に確認をする。

# dig @192.168.0.50 router.hayachi617.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> @192.168.0.50 router.hayachi617.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 47164
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;router.hayachi617.com.         IN      A

;; Query time: 0 msec
;; SERVER: 192.168.0.50#53(192.168.0.50)
;; WHEN: Sun Sep  1 12:03:02 2013
;; MSG SIZE  rcvd: 39

これにて終了。




DNSを構築してみる(CentOS6.4+Bind9.8)

自宅に仮想環境でたくさんOSを立て始めたので、DNSサーバを立ててみた。
やる内容は
 ・環境は、Hyper-V上で構築したCentOS6.4上に、BIND 9.8を使う。
 ・内部のネットワーク向けのDNSサーバ(公開はしない)
 ・IPv4のみを使う(IPv6は使わない)
 ・折角なので、キャッシュサーバ機能を持たせてみる
 ・折角なので、chroot環境にしてみる
を目的とする。

1.パッケージをインストールする

# yum -y install bind bind-utils bind-chroot caching-nameserver

としたところ、caching-nameserverについては、

Package 32:bind-9.8.2-0.17.rc1.el6_4.6.x86_64 already installed and latest version

というメッセージがでてインストールできないようです。bindに統合されたということ
ですかね。ここにも記載が。


2.設定変更する

# vi /etc/sysconfig/named ※全記載
>>
ROOTDIR=/var/named/chroot
OPTIONS="-4"
<<

この"-4"はIPv4のみ有効にしてbindを起動するという指定です(IPv6の無効化)。

# vi /etc/named.conf ※全記載
>>

options {
//      リスンするIPアドレスを指定する。指定なしの場合は全てのIPでリスンする
//      listen-on port 53 { 127.0.0.1; };
//      listen-on-v6 port 53 { ::1; };

        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";

//      同一セグメント上のマシンからの問い合わせを受ける
//      allow-query     { localhost; };
        allow-query             { localnets; };
        allow-query-cache       { localnets; };

//      不要なエラーを省く
        empty-zones-enable no;

//      IPv6を無効化するのでポートは閉鎖
        use-v6-udp-ports { };

//      再帰的問い合わせはデフォルト無効化
//      recursion yes;
        recursion no;

//      DNS SECを無効化する
//      dnssec-enable yes;
//      dnssec-validation yes;
        dnssec-enable no;
        dnssec-validation no;

        dnssec-lookaside auto;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";

//      forward先の設定
        forwarders {
                192.168.0.1;
        };
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

//viewを使っている場合は、zoneはview内で記載する必要がある
//zone "." IN {
//      type hint;
//      file "named.ca";
//};
//include "/etc/named.rfc1912.zones";

include "/etc/named.root.key";

//DNSキャッシュサーバ用設定
view localhost_resolver {
        match-clients      { localhost; };
        match-destinations { localhost; };
        recursion yes;
        include "/etc/named.rfc1912.zones";
        include "/etc/named/named.local.hayachi617.com.zone";
};

//LAN用設定
view "internal" {
        match-clients { localnets; };
        match-destinations { localnets; };
        recursion yes;
        include "/etc/named.root.hints";
        include "/etc/named/named.local.hayachi617.com.zone";
};

<<

# vi /etc/named.rfc1912.zones ※変更分を記載
>>


#IPv6は使わないので、コメントアウト
#zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" IN {
#       type master;
#       file "named.loopback";
#       allow-update { none; };
#};

<<

ゾーンファイルを作成する
# vi /etc/named.local.hayachi617.com.zone ※全記載
>>
zone "hayachi617.com" {
                type master;
                file "hayachi617.com.db";
};

zone "0.168.192.in-addr.arpa" {
                type master;
                file "0.168.192.in-addr.arpa.db";
};
<<

正引きのゾーンファイルの作成
# vi /var/named/hayachi617.com.db ※全記載
>>
$TTL            86400
@               IN      SOA     ns.hayachi617.com.   root.hayachi617.com.(
                                2013083101     ; Serial
                                28800             ; Refresh
                                14400             ; Retry
                                3600000          ; Expire
                                86400 )           ; Minimum

                 IN      NS      ns.hayachi617.com.
router         IN      A       192.168.0.1
ns              IN      A       192.168.0.49
svr2           IN      A       192.168.0.50
svr3           IN      A       192.168.0.51
svr4           IN      A       192.168.0.52

svr1           IN      CNAME   ns
www           IN      CNAME   svr2
ntp             IN      CNAME   svr1
<<

逆引きのゾーンファイルの作成
# vi /var/named/0.168.192.in-addr.arpa.db ※全記載
>>
$TTL    86400
@       IN      SOA     ns.hayachi617.com.   root.hayachi617.com.(
                        2013083101   ; Serial
                        28800        ; Refresh
                        14400        ; Retry
                        3600000      ; Expire
                        86400 )      ; Minimum

        IN      NS      ns.hayachi617.com.
        IN      PTR     hayachi617.com.
        IN      A       255.255.255.0

1       IN      PTR     router.hayachi617.com.
49      IN      PTR     svr1.hayachi617.com.
50      IN      PTR     svr2.hayachi617.com.
51      IN      PTR     svr3.hayachi617.com.
52      IN      PTR     svr4.hayachi617.com.
<<

3.chroot対応として、rsyslogの設定変更(変更分を記載)

# vi /etc/rsyslog.conf
>>
$AddUnixListenSocket /var/named/chroot/dev/log
<<
# service rsyslog reload

4.サービスの起動

ここまでで設定は一通り完了しているはずなので、サービスを起動してみる。

# chkconfig named on

# service named start

ちなみに、chroot設定が有効か?チェックしてみると、

# df -ha

Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/VolGroup-lv_root
                      8.5G  2.8G  5.3G  35% /
proc                     0     0     0   -  /proc
sysfs                    0     0     0   -  /sys
devpts                   0     0     0   -  /dev/pts
tmpfs                 2.9G     0  2.9G   0% /dev/shm
/dev/sda1             485M   47M  414M  11% /boot
none                     0     0     0   -  /proc/sys/fs/binfmt_misc
/etc/named            8.5G  2.8G  5.3G  35% /var/named/chroot/etc/named
/var/named            8.5G  2.8G  5.3G  35% /var/named/chroot/var/named
/etc/named.conf       8.5G  2.8G  5.3G  35% /var/named/chroot/etc/named.conf
/etc/named.rfc1912.zones
                      8.5G  2.8G  5.3G  35% /var/named/chroot/etc/named.rfc1912.zones
/etc/rndc.key         8.5G  2.8G  5.3G  35% /var/named/chroot/etc/rndc.key
/usr/lib64/bind       8.5G  2.8G  5.3G  35% /var/named/chroot/usr/lib64/bind
/etc/named.iscdlv.key
                      8.5G  2.8G  5.3G  35% /var/named/chroot/etc/named.iscdlv.key
/etc/named.root.key   8.5G  2.8G  5.3G  35% /var/named/chroot/etc/named.root.key


となっており、いくつかのファイルやディレクトリがchroot下にマップされていることがわかる。

5.その他の設定

ルートヒントの情報を更新しておく。

# dig @a.root-servers.net . ns > /var/named/named.ca

設定再読み込みで完了。

# servivce named reload

最後に確認をする。

# dig router.hayachi617.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> router.hayachi617.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7432
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;router.hayachi617.com.         IN      A

;; ANSWER SECTION:
router.hayachi617.com.  86400   IN      A       192.168.0.1

;; AUTHORITY SECTION:
hayachi617.com.         86400   IN      NS      ns.hayachi617.com.

;; ADDITIONAL SECTION:
ns.hayachi617.com.      86400   IN      A       192.168.0.49

;; Query time: 0 msec
;; SERVER: 192.168.0.49#53(192.168.0.49)
;; WHEN: Sun Sep  1 07:38:59 2013
;; MSG SIZE  rcvd: 88

これにて終了。

6.外のDNS問い合わせが遅い

その後外向けのDNS解決が遅いことに気が付いた。
ということで、fowardersを、ISPのDNSに変更をしてみたところ速くなった。
よかった。


(2014/6/29)
オプションの説明を補足と、もう少しセキュアに構築するよう変更。