Command disabled: diff
[wiki]Postfix + qmail(+vpopmail) + Dovecot with IPv6

Postfix + qmail(+vpopmail) + Dovecot with IPv6

1. 概要

FreeBSD上で、Postfixをフロントエンドに設置し、内部でqmailとvpopqmailを動かして、Dovecotにpop3sやimapsでvpopmailユーザ認証ベースで受信してSMTP-AUTHの認証までをさせてIPv6る方法の一つです。
vopomailのvdelivermailをPostfixから呼び出す方法1)や、Dovecotのdeliverを呼び出す方法もあるようですが、私は諸般の事情2)からqmailをバックエンドに配送デーモンとして残す方法を選択しました。
ものすごく長い説明となっていますが、設定の参考値が多いだけで手順は以下のような流れになっています。

ファイル入手 → 展開 → コンパイル → インストール → 設定 → 起動 → 確認

この流れをそれぞれのソフト及び順番が絡んでくるため非常に長くなっていますが、基本形は上記のとおりです。
インストールおよび設定・確認の順番は以下の通りです。

ucspi-tcp → qmail → vpopmail → 起動確認 → postfix → 起動確認 → Dovecot → 設定確認

途中でわからなくならないように、事前にここで内容を確認してください。
また、FreeBSD向けなので、Linux環境下では以下の流れでいいのかわかりません。

1.1. 概略図

今回作成する環境は以下のようなイメージです。(かなり適当な図です)

2. 用意するもの

全部で5つあります。
また、必要なライブラリまたは修正パッチ等はほとんど説明していませんでのご自身で適宜追加するなりしてください。

2.1. Postfix

2.2. qmail

2.3. ucspi-tcp

2.4. vpopmail

2.5. dovecot

3. 事前準備

それぞれの管理・起動ユーザ・グループが事前に作成が必要になりますので以下のように作成します。

3.1. グループ

nofiles:*:6000:
qmail:*:6010:
vchkpw:*:6020:
postdrop:*:6051:
postfix:*:6050:
dovecot:*:6060:
dovenull:*:60050:

3.2. ユーザ

3.2.1. Postfix

postfix:*:6050:6050:Postfix:/nonexistent:/sbin/nologin

3.2.2. qmail

alias:*:6001:6000:qmail users:/var/qmail/alias:/sbin/nologin
qmaild:*:6002:6000:qmail users:/var/qmail:/nonexistent
qmaill:*:6003:6000:qmail users:/var/qmail:/nonexistent
qmailp:*:6004:6000:qmail users:/var/qmail:/nonexistent
qmailq:*:6010:6010:qmail users:/var/qmail:/nonexistent
qmailr:*:6011:6010:qmail users:/var/qmail:/nonexistent
qmails:*:6012:6010:qmail users:/var/qmail:/nonexistent

3.2.3. vpopmail

vpopmail:*:6020:6020:Vpopmail users:/home/vpopmail:/bin/sh

3.2.4. dovecot

dovecot:*:6060:6060:Dovecot IMAP server:/usr/local/libexec/dovecot:/sbin/nologin
dovenull:*:60050:60050:Dovecot IMAP server unauthorized user:/usr/local/libexec/dovecot:/sbin/nologin

vipwかpwかuseraddなどで追加しちゃってください。ユーザ名、GID、UID等は自由にわかりやすいのでいいと思います。
私はUID、GIDともに6000番台をメール関係に使っています。
また、vpopmailにShellを割り当てなくてもいいと思いますが、管理の都合上割り当てています。

4. コンパイル及びインストール

コンパイルする順番は特に関係ありませんが、設定および起動の都合から以下のような順番ですすめました。
また、基本的にパッチ類は一個したの階層にすべておいてあるものとしてあり(../~.diff)のパス等は環境に合わせて設定してください。

4.1. ucspi-tcp(tcpserver)

qmailは単体でListenしてくれないのでこいつが必要です。
また、IPv6Patchをあてなくてもいいのですが、私はあててます。

% tar xvfz ucspi-tcp-0.88.tar.gz
% cd ucspi-tcp-0.88
% patch -p1 < ../ucspi-tcp-0.88-ipv6.diff19
% make
% su
# make setup check

4.2. qmail

% tar xvfz qmail-1.03.tar.gz
% cd qmail-1.03
% patch < ../originalpatches.diff
% patch -p1 < ../qmail-1.03-v6-20021006.diff
% make
% su
# make setup check

4.3. vpopmail

% tar xvfz vopopmail-5.4.32.tar.gz
% ./configure --enable-tcpserver-file=/etc/tcp/smtp --enable-qmaildir=/var/qmail --enable-roaming-users --enable-many-domains --enable-qmail-ext --enable-ip-alias-domains --enable-clear-passwd
% make
% su
# make install

4.4. postfix

% tar xvfz postfix-2.8.4.tar.gz
% cd postfix-2.8.4
% make tidy
% make makefiles AUXLIBS='-lssl -lcrypto -L/usr/local/lib -Wl,-R/usr/local/lib -lpcre' CCARGS='-DUSE_TLS -DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\"dovecot\" -DHAS_PCRE -I/usr/local/include'
% make
% su
# postfix-install

