Postfixでメールサーバー設定

sendmail の代替 MTA として、qmail, postfixというものがあります。sendmail や qmail について記述したページを作ったので、ついでに Postfix のページも作ります。(インストール方法だけというすごく大雑把な内容です)


* Postfix の入手

Postfix のオフィシャルサイトへ行くと、ダウンロードサイトのリストがあるので一番身近なダウンロードサイトからソースを入手します。

Postfix オフィシャルページ  オリジナルサイト
ダウンロードサイトのリスト  http://www.postfix.org/ftp-sites.html

postfix-20010228-pl08.tar.gz リリースされている最新のものを入手(Snapshotでないもの)

* インストールと事前にやっておくこと

Postfix モジュールをダウンロードして展開します。 Postfix で必要となるユーザーやグループを新規に登録します。(インストールドキュメントでは、モジュールをインストールする直前でユーザー登録を行っている)作業はスーパーユーザーで行います。 また、Redhat Linux 6.2 で作業を行いました。

postfix というユーザーを、むやみにログインできないようにシェルなしで登録します。そして、postfix 宛てのメールを root に振ります。

# useradd -s /bin/true postfix
# edit /etc/aliases
   postfix: root
# newaliases

今まで利用していた sendmailを終了させ、起動されないような手続きを行います。sendmail の終了は kill コマンドを使用して sendmailプロセスを終了させます。その後、sendmail が起動されないようにします。queue にある未処理のメールを配送する。

# kill -TERM 'process number of sendmail'
# mv /usr/sbin/sendmail /usr/sbin/sendmail.OFF
# mv /usr/bin/newaliases /usr/bin/newaliases.OFF
# mv /usr/bin/mailq /usr/bin/mailq.OFF
# chmod 755 /usr/sbin/sendmail.OFF
# /usr/sbin/sendmail.OFF -q

ダウンロードしてきたソースの展開とコンパイル。

# gzip -dc postfix-20010228-pl08.tar.gz | tar xf -
# cd postfix-20010228-pl08
# make

コンパイルが終了したら、インストールします。このときに、インタラクティブにいろいろと入力を求められます。全て [] 内のデフォルト設定でインストールして構わなければ、リターンキーを入力していきます。

# make install
Warning: this script replaces existing sendmail or Postfix programs.
Make backups if you want to be able to recover.

...
 
install_root: [/] <Enter>
tempdir: [/tmp/postfix-20010228-pl08] <Enter>
config_directory: [/etc/postfix] <Enter>
daemon_directory: [/usr/postfix/bin] <Enter>
command_directory: [/usr/postfix/bin] <Enter>
queue_directory: [/var/spool/postfix] <Enter>
sendmail_path: [/usr/sbin/sendmail] <Enter>
newaliases_path: [/usr/bin/newaliases] <Enter>
mailq_path: [/usr/bin/mailq] <Enter>
mail_owner: [postfix] <Enter>
setgid: [no] <Enter>
manpages: [/usr/local/man] <Enter>
...
#

* 設定

Postfix では、mail.cf というファイルを編集することで環境を設定することが出来ます。postfix コマンドに引数 check を付けて実行すると設定内容がチェックできます。syslog 等のログにエラーが出力されていないか調べる。Berkeley DB を使用していると想定しています。

# cd /etc/postfix
# cp main.cf main.cf.org
# edit main.cf
    # 最低限必要な設定
    myhostname = myhost.foobar.co.jp
    mydomain = foobar.co.jp
    myorigin = $myhostname
    inet_interfaces = all
    mydestination = $myhostname, localhost.$mydomain
    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases
    transport_maps = hash:/etc/postfix/transport
    mail_spool_directory = /var/mail
    mynetworks_style = subnet
# /usr/sbin/postfix check

メールアドレスのエイリアスを記述する/etc/aliases、配送方法のマップを記述する/etc/postfix/transportはpostmap コマンドでデータベースを作成します。

# edit /etc/aliases
    webmaster: sysadmin
    support:     user1, user2
# edit /etc/postfix/transport
    docomo.ne.jp    smtp:[mail.foobar.co.jp]
    .docomo.ne.jp   smtp:[mail.foobar.co.jp]
# postmap hash /etc/aliases
# postmap hash /etc/postfix/transport

* 起動

起動には、postfix コマンドに引数 start を付けて実行することで MTA として起動されます。

# /usr/sbin/postfix start

このプログラムを、OS 起動時に実行するように /etc/rc.d 以下の必要な場所にスクリプトを記述しておくと良い。

* メールの中継制限

