関連リンク

2008/9/16現在、2.5.5が最新

インストール

make
make install

簡単。

バージョン確認方法

postconf | grep mail_version

とすると、下のように表示される

# postconf | grep mail_version
mail_version = 2.3.6
milter_macro_v = $mail_name $mail_version

設定いろいろ

  • Postfix/設定例1? 最も簡単なメールサーバ(終端MTA)
  • Postfix/設定例2? 中継サーバ(DMZ設置の例)
  • Postfix/設定例3? 中継サーバ2(In/Outが固定経路)
  • Postfix/設定例4? 振り分けサーバ(アウトバウンド:宛先による次MTA指定)
  • Postfix/設定例5? 振り分けサーバ(インバウンド:宛先による次MTA指定)
  • Postfix/設定例6? SPAM対策1(特定ドメインのFromを拒否)
  • Postfix/設定例7? SPAM対策2(特定IPアドレスブロックの拒否)

transport_mapの評価について

 いくつかのサブドメインを持つドメインについて、振り分けにtransport_mapを使う場合、振り分けルールについてわかりにくかったところがあり、確認した結果をメモに残す。

例として、

foo@example.com         -- 本社      --> 本社メールサーバ(mail.example.com)で受ける
foo@oita.example.com    -- 大分支社  -->     〃
foo@fukuoka.example.com -- 福岡支社  --> 支社サーバ(mail-f.example.com)で受ける

のドメインを考える。

 ここで、大分支社は規模が小さいなどの理由で本社サーバで受けるとし、福岡は支社内設置の別メールサーバで受けるとする。

 この場合、各所に振り分けをするメールサーバのtransport_mapは次のようになる

example.com         : mail.example.com
oita.example.com    : mail.example.com
fukuoka.example.com : mail-f.exsample.com

 一部のサブドメインについてのみ別のサーバに配送するには、その「一部」を別に記述すればいいと言うことになる。

 mail.cfには、下記のように書いており、hash辞書を使うため、記入順序は関係ない

</etc/postfix/main.cf>
transport_maps = hash:/etc/postfix/transport

 ところで、例えば、本社サーバで受信するサブドメインがもっと沢山あったとしたら、次のように書きたくなるかもしれない。

(悪い例)
example.com         : mail.example.com
.example.com        : mail.example.com
fukuoka.example.com : mail-f.exsample.com

 こうすると、福岡は別サーバで、それ以外は本社サーバで、と配送してくれることを期待するのだが、動かしてみるとそうではない。

 fukuoka.example.com、"*.example.com"にマッチしてしまうため、本社サーバに配送されてしまう。そこに同じアカウントでもあれ\ば悲劇だ。

 記入する順番を変えたところで、hashなので記述順になる保証はないし、そもそもマッチングする課程でおかしい。  考えてみれば、マッチするエントリがふたつあること自体が問題だ。

 結論として、沢山サブドメインがある場合は、それらを全て記述するか、あるいは、本社メールアドレスについて、"@honsya.example.com"として、本社もサブドメインのひとつにしてしまうかのふたつの方法が考えられる。 サブドメインの数に応じて考えてもいいと思う。

キューの削除

mailqコマンド(実は postqueue -p コマンド)でキューを確認すると、かなり多くの情報が表示されてしまうことがあるが、ここからキューIDを確認して、いちいちpostsuperコマンドを使って削除するのは結構な手間であり、ウィルス蔓延時などはとても手打ちはしていられない。

一括削除する場合は下記のようにする

postqueue -p | grep '^[0-9A-Z]' | cut -f1 -d' ' | postsuper -d -

UNIXのコマンドの例ですな。

差出人による発信制限

 差出人(From)アドレスによる送信制限をかけるには下記のようにする。  ただし、この記述だと差出人が許可対象のものであれば、どのIPアドレスから発信されたかは見ないと言うこと。  つまり、インターネットに公開されているメールシステムでこれをそのまま適用してしまうと、Fromアドレスを詐称されて、いくらでもSPAMやウィルス展開の踏み台にされる。

 よって、確実に外部からの中継に使用できない位置に配置すること。  その方法が分からないヒトはこの設定はせずに別の方法にするか、基本書を読んでからの方がいいです。

 まず、main.cfに次の行を追加