postfix-installでは基本的に標準値でOKですが、注意してほしいのはnewaliases、mailq、sendmailを置き換えるかという質問がくるのでそれぞれ/usr/libexec/postfix/配下にしてあげましょう。
FreeBSDはそれらはすでにラッパーになっており/etc/mail/mailer.confでPostfixのほうへパスを変更してあげればOKです。
またこの置き換えをするとFreeBSD標準のsendmailのqueue処理がはしってしまい、デイリーでくるメールにエラーがのったりするので/etc/periodic.confに以下の内容を記載してあげるとエラーがとまります。

daily_clean_hoststat_enable="NO"
daily_status_mail_rejects_enable="NO"
daily_status_include_submit_mailq="NO"
daily_submit_queuerun="NO"

4.5. dovecot

% ./configure --with-vpopmail
% make
% su
# make install

4.5.1. SSL証明書

dovecotでpop3sやpostfixのSMTP-AUTH+TLSなどをする場合、SSL証明書が必要となります。
ここではdovecotのスクリプトから作れるオレオレ証明書を使っていますが、本番運用するような場合は専門の認証機関(VerisignやGlobalSign等)から購入するなどして得た証明書を使うべきでしょう。個人レベルなどではあまり問題ないと思いますが他者へ提供するサービス等ではいささか問題があると思います。
さて、作り方ですが、展開したdovecotのディレクトにはdocというディレクトリがありその中にmkcert.shというファイルがあります。
これを実行すればよいのですが、その前にdovecot-openssl.cnf編集しオレオレ証明書をご自身の合う内容に設定してください。

% cd doc
% vi dovecot-openssl.cnf
% ./mkcert.sh

そうすると/etc/ssl/配下のprivate及びcertsにdovecot.pemがあるはずです。
以下はdovecot-openssl.cnfのサンプルです。

dovecot-openssl.conf
[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no
 
[ req_dn ]
# country (2 letter code)
C=JP
 
# State or Province Name (full name)
#ST=
 
# Locality Name (eg. city)
L=Tokyo
 
# Organization (eg. company)
O=Example Group
 
# Organizational Unit Name (eg. section)
OU=IMAP server
 
# Common Name (*.example.com is also possible)
CN=mail.example.gr.jp
 
# E-mail contact
emailAddress=root@example.gr.jp
 
[ cert_type ]
nsCertType = server

このような記述をしてから実行してください。当然ですが、opensslが入っていないと動かないのでご注意ください。(configureではじかれていると思いますが)

4.6. 注意事項

コンパイルをせずpkg_add(ports)、yum、apt-get等でやるやり方もあるとは思いますが、ここではカバーしていません。
また、コンパイル時にエラーが出た場合エラーはおおよそライブラリ等の依存関係に問題がある場合がほとんどです。
このため、依存するそれぞれがライブラリ等が入っているか確認しておきましょう。
特に今回インストールしているqmail、ucspi-tcpはLinux環境下だとコンパイルエラーがパッチをあてていないと出るようです。

5. 設定

ここでは設定値について記載してありますが、以下のような順番で設定をして確認すると問題の切り分けがしやすいと思います。

ucspi-tcp → qmail → vpopmail → 起動確認 → postfix → 起動確認 → Dovecot → 設定確認

これ以降何らかの問題があった場合は、大体設定ミスが場合が多いです。注意深く設定してください。

5.1. ucspi-tcp

ucspi-tcpはアクセスリスト(tcprulesでcdb生成)を作りそれをもとにアクセスコントロールをしています。
このため、サーバ内部で使うだけでもcdbファイルの生成は必要です。

/etc/tcp/smtp
127.:allow
:deny

この内容をtcprulesに以下のように食わせてやります。

tcprules smtp.cdb smtp.tmp<smtp

smtp.tmpが一時的なファイルですので、実在しないファイルを指定しましょう。
そのあと起動スクリプトをqmailの設定完了後に書きます4)
2012/11/08に記述内容に問題があったため修正しました

5.2. qmail

qmailは初期設定をmakeのあとに質疑形式で作ることもできますが、ここでは割愛して最低限の設定ファイルについてのみ記述しておきます5)

/var/qmail/control/databytes
1073741824
/var/qmail/control/defaultdomain
example.gr.jp
/var/qmail/control/locals
 
/var/qmail/control/me
mail.example.gr.jp
/var/qmail/control/plusdomain
gr.jp
/var/qmail/control/rcpthosts
 
/var/qmail/control/virtualdomains
 

基本的にこのような形に設定しておきます。
rcphostsやvirtualdomainsはファイルだけ作っておいてもいいですが、このあとvpopmailで使います。
あと、パーミッションには注意してください。私は以下のように設定しています。

/var/qmail/control
drwxr-xr-x   3 root      qmail      22 Jul 29 16:03 .
drwxr-xr-x  10 root      qmail      11 Jul 28 17:49 ..
-rw-r--r--   1 root      qmail      11 Jan 20  2004 databytes
-rw-r--r--   1 vpopmail  qmail      16 Aug 18  2002 defaultdomain
-rw-r--r--   1 root      qmail       0 Jul 29 16:03 locals
-rw-------   1 vpopmail  qmail       0 Oct 14  2007 locals.lock
-rw-r--r--   1 vpopmail  qmail      21 Jul 29 00:17 me
-rw-r--r--   1 vpopmail  qmail      11 Aug 14  2002 plusdomain
-rw-r--r--   1 vpopmail  qmail     554 Jul 29 16:03 rcpthosts
-rw-------   1 vpopmail  qmail       0 Oct 14  2007 rcpthosts.lock
-rw-r--r--   1 vpopmail  qmail    1211 Jul 29 16:03 virtualdomains
-rw-------   1 vpopmail  qmail       0 Oct 14  2007 virtualdomains.lock

