Linux
さらばsendmail!

10分で出来る qmail + pbs4qのインストール




かつて私自身が、qmail + pbs4q(POP before SMTP for qmail)をインストール
しようとして方法が良くわからずに悪戦苦闘した経験があるのですが、
インターネットで探しても「qmail + pbs4q」の組み合わせについて解説している
サイトがあまり無かったので、思い切って自分で解説ページを作ることにしました。


qmailとは?

UNIX/Linux用のメールサーバーではsendmailが最も有名ですが、
様々な問題を抱えていることも事実です。

sendmailはその歴史がセキュリティホールの発見と対策パッチ当ての
連続だったといっても過言では無いと思います。
あらゆるプロトコルに対応しているためにプログラムが肥大化し、
リソースを消費してしまいます。
また、設定が難しいために多くのユーザーはsendmail.cfを利用して
設定ファイルを作成するという手間をかけています。

その点、D.J.Bernstein氏・作のqmail日本語訳サイト)はシンプルな
構造なので処理速度が速く、安定しており、それでいてセキュリティ対策は
万全だと言われています。

ここではqmailに八上 全弘氏・作のpbs4q を組み合わせて
POP before SMTP対応にしてみました。

POP before SMTP対応にすると、ユーザーはsmtpでメールを
送信をする前にpopでパスワード認証をしなければいけません。
それにより、不正なメール中継を防止することができます。
(とはいえ、pop を外部ネットワークから使うとパスワードや
データの内容が平文で流れるので、注意が必要です。)

既にsendmailでメールサーバーを運営していて後からqmailに
移行する場合、qmail側のポート番号を一時的に変更することによって
sendmailを動かしながら平行してqmailのテスト運営をすることも
可能ですが、当サイトではその方法については説明していません。


用意するファイル

・qmail
ftp://ftp.jp.qmail.org/qmail/qmail-1.03.tar.gz

・pbs4q
http://mambo.kuhp.kyoto-u.ac.jp/~masahiro/PbS4q/pbs4q-0.2.1.tar.gz

・localtime用パッチ
ftp://ftp.nlc.net.au/pub/unix/mail/qmail/qmail-date-localtime.patch

・tcp-server
http://cr.yp.to/software/ucspi-tcp-0.88.tar.gz

・checkpassword
http://cr.yp.to/software/checkpassword-0.90.tar.gz

・cdb
http://cr.yp.to/cdb/cdb-0.75.tar.gz

 

ファイルがたくさんあるのでインストールが大変そうに感じますか?
しかし、後々の事を考えると、sendmailで煩雑な設定・管理をするよりも
ずっと楽チンですよ!(笑)

 

設定例について

ここに記載している設定例は、このサーバー (ns.planet-green.com)を例に説明して
います。サーバー名の部分をあなたのものに変更して利用してください。

