Postfixの設定

投稿者: | 2010年8月13日
Pocket

対象サーバについて

製品名 OpenBlockS 600
OS(kernel ver) Debian lenny(2.6.29)
CPU 600MHz(AMCC PowerPC 405EX)
メモリ 1GB(DDR2 SDRAM)
ストレージ 8GB(Compact Flash)

メールサーバについて

基本知識

メールサーバの設定はDNSサーバの設定に深く関連するため、BIND9の設定が前提となります。

外部にメールを送信したり外部からのメールを受信したりするにはSMTPサーバが必要になり、Windowsなどのクライアント端末からメールサーバに保存されたメールを読むためにはPOP3/IMAPサーバが必要になります。

SMTPサーバについて

SMTPサーバにはSendmail、qmail、Postfixがあり、POP3/IMAPサーバにはdovecot、courier-imap、qmail-pop3dなどがありますが、本サイトでは最もユーザの多いと思われるPostfixとDovecotを選択しています。

SMTPサーバを運用する上で気をつけなければならないのは、外部から送られてきたメールを別のドメインに転送しないようにリレー制御することです。リレー制御がONになっていると踏み台に使われてしまい、自分のサイトだけでなく、他のメールサーバに対する攻撃に加担してしまうことになりますので、非常に重要な設定になります。

内部サーバと外部サーバのように分ける場合、内部から外部への転送は許可して、外部から外部への転送は拒否する、というようなことを考えなければなりません。1台で運用する場合は、リレー動作はデフォルトOFFのため特に設定上気をつけなければいけない点はありませんが、意識はしておいた方が良いでしょう。

POP3/IMAPサーバについて

POP3とIMAPについては利点欠点がありますが、一言で特徴を言ってしまうと、POP3はサーバからメールをダウンロード(サーバ上にメールは残らない)し、IMAPはサーバ上に保存しているメールを閲覧する(サーバ上にメールが残る)という特徴があります。本サイトの場合はOpen Blocks600のディスク容量が小さいため、POP3を採用します。

外部から送られてきた自ドメイン宛のメールの保存形式としては、MailboxとMaildir形式があります。Mailboxの場合メールが1ファイルにまとまってしまい、長期運用時にファイルが肥大化する可能性があるため、メールごとにファイルを作るMaildir形式を選択しています。

本サイトのメールサーバ構成

1台構成の場合と2台構成の場合について設定例を説明していきます。

1台構成の場合

サーバ1台構成

1台構成の場合、内部LAN端末から外部ドメイン宛に送られるメールは、自身でMXレコードを引いて外部ドメインのメールサーバに転送します。

また、外部ドメインから送られてきたメールはそのまま自身のディスクに保存し、内部LAN端末からPOP3にて受信します。

2台構成の場合

外部ドメインからのメール受信時の動き

サーバ2台構成

外部ドメインへのメール送信時の動き

サーバ2台構成

2台構成では、DMZに設置された外部サーバ(以降、OPENサーバと記載)とInsideに設置された内部サーバ(以降、CLOSEサーバ)で役割を分けていますので、それぞれの役割を以下に記載します。

OPENサーバ

Postfix(SNMP)
  1. CLOSEサーバから来た外部宛メールをDNSで調べてあて先のメールサーバに転送する。
  2. 外部のサーバから来た@example.jp宛てのメールをCLOSEサーバに転送する
DOVECOT(POP/IMAP)
  1. OPENサーバ自身が吐き出すcronのようなシステム系メールを内部LANにあるWindowsからPOP3で受信できるように設定します。

CLOSEサーバ

Postfix(SNMP)
  1. 外部のサーバからOPENサーバが受信した@example.jp宛てのメールの転送を、OPENサーバがCLOSEサーバにSMTPで転送してくるので、自身のHDDに蓄積します。
  2. 内部LAN端末から外部ドメイン宛のメールをOPENサーバに転送します。
DOVECOT(POP/IMAP)
  1. 内部LAN端末が@example.jp宛てのメールを受信できるように入れています。

Postfixのインストール

# aptitude install postfix

以下のパッケージが削除されます:
  exim4{a} exim4-base{a} exim4-config{a} exim4-daemon-light{a}

先に進みますか? [Y/n/?] Y

パッケージの設定:インターネットサイト
パッケージの設定:example.jp
を選択

# ls /etc/postfix/
dynamicmaps.cf  main.cf  master.cf  post-install  postfix-files  postfix-script  sasl

Postfixのコンフィグ設定