最低限、locals、rcphosts、virtualdomainsはvpopmailが書き込み権限等がないと設定できないとエラーはきます。もっとも、rootで実行すればそういったことはありませんが。

5.3. vpopmail

vpopmailは設定ファイルを書くよりはどっちかというと管理ツールで設定をするのでファイルをいじるより簡単です。
ただし、その際配信時等の権限を気にする人はvpopmailになって操作したほうがいいでしょう。
もちろんrootから呼び出しても問題ありませんが、いくつのファイルがrootで設定されるというだけです。
vpopmailの標準ディレクトリは/home/vpopmailです。この下にbinがあり、domains配下にはドメイン毎にフォルダが作られていきその下にユーザ毎のMaildir形式のフォルダ作られていきます。
ここでは従来通り/homevpopmail/bin/にパスを移動しvadddomainを実行して受信をしたいドメインを追加してください。

% ./bin/vadddomain mailtest.example.jp passowrd
% ./bin/vadduser test@mailtest.example.jp passowrd

以上のような形式でドメインを作成後ユーザを登録するにはvadduserを使って登録するだけです。
またこれ以上の詳しいvpopmailの操作方法についてはここでは割愛しています。6)

5.3.1. エラーについて

could not open lock file /var/qmail/users/assign.lock
Failed while attempting to update_file() the assign file
Error. Failed to add domain to assign file
Error: Could not update file

上記エラーが出た場合ファイルのパーミッションでvpopmailが書き込めない設定になっているのでパーミッションを適切に設定しましょう。

5.4. 起動チェックその1/3

さて、設定qmail及びvpopmailの設定が一通り完了したところで、起動確認を行います。以下のスクリプトを適当なところにて実行するとqmailが立ち上がるはずです。

#!/bin/sh
env - PATH="/var/qmail/bin:/usr/local/bin:/home/vpopmail/bin"
csh -cf '/var/qmail/rc &'
 
/usr/local/bin/tcpserver -v -R -h -u 6002 -g 6010 -c 100 -x /etc/tcp/smtp.cdb 0 10025 \
/var/qmail/bin/qmail-smtpd 2>&1 | /usr/bin/logger -p mail.info -t smtp &

上記スクリプト適当な場所に保存し実行後telnetで直にqmail-smtpdをたたいてみます。

Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 mail.example.gr.jp ESMTP
HELO me
250 OK mail.example.gr.jp
MAIL FROM: noel@example.gr.jp
250 ok
RCPT TO: test@mailtest.example.jp
250 ok
DATA
354 go ahead
Subject: test mail from me

Hello qmail+vpopmail?
.
250 ok 1316097378 qp 90251
QUIT
221 mail.example.gr.jp
Connection closed by foreign host.
% 
うまく送信できましたでしょうか?ハイライトがかかっている5,7,9,11,13,14,15,16,18行目の項目を入力してください。
そして、17行目のような250 ok ~ qp ~とでれば配送が完了したはずです。
以上の送信が成功したあとは、実際に配送先のディレクトリをのぞいてみましょう。
今回の場合「/home/vpopmail/domains/mailtest.example.jp/test/Maildir/new」配下にメールが届いてるはずです。

# cd /home/vpopmail/domains/mailtest.example.jp/test/Maildir/new
# ls
1316097371.86674.mail.example.gr.jp,S=90251
# cat 1316097371.86674.mail.example.gr.jp,S=90251
Return-Path: <noel@example.gr.jp> 
Received: (qmail 90255 invoked 
 by uid 6020); 
 15 Sep 2011 23:36:18 +0900 
Date: 15 Sep 2011 23:36:18 +0900 
Message-ID: <20110915143618.90254.qmail@mail.example.gr.jp> 
From: noel@example.gr.jp
Delivered-To: test@mailtest.example.jp 
Received: (qmail 90251 invoked from network); 
 15 Sep 2011 23:35:59 +0900 
Received: from unknown (HELO me) (::1) 
 by ::1 
 with SMTP for <test@mailtest.example.jp >; 
 15 Sep 2011 23:35:59 +0900 
Subject: test 

Hello qmail+vpopmai?

このようなファイルが表示されればucspi-tcpとqmail、そしてvpopmailの受信設定が完了です。
さて続いて、フロンドエンドSMTPとなるPostfixの設定です。

5.5. postfix

postfixはmain.cf及びmaster.cfと追加で読み込ませるファイルによって成り立っています。
今回の設定でキモとなるmain.cf、master.cf及びtransport7)とacceptshosts8)について記載しておきます。

5.5.1. mail.cf

postfixはmain.cfの標準値がバージョンによってコロコロ変わるため参考になるかどうかわかりませんが、postconf -n(差分表示)したmail.cfの結果です。
RBLについて値が入っていますがテストのときは設定しないほうがいいでしょう。特にdul.dnsbl.sorbs.net9)のせいで確認などができない場合もあるかもしれません。

