CentOS6 メールサーバー構築 postfix + dovecot

メールサーバーの構築は面倒臭い。非常に面倒くさい。なので基本的に送信メールサーバーのログインのみ制限してその他の暗号化や認証などはむかしながらのもので設定するという仕様で進めます。基本的にはそれで大丈夫なのですが、いろいろなやり方があるのでその都度自分で仕様変えてみてください。ここでは初心者級のメールサーバー(送信・受信)の構築方法を紹介します。

  • ドメイン: mail.example.com
  • IPアドレス: 120.340.560.780
  • メールアドレス: testuser@mail.example.com
  • パスワード: ******

MXレコードを追加する

メールサーバーを使ってオリジナルのメールアドレスを送受信するにはDNSのゾーン情報にMXレコードを追加します。初心者はここで躓くわけですが、慣れてくるとそんなに難しいことではありません。
まずはドメインを管理しているDNSサーバーにいってゾーン情報の変更とかDNSレコードを追加とかそんな感じのところで作業をします。ドメインをどこで管理しているかによって違ってくるのでここでは具体的な方法は割愛します。

DNSのMXレコードはホスト名で指定するのであらかじめそのホスト名に対応するAレコードがないと駄目なので何も設定していない場合はAレコードから設定してください。
example.com A 120.340.560.780
mail.example.com MX 10 example.com

設定が終わったら取り急ぎ外から確認。
# dig mail.example.com @dns.example01.com mx
digで設定したMXレコードを指定して引いてみます。設定が反映されるまで数時間かかるので@付きで設定したネームサーバーを付けてあげるとDNSの設定が間違っているか正しいかが確認できます。数時間経ったら(最近は数分程度で反映される時もあるけど)@なしで引いてみて確認。
# dig mail.example.com @dns.example01.com mx

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.23.rc1.el6_5.1 <<>> mail.example.com @dns.example01.com mx
;; global options: +cmd
;; Got answer:
;; ->>HEADER< ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;mail.example.com. IN MX

;; ANSWER SECTION:
mail.example.com. 3600 IN MX 10 mail.example.com. ←ここで正しく引けてる

;; AUTHORITY SECTION:
example.com. 86400 IN NS dns.example01.com.
example.com. 86400 IN NS dns.example02.com.
example.com. 86400 IN NS dns.example03.com.
example.com. 86400 IN NS dns.example04.com.

次いでにAレコードも一応確認しておく(といってもMXが正しければそれでAも正しいってことにはなる。この場合)
# dig example.com @dns.example01.com

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.23.rc1.el6_5.1 <<>> mail.example.com @dns.example01.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER< ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;example.com. IN A

;; ANSWER SECTION:
example.com. 3600 IN A 120.340.560.780 ←設定したIPが正しく引けてる

;; AUTHORITY SECTION:
example.com. 86400 IN NS dns.example01.com.
example.com. 86400 IN NS dns.example02.com.
example.com. 86400 IN NS dns.example03.com.
example.com. 86400 IN NS dns.example04.com.

mailコマンドを入れておく

設定中にメール送信テストする時にコマンドから送信できるので便利です。
# yum -y install mailx
# mail user@example.com
Subject: test
test
.
EOT

で、まだ送信メールサーバーを構築していないので何も起きないと思います。

postfix送信メールサーバーの設定

postfixいろいろ確認

postfixがインストールされているか確認します。たいていデフォルトで入っていたります。postfixは特にバージョンでなんちゃら系の難しいことがあまりないパッケージなのでそのまま使います。
# rpm -qa postfix
postfix-2.6.6-6.el6_5.x86_64
インストールされていなかったら、yumでインストールしてしまう。
# yum -y install postfix
以下のようなコマンドで一応起動しているかどうか確認しておくといいです。
# ps aux | grep postfix
# service postfix status
# chkconfig --list
sendmailがデフォルトで起動しているサーバーが比較的たくさんあるので、一応確認しておくこと。場合によっては競合してsendmail側を削除することになります。
以下のコマンドでMTAの確認ができます。sendmailが選択されていたので1を入力してpostfixを選択します。
# alternatives --config mta
There are 2 programs which provide 'mta'.

Selection Command
-----------------------------------------------
1 /usr/sbin/sendmail.postfix
*+ 2 /usr/sbin/sendmail.sendmail

Enter to keep the current selection[+], or type selection number:1
次いで、postfixを立ち上げてみる。
# service postfix start
これでpostfixが一応使えるようになっています。mailコマンドで適当な場所にメールしてみると、初期設定では以下のような警告が出ます。postfix自体はIPv6に対応しているものの周りが追いついていないのでいろいろ文句を言われます。ここら辺りはpostfixの設定で調整します。ちなみに警告内容にsendmailが出ているのはsendmailがエイリアスとして動き続けていてsendmailのエイリアスがpostfixを呼んでいる感じになっているからです。sendmailパスとかがあまりにも歴史が長すぎて今更変更するのもつらい模様です。
# send-mail: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
send-mail: warning: inet_protocols: configuring for IPv4 support only
postdrop: warning: inet_protocols: IPv6 support is disabled: Address family not supported by protocol
postdrop: warning: inet_protocols: configuring for IPv4 support only

postfixの設定

基本的な設定は以下のファイルでやる
# vi /etc/postfix/main.cf
[75行目ぐらい]
myhostname = mail.example.com