Postfix には、メール配送方法を制御するパラメータがいくつか用意されています。外部ホストから受信したメッセージをどのように配送するかを制御するといった、最も一般的なメールのリレー制御は smtpd_recipient_restrictions というパラメータを使用します。これらはやはり、main.cf 設定ファイルに記述します。ソースパッケージに付属の sample-smtpd.cf ファイルを参考にすると良い。smtpd_recipient_restrictions パラメータで良く使われると思われるものを表にしておきます。また、以下の太字表示の内いずれかひとつは必ず設定されていなければなりません。

制限される要求
permit_mynetworks ローカルネット上の IP Address を持つクライアントを許可する
permit 任意のクライアントに対して任意のホストへのリレーを許可する
permit_auth_destination $check_relay_domains の基準に合うメッセージを許可する
permit_mx_backup DNSの MXレコードのエントリーにあるドメイン宛のメッセージ受信を許可する
check_relay_domains $mydestination, $inet_interfaces, $virtual_maps, $relay_domains それぞれのパラメータ値にリストされたアドレス宛かチェックする
reject ローカルを含めすべてのメッセージを拒否する
reject_invalid_hostname 無効な HELOホスト名の場合拒否する
reject_maps_rbl $maps_rbl_domains(Realtime Blackhole List)に登録されているクライアントからのメッセージを拒否する
reject_non_fqdn_hostname FQDN(Fully Qualified Domain Name)でない HELOホスト名の場合拒否する
reject_non_fqdn_recipient 受信者アドレスが FQDNでない場合拒否する
reject_non_fqdn_sender 送信者アドレスが FQDNでない場合拒否する
reject_unauth_destination $check_relay_domains の基準に合わないメッセージはすべて拒否する
reject_unauth_popelining パイプを使用するプログラムから送信されたメールを拒否する
reject_unknown_client クライアントのホスト名が不明な場合拒否する
reject_unknown_hostname DNS の Aレコードや MXレコードのエントリーにない HELOホスト名の場合拒否する
reject_unknown_recipient_domain 受信者のメールアドレスが DNS の Aレコードや MXレコードを持たない場合拒否する
reject_unknown_sender_domain 送信者のメールアドレスが DNS の Aレコードや MXレコードを持たない場合拒否する
check_client_access
check_helo_access
check_recipient_access
check_sender_access

データベースに登録されたホストやIP Address、ドメインなどに対するアクセス設定が行えます

check_client_access hash:/etc/postfix/clients

といった形式で、データベースのタイプとデータベース名を指定します。
データベースのレコードフォーマットは

address action

となり、address フィールドには、ホスト名、IP Address、ドメイン名、IPネットワークの範囲を指定できます。action フィールドには、指定された address に対するアクションを記述します。

REJECT - 拒否
4xx text - textをメッセージとした一時的なエラー
5xx text - textをメッセージとした永続的なエラー

テキスト形式でデータベースのテーブルファイルを上記の形式で作成したら、postmap コマンドでバイナリーのデータベースファイルを作成します。

postmap hash /etc/postfix/clients

また、以下のように指定すると、データベースに登録されたホストやドメインはすべて拒否することになります

smtpd_recipient_restrictions =
    check_client_access hash:/etc/postfix/clients, reject

DRAC を利用してPOP before SMTPを設定する場合、check_client_access として以下のように設定します。

smtpd_recipient_restrictions =
    check_client_access hash:/etc/mail/dracd

* 受信メールの拒否

Postfixでは、前節のようにリレーに関する細かい設定が行えますが、これをホスト/HELO/MAIL FROM: に対しても設定することができます。

確認
パラメータ
設定例
送信元ホスト smtpd_client_restrictions
= check_client_access hash:/etc/postfix/bad_clients
HELOコマンド smtpd_helo_restrictions
= reject_unknown_hostname, permit_mynetworks
= check_helo_access hash:/etc/postfix/bad_helo
MAIL FROM: コマンド smtpd_sender_restrictions
= reject_unknown_sender_domain, permit_mynetworks
= check_sender_access hash:/etc/postfix/bad_secer

メッセージフィルタを利用してメールを拒否することもできます。Postfix の header_checks パラメータを利用すると、メッセージヘッダーをスキャンし、特定のフレーズを含むメッセージの配送をブロックすることができます。

header_checks = regexp:/etc/postfix/bad_header

と設定(正規表現テーブルを使用する場合)し、以下のレコードフォーマットでファイルを作成します。

pattern action

pattern はヘッダーフィールドでマッチングされる正規表現を記述し、action は、パターンにマッチした際のアクションを指定します。

アクションには、

REJECT - メッセージを拒否
OK - メッセージを許可
IGNORE - メッセージからヘッダー行を破棄

すべてのヘッダー行に対して指定した条件を実行します。
テーブルの例は以下のようになります。大文字小文字の区別は行いません。

/^subject: more money$/  REJECT
/^from: your friend$/    REJECT