netqmail 1.05 のインストール
SERVER
netqmail
久しぶりに qmail をインストールしてみようと http://www.jp.qmail.org/ へアーカイブを頂きに入ってみたところ、なんだか上手く繋がらずでした。そこで http://www.qmail.org/ へ接続してみたのですけどそこから日本語へのサイトは繋がらず、とりあえず英語のサイトから qmail を探してみたのですけど、なんだか見つかりませんでした。
そんな中で目に留まったのが netqmail 1.05 というアーカイブです。
調べてみると、この netqmail 1.05 というのは qmail 1.03 を含んでいて、さらにそれ用の主立ったパッチが含まれたパッケージだそうでした。さらにもう少し探してみると、今はこの netqmail 1.05 が主流となっているようで、アーカイブは http://qmail.org/netqmail/ にて提供されているようです。
含まれているパッチは次のようなもののようです。 細かい内容とかがわかればよかったのですけどいまひとつ見つからなかったので、英語が非常に苦手なのも相まって曖昧な感じになってしまいますけど…。
ちなみに RBL というのは、SPAM メールの中継サーバをデータベースにした DNSBL を利用して、不正送信と思われるメールを許可しないための仕組みだそうです。
パッチファイル名 保管パス パッチの効用と思われるもの…。自信は無いです。 netqmail-1.05.patch ./ netqmail-1.05 用にまとめられたパッチのようです…。 checkpassword-0.90.errno.patch ./other-patches glibc 2.3.1 以降だと errno の定義に互換性が無いそうで、コンパイルエラーとならないように必要なパッチだそうです。 daemontools-0.76.errno.patch ./other-patches glibc 2.3.1 以降だと errno の定義に互換性が無いそうで、コンパイルエラーとならないように必要なパッチだそうです。 mess822-0.58.errno.patch ./other-patches glibc 2.3.1 以降だと errno の定義に互換性が無いそうで、コンパイルエラーとならないように必要なパッチだそうです。 qmailanalog-0.70.errno.patch ./other-patches glibc 2.3.1 以降だと errno の定義に互換性が無いそうで、コンパイルエラーとならないように必要なパッチだそうです。 ucspi-tcp-0.88.a_record.patch ./other-patches rblsmtpd 関連のパッチのようなことも聞きつつ…、A レコードのみのゾーンにも対応させる…という感じなのでしょうか…。 ucspi-tcp-0.88.errno.patch ./other-patches glibc 2.3.1 以降だと errno の定義に互換性が無いそうで、コンパイルエラーとならないように必要なパッチだそうです。 ucspi-tcp-0.88.nodefaultrbl.patch ./other-patches rblsmtpd を -r オプションが与えられなかった場合に、ディフォルトの RBL として rbl.maps.vix.com が利用されるのではなく、RBL が使用されないものとするようにする…感じでしょうか。 基本的には netqmail-1.05.patch を ./collate.sh スクリプトを使って充てて qmail をインストールする感じになるようです。それ以外の other-patches にあるパッチは、必要に応じて手動で充てる必要があるようです。
なお glibc のバージョンを確認するには、次のようにでもして、"lib" ディレクトリに保存されているオブジェクトのバージョンを確認すれば良いようです。
ls /lib/libc-*
今回の環境にて、これで確認してみると libc-2.3.1.so が見つかったので、glibc のバージョンは 2.3.1 だと思うのですけど、そういえばこの環境へ daemontools 0.76 をインストールしたときには特にコンパイルエラーは出なかったんですよね…。
調べる限りでは 2.3.1 "以降" ではエラーが出るからパッチを充てなくてはいけないと書かれていますけど、"以降" って、ちょうど 2.3.1 はどちらに入るのでしょうね。glibc 2.3.1 までは大丈夫なのかな…、よく判らないですけど。
前提
今回は qmail を用いて、内部からの送信専用メールサーバを構築してみようと思います。ですので、設定内容は qmail と、特に認証を必要としない SMTP サービスのみという感じになります。
さらに既に daemontools 0.78 が既にインストールされているものとします。それについてのお話は EZ-NET: SSD/Linux へ daemontools を組み込んでみる にて触れてみました。それを使って qmail 周りの起動環境を整えてみようと思います。
インストールの準備
netqmail 1.05 のインストールを行うにあたって、まずは qmail が使うディレクトリを作成します。
mkdir /var/qmail
続いて qmail が利用するグループとユーザを登録します。
以下の -u の後に続く数値は ”ユーザ ID”、-g に続く数値は ”グループ ID” ですので、必要に応じて変更してください。また、作成するアカウントのシェルは、通常ならば /bin/false となることが多いみたいですけど、SSD/Linux の場合は /usr/bin/false となるようです。
groupadd -g 500 nofiles
groupadd -g 501 qmailuseradd -u 1000 -g nofiles -s /usr/bin/true -d /var/qmail/alias alias
useradd -u 1001 -g nofiles -s /usr/bin/true -d /var/qmail qmaild
useradd -u 1002 -g nofiles -s /usr/bin/true -d /var/qmail qmaill
useradd -u 1003 -g nofiles -s /usr/bin/true -d /var/qmail qmailp
useradd -u 1004 -g qmail -s /usr/bin/true -d /var/qmail qmailq
useradd -u 1005 -g qmail -s /usr/bin/true -d /var/qmail qmailr
useradd -u 1006 -g qmail -s /usr/bin/true -d /var/qmail qmails
netqmail のインストール
http://www.qmail.org/ から netqmail-1.05.tar.gz をダウンロードしたら、とりあえず /usr/local/src/ ディレクトリ などへ移動して、アーカイブを展開し、出来上がった qmail-1.05 ディレクトリへ移動します。
tar xvzf netqmail-1.05.tar.gz
cd netqmail-1.05/
そうしたら collate.sh を実行してパッチを充て、続けて qmail のインストールを行います。
./collate.sh
cd netqmail-1.05
make setup check
これで qmail のインストールは完了です。
qmail 周りを設定する
インストールが完了したら、どのメールアドレスのメールを受け取るかを設定します。
./config-fast domain.dummy
今回は内部からの送信用の SMTP サーバとして利用しようと思うので、とりあえずてきとうに domain.dummy とでもしておくことにしました。ここで指定したドメイン名は、"me", "defaultdomain", "plusdomain", "locals", "rcpthosts" ファイルに適宜反映されるようです。
なお、これらのファイルの意味は次のような感じのようです。
me 自分自身の完全修飾ドメイン名を示すものだそうで、各種制御ファイルのディフォルトとしても効果をなすそうです。SMTP 接続時の応答メッセージや、Received ヘッダなどで使用されるようです。 defaultdomain ドットの無いホスト名が指定された場合に付加されるドメイン名だそうです。defaulthost にドットが含まれない場合にも、この情報が付加されるとのことでした。 plusdomain ドットがなく、さらに最後が + で終わるホスト名が指定された場合に付加されるドメイン名だそうです。defaulthost についてもこの条件に該当する指定がなされていた場合は、この情報が付加される対象となるそうです。 locals ここに記されたドメイン宛てのメールを自サーバ宛てのメールとして、メールボックスへの格納対象とします。virtualdomains で指定されたドメインは含みません。 rcpthosts SMTP 接続時に、ここに記されたドメイン宛のメールを受理します。具体的には SMTP 要求の "RCPT TO: " にて指定可能な宛先のドメイン名です。locals や virtualdomains に指定されたドメインがここに含まれていないと、それら宛のメールの SMTP による送受信が行えませんので注意です。
続いて qmail を起動します。
今回は daemontools に付属の svscan を用いて起動しようと思うので、まずは /var/qmail ディレクトリに次のようなスクリプトを作成します。ファイル名は run という名前にしておきます。
#!/bin/sh
exec env - PATH="/var/qmail/bin:/usr/local/bin:/usr/bin:/bin" \
qmail-start ./Maildir
続いて、次のようにしてログ収集用のディレクトリを作成します。
chmod +t /var/qmail
mkdir /var/qmail/log
chown qmaill.nofiles /var/qmail/log
そして、出来上がった /var/qmail/log ディレクトリに次のようなスクリプトを作成します。ファイル名は run という名前にします。
#!/bin/sh
exec \
setuidgid qmaill \
multilog t ./main \
-'* status: *' \
-'* starting delivery *' \
-'* delivery * success*' \
-'* delivery * failure*' \
-'* new msg *' \
-'* info msg *' \
-'* end msg *' \
-'* bounce msg *' \
-'* delivery * deferral: Sorry,_I_couldn't_find_any_host_by_that_name*' \
-'* delivery * deferral: Sorry,_I_wasn't_able_to_establish_an_SMTP_*' \
./alert \
'-*' '+* status: *' =status
そうしたら、これら二つの run スクリプトに実行可能フラグを設定します。
chmod +x /var/qmail/run
chmod +x /var/qmail/log/run
後は次のようにして /service ディレクトリへ /var/qmail へのシンボリックリンクを作成すれば、qmail が起動します。
ln -s /var/qmail /service
このように svscan で起動されたサービスは、直ちにサービスが起動され、その後もプロセスが落とされても自動起動されるなど監視され続けます。svscan で起動したサービスをコントロールする方方については EZ-NET ディクショナリ: svscan で使用できる引数 にまとめてみました。
ついでに sendmail 周りの調整もしておきましょう。
qmail には /var/qmail/bin/sendmail という、よく CGI 等でメール送信の際に使用する sendmail コマンドが同梱されていますので、一般的なパスからこのプログラムへのシンボリックリンクを張っておくと、何かと都合が良さそうです。
ls -l `find / -name sendmail -type f`
このようにすれば通常の実行ファイルが見つかりますので、とりあえず見つかったファイルは sendmail.org などとしておいて、新たに /var/qmail/bin/sendmail へのシンボリックリンクを張っておくと良さそうです。
mv sendmail sendmail.org
chmod -x sendmail.org
ln -s /var/qmail/bin/sendmail
他の機会に Fedora Core 5 で netqmail-1.05 をインストールした時は、既存の sendmail の配置がやけに複雑になっていました。これはなにやら MTA を切り替える仕組みが備わっているらしく、それに配慮した作りになっているのだそうです。
そのときは完全に qmail に差し替えるつもりだったので、次のように sendmail をアンインストールしてみたところ、とりあえず解消されました。
yum -y remove sendmail
SMTP サービスを稼動する
qmail が稼動したら、それと連動して使用する SMTP サービスの組み込みです。
今回は qmail-smtpd を tcpserver にて起動しようと思うので、そのためにまずは ucspi-tcp をインストールします。これは http://cr.yp.to/ucspi-tcp.html にて提供されていて、2005/10/22 の時点では 0.88 が最新版のようです。
ucspi-tcp-0.88.tar.gz を入手したら、次のように展開およびインストールを行います。
tar xvzf ucspi-tcp-0.88.tar.gz
cd ucspi-tcp-0.88
make setup check
ucspi-tcp のインストールが終わったら、続いて SMTP サーバの待ちうけを制御するためのデータベースを作成します。
データベースは /etc/tcprules ディレクトリへ保存することとしておくことにします。そのために /etc/tcprules ディレクトリを作成したら、そこへ smtp.rule という名前でもつけたファイルを用意します。そのファイルの内容は次のような感じです。
192.168.0.:allow,RELAYCLIENT=""
:deny
これは、192.168.0.* という IP アドレスからの接続は許可して、その際にはメールのリレーを許可する( RELAYCLIENT="" ) という意味になります。この RELAYCLIENT が設定されていない場合は、qmail の rcpthosts に指定されているドメイン宛のメールしか受理してもらえないため、それ以外の宛先へはメールが送信できません。
次に :deny としていますが、これは上記で指定した以外のアドレスからの接続は拒否するという意味です。
もしこの qmail を受信も可能なメールサーバとして運用する場合には、不特定のアドレスから SMTP 接続されることになりますので、これを設定してしまうと外からメールが届かないという状況になります。
tcpserver は tcprules のデータベース内に該当するものが見つからなかった場合は許可となるようですので、完全なメールサーバとして運用する場合には :deny は書かないでおきます。また、不特定のアクセスへは RELAYCLIENT を設定しないように注意しましょう。もしこれを設定してしまうと誰もが自由にメールの送信サーバとして利用できてしまうため、SPAM メールの送信元となってしまう可能性があります。
以上のルールファイルを作成したら、それを tcprules という命令を使って変換します。
/usr/local/bin/tcprules smtp.cdb smtp.tmp < smtp.rule
これで smtp.rule ファイルを基にした smtp.cdb データベースが作成されます。なお、このデータベースは tcpserver 起動最中でも作成しなおせばそのまま有効になるようです。
続いて svscan で起動するために /var/qmail-smtpd ディレクトリを作成します。
mkdir /var/qmail-smtpd
chmod +t /var/qmail-smtpd
mkdir /var/qmail-smtpd/log
chown qmaill.nofiles /var/qmail-smtpd/log
/var/qmail-smtpd ディレクトリの中に、次の内容で run ファイルを作成します。-u と -g の後の数値はユーザとグループの ID です。
#!/bin/sh
exec \
/usr/local/bin/tcpserver -v -R -H -l0 -x /etc/tcprules/smtp.cdb -u 1002 -g 500 0 smtp /var/qmail/bin/qmail-smtpd 2>&1
/var/qmail-smtpd/log ディレクトリの中には、次の内容で run ファイルを作成します。
#!/bin/sh
exec \
/usr/local/bin/multilog t ./main '-*' '+* * status: *' =status
そして作成した run ファイルに実行可能フラグを設定します。
chmod +x /var/qmail-smtpd/run
chmod +x /var/qmail-smtpd/log/run
これで準備は完了です。
後は次のようにして /service ディレクトリへ /var/qmail-smtpd へのシンボリックリンクを生成すれば、SMTP サーバが起動します。
ln -s /var/qmail-smtpd /service