/etc/postfix/mail.cf
address_verify_map =
alias_database =
alias_maps =
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
disable_vrfy_command = yes
html_directory = no
inet_protocols = ipv4, ipv6
local_recipient_maps =
mail_owner = postfix
mailq_path = /usr/libexec/postfix/mailq
manpage_directory = /usr/local/man
mydestination = hash:/var/qmail/control/accepthosts
mynetworks = 192.168.1.200/29, 10.10.55.215, 10.10.2.153
newaliases_path = /usr/libexec/postfix/newaliases
queue_directory = /var/spool/postfix
readme_directory = no
sample_directory = /etc/postfix
sendmail_path = /usr/libexec/postfix/sendmail
setgid_group = postdrop
smtpd_client_restrictions = check_client_access hash:/etc/postfix/bad_clients,
                                      permit_mynetworks, 
                                      reject_rhsbl_client rhsbl.ahbl.org,
                                      reject_rbl_client bl.spamcop.net,
                                      reject_rbl_client cbl.abuseat.org,
                                      reject_rbl_client sbl.spamhaus.org,
                                      reject_rbl_client dul.dnsbl.sorbs.net,
                                      reject_rbl_client all.rbl.jp,
                                      reject_rbl_client web.dnsbl.sorbs.net,
                                      permit
smtpd_helo_required = yes
smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname, pcre:/etc/postfix/bad_helo
smtpd_recipient_restrictions = reject_unverified_recipient, reject_unauth_destination,
smtpd_sasl_auth_enable = no
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_type = dovecot
smtpd_tls_cert_file = /etc/ssl/certs/dovecot.pem
smtpd_tls_key_file = /etc/ssl/private/dovecot.pem
transport_maps = hash:/etc/postfix/transport
unknown_local_recipient_reject_code = 550
unverified_recipient_reject_code = 550
unverified_recipient_reject_reason = Unknown user. Sorry.

5.5.2. master.cf

/etc/postfix/master.cfにSubmission用のポート設定を記述します。

/etc/postfix/master.cf
submission inet n       -       n       -       -       smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_sasl_security_options=noanonymous
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

5.5.3. transport

転送先に記述してあるファイルです。
hashのほうが高速らしいのでpostmap transportとして.dbファイルを作成してください。
書式は以下のような形式です。[ipaddr]とIPアドレスを今回は指定していますが。ホスト名を記述することも可能です。

ドメイン名(.で始まるとサブドメイン名省略可能)	smtp:[ipaddress]:port
/etc/postfix/transport
example.gr.jp smtp:[127.0.0.1]:10025
.example.gr.jp smtp:[127.0.0.1]:10025
example.jp smtp:[127.0.0.1]:10025
.example.jp smtp:[127.0.0.1]:10025

5.5.4. accepthosts

transports同様にpostmap accepthostsとしてdbファイルを作成してください。
フォーマットは以下のようです。transportと違いサブドメイン名は省略できませんので注意してください。

ドメイン名 ステータス(OK)
/var/qmail/control/accepthosts
example.gr.jp OK
mailtest.example.jp OK
example.jp OK

5.6. 起動チェックその2/3

postfixの起動は非常にシンプルです。

% postfix start

以上のコマンドで起動するはずです。
エラーがある場合は/var/log/maillogに出力されているので確認しましょう。
qmailは起動チェックその1/3を参考に起動してください。

さてqmail+vpopmail同様にTELNETでSMTPをしゃべって動作チェックをします。
もちろんMXレコード等が設定済みであれば外向きにPortをあけているので通常のMUAなどを使ってチェックも可能だと思いますが、私はTELNETでしゃべりました。

Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 mail.example.gr.jp ESMTP Postfix
EHLO me
250-mail.example.gr.jp
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM: noel@example.gr.jp
250 2.1.0 Ok
RCPT TO: test@mailtest.example.jp
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: test

Hello, postfix+qmail+vpopmail?
.
250 2.0.0 Ok: queued as 9A9AB225
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
ハイライトになっている5,13,15,17,19,20,21,22,24行目の項目を環境に合わせて入力してください。
そして、qmail+vpopmailのときのように直接vpopmailのディレクトリの中をのぞきに行きます。

# cd ~vpopmail/domains/mailtest.example.jp/test/Maildir/new
# ls -la
total 5
drwx------  2 vpopmail  vchkpw    3 Sep 19 15:59 .
drwx------  5 vpopmail  vchkpw   11 Sep 19 15:59 ..
-rw-------  1 vpopmail  vchkpw  767 Sep 19 15:59 1316415584.12000.mail.example.gr.jp,S=767
# cat 1316415584.12000.mail.example.gr.jp,S=767
Return-Path: <noel@example.gr.jp>
Cc: recipient list not shown: ;
Delivered-To: test@mailtest.example.jp
Received: (qmail 11994 invoked from network); 19 Sep 2011 15:59:44 +0900
Received: from unknown (HELO mail.example.gr.jp) (127.0.0.1)
  by 127.0.0.1 with SMTP for <test@mailtest.example.jp>; 19 Sep 2011 15:59:44 +0900
Received: from me (localhost [IPv6:::1])
  by mail.example.gr.jp (Postfix) with ESMTP id 9A9AB225
  for <test@mailtest.example.jp>; Mon, 19 Sep 2011 15:59:00 +0900 (JST)
Subject: test
Message-Id: <20110919065922.9A9AB225@mail.example.gr.jp>
Date: Mon, 19 Sep 2011 15:59:00 +0900 (JST)
From: noel@example.gr.jp
 
Hello, postfix+qmail+vpopmail?

