目次
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.8.4 http://www.postfix.org/
2.2. qmail
1.03 + (original Pathches) http://qmail.org/top.html
IPv6 Patch3) http://member.wide.ad.jp/~fujiwara/
2.3. ucspi-tcp
0.88 http://cr.yp.to/ucspi-tcp/install.html
IPv6 Patch(diff19) http://www.fefe.de/ucspi/
2.4. vpopmail
2.5. dovecot
2.0.13 http://www.dovecot.org/
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/me
mail.example.gr.jp
基本的にこのような形に設定しておきます。
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/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 DONESMTP-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. 備考
今回の設定では記述しきれなかった事柄は以下にあります、気になる方は合わせて参照してください。
そのほかPostfixは様々なフィルターが使用でき、今回全くふれていない正規表現を使ったアクセス元規制、HELO/EHLO規制14)等々単体だけでもいろいろできます。
公式ドキュメントは様々な事柄についてかなり網羅らされているので参考になります。
http://www.postfix.org/documentation.html (英語)
11. 参考資料
この資料を作るにあたって大変参考になった参考資料サイトです。
大変すばらしい、資料をそれぞれの方々がおつくりいただき感謝しています。
- qmailからpostfixに移行するときvpopmailをどうするか
今回の設定をするにあたり大変参考になったサイトです。
こちらのサイトでは、mysqlを間に挟んでvpopmailとdovecot・postfix 間を連携する方法を紹介しています。 - Postfix+Dovecot(バーチャルドメイン・メール)+vpopmail形式の設定の巻
postfixがvpopmailのユーザディレクトリへ直接配送する方法を紹介しています。 - Postfix + qmail + vpopmail + Dovecotでメールのバーチャルドメインで問題が « 日曜研究室
alias_maps及びalias_databaseによる挙動について記述しています。 - Testing SMTP AUTH connections (英語)
opensslを使って手動でSMTP-AUTHする方法を紹介しています。 - モバイル時代の優等生「IMAP4~後編」 記事中IMAP4のコマンドストリームをあわせてIMAP4のコマンド一覧も掲載しています。この内容はIMAPSですが、IMAP4をTLS化しているだけなのでコマンドは同じです。
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 :-)