本ページで紹介する構成では、役割に応じていくつか設定パターンがあります。

1台構成の場合

  1. シングルドメイン(example.jpのみ)
  2. マルチドメイン(example2.jp)

2台構成の場合

  1. OPENサーバ
  2. CLOSEサーバ

上記役割に応じて一部設定に差分はありますが、基本的には同じ設定部分が多いため、差分箇所には分岐を設けて記載します。

※OPEN/CLOSEサーバに分けた場合のマルチドメインの設定については割愛します。

編集するファイル:/etc/postfix/main.cf

(※修正を行う箇所及びその前後のみを載せます。設定の意味についてはコメントアウトにて記載します。)

smtpd_banner = $myhostname ESMTP unknown
# デフォルト設定ではDebian、Postfixという情報が流出するため表示させない

biff = no
# ローカル biff サービスを使うかどうか。
# 互換性のためにデフォルトで有効化されているがパフォーマンス重視でnoとする。

append_dot_mydomain = yes
# ドメイン名がついてないメールアドレスに$mydomainがつけられる

readme_directory = no
# Postfix READMEファイルを置くディレクトリを指定。
# これらのファイルをインストールしたくなければ "no" を指定(デフォルト)


■■■■■■■■■■ ここから構成に応じて差分のある設定になります。 ■■■■■■■■■■


// ------------------ メールサーバ1台構成の場合はここから ------------------//

myhostname = mail.example.jp
mydomain = example.jp
myorigin = $mydomain
mydestination = example.jp, $myhostname, localhost.example.jp, localhost

// --- 1台構成でマルチドメインを使用する場合 ---//
virtual_alias_maps = hash:/etc/postfix/virtual
# あわせて/etc/postfix/virtualを作成する(後述)
// ------------- ここまでを使用 ---------------//

// ----------------------------- ここまでを使用 -----------------------------//

// ------------------ メールサーバ2台構成の場合のOPENサーバはここから ------------------//

myhostname = open.example.jp
mydomain = $myhostname
myorigin = $myhostname
mydestination = example.jp, $myhostname, localhost.example.jp, localhost
transport_maps = hash:/etc/postfix/transport
relayhost =

// ---------------------------------- ここまでを使用 -----------------------------------//

// ------------------ メールサーバ2台構成の場合のCLOSEサーバはここから ------------------//

myhostname = close.example.jp
mydomain = example.jp
myorigin = $mydomain
mydestination = example.jp, $myhostname, localhost.example.jp, localhost
relayhost = [172.0.0.2]

// ---------------------------------- ここまでを使用 -----------------------------------//

#=======================================================================
# 上記設定の意味
#
# myhostname = 
# このメールシステムのインターネットホスト名。様々なパラメータで使用される。
#
# mydomain = 
# append_dot_mydomain 有効時にドメイン名がついてないメールアドレスにつけられる。
# OPENサーバとCLOSEサーバに分ける場合は、CLOSEサーバをドメイン名にして、
# OPENサーバについては別の名前(本サイトではホスト名)を付与する。
#
# myorigin = $mydomain
# localhostが送信する場合のホスト名として@以下に設定される。
# この設定もOPENサーバとCLOSEサーバに分ける場合、識別できるように別の名前とする。
#
# mydestination = example.jp, $myhostname, localhost.example.jp, localhost
# mydestination には自ホストが最終的な宛先になるようなドメイン名を指定する。
# OPENサーバの場合はexample.jp宛を自身では受信せずすぐに転送するが、
# 設定しないとメールが弾かれるので入れる。
#
# transport_maps = hash:/etc/postfix/transport
# OPENサーバはtransportファイルにて@example.jp宛メールを
# 受信したらCLOSEサーバに転送する(transportファイルについては後述)
#
# relayhost = [XXX.XXX.XXX.XXX]
# 自分宛以外は全てOPENサーバ(XXX.XXX.XXX.XXX)に転送する設定。
# 
#=======================================================================

■■■■■■■■■■ ここまで構成に応じて差分のある設定になります。 ■■■■■■■■■■

mynetworks = 127.0.0.1/32 192.168.0.0/24
# ここで指定したクライアントからSMTP接続された場合、適切なサーバに中継する。 

mailbox_command = procmail
# デフォルトでは所定のディレクトリに保存されてしまうが、
# 処理を渡す外部コマンドを mailbox_command により設定できる。
# 詳細はこちらを参照
# ちなみにMaildir形式にする場合、postfixの設定ではなくprocmailの設定を変える点に注意する。