お疲れ様です。このように表示されればpostfixとqmailの連携は完了です。最後はdovecotとの連携です

5.6.1. 注意点

qmailがきちんと起動していれば問題なく転送されるはずですが、もしqmail側にうまく配送されない場合はtransportの設定などを確認してみてください。
また/var/log/maillogのログファイルも参考にしてみてください。エラーなどがあった場合は何か書かれている可能性があります。

5.7. dovecot

dovecotはファイルが多く標準の値と差分のあった部分のみ記述していますが、Postfixの設定ファイルに比べるとわかりやすく簡単に記述できます。
dovecotはこのファイルを最初に読み込みincludeされたファイルを読み込みます。ですから、このファイルにまとめて書くこともできるようですが、私は分けてかいてあったのでそのままわけたのを使っています。
またほとんどの今回の設定をもとにIMAP4サーバとしても簡単に設定できますので、記述してあります。
このファイルの中でlisten=に*と::を指定しますが*がIPv4で::がIPv6のアドレスでListenという意味です。login_trsuted_networksはあとで少し説明しています。

/usr/local/etc/dovecot/dovecot.conf
protocols = imap pop3 lmtp
listen = *, ::
base_dir = /var/run/dovecot/
login_greeting = Dovecot ready.
login_trusted_networks = 10.10.55.215
import_environment = TZ

auth_mechanismsでplainやlogin以外のcram-md5とdigest-md5を追加しているのは、digest-md5がOutlook向けでそれ以外はcram-md5のみに対応しているものがあったりするようなので両方追加しています。

/usr/local/etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = digest-md5 cram-md5 login plain
#!include auth-system.conf.ext
!include auth-vpopmail.conf.ext

私はdovecotの情報をsyslogのfacilityをlocal6.*で吐き出させていますが、mail.*の方がいい方はそちらの値にしたほうがいいでしょう。

/usr/local/etc/dovecot/conf.d/10-logging.conf
log_path = syslog
syslog_facility = local6
auth_verbose = yes
/usr/local/etc/dovecot/conf.d/10-mail.conf
first_valid_uid = 6020
first_valid_gid = 6020

ここでPort 110(pop3)も追加指定していますが、設定しているサーバはpfによって110のアクセスを特定のホスト以外禁止しています。
またlogin_trusted_networksで指定しているIPアドレスはPOP3で平文のパスワードを使用することができますが、一般的にはおすすめしません。。

/usr/local/etc/dovecot/conf.d/10-master.conf
  service pop3-login {
    inet_listener pop3 {
      port = 110
    }
    inet_listener pop3s {
      port = 995
      ssl = yes
    }
  }
 
   # Postfix smtp-auth
   unix_listener /var/spool/postfix/private/auth {
     mode = 0666
     user = postfix
     group = postfix
   }

sslを追加でyesとしていますが、証明書はオレオレ証明書10)をつかっています。
ちなみに証明書を作らないとnoにした場合でも標準値ではcertに関する記述がかかれているため、エラーが出ます。
作成手順はdovecotのコンパイル後に少し説明してあります。

/usr/local/etc/dovecot/conf.d/10-ssl.conf
ssl = yes
/usr/local/etc/dovecot/conf.d/auth-vpopmail.conf.ext
   #args = quota_template=quota_rule=*:backend=%q

5.8. 起動チェックその3/3

dovecotの起動も非常に簡単です。

% dovecot

以上でpostfix同様に起動するはずです。
こちらのエラーもsyslogもしくは画面に表示されるので随時確認してください。

さて、dovecotのチェック事項は2つあります。
まず一つ目はPostixのSMTP-AUTHのユーザ認証の受け渡しです。二つ目は、DovecotによるPOP3sです。

5.8.1. SMTP-AUTHの確認

一つ目はSMTP-AUTHですが、TLSをEnableにした設定をしているためtelnet経由では随時暗号化しないとできませんのでopensslを使用します。
また、SMTP-AUTHでは、PLAIN形式でもBase64エンコードを必要としますのでユーザ名及びパスワードをBase64エンコードします。

CONNECTED(00000003)
depth=0 /C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
verify error:num=18:self signed certificate
verify return:1
depth=0 /C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
verify return:1
---
Certificate chain
 0 s:/C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
   i:/C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
---
Server certificate
-----BEGIN CERTIFICATE-----
(省略)
-----END CERTIFICATE-----
subject=/C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
issuer=/C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
---
No client certificate CA names sent
---
SSL handshake has read 1477 bytes and written 372 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: (省略)
    Session-ID-ctx:
    Master-Key: (省略)
    Key-Arg   : None
    Start Time: 1316418486
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
250 DSN
helo me
250 mail.example.gr.jp
auth plain AHRlc3RAbWFpbHRlc3QuZXhhbXBsZS5qcABbUEFTU1dPUkRd
235 2.7.0 Authentication successful
mail from: noel@example.gr.jp
250 2.1.0 Ok
rcpt to: test@mailtest.example.jp
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Subject: test

Hello, postfix+SMTP-AUTH with TLS by dovecot authentication?

.
250 2.0.0 Ok: queued as C8CB824B
QUIT
DONE
SMTP-AUTHは成功したでしょうか?実際につないでみるとわかりますが、SSLの証明書について評価されていたりします。
また、opensslを使用したセッションでは行頭に大文字のRを入力するとセッションが再認証されてしまうなど影響があるので、小文字で入力すべきみたいです。
そして42行目に出てくるAUTHですが以下のように引数を指定してperlを実行すると結果が得られますのでご自身の環境に合わせて変更してください。

