Postfix

(作成:2006/03)

Postfixは従来のsendmailに比べてパフォーマンスやセキュリティ等の様々な面で優位なMTAらしい。qmailと並んで、Linuxサーバではメジャーなんじゃないかしらん。

今回は仕事でVine Linuxへの導入をしたので、その備忘録。Vineには始めから導入されてるみたいなんだが、デフォルトのパッケージではSMTPAuthなんかが使えないので、 src.rpm からのリビルドで導入してみた。

Install on Vine

SMTPAuthによるアクセスを実現するため、一度 src.rpm からリビルドする必要がある。 ビルド環境の構築については拙サイト「Vine - パッケージのリビルド」参照。

Computer雑記
(更新:2017/10)Windows (更新:2014/07)Android (更新:2012/02)OS最適化-CentOS (更新:2...

src.rpm を取得。

$ apt-get source postfix
...

以下のコマンドで一時的に展開し、specファイルを書換える。

$ rpm -Uvh postfix-2.0.20-0vl5.1.src.rpm
...
#### ~/rpm/SPECS/postfix.spec

...
%build
...
       -DUSE_SASL_AUTH -I/usr/include" \
   AUXLIBS="-L/usr/lib -lsasl"
...

パッケージのリビルド。

$ rpm -bb rpm/SPECS/postfix.spec
...

このリビルドでは、あらかじめ cyrus-sasl cyrus-sasl-md5 cyrus-sasl-plain cyrus-sasl-devel のパッケージが必要。

# apt-get install cyrus-sasl cyrus-sasl-md5 cyrus-sasl-plain cyrus-sasl-devel
...

出来上がったパッケージで再インストール。

# apt-get remove --purge postfix
...
# rpm -Uvh rpm/RPMS/i386/postfix-2.0.20-0vl5.1.i386.rpm
...

設定

SMTPサーバにする

ここではサーバのホスト名 mail 、ドメイン名 hyakki.local として話を進める。(FQDN: mail.hyakki.local

設定ファイルの修正。

#### /etc/postfix/main.cf

myhostname = mail.hyakki.local
mydomain = hyakki.local
myorigin = $myhostname

inet_interfaces = all

mydestination = $myhostname, localhost.$mydomain $mydomain

unknown_local_recipient_reject_code = 550
#unknown_local_recipient_reject_code = 450

mynetworks_style = subnet

#home_mailbox = Mailbox
#home_mailbox = Maildir/

# VRFYコマンドを許可
disable_vrfy_command = no

# MAIL FROMやRCPT TOがRFC821構文のものを拒否(SPAM対策)
strict_rfc821_envelopes = no

# HELOコマンドを許可
smtpd_helo_required = no

# bounceメールサイズの指定
bounce_size_limit = 50000

# mboxサイズの指定
mailbox_size_limit = 102400000

mail_spool_directory = /var/spool/mail

動作確認

# /etc/init.d/postfix start
...

/var/log/maillog にて起動ログのチェックができる。設定が間違っとるとfatalエラーが残るんで、必ずチェックしとくこと。
動作チェック。取り敢えず外部から telnet で接続してみる。

$ telnet mail.hyakki.local 25
Trying ***.***.***.***...
Connected to mail.hyakki.local.
Escape character is '^]'.
220 mail.hyakki.local ESMTP Postfix
HELO mail.hyakki.local
250 mail.hyakki.local
mail from: riyo@hyakki.local
250 Ok
rcpt to: root@hyakki.local
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
subject: test
Viva la raza!
.
250 Ok: queued as EFFEEE5406F
QUIT
221 Bye
Connection closed by foreign host.
$

mail.hyakki.local の宛先アカウントにログインしてみて、 mail コマンドか何かで確認してみる。 入力通りの情報が入っていれば、外部からの接続は大丈夫と見て良いんじゃないかな。

SMTPAuthサーバにする

こちらもサーバのホスト名 mail 、ドメイン名 hyakki.local として話を進める。(FQDN: mail.hyakki.local
上記設定に加えて以下の設定を施す。

#### /etc/postfix/main.cf

# SMTPAuthを使う
smtpd_sasl_auth_enable = yes

# SASL認証するドメイン
smtpd_sasl_local_domain = $myhostname

# SASL認証しなくて良いネットワーク
#mynetworks = 192.168.0.0/24, 127.0.0.0/8

# SMTP認証に必要なリレー設定
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination

# 匿名での接続を拒否する
smtpd_sasl_security_options = noanonymous

# Outlook Expressから利用可能にする
broken_sasl_auth_clients = yes

続いてSASLの設定。

#### /usr/lib/sasl/smtpd.conf

pwcheck_method:sasldb

SASL認証用ユーザの作成。認証用ユーザは実際に存在するアカウントじゃないと駄目。 一度目は何故か必ずエラーで弾かれるので、二度実行する必要があるみたい。バグ?

# /usr/sbin/saslpasswd -c -u `/usr/sbin/postconf -h myhostname` (SMTPAuth認証用アカウント名)
Password:********
Again (for verification):********

登録出来たかどうかは以下のコマンドで確認できる。

# /usr/sbin/sasldblistusers
user: wi realm: mail.hyakki.local mech: CRAM-MD5
user: wi realm: mail.hyakki.local mech: PLAIN
user: wi realm: mail.hyakki.local mech: DIGEST-MD5

Postfixでsasldbを参照出来るように修正する。

# chgrp postfix /etc/sasldb
# chmod 640 /etc/sasldb

動作確認

# /etc/init.d/postfix start
...

/var/log/maillog にて起動ログのチェックができる。設定が間違っとるとfatalエラーが残るんで、必ずチェックしとくこと。
動作チェック。以下のPerlスクリプトでBase64エンコードされたアカウント情報を作成、これを使ってログインチェックしてみる。

$ perl -MMIME::Base64 -e 'print encode_base64("アカウント名\0アカウント名\0パスワード");'
(エンコード済アカウント情報が表示される)

取り敢えず外部から telnet で接続し、EHLO コマンドで拡張機能を確認する。 250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5 の行があればSMTPAuthが使用可能。

$ telnet mail.hyakki.local 25
Trying ***.***.***.***...
Connected to mail.hyakki.local.
Escape character is '^]'.
220 mail.hyakki.local ESMTP Postfix
EHLO mail.hyakki.local
250-mail.hyakki.local
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250-AUTH=PLAIN LOGIN DIGEST-MD5 CRAM-MD5
250 8BITMIME
AUTH PLAIN (エンコード済アカウント情報)
235 Authentication successful
QUIT
221 Bye
Connection closed by foreign host.
$

こんな感じで認証に成功したらOK。

alias設定

メールのエイリアスは /etc/postfix/aliases で設定する。場所が気に食わなんだら、 /etc/postfix/main.cf 内で設定変更しとけば良い。 設定の詳細はここでは省く。けどまぁ、以下みたいな名称のエイリアスは作っといて損は無いんじゃないかな。

  • admin
    全サーバ管理者宛
  • all
    全員宛

設定を施したら以下のコマンドで aliasDB を更新する。

# newaliases

送信用サーバにする

昨今の巷のメールサーバはspam業者との戦いのなかから、一般利用者からすると色々と融通が利かないカターい設定になってたりする。例えば riyo@hyakki.local でメールしようものなら「そんなドメイン無いよ? ばかなの?」と言われる始末。
まあ個人で外部向けメールを作る事なんて殆ど無いだろうけれど、CGI検証なんかでどーしても sendmail 使って外部にメールを送りたい事もあったりして。会社とかならメールサーバがあったりするけれど、個人環境だとISPのメールサーバくらいしか使えそうなモノが無く、そこもやっぱりカターい設定がされていたりして。

というわけで、試験サーバから外部にメール送信する際、あたかも「私はプロバイダから送ってますよー」と誤魔化すための設定。

#### /etc/postfix/main.cf

relayhost = [(ISPのSMTPサーバ)]

smtp_generic_maps = hash:/etc/postfix/generic
#### /etc/postfix/generic

@localhost.localdomain @(ISPのメールドメイン)
# postmap /etc/postfix/generic
# /etc/init.d/postfix reload