どうしてこんな当たり前の事を書くかというと、以前ここの設定例をそのまま
コピーして利用していた方がいまして、困惑した経験があるからです(^-^;


qmialのインストール

ソースを展開する

# tar zxvf qmail-1.03.tar.gz -C /usr/local/src
# cp qmail-date-localtime.patch /usr/local/src/qmail-1.03
# cd /usr/local/src/qmail-1.03
        

/var/qmail がqmail用のディレクトリになるので作成しておきます。

# mkdir /var/qmail
# chmod 755 /var/qmail


qmailが使用するグループとユーザーを作成します。
ユーザ・グループIDは任意の番号でいいのですが、ここでは900番から始める
ことにします。
下記のコマンドを9行まとめてコマンドラインにコピー&ペーストし実行すれば
一括作成できるはずです。

/usr/sbin/groupadd -g 900 nofiles ;\
/usr/sbin/groupadd -g 901 qmail; \
/usr/sbin/useradd -g nofiles -u 902 -d /var/qmail/alias alias; \
/usr/sbin/useradd -g nofiles -u 903 -d /var/qmail qmaild; \
/usr/sbin/useradd -g nofiles -u 904 -d /var/qmail qmaill; \
/usr/sbin/useradd -g nofiles -u 905 -d /var/qmail qmailp; \
/usr/sbin/useradd -g qmail -u 906 -d /var/qmail qmailq; \
/usr/sbin/useradd -g qmail -u 907 -d /var/qmail qmailr; \
/usr/sbin/useradd -g qmail -u 908 -d /var/qmail qmails 


これで、下記のようにユーザー・グループが登録されてるはずです。

# cat /etc/passwd
(〜中略〜)
alias:!!:902:900::/var/qmail/alias:/bin/bash
qmaild:!!:903:900::/var/qmail:/bin/bash
qmaill:!!:904:900::/var/qmail:/bin/bash
qmailp:!!:905:900::/var/qmail:/bin/bash
qmailq:!!:906:901::/var/qmail:/bin/bash
qmailr:!!:907:901::/var/qmail:/bin/bash
qmails:!!:908:901::/var/qmail:/bin/bash



qmailはデフォルトではRecieved:フィールドがローカルタイム(JST)ではなく
国際標準時間(GMT)になってしまいます。
それでは何かと不便なので、ローカルタイム表示にするパッチを当てておきます。

# patch -p1 < qmail-date-localtime.patch


それではqmailのコンパイルです。

# make
# make man
# make setup
# make check
(errorが無いか確認する)

 

# ./config

この時、サーバーでDNSを使えないとホスト名を正しく取得できないので、
その場合は ./configの代わりに次のようにオプション指定します。
./config-fast hoge.hogehoge.co.jp(←ホスト名)
(表示例) 
Your hostname is ns.planet-green.com.
Your host's fully qualified name in DNS is planet-green.com.
Putting planet-green.com into control/me...
Putting planet-green.com into control/defaultdomain...
Putting planet-green.com into control/plusdomain... 
Checking local IP addresses:
127.0.0.1: Adding localhost to control/locals...
xxx.xxx.xxx.xxx: Adding ns.planet-green.com to control/locals...
xxx.xxx.xxx.xxx: Adding planet-green.com to control/locals...
If there are any other domain names that point to you,
you will have to add them to /var/qmail/control/locals.
You don't have to worry about aliases, i.e., domains with CNAME records.
Copying /var/qmail/control/locals to /var/qmail/control/rcpthosts...
Now qmail will refuse to accept SMTP messages except to those hosts.
Make sure to change rcpthosts if you add hosts to locals or virtualdomains!




aliasの設定

これはsendmailにおける/etc/aliasesと同じ機能です。
ディレクトリ /var/qmail/alias/ 内に設定ファイルを書くことで
メールの転送先を設定できます。

例えば、/var/qmail/alias/  に

.qmail-hogehoge

という名前のファイルを作り、 そのファイルの中に

&foo (又は、 &foo@xxxxx.or.jp のように完全メールアドレスでもいい)

と書くと、hogehoge 宛てのメールが foo に転送されます。
また、転送先は1行に1アドレスずつ、何個でも指定できます。

ここでは

.qmail-root
.qmail-postmaster
.qmail-mailer-daemon

という空の3つのfileを作成します。

# cd /var/qmail/alias
# touch .qmail-root .qmail-postmaster .qmail-mailer-daemon 
# chmod 644 .qmail* 


.qmail-root と .qmail-postmaster で あなたのアカウント指定しておくと、
それらに送られてきたメールは あなたのアカウントに転送されます。

qmailはroot宛てのメールを受信しないので、この設定は必須です。
.qmail-mailer-daemonの中身は、送信者に戻るように空にしておくのがいいでしょう。

また、.qmail-defaultを作成し、宛先不明メールの送り先を指定することも出来ます。


/var/qmail/control/内の設定ファイルについて

me ホストのFQDN

(設定例)
planet-green.com
rcpthosts  このファイルにかかれているアドレスを含むホストにのみメール
中継を許可する。(これに関しては後述)

(設定例)
localhost
ns.planet-green.com
planet-green.com
locals

ここに記述されているホスト名をメールアドレスに含むユーザーを
ローカルユーザーと見なし、メールを受信を許可する。

(設定例)
localhost
ns.planet-green.com
planet-green.com

defaultdomain

送信したメールの From: に書かれるホスト名

(設定例)
planet-green.com

badmailfrom

受取を拒否する相手先のアドレス。(SPAMメール禁止に便利)
@host 形式で記述することも可能。



Maildir形式

qmailはデフォルトではsendmailと互換性のあるMailbox形式でメールを保存します。
しかしMailbox形式よりもMaildir形式の方がセキュリティ上は安全で、処理速度も
早いので、ここではMaildir形式に変更します。

まずMaildirを作ります。メールサーバーをsendmailからqmailに途中から移行した場合、
これらは各ユーザーが作ることになります。

$ /var/qmail/bin/maildirmake $HOME/Maildir; echo ./Maildir/ > ~/.qmail  

次のように設定しておけば、以後、新規ユーザーを登録した時に自動的にMaildirを
各ユーザーのホームディレクトリに作成してくれます。

# /var/qmail/bin/maildirmake /etc/skel/Maildir; echo ./Maildir/ > /etc/skel/.qmail

起動スクリプトをコピーします。

# cp /var/qmail/boot/home /var/qmail/rc 


Maildir形式にするため、今コピーしたファイルを書き換えます。

(/var/qmail/rcの最下行を次のように変更します)

qmail-start ./Maildir splogger qmail

 


メールの送信テスト

qmailを開始します。sendmailから移行した場合は、その前にsendmailを停止しておいてください。

# csh -cf '/var/qmail/rc &' 


自分のhomeにMaildirがあることを確認した後、以下のコマンドでroot宛てにメールを送ります。

$ echo to: root | /var/qmail/bin/qmail-inject

~/Maildir/new に新しいメールが来るはずです。

次は、外部への送信テストです。

$ echo To: ooo@xxx.xx.jp(送信先メールアドレス) | /var/qmail/bin/qmail-inject


qmailの sendmail wrapperをMUAから使えるようにします。
一部のソフトやCGIはメール送信時にsendmailを利用していますが、
qmailがsendmailになりすましてそれらの処理を行うようにします。

# mv /usr/lib/sendmail /usr/lib/sendmail.bak 
# mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
# chmod 644 /usr/sbin/sendmail.bak 
# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail 
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

(最初からsendmailを入れていなければ下の2行だけ実行)



tcpserverの導入

従来のtcp wrapperではなく、tcpserverでqmailを制御することにします。
(tcpserverの特徴については、このサイトに詳しく書いてあります。)

tcpserverのインストール

# tar zxvf ucspi-tcp-0.88.tar.gz -C /usr/local/src 
# cd /usr/local/src/ucspi-tcp-0.88 
$ make 
$ make setup check 

/etc/inetd.conf  の中でsmtpが有効になっていたら、コメントアウトして無効にしておいてください。


popperの設定

/etc/services に pop3 110/tcp の行があることを確認します。

checkpasswd をインストールします。

# tar zxvf checkpassword-0.90.tar.gz -C /usr/local/src
# cd checkpassword-0.90 
# make 
# make setup 
# make check 

/etc/inetd.conf のpop-2 pop-3をコメントアウトして従来のtcp wrapperからは
利用できないようにしておきます。


cdbを導入

qmailはデフォルトではlocalにしか送信できず、設定ファイル control/rcpthosts に
書いてあるホストにのみ、送信を許可する仕様になっています。

これでは不便なので、cdbをインストールして送信先ホストをコントロールするように
します。

(2003/12/09追記 tcpserver v0.88にはcdbが含まれているので、別途インストールする必要が
無くなったようです。したがって、下記の取り消し線部分は無視してください。)

まず、cdbを展開します。

$ tar zxvf cdb-0.75.tar.gz -C /usr/local/src 
$ cd /usr/local/src/cdb-0.75 

次のようにインストールします。

# make 
# make setup check


/etc/tcp.smtpを以下のように作ります。

192.168.0.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""

(IPアドレスが 192.168.0.*と127.* であるホストからの接続を許可を意味しています。)
そのほか、許可するIPを設定します。

tcprulesを以下のように実行し、 tcp.smtp.cdbファイルを作成します。

# /usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp 

/etc/tcp.smtpを変更した後は必ずtcprulesを実行して tcp.smtp.cdb も
更新しなければいけません。


tcprulescheckコマンドでルールデータベースをチェックします。

# TCPREMOTEIP=(テストしたいIPアドレス) /usr/local/bin/tcprulescheck /etc/tcp.smtp.cdb

IPアドレスを指定する事により、アクセス許可/拒否のいずれかを表示します。


pbs4qのインストール

ソースの展開とコンパイル

# tar zxvf pbs4q-0.2.1.tar.gz -C /usr/local/src
# cd /usr/local/src/pbs4q # make ; make install


自動起動スクリプトの設定

そして最後に /etc/rc.d/rc.local の末尾に次の内容を追加し、再起動すれば完了です。

##start qmail
csh -cf '/var/qmail/rc &'

##qmail-smtpd

/usr/local/bin/tcpserver -v \
-c 40 -u 903 -g 900 \ (←作成したqmaildとnofilesのユーザー・グループIDに一致するか確認)
-x /etc/tcp.smtp.cdb \
ns.planet-green.com smtp \ (←あなたのホストのFQDNに変更)
/usr/local/bin/pbs4q2_smtp \
/var/qmail/bin/qmail-smtpd \
2>&1 | /var/qmail/bin/splogger smtpd 3 &

##qmail-pop3d

/usr/local/bin/tcpserver -v -c 40 -u 0 -g 0 \
-x /etc/tcp.smtp.cdb 0 110 \
/var/qmail/bin/qmail-popup \
ns.planet-green.com \ (←あなたのホストのFQDNに変更)
/bin/checkpassword \
/usr/local/bin/pbs4q1 \
/var/qmail/bin/qmail-pop3d Maildir \
2>&1 | /var/qmail/bin/splogger pop3d 3 &
        

これによって、起動後に自動的にtcpserverが立ち上がり、
外部からの要求に応じてqmailをコントロールします。

この設定例ではtcpserverは同時に40までのqmail-smtpdを扱えるようにしてあります。
この制限を変えるには、コマンドライン -c の後を任意の数字にします。


メールの不正中継テスト

インストールが終わり、メールの送受信テストに成功したなら、無料のWEBサービスを利用して
サーバーが不正中継に利用されないか テストしてみるのも手です。

CyBrain

長崎ネットワークサービス



このサイトおよびこのサイトからリンクされているWEBページにあるソフトウェアあるいは情報が原因で生じたいかなる損害に対しても、このサイトの管理者、リンク先サイトの関係者は一切謝罪、補償をいたしません。
このサイトにある情報については、正しい情報であるよう努力していますが、そのことは正しさを保証するものではありません。
サイト内の情報は通告なく変更されます。インストール、改造、修正、その他、自己の行動は自責にてお願いいたします。