% perl -MMIME::Base64 -e 'print encode_base64("\000test\@mailtest.example.jp\000[PASSWORD]")'
AHRlc3RAbWFpbHRlc3QuZXhhbXBsZS5qcABbUEFTU1dPUkRd
5.8.1.1. 注意点

何か問題がある場合は、まず/var/log/maillogや/var/log/messagesなどPostfix及びDovecotに関するログをみてみましょう。
dovecotは標準値では認証になぜ失敗したのか教えてくれないのでAUTHに関するデバッグレベルを下げると色々ログに吐き出してくれるのでconfファイルの設定値を変えてみてください。
ログ出力を変更してdovecotのログをみればpostfix間とのパーミッションや権限でうまくいかない場合などすぐにわかると思います。

5.8.2. POP3sの確認

続いてPOP3sですが、先ほどのopensslに指定した引数とはポート以外にも異なります11)ので注意してください。

CONNECTED(00000003)
depth=0 /C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
verify error:num=18:self signed certificate
verify return:1
depth=0 /C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
verify return:1
---
Certificate chain
 0 s:/C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
   i:/C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
---
Server certificate
-----BEGIN CERTIFICATE-----
(省略)
-----END CERTIFICATE-----
subject=/C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
issuer=/C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
---
No client certificate CA names sent
---
SSL handshake has read 1274 bytes and written 337 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: (省略)
    Session-ID-ctx:
    Master-Key: (省略)
    Key-Arg   : None
    Start Time: 1316418578
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
+OK Dovecot ready.
user test@mailtest.example.jp
+OK
pass [PASSWORD]
+OK Logged in.
stat
+OK 1 819
list
+OK 1 messages:
1 819
.
uidl
+OK
1 0000024b4e324d9e
.
retr 1
+OK 819 octets
Return-Path: <noel@example.gr.jp>
Cc: recipient list not shown: ;
Delivered-To: test@mailtest.example.jp
Received: (qmail 12227 invoked from network); 19 Sep 2011 16:49:28 +0900
Received: from unknown (HELO mail.example.gr.jp) (127.0.0.1)
  by 127.0.0.1 with SMTP for <test@mailtest.example.jp>; 19 Sep 2011 16:49:28 +0900
Received: from me (localhost [127.0.0.1])
  by mail.example.gr.jp (Postfix) with ESMTPSA id C8CB824B
  for <test@mailtest.example.jp>; Mon, 19 Sep 2011 16:48:34 +0900 (JST)
Subject: test
Message-Id: <20110919074848.C8CB824B@mail.example.gr.jp>
Date: Mon, 19 Sep 2011 16:48:34 +0900 (JST)
From: noel@example.gr.jp

Hello, postfix+SMTP-AUTH with TLS by dovecot authentication?

.
quit
+OK Logging out.
closed

5.8.3. IMAPsの確認

最後にIMAPsですが、先ほどのpop3sと同様にでポート(993)のみが異なりますので注意してください。
また、コマンドはPOP3と似ているようですが、コマンドの前に英数字をつけることが必須です。
例: 01 LOGIN hogehoge fugafuga
01は英数字、一桁でもOKみたいです。

CONNECTED(00000003)
depth=0 /C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
verify error:num=18:self signed certificate
verify return:1
depth=0 /C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
verify return:1
---
Certificate chain
 0 s:/C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
   i:/C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
---
Server certificate
-----BEGIN CERTIFICATE-----
(省略)
-----END CERTIFICATE-----
subject=/C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
issuer=/C=JP/L=Tokyo/O=Example Group/OU=IMAP server/CN=mail.example.gr.jp/emailAddress=root@example.gr.jp
---
No client certificate CA names sent
---
SSL handshake has read 1663 bytes and written 337 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: (省略)
    Session-ID-ctx:
    Master-Key: (省略)
    Key-Arg   : None
    Start Time: 1352512489
    Timeout   : 300 (sec)
    Verify return code: 18 (self signed certificate)
---
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=DIGEST-MD5 AUTH=CRAM-MD5 AUTH=LOGIN AUTH=PLAIN] Dovecot ready.
01 LOGIN test@mailtest.example.jp [PASSWORD]
01 OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS] Logged in
02 list "" *
* LIST (\HasNoChildren) "." "INBOX"
02 OK List completed.
03 select INBOX
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 1 EXISTS
* 1 RECENT
* OK [UNSEEN 1] First unseen.
* OK [UIDVALIDITY 1312191013] UIDs valid
* OK [UIDNEXT 2] Predicted next UID
* OK [HIGHESTMODSEQ 1] Highest
03 OK [READ-WRITE] Select completed.
04 fetch 1 body[]
* 1 FETCH (BODY[] {454}
Return-Path: <noel@mail.example.gr.jp>
Delivered-To: noel@mail.example.gr.jp
Received: (qmail 74594 invoked by uid 6020); 10 Nov 2012 10:28:40 +0900
Delivered-To: mail.example.gr.jp-postmaster@mail.example.gr.jp
Received: (qmail 74592 invoked by uid 0); 10 Nov 2012 10:28:40 +0900
Date: 10 Nov 2012 10:28:40 +0900
Message-ID: <20121110032840.74591.qmail@mail.example.gr.jp>
From: noel@mail.example.gr.jp
To: postmaster@mail.example.gr.jp
Subject: test

Hello, postfix+SMTP-AUTH with IMAPs by dovecot authentication?
)
04 OK Fetch completed.
05 LOGOUT
* BYE Logging out
05 OK Logout completed.
closed

