※ この記事は2005年12月に書いたものを書き直したものです。
UNIX Client-Server Program
qmail という
MTA(Message Transfer Agent = インターネットでメールを配送するソフトウェア)は、イリノイ大学の
D. J. Bernstein(
http://cr.yp.to/djb.html) 教授によって作られた、メールの送受信のみを行うとてもシンプルなソフトウェアです。バージョンナンバーからも分りますように、作られてからほとんどバージョンアップされていません。ネットの検索サイトで、"qmailの歴史" で検索しても、何故か sendmail の歴史といったサイトばかりでてきます。(^^;)
qmail自体はそんなシンプルな MTA ですが、パッチファイルを当てたり、アドインソフトと共に使ったりして色々と機能を増やせるようになっています。最もよく使われるアドインソフトに
tcpserver があります。
※ tcpserver はqmailと同じく D. J. Bernstein さんの作られたソフトウェアで、サーバを制御するツールです。FreeBSDでは、/usr/ports/sysutils/ucspi-tcp に収められています、この ucspi とは UNIX Client-Server Program Interface の略で、TCP/IP のクライアント・サーバ通信ツールのインターフェースの役割を果たしています。
難しい説明はこの位にして、FreeBSDにqmailをインストールする手順を書きます。FreeBSDのリリースは2008年9月現在最新の
7 (2009年10月現在最新の
7.2 にて再インストールし、記事内容を新しくしてあります)です。3年前の書き込み時には、
4.11を使っていましたが、古くなり過ぎインストール時にエラーが多くでるようになりましたので
7 にしました。インストール後直ぐに
ssh が使えるということで 4.11 は良かったのですが…。
使用PCは、東芝の古い低スペックのノートパソコンを使っています。ネットオークションで送料も含め3,000円前後で手に入れたものです。わたし個人のメールサーバとして使う分には、この程度のマシンで充分です。これから自宅サーバをやってみたいという方にアドバイスするとしたら、ウェブサーバとメールサーバは、マシンを分けた方がいいということです。ウェブサーバのメンテナンス時に、メールサーバを止めなければいけないということがありませんし、その逆の場合もウェブサーバを止めずに済みますので安心です。
- checkpassword のインストール(ports より)
# cd /usr/ports/security/checkpassword
# make install clean
- tcpserver のインストール(ports より)
# cd /usr/ports/sysutils/ucspi-tcp
# make install clean
2009年10月にインストールした時、オプションが出ました。やたらとチェックを入れますと、エラーになってインストールがストップしてしまいます。一度設定したオプションを変更するには、
# make config
と入力してオプションを変更してから make install clean コマンドを打ち直します。詳しくは BSDハンドブック の Ports Collection の利用のページ をご覧ください。
インストールが上手く行きましたら、/etc ディレクトリに、tcp.smtp というファイルを作ります。
# vi tcp.smtp
リレイを許可する者のIPアドレスを設定します。LAN 外からの送信は、固定グローバルIPでインターネット接続している人であれば、ここにそのグローバルIPアドレスを書き込むことによって、LAN外のパソコンからこのSMTPサーバを使ってメールの送信ができます。固定グローバルIPがなければ、SMTP Authentication システムや、daemontools と relay-ctrl をインストールして、pop before smtp 機能を持たせることにより、ユーザが LAN 外からこのメールサーバを使って送信することができるようになります。
127.:allow,RELAYCLIENT=""
192.168.0.:allow,RELAYCLIENT=""
固定グローバルIPがあれば
***.***.***.***:allow,RELAYCLIENT=""
この時書き方で、注意すべき点があります。途中で省略する場合は、必ず最後をドットで終えるという点です。
192.168.0:allow,RELAYCLIENT=""
と書きますと、LAN 内から外部メールアドレスへの送信はできません。
下記のコマンドで、/etc に tcp.smtp.cdb というデータベースファイルが作られます。このコマンドを実行しませんと、設定が有効になりません。
# tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
※ 198.168.0 のローカルIPは、ご自宅のものに変えてください
- qmail のインストール(ports より)
# cd /usr/ports/mail/qmail
# make install clean
途中オプション選択画面が出て来ます。 |
|
Options for qmail 1.03_7 |
1 | SMTP_AUTH_PATCH | Provide SMTP Authentication |
2 | QMAILQUEUE_PATCH | run a QMAILQUEUE program |
3 | BIG_TODO_PATCH | enable big_todo qmail patch |
4 | BIG_CONCURRENCY_PATCH | use a concurrency greater than 240 |
5 | OUTGOINGIP_PATCH | set the IP address to send messages |
6 | LOCALTIME_PATCH | emit dates in the local timezone |
7 | QMTPC_PATCH | send email using qmtp protocol |
8 | MAILDIRQUOTA_PATCH | Maildir++ support |
9 | BLOCKEXEC_PATCH | block many windows viruses/worms |
10 | DISCBOUNCES_PATCH | discard double-bounces |
11 | SPF_PATCH | Implement SPF checker |
12 | RCDLINK | create rc.d/qmail.sh |
1番の SMTP_AUTH_PATCH オプションは、pop before smtp のように、ローカルエリア外のパソコンから送信したいユーザがいる場合に必要になります。vpopmail や、qmailvida と組み合わせて使うようですが、インストール・設定がややこしくあまりお勧めできません。外から利用のユーザが、固定のグローバルIPを持っている場合は、これを使う必要はありません。/etc ディレクトリ下の tcp.smtp ファイルにその固定グローバルIPを設定すればOKです。6番の local timezone オプションはチェックした方がいいです。チェックしておかないとメールに表示される時刻がグリニッジ標準時(GMT、Greenwich Mean Time)になってしまいます。11番は自分のメールサーバで SPF(Sender Policy Framework、メールの送信元アドレスが偽装されているかどうかチェックする機能)を使いたければチェックを入れておきましょう。SPF を使うのは意外と簡単です。/var/qmail/control に4つの設定ファイルを置くだけです。やってみたい人は、下記のリンク先をご覧ください。
qmail用のSPF実装
12番は既にチェックが入っていまして、そのままでいいと思います。後はお好みで…。(^^;)
■ /var/qmail/alias 下のファイル設定
.qmail-mailer-daemon |
宛先を間違えたメールが、ここ宛てに戻って来ます |
.qmail-postmaster |
メールサーバ管理者のアドレス |
.qmail-root |
daily weekly monthly のチェックデータが ここ宛てに送られてきます |
自宅サーバでしたら、全てあなたの一番受け取りやすいメールアドレスをここに
&tarou@abc.ne.jp といったように書いておけばそこに転送されます。
もしその受け取りやすいアドレスのアカウントがサーバ内にあるのでしたら、そのアカウント名のみを &tarou 書き込めばOKです。
※ これはqmailサーバを稼動して暫くして分ったことなのですが、海外から、admin、anonymous、accounting、accounts、administrator、guest、help、home、info、mail、majordomo、sales、service、support、test、uucp などのアカウント宛てにスパムメールがよく送られてきます。これらのアカウントは Unix サーバには始めからあるものなのですが、メールボックスがなく転送先も指定されていないために "Sorry no mailbox here by that name" と書かれたお知らせメールが Return Path に書かれたアドレス宛に送り返されます。しかしそういったメールの Return Path は架空のものなので、qmailのプログラムがそれらを送り返す作業を繰り返し続け、 /var/qmail/queue に溜まります。そしてメールサーバから毎日送られてくる daily run outpu メールに、
Mail in local queue:
14 Mar 2006 21:47:35 GMT #1371 26561 <>
remote william@perlite.biz
といった報告が延々と繰り返されてしまいます。そういった問題に対処するには、
/var/qmail/alias に .qmail-default というファイルを作ります。.qmail-default は、本来は届け先不明メールの届け先を指定するファイルです。catch-all アカウント としてアカウント名をミスタイプされて送られて来たメールや、メールアドレスの変更に伴う旧メールアドレス宛に送られて来たメール用として使われるものだそうですが、使いようによっては便利なスパム対策用ファイルとして使うことができます。作った .qmail-default ファイルには、下記のように書き込んでおきます。 ( .qmail ファイルの詳しい設定方法は、qmailの日本語解説サイトをご覧ください。
dot-qmailの使い方
|bouncesaying 'このメールアドレスは存在しません。' /bin/sh -c "if [ $LOCAL != admin -a $LOCAL != anonymous -a $LOCAL != accounting -a $LOCAL != accounts -a $LOCAL != administrator -a $LOCAL != guest -a $LOCAL != home -a $LOCAL != info -a $LOCAL != majordomo -a $LOCAL != sales -a $LOCAL != uucp ] ; then exit 0 ; else exit 100 ; fi"
そうすると上のプログラムに書かれたアカウント宛のメールはそこで消え、その後何の処理も行われません。上のプログラムに記入のないアカウント宛のメールで、メールボックスがなく /var/qmail/alias 下の .qmail ファイルに転送先の指定もされていないアカウント、あるいは送信者のミスタイプによる間違ったアカウント宛に送られたメールには、'このメールアドレスは存在しません。' のメッセージが書かれたqmailサーバからのお知らせメールが返送されます。.qmail-default ファイルに # と書いておくよいと解説しておられるサイトもありますが、これですと宛先ユーザ名をミスタイプして送られて来たメールは消えてしまうだけで、届かなかったことをお知らせするメールは送られません。
■ /var/qmail/control 下のファイル設定
インストール後、/var/qmail/control 内にできている defaultdomain、 locals、 me、 plusdomain、 rcpthosts という名のファイルに下記情報を書き込みます。ports のインストール後直ぐに ./config とコマンドを打ちますと、固定IPで逆引き設定されている自宅サーバであれば自動的に書き込まれます。
1 | defaultdomain | ryos.info |
2 | locals | localhost |
|
| ryos.info |
3 | me | ryos.info |
4 | plusdomain | info |
5 | rcpthosts | localhost |
|
| ryos.info |
6 | databytes | 5242880 |
7 | badmailfrom | @hanmail.net |
|
| @nate.com |
|
| @postmark.net |
|
| @yyhmail.com |
6 と 7 は、後で必要になったら、自分でファイルを作って書き込みます。qmailの設定ではなく tcpserver の設定ですが、同じディレクトリに作る設定ファイルということで一緒にしました。
6 は、一回に転送できる容量の制限。(5242880 は、5MB の設定例です)
7 は拒否したいドメインの指定。tcpserver が読みとって拒否してくれます。しかしスパマーは、その都度違う架空のドメインで送ってきますので、効果は期待できません。それでわたしは使っていません。しかし、世界中のメールサーバ管理者に代わって、Kelkea社が中心となって MAPS RBL (Mail Abuse Prevention System Realtime Blackhole List) というスパムメールのリストを作ってくださっています。最近 Kelkea社はトレンドマイクロ社に買収されましたが、トレンドマイクロ社が同様のサービスを継続してくれていますので、今迄通りこのリストを利用することができます。このリストを利用するには、rblsmtpd を利用します。rblsmtpd は tcpserver をインストールした際に /usr/local/bin/rblsmtpd にインストールされていますので、後で説明します rc ファイル に /usr/local/bin/rblsmtpd のコマンドを書き加えるだけで利用することができます。
http://www.mail-abuse.com/
最近プロバイダーがよく行っている25番ポートブロック(Outbound Port25 Blocking)対策として、プロバイダーのSMTPサーバを使いたいような場合は、smtproutes というファイルを作り、
コロン+契約しているプロバイダのSMTPサーバのアドレス
例 :mail.biglobe.ne.jp (ビッグローブユーザの場合)
と書き込んでおきます。コロンの前や後ろに空白を入れてはいけません。
宛先が携帯電話のメールの時だけプロバイダのSMTPサーバを使いたいような場合、
ビッグローブユーザでしたら、
docomo.ne.jp:mail.biglobe.ne.jp
.ezweb.ne.jp:mail.biglobe.ne.jp
.vodafone.ne.jp:mail.biglobe.ne.jp
などのように書いておけばOKのようです。
※ 25番ポートブロックは動的IPにのみ適用している場合が多いので、ご自分の契約プロバイダの案内をよく調べてください。固定IPで自宅メールサーバを運用している場合は何もしなくてOKです。
■ Maildir の作成
sendmail では、メールは、/var/spool/mail/user というディレクトリに届きますが、qmail では、各ユーザ毎のディレクトリにある Maildir というディレクトリ内に届きます。ユーザ毎のディレクトリに Maildir ディレクトリを作るには、各ユーザでログインし、下記のコマンドを使います。
% /var/qmail/bin/maildirmake $HOME/Maildir
% echo ./Maildir/ > /.qmail
これから登録されるユーザでは、下記の設定をしておきますと、ユーザを登録すると自動的に Maildir ディレクトリが作られます。
# cd /usr/share/skel
# /var/qmail/bin/maildirmake Maildir
としてユーザ用の Maildir ディレクトリを作っておきます。
# vi dot.qmail
同じ /usr/share/skel 内に、dot.qmail というファイルを作り "./Maildir/" と書いておきます。
■ rc ファイルの作成
/var/qmailに作られた rc ファイルは、/usr/local/etc/rc.d/qmail.sh にリンクされています。
つまり qmail.sh の実態はこの rc ファイルということになります。
# cd /var/qmail
# vi rc
rc ファイルの記述例
できた rc ファイルに実行権を与えます。
# chmod +x /var/qmail/rc
■ send mail の廃止
# vi /etc/rc.conf
で sendmail_enable="NONE" としておきます。NO ではなく必ず NONE にしておいて下さい。
# chmod 0 /usr/libexec/sendmail/sendmail
# chmod 0 /usr/sbin/sendmail
# mv /usr/libexec/sendmail/sendmail /usr/libexec/sendmail/sendmail.bak
# mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
# ln -s /var/qmail/bin/sendmail /usr/libexec/sendmail/sendmail
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
# chmod 0 /usr/libexec/mail.local
/etc/defaults/periodic.conf の daily_status_include_submit_mailq="YES"
の個所を探して、"YES" の記述を "NO" に書きかえる。
# vi /etc/defaults/periodic.conf
121 行目辺りの
daily_status_include_submit_mailq="YES" # Also submit queue
の YES を NO に書き換える
- qmHandle のインストール
何らかの理由によって /var/qmail/queue にメールが溜まってしまった場合に、/var/qmail/queue に溜まっているメールを簡単に削除できるソフトが qmHandle です。
# cd /usr/ports/mail/qmhandle
ちょっと前までは、qmHandle ディレクトリだったのですが、qmhandle とエッチが小文字になっていました。(^^;)
# make install clean
・使い方
# qmHandle -l
で下記のようなデータが表示され(コマンドの方は、エッチは大文字のままでOKでした)、溜まっているメールがあるかないか、またそのメールのナンバーが分かります。
571 (19, L)
From: pgalove@hanmail.net
To: anonymous@ryos.info
Subject: failure notice
Date: 25 Dec 2005 01:35:38 -0000
Size: 3853 bytes
Messages in local queue: 1
Messages in remote queue: 0
ローカルにナンバー 571 のメールが溜まっていることが分ります。
# qmHandle -D
で全てまとめて削除できます。
# qmHandle -d571 ← 番号は削除したいメールのナンバー
のコマンドですと、指定した番号のメールのみを削除できます。
qmHandle -D や qmHandle -d削除したいメールのナンバー のコマンドは、メールの削除をする前にqmailを停止してメールの削除を行い、その後qmailを再起動するようになっていますが、わたしのサーバのように時として停止・再起動が上手くできない場合があります。その時は、
/usr/local/bin/qmHandle
の #my ($stopqmail) と #my ($startqmail) の値を適正なものに指定し直す必要があります。それでもqmailの停止・再起動上手く行かないと、
warning: trouble opening local/19/571; will try again later
といったログが /var/log/maillog に2分おきに記録されてしまいます。
そういう場合は、下記のコマンドを手動で打ち込み、
# /usr/local/etc/rc.d/qmail.sh stop
qmailを一旦きちんと停止して qmHandle -D や qmHandle -d削除したいメールのナンバー のコマンドを実行し、その後また下記のコマンドで、
# /usr/local/etc/rc.d/qmail.sh start
qmailを手動で再起動すると warning: trouble opening … のログがでずにすみます。
それでは皆さん、古くて捨てるようなパソコンを利用し、自宅サーバを楽しみましょう。ご質問・その他情報は、
FreeBSD BBS によろしくお願いいたします。v