qmailのインストール(FreeBSD)

 FreeBSD RELEASE7 へのインストールはこちらへ

 UNIX Client-Server Program qmail というMTA(Message Transfer Agent = インターネットでメールを配送するソフトウェア)は、イリノイ大学の D. J. Bernsteinhttp://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のリリースは 4.11 です。5.〜をお使いの方のが多いかと思いますが、サーバとして使う分には GUI 環境は要らず、インストール後直ぐに ssh が使えるということで未だに 4.11 を使っています。2005年11月頃よりFreeBSDの FTP サイトでも 4.11 を置かなくなってしまったため、我が家では LAN 内に我が家専用の 4.11 のみを置いた FTP サイトを用意しています。(FreeBSDのインストール後cvsupでポートの更新をされる方がほとんどだと思いますが、これによってポートからインストールされる関連ソフトのバージョンがこの記事を書いた時よりも新しくなっていることがよくあります。ということで、この記事を見ながらqmailによるメールサーバ作りをされた場合、この記事に書いてある通りの流れにならないということをご承知おきください。)

 使用PCは、上の画像の SHARP mebius MN350-X16 Pentium 166MHz。このマシンは、ネットオークションで送料も含め4,000円弱で手に入れたものです。我が家でわたしが、日常のやりとりや、ホームページ教室の生徒さんたちとやっているMLなどで使う分には、この程度のマシンで充分です。これから自宅サーバをやってみたいという方にアドバイスするとしたら、ウェブサーバとメールサーバは、マシンを分けた方がいいということです。ウェブサーバのメンテナンス時に、メールサーバを止めなければいけないということがありませんし、その逆の場合もウェブサーバを止めずに済みますので安心です。

  1. cvsup のインストール(packages より)
     まず ports より色々インストールしますので、ports を最新のものに更新しておきましょう。
    #cd /usr/ports/net/cvsup-without-gui
    #make install clean
    # rehash
    # cvsup と打ってオプションが表示されればインストールは上手くできています
    # cd /usr/share/examples/cvsup
    # cp ports-supfile /etc
    # chmod 644 /etc/ports-supfile
    # vi /etc/ports-supfile
    変更個所 51行目辺り
     *default host=CHANGE_THIS.FreeBSD.org
      太線 CHANGE_THIS の部分を
     *default host=cvsup6.jp.FreeBSD.org
      のように利用するFTPサーバ名に書き換えます。

    # cvsup -g /etc/ports-supfile
    にて ports が最新のものに更新されます。特定の ports のみを更新したい場合は、ports-all をコメントアウトし、その下の必要な ports の<コメントアウトを外してから
    cvsup -g /etc/ports-supfile のコマンドを実行します。
    ※ cvsupのインストール、ポートの更新はけっこう時間がかかります。(^^;)

  2. Perl のアップグレード 2006.6.10 現在 perl 5.8.8
     qmHandle のインストール時に必要になりますが、他のソフトでも 5.8 を必要とするものがありますので、インストールしておくことをお勧めします。
    ※ FreeBSD5.〜をお使いの方々は、既に Perl5.8 になっていますので、この作業は不要です。
    # cd /usr/ports/lang/perl5.8
    # make install clean
    • # use.perl port
      とコマンドすると
      # perl -v
      This is perl, v5.8.8
    • # use.perl system
      とコマンドすると
      # perl -v
      This is perl, version 5.005_03
      と切り替えられます。
    use.perl port のまま、perl5.8.8 で使用しましょう。

  3. checkpassword のインストール(ports より)
    # cd /usr/ports/security/checkpassword
    # make install clean

  4. tcpserver のインストール(ports より)
    # cd /usr/ports/sysutils/ucspi-tcp
    # make install clean
    /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

  5. qmail のインストール(ports より)
    # cd /usr/ports/mail/qmail
    # make install clean
    途中オプション選択画面が出て来ます。
    Options for qmail 1.03_4
    1SMTP_AUTH_PATCHProvide SMTP Authentication
    2QMAILQUEUE_PATCHrun a QMAILQUEUE program
    3BIG_TODO_PATCHenable big_todo qmail patch
    4BIG_CONCURRENCY_PATCHuse a concurrency greater than 240
    5OUTGOINGIP_PATCHset the IP address to send messages
    6LOCALTIME_PATCHemit dates in the local timezone
    7QMTPC_PATCHsend email using qmtp protocol
    8MAILDIRQUOTA_PATCHMaildir++ support
    9BLOCKEXEC_PATCHblock many windows viruses/worms
    10DISCBOUNCES_PATCHdiscard double-bounces
    11SPF_PATCHImplement SPF checker
    12RCDLINK create rc.d/qmail.sh
     1番の SMTP_AUTH_PATCH オプションは、pop before smtp のように、ご自分のメールサーバを使ってメールを送信する者をチェックするためのものです。ローカルエリア外のパソコンから送信したいユーザがいる場合に必要になります。そのユーザが固定のグローバル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番は既にチェックが入っていまして、そのままでいいと思います。後はお好みで…。(^^;)
    • 後々機能を追加する時に便利なように、わたしは全てチェックを入れてみました。ただし、1 番の SMTP_AUTH_PATCH は、qmail-smtpd-auth-0.31.tar.gz がないよとのエラーが出てインストールが止まってしまったので、ネットより qmail-smtpd-auth-0.31.tar.gz を探してダウンロードし、/usr/ports/distfilesqmailというディレクトリを作って入れて、インストールし直しました。これは ports を使ってインストールする場合によくあることですね。どうしてもOSのインストール時に、ほとんどの人はcvsupを使って ports の更新をしてから色々インストールすると思いますが、関連ソフトのバージョンがそのマシンのFreeBSDリリースと合わなかったりすると起こるようです。

    ■ /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 内にできている defaultdomainlocalsmeplusdomainrcpthosts という名のファイルに既に書かれている情報を削除し、わたしのサイトのドメイン ryos.info を例に設定例を書いておきますが、このような情報を書き込んでおきます。
    1defaultdomainryos.info
    2localslocalhost


    ryos.info
    3meryos.info
    4plusdomaininfo
    5rcpthostslocalhost


    ryos.info
    6databytes5242880
    7badmailfrom@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 を利用します。rblsmtpdtcpserver をインストールした際に /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
    110 行目
    daily_status_include_submit_mailq="YES" # Also submit queue
    の YES を NO に書き換える

  6. qmHandle のインストール
     何らかの理由によって /var/qmail/queue にメールが溜まってしまった場合に、/var/qmail/queue に溜まっているメールを簡単に削除できるソフトが qmHandle です。
    # cd /usr/ports/mail/qmHandle
    # make install clean
    ・使い方
    # qmHandle -l
    で下記のようなデータが表示され、溜まっているメールがあるかないか、またそのメールのナンバーが分かります。
    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 -DqmHandle -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 -DqmHandle -d削除したいメールのナンバー のコマンドを実行し、その後また下記のコマンドで、
    # /usr/local/etc/rc.d/qmail.sh start
    qmailを手動で再起動すると warning: trouble opening … のログがでずにすみます。


    ■ pop before smtp機能を持たせ、LAN外ユーザの使用を可能にしたい場合は、daemontoolsとrelay-ctrlをインストールする必要があります。

  7. daemontools のインストール(tar.gz ファイルより)
    # cd /usr/local/src
    # gunzip daemontools-0.76.tar.gz
    # tar -xpf daemontools-0.76.tar
    # cd admin/daemontools-0.76
    # package/install
    サービス・ディレクトリ /service が作成され、
    /etc/rc.local に下記の記述が追加される。
    csh -cf '/command/svscanboot &'
    # reboot
    ps auxにsvscanのプロセスが表示される。

  8. relay-ctrlのインストール(ports より)
    # cd /usr/ports/mail/relay-ctrl
    # make install clean
    /etc/crontabに以下のように記述します。
    * * * * * root /usr/local/bin/envdir /usr/local/etc/relay-ctrl /usr/local/bin/relay-ctrl-age
    pop before smtpを使う場合の rc ファイルの設定例

     インストール時に、/usr/local/etc に relay-ctrl というディレクトリができ、中に RELAY_CTRL_DIRRELAY_CTRL_EXPIRY というファイルが作られます。 RELAY_CTRL_EXPIRY に書かれた数字が、LAN外からSMTPサーバ利用時にLAN外から受信後送信の許される時間(秒数でかかれています)です。デフォルトでは 900 ですので、15分ですね。
     実際にLAN外のパソコンのOutlook Expressで、qmailサーバのユーザのメールアカウントを設定して送信してみたところ、送信のみでは拒否。一度受信してからだと上手く送信することができました。

 自宅メールサーバではASAHINETの固定IPサービスと、No-IP.comのDNSサーバ・サービス(No-IP Plus)を利用しています。ASAHINETでは 25番ポートブロック(Outbound Port25 Blocking)対策を最近(2007.4)始めましたが、動的IP利用者に対してのみですので、固定IP利用で自宅メールサーバを運用している我が家には影響がありません。No-IP.comでは、MXレコードとSPFの設定ができます。
 最近逆引きできないメールサーバからの送信をチェックするシステムもできているとか。現在(2007年4月)逆引きできるプロバイダーはインターリンクさんだけでしょうか…。あまり詳しいことはよく分からないのですが、メールの送信は全てプロバイダーのSMTPサーバ経由でした方が良いようですね。その際送信者のメールアドレス(envelope from)をプロバイダーからいただいているものにし、返信アドレス(Reply to)を自宅サーバのものにしておくと全てのチェックを通るようです。わたしはこのやり方で送信しています。m(^^)m

2008年5月より、ASAHINETさんの固定IPサービスが無料から一気に月額840円になりました。逆引きサービスが無料になったインターリンクさんの固定IPサービス料との差が500円程度(インターリンクさんの方がまだ高い)になりましたので、プロバイダーをインターリンクさんの光接続に切り替えました。逆引き設定ができるようになりましたので、全てのメールを我が家のメールサーバから発信しています。

追記(2010.4):プロバイダをインターリンクさんにしたのですが、サポートが悪いので3ヶ月で解約いたしました。悪いというよりサポートが全く無いのです。問い合わせ用の電話もメールアドレスもありません。あるのは よくある質問のページ と、利用者同士の 助け合い掲示板 のみです。
 現在(2008年8月以降)は、やはり固定IPの利用と逆引き設定のできる株式会社ラットIPプロバイダIPP を利用しています。価格も月額 1,800円なので、固定IPが利用できても逆引き設定ができないASAHINETとの差額が300円未満です。