以上でdovecot関係の設定確認も完了しました。
最終段階の設定に移ります。

5.8.3.1. 注意点

何か問題がある場合は、まず/var/log/maillogや/var/log/messagesなどdovecotに関するログをみてみましょう。
dovecotは標準値では認証になぜ失敗したのか教えてくれないのでAUTHに関するデバッグレベルを下げると色々ログに吐き出してくれるのでconfファイルの設定値を変えてみてください。
ログ出力を変更してdovecotのログをみればvpopmailとの連携でうまくいかない場合などすぐにわかると思います。
また、外部からうまくできない場合はfirewall(ipfw、ipf、pfなど)を確認してみてください。Linuxだとipchainsでしょうか。

6. その他の設定

6.1. shell script

6.2. sendmail

/etc/rc.confに以下の内容を追記しないとsendmailは再起動後もとまりません。

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"

7. 不正中継対策

Postfixは最初から不正中継対策が取れられていますので、qmailのようにチェックをすべてパスするためにpatchをあてたりする必要性はほとんどありません。
mydestinationやrelay関係の設定を誤らなければほとんど問題がないと思います。
以下のサイトで不正中継の確認ができますので参考にしてみてください。
http://www.abuse.net/relay.html Mail relay testing

http://www.rbl.jp/svcheck.php 第三者中継チェック RBL.JP

第三者中継テストのサンプル
第三者中継テストのためmail.example.gr.jpに接続しています...
 
<<< 220 mail.example.gr.jp ESMTP Postfix
>>> HELO h.rbl.jp
<<< 250 mail.example.gr.jp
中継テスト その0
  (中略)
>>> QUIT
<<< 421 4.7.0 mail.example.gr.jp Error: too many errors
第三者中継テストの結果
 
全てのテストが行われました, no relays accepted.

気になるのは最後421 ~ Error: too many errorsとでていますが。これはRSETを表面上受け入れつつ(250 ~)も実際には評価してるってことなのでしょうか。
これらのチェッカーで正しくpostfixを評価できているか、私にはわかりません。時間がとれたらチェックしてみます。

8. MXレコード設定

上記作業をすべて終えたのなら、MXレコードを設定しましょう。
BINDの場合以下のような記述を書きます。

[hostname]		IN	MX [num] [mailserver A record hostname]
[hostname]はメールを受信したいドメイン名で、[num]は優先順位をあらわす数字で複数のMXレコードを設定する場合に異なる数字にするといわゆるバックアップメールサーバとして設定できます。
[mailserver A record hostname]はAレコードとして記述されたホスト名を指定します。異なるドメイン名を指定する場合最後に"."を忘れないようにしましょう。

なので今回の場合example.jpに記述するのは、以下のような記述になります。

mailtest		IN	MX	10 mail.example.gr.jp.

example.jpのmailtestはmail.example.gr.jpのAレコードに向けて優先順位10で処理することを期待した記述です。
一部MXレコードでは、優先順位が0などの記述もみられるようですが、いろいろ解釈記述があるようです。

9. 動作確認

以上MXレコードの設定まで終えたら実際にほかのメールサーバから送信受信してみてください。
gmailやHotmailなどのサービスがお手軽でいいと思います。
それらのサービスは、外部のpop3sへのアクセスも対応しておりSMTP-AUTHなども対応していますので、確認するには大変便利です。
また、spfやDKIMにも対応しており、備考で紹介しているspfやDKIMのチェックにも使えると思います。

手元のクライアントとしてThunderbirdやBeckyやOutlook12)などでも試してみるのがいいとおもいます。
注意点としてはほとんどのクライアントでSSL証明書のチェックを確認しますので、今回使用としたオレオレ証明書では警告が出ます。
出ないようにするにはStartSSLなどでは無料のSSL証明書が個人利用の場合のみ入手可能なようです。業務などには有料のSSL証明書を入手するしかないようです。

また、今回の設定とは直接関係ありませんが、日本国内でメールサーバのサービスを第三者に提供する場合は電気通信事業者としての登録13)が必要になる場合があるようです。
詳しくは総務省総合通信基盤局電気通信事業部の資料電気通信事業参入マニュアル及び電気通信事業参入マニュアル[追補版]― 届出等の要否に関する考え方及び事例 ―などを参考にしてください。(情報通信 (IT政策) - マニュアルハンドブック支援メニューより)
// 総務省は日本のインターネットを規制・管轄してるのに重要な資料が関係するページにまとまっていなくてどこに何があるのか大変わかりくいのどうにかしてほしいですね。
// あれChromeの最小fontサイズって10pxなのか(苦笑 (参考資料: Chrome(webkit)の最小フォントサイズとinline要素間のスペースについて - kiyohoge/)

10. 備考

今回の設定では記述しきれなかった事柄は以下にあります、気になる方は合わせて参照してください。

  • spfはspf
  • DKIMはdkim
  • Postfixでセカンダリメールサーバの設定はsecondaryあたりを参考にするといいでしょう。
  • ClamAVは調査中です。

そのほかPostfixは様々なフィルターが使用でき、今回全くふれていない正規表現を使ったアクセス元規制、HELO/EHLO規制14)等々単体だけでもいろいろできます。
公式ドキュメントは様々な事柄についてかなり網羅らされているので参考になります。
http://www.postfix.org/documentation.html (英語)

11. 参考資料

この資料を作るにあたって大変参考になった参考資料サイトです。
大変すばらしい、資料をそれぞれの方々がおつくりいただき感謝しています。

12. 修正履歴

2012/11/08 ~ 10

設定のucspi-tcpのsmtpファイルから「,RELAYCLIENT=""」を削除

理由:
ucspi-tcpの設定部分において、RELAYCLIENT=““を記述しているせいで、場合によって自らにメールボックスをもっていない関連するドメイン宛のものも受け付けてしまい、場合によっては受付後qmail-sendが受け付けた後存在しない時ドメイン宛のメールをFrom元へエラーメール等を送信しAllowのみするのが適切だと気がついたため。15)
事実上のOpenRelayになっていたが基本的にはPostfix側ではじくため問題がなかった。
なので、127.:allowのみで接続のみを許可すべきでした。
また、念のため:denyも追記してあります。

IMAP4(IMAPs)に関する表現を一部変更

DovecotにおいてProtocolsにimapを記述し、その他の設定を記述しなくてもデフォルトでPort指定がされた値があるためそのPortにBINDしてしまっていたため、IMAP4非対応としていたが、対応するよう文章全体がつじつまがあうように変更。

13. 余談

あまりにも長くなってしまったので、愚痴ではなく一言。
当分こんな長い説明はかきたくないですw>HI-ROさん

新しいメールサーバを構築するにあたり、qmail環境を維持してもよかったんですが、SSL関係に対応しようとかIPv6対応とかするとただでさえ自作パッチ含めてかなり改造しちゃってる状態のqmail-smtpd等に、さらにパッチを追加であてまくることに辟易したので今回の構成を考え実施してみました。実際今回の構成をしてみて思ったのはpostfixの設定及び動作の複雑さとqmailの設定の簡単さです。
確かに、qmail歴は2000年ごろから使ってるのでそれなりに愛用してきた一人なので愛着は深いものではありますが、昨今のSMTPを取り巻く環境はqmailをパッチをあてずに使うのは難しくなってきています。実際にqmail.orgではnet-qmailのパッチをあてているバージョンを使うように配布していますし、10年ほど前と比べqmail単体でのインストールを説明しているサイトも数少ない状況です。
このような状況下で10年以上にわたってqmailをアップデートすることなく使えたことは、qmailの優れたな設計と実装、そしてその安全性は非常に特質すべきものがありDJB氏の質の高い能力を示す一つであり、私はqmailが大好きです。
ただ、先のように今後qmailを取り巻く環境は非常に険しく、開発された当時の設計思想とは違う動きも多々でてくる中、そのパッチ等の管理が一本化されていかない限りPostfixがさらに躍進していくでしょう。
残念ではありますが、qmail+vpopmailの良さを知る一人としてはバックエンドにqmailを残す選択を致しました。
ただ今回の説明にはほとんどかいていませんがqmailをバックエンドに残す最大の理由となった、変な俺専用メールアドレスを生成しまくってしまったので実在しないユーザと実在するユーザの管理がほぼ手動状態をどうにかしないといけないですね。
結局この問題は全く解決していない方法なのでorz
本当に最後に一言: Special Thanks to all references sites authors :-)

1)
正確にはqmailのsendmail経由でvdelivermailを呼び出す方法
2)
すでに動いているqmailサーバがありPostfixのVirtualドメイン形式に移行するには手間等がかかるのとchkuserというvpopmailに存在しないユーザ以外を拒否するパッチっぽいものを“自作”して使っていたのでqmail-smtpdを全く通さない方式が難しかったためです
3)
パッチの中のip6.intをip6.arpaへ記述を変更する必要があります
4)
deamontoolsでいろいろコントロールすると幸せになると思いますがここでは割愛しています
5)
このあたりなどを参考にどうぞ
6)
vpopmailの使い方については別途資料を参考してください。
7)
転送先のドメインとアドレスポートが記述してあるファイルです
8)
mydestinationから読み込んでいるファイルで、どのドメインをpostfixが受け付けるか記述してあります
9)
ダイアルアップなど動的なIPアドレスだと思われる領域のDNSBL
10)
ここではあくまでもお試しということで本番運用ならVerisignなりGlobalSignなりのルート証明書に登録されているような第三者による証明書を使うべきです。
11)
-starttls smtpの指定は必要ありません
12)
TLS対応は2003以降がいいみたいです
13)
許認可制ではなく地域の通信局に届出のみです
14)
RFC違反ですが(^^;)RFC5321で違反じゃなくなってましたorz
15)
RELAYCLIENTが記述されている接続元の場合qmailのもともの仕様である、一度全てのメールを受け付けて後でFrom元へエラーメールを送るため
tech/postfix_qmail_vpopmail_dovecot_with_ipv6.txt · 最終更新: 2013/02/26 16:51 (外部編集)
Copyright (c) 2011-, Secret Society Across, and etc. All Rights Reserved.
Driven by DokuWiki FreeBSD Recent changes RSS feed Valid CSS Valid XHTML 1.0