CentOS6.2 でメールサーバーを構築した

さくらの VPS ではデフォルトで postfix が入ってたのでそれを使う。POP3、IMAP には dovecot を利用する。認証には SSL を利用するが、自分だけしか使わないのとお金がないので自己証明書を用いる。きちんとしたサービスでは認証局から証明書を発行してもらうこと。


自己証明書

まずは自己証明書を作成する。こちらを参考にした。

# cd /etc/pki/tls/certs
# make server.key # "server" は好きな文字列でよい
Enter pass phrase:# パスフレーズ設定
Verifying - Enter pass phrase:# 再入力

2014/02/19 追記 下記のコマンドはパスフレーズを削除してしまうので実行しないでください。

# openssl rsa -in server.key -out server.key
Enter pass phrase for server.key:# パスフレーズ入力

# make server.csr # 色々聞かれるので解答していく
Country Name (2 letter code) [XX]:JP# 国
State or Province Name (full name) [e]:Tokyo  # 地域(県)
Locality Name (eg, city) [Default City]:Meguro-Ku # 都市
Organization Name (eg, company) [Default Company Ltd]:Individual   # 組織名
Organizational Unit Name (eg, section) []:Individual  # 組織の部門名
Common Name (eg, your server's hostname) []:www.hoge.com   # サーバーのFQDN
Email Address []:[email protected] # 管理者アドレス
A challenge password []:# 空Enter
An optional company name []:# 空Enter

# openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650 # 有効期限が10年の自己署名証明書を作成
# chmod 400 server.* 

これで

  • server.key
  • server.csr
  • server.crt

が出来ているはず。


SMTPサーバー構築

送信サーバーを立てる。さくら VPS ではすでに Postfix がインストールされ、Sendmail はアンインストールされているので、設定ファイルをいじっていく。
CentOS6 では、Postfix の設定ファイルは /etc/postfix 以下にある。起動停止は /etc/init.d/postfix に対して start とか stop とかやれば処理できる。

Postfix の設定

2012/05/05 現在では、バージョンは2.6.6が入っていた。以下設定ファイルの変更点。こちらと、こちらを参考にした。
# vim /etc/postfix/main.cf

# 追加
myhostname = mail.hoge.com
mydomain = hoge.com
myorigin = $mydomain
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP unknown

# 変更
inet_interfaces = localhost
	↓
inet_interfaces = all

mydestination = $myhostname, localhost.$mydomain, localhost
	↓
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# SMTP-Auth 系の設定追加
disable_vrfy_command = yes 
smtpd_sasl_auth_enable = yes 
broken_sasl_auth_clients = yes 
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_sender_restrictions = reject_unknown_sender_domain
smtpd_client_restrictions = permit_mynetworks,reject_unknown_client,permit
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
message_size_limit = 10485760

# TLS を利用するための設定、先ほど作った自己証明書を指定する
smtpd_tls_cert_file = /etc/pki/tls/certs/server.crt
smtpd_tls_key_file = /etc/pki/tls/certs/server.key
smtpd_use_tls = yes 

TLSを利用するために /etc/postfix/master.cf の下記の部分のコメントアウトを外す。

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



SMTP-Auth の設定

このままでは誰でもメールが使えてしまうので、認証をかけるために saslauthd を利用する。Postfix の設定でも一部出てきているが、ここでは SASL 単体の設定を行う。現時点でのバージョンは 2.1.23 で、さくら VPS ではすでにインストールされている。
設定ファイルは /etc/sasl2/smtpd.conf にあり、行数も少ないので全部下記に載せる。

pwcheck_method: auxprop
auxprop_plugin: sasldb
mech_list: plain login



saslauthd は /etc/init.d/saslauthd に起動/停止スクリプトがあるので、設定を変更したら忘れずに再起動しておく。また、下記のようにOS再起動時にも起動するように設定しておく。

# chkconfig saslauthd on
# chkconfig --list saslauthd #確認
saslauthd       0:オフ  1:オフ  2:オン  3:オン  4:オン  5:オン  6:オフ




POP・IMAPサーバー構築

今回は dovecot をインストールして設定する。こちらも /etc/init.d/dovecot あたりで起動・停止処理を行う。設定ファイルは /etc/dovecot 以下にある。
まずはインストール。現時点のバージョンは 2.0.9。

# yum -y install dovecot



設定ファイルは /etc/dovecot/ 以下にある。まずは ssl を利用出来るようにする。
/etc/dovecot/conf.d/10-ssl.conf

#追加
ssl = yes
ssl_key_password = "上記で設定した自己証明書のパスフレーズ"

#変更(上記で設定した自己証明書を指定、値の先頭に"<"がつくので気をつけること)
ssl_cert = </etc/pki/tls/certs/server.crt
ssl_key = </etc/pki/tls/certs/server.key



受信に認証をかける。
/etc/dovecot/conf.d/10-auth.conf

#追加
auth_mechanisms = plain login



それからポートの設定等。
/etc/dovecot/conf.d/10-master.conf

# imap と pop3 のポートとかsslのコメントアウトを外しておく
service imap-login {
  inet_listener imap {
    port = 143 
  }
  inet_listener imaps {
    port = 993 
    ssl = yes 
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 110 
  }
  inet_listener pop3s {
    port = 995 
    ssl = yes 
  }
}



基本設定。
/etc/dovecot/conf.d/10-mail.conf

#追加
mail_location = maildir:~/Maildir
valid_chroot_dirs = /home



こっちも基本設定?
/etc/dovecot/dovecot.conf

#追加
protocols = imap pop3 lmtp




ユーザー設定

ssh ログインなしのユーザーを作成する。

# useradd -s /sbin/nologin [ユーザー名]
# passwd [ユーザー名] #パスワードを設定
# saslpasswd2 -u [FQDN] [ユーザー名] #パスワード設定
# sasldblistusers2 #作成したユーザー確認
# chgrp postfix /etc/sasldb2 #認証DBの所有権変更

メールディレクトリのスケルトンを作成する。

# mkdir -p /etc/skel/Maildir/{new,cur,tmp}
# chmod -R 700 /etc/skel/Maildir

既存ユーザーがいる場合は下記のようにディレクトリを作成する。

# mkdir /home/[ユーザー名]/Maildir
# chmod 700 /home/[ユーザー名]/Maildir
# chown [ユーザー名]:[ユーザーグループ] /home/[ユーザー名]/Maildir




ファイアウォールの設定

下記のポートを開けておく。

  • 110, 995 (POP3)
  • 143, 993 (IMAP)
  • 25, 587 (SMTP) ※25番ポートは踏み台にされやすいので閉じておいた方が無難。

※基本的にはSSLを利用するので、上記の左側のポートは閉じていても良い
※2012/05/07追記 25番開けないと外部からのメール受けられませんでした
具体的には下記のコマンドを叩く。

-A INPUT -m state --state NEW -m tcp -p tcp --dport 110 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 995 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 143 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 993 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 587 -j ACCEPT





クライアントの設定

自分の Android でメールが受信できるようにした。その設定の一例。
クライアントソフトは K-9 Mail を利用した。https://play.google.com/store/apps/details?id=com.fsck.k9

  1. まずは上記で設定したアカウントを入力する
    1. メールアドレス(hoge@hoge.com)
    2. パスワード(****)
  2. 受信メールサーバーの種類を選択(POP3サーバー)
  3. 受信メールサーバー設定
    1. アカウント名(上記のメールアドレスと同じ)
    2. パスワード(上記のパスワードと同じ)
    3. POP3サーバー(今回設定したホスト名)
    4. 保護された接続(SSLを使用する)※なぜかTLSではrejectされてしまい、SSLではいけたのでSSLにしておいた。
    5. 認証タイプ(PLAIN)
    6. ポート(995)
  4. 証明書が無効ですと言われるけど、許可して次へ
  5. 送信メールサーバー設定
    1. SMTPサーバー(今回設定したホスト名)
    2. 保護された接続(TLSを使用する)
    3. ポート(587)
    4. このサーバーは認証が必要にチェックを入れる
    5. セキュリティ設定(PLAIN)
    6. アカウント名(上記で設定したユーザー名)
    7. パスワード(上記で設定したパスワード)

これで送受信できるはず。既存の Gmail かなんかとやりとりできるか確認しておく。



デバッグ方法

ログ

ログは基本的に /var/log/maillog に出力される。別窓で tail -f /var/log/maillog とかで監視しながらメールの送受信を行って動作確認をすると良い。
SSL 周りで動かなかったり、外部からのメールが reject されてたりするときに、このへんに出力されるキーワードをもって Google 先生に指南いただいた。

メールの打ち方

サーバーに ssh で入ってメールするときには

# mail [email protected]

って打つとタイトルを聞かれた後に本文を聞かれる。行頭で「.」のみ入力して改行すると、メールが送信される。ただ "mail" コマンドのみだけを打つと新規メールが来たかを確認できる。これで、サーバー内部、もしくは内部ネットワークからはメール可能なのか、外部から弾かれているのかが確認できる。

2012/11/12 追記 Google Apps を利用してメールを送信する

メールサーバーがグローバルに出ていない場合、スパムと判断されて正常に届かないことが多い。サーバー借りるお金なんかないし、自宅サーバーだけでスモールな感じでメールサーバー構築したいときに GAppsなんかを利用してメールを送信する。

基本的には上記の設定をひととおり終える。
んで、下記のライブラリをインストールする。

# yum install -y cyrus-sasl-plain

んで、Gmail のアカウントの情報を書く。
vim /etc/postfix/sasl_passwd

[smtp.gmail.com]:587    [email protected]:mogera123

ここで、[hoge@gmail.com]は自分のメールアカウント。GApps 利用しているなら gmail.com じゃなくて設定しているドメインでもいい。
mogera123 はそのパスワード。
それから、リレーホストも編集する。
vim /etc/postfix/main.cf

relayhost = [smtp.gmail.com]:587

この一行を追加。
そして postmap する。

# postmap /etc/postfix/sasl_passwd 

これでおそらくいけるはず・・・
念のため postfix と sasl2 を再起動

# /etc/init.d/postfix restart
# /etc/init.d/saslauthd restart