mailbox_size_limit = 0
# mailbox用の設定。maildirではディスククォータの機能を使って、
# maildirディレクトリのサイズを制限するという方法をとらなければならない

recipient_delimiter = +
# 拡張アドレスを有効にする機能。詳しくはこちらを参照。

inet_interfaces = all
# Postfix が待ち受けるべきインタフェースを全てのネットワークインターフェースに指定

smtpd_helo_restrictions = permit_mynetworks,
        reject_rbl_client all.rbl.jp,
        reject_rbl_client bl.spamcop.net,
        reject_rbl_client list.dsbl.org,
        reject_rbl_client sbl-xbl.spamhaus.org,
        permit

smtpd_client_restrictions = permit_mynetworks,
        reject_rbl_client all.rbl.jp,
        reject_rbl_client bl.spamcop.net,
        reject_rbl_client list.dsbl.org,
        reject_rbl_client sbl-xbl.spamhaus.org,
        permit

# maps_rbl_domainsは古い機能なのでPostfix 2.0以降はいらない。
# Postfix 2.0以降はsmtpd_client_restrictions中にreject_rbl_clientを使う。
# smtpd_recipient_restrictionsもいらない。

smtpd_helo_required = yes
# HELOコマンドを要求するようにしておく

disable_vrfy_command = yes
# vrfyコマンドを無効にすることでユーザーが存在するかどうか問い合わせできなくする。

debug_peer_level = 2
# ホストと通信する時のデバッグレベル。通常は、2を指定する。ログの詳細レベルが2段階アップされる。

header_checks = regexp:/etc/postfix/header_checks
# 内部からinternet宛のメールヘッダに含まれるプライベートIPアドレスを消す。

smtpd_client_event_limit_exceptions = 192.168.0.0/24 127.0.0.1/32
# 送信元ごとの制限を除外するホスト(制限の機能を使用していないが残しておく。)

unknown_local_recipient_reject_code = 550
# SMTP時に宛先に指定されたローカルメールアドレスが存在しない時に返されるエラー。
# 550にすれば再送されなくなる。

役割に応じた追加設定

transport設定(OPEN/CLOSEサーバに分ける場合はOPENサーバ側のみに必要)

本設定により、@example.jp宛は全て192.168.0.2へ転送されるようになる。

www:~# vi /etc/postfix/transport
example.jp    smtp:[192.168.0.2]

www:~# postmap /etc/postfix/transport
www:~#

virtualの設定(マルチドメインを使用する場合のみ必要)

下記設定でexample.jp/example2.jpにて送受信可能となりますが、ファイルが両ドメインで共通となるため、メーラーで受信する際に両ドメイン宛のメールが混じってしまいます。現状はそれでも困らないためそのままとします(分割するにはアカウントを分割するなどの対応が必要です)。

www:~# vi /etc/postfix/virtual
example.jp            anything
user001@example.jp    user001
webmaster@example.jp  user001

example                anything
user001@example2.jp    user001
webmaster@example2.jp  user001

www:~# postmap /etc/postfix/virtual
www:~# 

共通設定

外部へ送られるメールヘッダのプライベートIPアドレスを削除します(smtpd_banner = $myhostname ESMTP unknownだけではヘッダにPostfixの文字が残ったためここで確実に消去します。)

www:~# vi /etc/postfix/header_checks
/^Received:.*127\.0\.0\.1.*/ IGNORE
/^Received:.*192\.168\..*/ IGNORE
/^Received:.*172\.0\..*/ IGNORE
/.*Postfix.*/ IGNORE

www:~# /etc/init.d/postfix restart
Stopping Postfix Mail Transport Agent: postfix.
Starting Postfix Mail Transport Agent: postfix.
www:~#

送受信確認

他のマシンからtelnetで接続してgmailに対してメール送信してみる。

test:~# telnet 172.0.0.2 25
Trying 172.0.0.2...
Connected to 172.0.0.2.
Escape character is '^]'.
220 mail.example.jp ESMTP unknown
HELO mail.infra.jp
250 mail.example.jp
MAIL FROM:user001@example.jp
250 2.1.0 Ok
RCPT TO:[実在のユーザ名]@gmail.com
250 2.1.5 Ok
DATA
354 End data with .
test
.
250 2.0.0 Ok: queued as F14BCE338B
quit
221 2.0.0 Bye
Connection closed by foreign host.

gmailで受信確認→ OK

最後にリレーの試験を実施します。ここで20試験が全てno relays accepted.なことを確認して終了します。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です