smtpd_sender_restrictions = hash:/etc/postfix/allow_domains,reject

 次に、/etc/postfix/allow_domains を作成

</etc/postfix/allow_domains>
intra.exsample.com     OK

 hash辞書にするので、postmap allow_domains しておく

 あとは、postfix checkして問題なければ、postfix reload します。

 main.cfの定義では、hogehoge@intra.example.comからのメールは中継処理しますが、それ以外はrejectするようにしてます。

 外部からのメールを受け付ける場合、Fromは通常は外部アドレスですから、そのままではまともにうけとれません。

 よって、

smtpd_sender_restrictions = permit_mynetworks, hash:/etc/postfix/allow_domains, reject

 として、さらに、外部からの中継をしてくれるサーバ(DMZにそういうサーバを置いてる場合がよく見られますね)をmynetworksに書 いておきます。

</etc/postfix/main.cf>
mynetworks = nnn.nnn.nnn.nnn/32, 127.0.0.0/32

なんてしておくと大体いいです。

特定のアドレスに対してのメールを拒否する

main.cfには、

header_checks = regexp:/etc/postfix/header_list

などと書いておいて、/etc/postfix/header_listファイルを作成。内容は例えば以下。

/denyaddress@example\.com/    REJECT

 で、postfix reloadなどとして読み込ませると、このアドレスをヘッダ内に含むメールは拒否されるようになる。 正規表現による\ 記述のため、ドットはエスケープする。  この記述だと、ヘッダ内のどこに含まれていてもマッチするため、問題がある場合は表記に工夫をする必要がある。

送信者ドメインの書き換え

ドメイン変更などの理由で、強制的にユーザのFromアドレスを書き換える方法。 main.cfに、

sender_canonical_maps = /etc/postfix/canonical

としておいて、/etc/postfix/canonical ファイルを

@old.domain.name @new.domain.name

のように、「書き換え前ドメイン」、「書き換え後ドメイン」を並べて書く。 区切りはタブ文字でも半角空白でもOK。

あとは、

postmap canonical

としてから、postfix reloadでOK。

アクセス管理

HELO要求

smtpd_helo_required = yes

VRFYコマンド使用不可

disable_vrfy_command = yes

RFC822非準拠のメールアドレスは不許可

strict_rfc821_envelopes = yes

ソースルート形式不許可

allow_untrusted_routing = no

ホスト名書式のチェック

smtpd_helo_restrictions = perlmit_mynetworks, reject_invalid_hostname, reject_unknown_client, permit

myneworksからは許可して、ホスト名不正を拒否、逆引きできないホストも拒否してから、残りを許可する

逆引きできないのは不許可

smtpd_client_restrictions = permit_mynetworks, reject_unknown_client, permit mynetworksからは許可、逆引きできないのを不許可、あとは許可

存在しないドメインからの送信を拒否

smtpd_sender_restrictions = reject_unknown_sender_domain, reject_sender_login_mismatch 存在しない(確認できない)ドメインからの着信を拒否し、SMTP認証のログイン情報と異なる場合も拒否

利用できるmaptypeの確認

postconf -m

内部からしか接続できない

ひととおりのセットアップが終わって、ローカルで 25/tcp につないでメール送信テストもできて、いざ同一ネットワーク上の別ホストからつないでみるとつながらない。

環境は CentOS 5.7 なので、iptables で 25/tcp が開いているのも確認。

はて。

メールサーバ上で、netstat -an してみると、こんな感じ。比較のために httpd の部分を並べている。

tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN

なんか違う。 25/tcp はローカルホストインタフェースでしか待ち受けていない。

main.cf を調べると、

inet_interfaces = localhost

になってた。

これを、

inet_interfaces = all

としたら、直った。

# rpm -qa | grep postfix
postfix-2.3.3-2.3.el5_6

という状況なんだけど、デフォルトで受信インタフェースが localhost になってるのかな。 そうだとしたら、これはハマるよなあ。

時間を無駄にした。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS