久しぶりにサーバ管理ネタで。
最近どうもネームサーバが収容されているメールサーバの負荷が高くなると、DNSの名前解決に失敗することが多くなってきた。BINDはsendmailほどではないにしても、結構色々と脆弱性がらみでバージョンアップをしているのだが、とっくにEnd of LifeとなったRedHat Linux9 では、bind-9.2.1-16という古いバージョンのBINDパッケージしかない。
この際、不安要素はひとつづつ取り除きましょうということで、まずはbindを9.2.8にバージョンアップするべく、私製RPMパッケージを作ってみることにした。
# 2007/10/01 追記
パッチの当たっていない 9.2.8 にはセキュリティホールがあります。またbind 9.2系列は既に開発元によるサポートが打ち切られています(End of Life)。後日、bind 9.4.1-P1を作成して公開しています
ので、bind 9.4系列にアップデートしましょう。
参考にしたのは、こちらのサイト
。
ここでもRHL9用に私製 bind-9.2.8-1.rpm をbuildしようとしていて、その手順が説明されている。
先人の知恵を拝借してそのままやってみる。
まず、RPMをBUILDする場所を用意する。
$ mkdir -p RPM/BUILD RPM/RPMS/i386 RPM/SOURCES RPM/SRPMS RPM/SPECS
$ echo %_topdir $PWD/RPM > ~/.rpmmacros
上記で、カレントに RPMディレクトリを作り、その下にBUILD , RPMS/i386 , RPMS/SOURCES , RPM/SRPMS , RPM/SPECSを作り、.rpmmacrosファイル(RPM設定ファイル)に、RPMディレクトリを作業ディレクトリとして設定したことになる。
念のため、自家製RPMが動作不良だったときのために現在インストールされているパッケージを確認して、バイナリパッケージを用意しておく。
$ rpm -qa | grep bind
ypbind-1.11-4
redhat-config-bind-1.9.0-13
bind-utils-9.2.1-16
bind-9.2.1-16
ここでは、bind-9.2.1-16とbind-utils-9.2.1-16をgetしておくことにする。
$ cd RPM/RPMS/i386/
$ wget http://ftp.kddilabs.jp/Linux/packages/fedora.legacy/redhat/9/os/i386/bind-9.2.1-16.i386.rpm
$ wget http://ftp.kddilabs.jp/Linux/packages/fedora.legacy/redhat/9/os/i386/bind-utils-9.2.1-16.i386.rpm
RHL9の最後のbindパッケージをsrpmファイルで入手し、SRPMS ディレクトリに保存する。
$ cd ../../SRPMS/
$ wget http://ftp.kddilabs.jp/Linux/packages/fedora.legacy/redhat/9/os/SRPMS/bind-9.2.1-16.src.rpm
BIND 9.2.8のオリジナルソースを入手しSOURCESに保存する。
$ cd ../SOURCES/
$ wget http://ftp.isc.org/isc/bind9/9.2.8/bind-9.2.8.tar.gz
getしてきたbind-9.2.1-16.src.rpmから、bind.specを取り出し SPECSへ保存
$ cd ../SPECS/
$ rpm2cpio ../SRPMS/bind-9.2.1-16.src.rpm | cpio -i bind.spec
同じく、bind-9.2.1-16.src.rpmから、パッチその他(*.patch, bind-manpages.tar.bz2, keygen.c, named.init, named.logrotate, named.sysconfig, rfc1912.txt)を取り出し%{_topdir}/RPM/SOURCESへ置く。
$ cd ../SOURCES/
$ rpm2cpio ../SRPMS/bind-9.2.1-16.src.rpm | cpio -i "*.patch" bind-manpages.tar.bz2 keygen.c named.init named.logrotate named.sysconfig rfc1912.txt
SPECSへ移動
$ cd ../SPECS/
$ ls
bind.spec
bind.spec.patchという名前で以下のpatchを作り、bind.specにパッチをあてる。
--- bind.spec~ 2007-02-08 23:55:33.000000000 +0900
+++ bind.spec 2007-02-08 23:34:20.000000000 +0900
@@ -3,7 +3,7 @@
Name: bind
License: BSD-like
Group: System Environment/Daemons
-Source: ftp://ftp.isc.org/isc/bind9/%{version}/bind-%{version}.tar.bz2
+Source: ftp://ftp.isc.org/isc/bind9/%{version}/bind-%{version}.tar.gz
Source1: bind-manpages.tar.bz2
Source2: named.sysconfig
Source3: named.init
@@ -12,11 +12,11 @@
Source6: rfc1912.txt
Patch: bind-9.2.0rc3-varrun.patch
Patch1: bind-9.2.1-key.patch
-Patch2: bind-9.2.1-config.patch
+Patch2: bind-9.2.8-nslookup.patch
Url: http://www.isc.org/products/BIND/
Buildroot: %{_tmppath}/%{name}-root
-Version: 9.2.1
-Release: 16
+Version: 9.2.8
+Release: 1
BuildRequires: openssl-devel gcc glibc-devel >= 2.2.5-26 glibc-kernheaders >= 2.4-7.10 libtool pkgconfig
@@ -61,7 +61,7 @@
%setup -q -n %{name}-%{version}
%patch -p1 -b .varrun
%patch1 -p1 -b .key
-%patch2 -p1 -b .configure
+%patch2 -p1 -b .nslookup
%build #CHROOT=/etc/named/chroot
パッチあて
$ patch < bind.spec.patch
patching bind.spec
$
次にSOURCESの下に、bind-9.2.8-nslookup.patch という名前で以下のパッチを用意する。
単に、MANPAGESのnslookup.1をコメントアウトするだけのパッチなのだが参考記事のパッチではどうしてもrejectくらうので、結局自分以下のパッチを用意した。
*** bind-9.2.8/bin/dig/Makefile.in~ 2004-08-19 08:22:52.000000000 +0900
--- bind-9.2.8/bin/dig/Makefile.in 2007-03-02 17:27:19.000000000 +0900
***************
*** 48,54 ****
SRCS = dig.c dighost.c host.c nslookup.c
! MANPAGES = dig.1 host.1 nslookup.1
HTMLPAGES = dig.html host.html nslookup.html
--- 48,54 ----
SRCS = dig.c dighost.c host.c nslookup.c
! MANPAGES = dig.1 host.1 # nslookup.1
HTMLPAGES = dig.html host.html nslookup.html
これで準備完了
RPMをBUILDする。
$ cd ../SPECS/
$ rpmbuild -bb bind.spec > build-bind.log 2>&1&
[1] 24532
ビルド中のログはbuild-bind.logに記録されます。tail -f build-bind.logしてビルド経過を眺めることも出来ます。
無事にビルドが完了すると、RPMS/i386ディレクトリにrpmが出来てるはず。
$ cd ../RPMS/i386/
$ ls
bind-9.2.1-16.i386.rpm bind-debuginfo-9.2.8-1.i386.rpm bind-utils-9.2.1-16.i386.rpm
bind-9.2.8-1.i386.rpm bind-devel-9.2.8-1.i386.rpm bind-utils-9.2.8-1.i386.rpm
9.2.1-16なやつは既にインストールされているものと同じものをgetしてきたもの。
9.2.8-1なi386.rpmが4つ出来てますが、通常はbind-9.2.8-1.i386.rpmとbind-utils-9.2.8-1.i386.rpmだけ利用すればよし。
ということで、rpmをアップデート。
$ su -
# rpm -Uvh bind-9.2.8-1.i386.rpm bind-utils-9.2.8-1.i386.rpm
Preparing... ########################################### [100%]
1:bind-utils ########################################### [ 50%]
2:bind ########################################### [100%]
#
# ps -aux | grep named
named 28178 0.8 0.3 30660 3640 ? S 18:44 0:00 /usr/sbin/named -u named
root 28346 0.0 0.0 4584 668 pts/3 S 18:45 0:00 grep named
# /usr/sbin/named -v
BIND 9.2.8
# exit
$
この次はsendmailが8.12.x系なので8.13.x系にして、greetpauseの実装をしないといかんなあ。
いっそのことpostfixに乗り換える手もあるが、なにぶんプロダクションサーバなので大変更はきつい。