[83行目ぐらい]
mydomain = example.com

[113行目ぐらい]
inet_interfaces = all ←コメントを削除
#inet_interfaces = localhost こっちをコメントアウト

[119行目ぐらい]
inet_protocols = ipv4

[419行目ぐらい]
home_mailbox = Maildir/ ←コメント削除する

[最終行あたりに追加]
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,reject_unauth_destination

設定が終わったら再起動
# service postfix restart
これでpostfixの基本的な設定は終わりです。これでエラーもなくたいていはメール送信ができてる筈。PHPとかのmb_sendmailとかもsendmailパスを通じてpostfixから送信されることになります。先ほどインストールしたmailコマンドから適当なテストメールを送信してみます。

dovect受信メールサーバーの設定

メールアドレスを作成して送受信できるようにします。postfix(送信メールサーバー)、dovecot(受信メールサーバー)を使って構築します。
http://web.arena.ne.jp/support/vps-cloud/manual/vps/centos6/dovecot.html

dovecotいろいろ確認

# ps aux | grep dovecot プロセスない。
# rpm -qa dovecot うわ、インストールされてない。

dovecotの基本設定

# yum -y install dovecot
以下のバージョンがインストールされました。
dovecot-2.0.9-7.el6.x86_64

設定ファイルは以下。
# vi /etc/dovecot/dovecot.conf

[20行目] IPv6の対応を削除
protocols = imap pop3 ←コメントとlmtpを削除

[26行目ぐらい]
listen = * ←行頭にあるコメント削除、行末の「, ::」を削除

[最終行辺り]
mail_location = maildir:%h/Maildir ←行を追加

設定が完了したら、
# service dovecot start

送信メールサーバーの認証

送信メールサーバーは適当に開放しておくとだれでも使えるので、だれでも使えないようにします。普通内部のlocalhostは全部使えて外部からは認証通ったユーザーだけ使えるようにします。認証には、saslauthdというデーモンを使います。
# vi /etc/sasl2/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login cram-md5 ←パラメータとしてcram-md5追記

ユーザーとパスワードを登録します。(この登録は後ほど作るユーザーとパスワードと同じにしておくとわかりやすいですが、違っていても全然OK)
# saslpasswd2 -u mail.example.com testuser
(saslpasswd2 -u [ホスト名] [ユーザー名])
Password:******
Again (for verification):******

postfixデーモンが読み込めるように権限変更
# chown postfix /etc/sasldb2

このファイルはバイナリなのでcatとかviとかで見れないです。
確認コマンドはこれ。パスワード部分はuserPasswordで代用されて隠されます。
# sasldblistusers2
testuser@mail.example.com: userPassword

削除する場合は、
# saslpasswd2 -u mail.example.com -d testuser ← ユーザー削除
でやる。
# service postfix restart
# service saslauthd start

サブミッションポートの設定

なんでこんなことしないといけないかというと大手のプロバイダーだかキャリアだかがなんか勝手なことをはじめたからです。
# vi /etc/postfix/master.cf
以下の12行目、14行目15行目のコメントを外して有効にします。
submission inet n - n - - smtpd
# -o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING

先頭に半角スペースが2つあるのですが、(私自身意味がわかりませんが)意味があるらしいので削除しないこと。
設定が終わったら再起動します。CentOSは、
# service postfix reload

ポートの確認

この時点でポートがちゃんと開放されているか確認しておくとよいかも。
# nmap mail.example.com (外部から)
PORT STATE SERVICE
25/tcp open smtp ←開いた!
80/tcp open http
110/tcp open pop3 ←開いた!
143/tcp open imap ←開いた!
443/tcp open https
587/tcp closed submission

# netstat -tanp(内部から)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 13814/dovecot
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 13814/dovecot
tcp 0 0 120.340.560.780:80 0.0.0.0:* LISTEN 19703/httpd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 19674/sshd
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 13554/master
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 19703/httpd
tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 13814/dovecot
tcp 0 0 0.0.0.0:995 0.0.0.0:* LISTEN 13814/dovecot
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 20184/mysqld
tcp 0 0 120.340.560.780:22 12.34.56.78:65041 ESTABLISHED 13141/sshd

疎通自体の確認は、ここが有名です。
https://www.cman.jp/network/support/port.html

ここ最近はやりのクラウドサーバーとかではセキュリティーグループとかで設定したりするので、該当のポートを開けておく。
#mail
tcp:110,110,ip4:0.0.0.0/0
tcp:143,143,ip4:0.0.0.0/0
tcp:25,25,ip4:0.0.0.0/0
tcp:587,587,ip4:0.0.0.0/0

とか。

ユーザーの作成

スケルトンを作成しておく
# mkdir -p /etc/skel/Maildir/{new,cur,tmp}
# chmod -R 700 /etc/skel/Maildir/

あとは、adduserとかで適当なユーザー名(ここでは、testuser)を作成します。これで、testuser@mail.example.comというオリジナルのメールアドレスの完成です。
メーラーの設定は後日。

一応送信メールサーバーとかの不正中継テストとかしておく。
http://www.rbl.jp/svcheck.php

参考
http://web.arena.ne.jp/support/vps-cloud/manual/vps/centos6/postfix.html
http://web.arena.ne.jp/support/vps-cloud/manual/vps/centos6/dovecot.html
http://www.omnioo.com/omnioolab/2012/09/centos6-1.php