メイン

Postfix アーカイブ

2007年02月17日

postfixによるSMTPサーバの構築その1

●プロセス概要

postfixは内部的に処理が分割されていてそれぞれが自分の仕事をこなすことで成り立っています。
主なものは以下。

master
postfix全体の管理する。

sendmail
ローカルからの送信処理を担当。

smtpd
メールの受信処理を担当。その後cleanupプロセスに渡す。

cleanup
メールをincomingキューに保管するプロセス

qmgr
incomingキューを監視し,メール配送の準備をするプロセス

active
qmgrが配送中のメールを管理するプロセス

local
届いたメールをローカルスプールに格納するプロセス

incoming
受信したメールを保存し,配送プロセスに渡す。

pickup
maildropキューを監視するプロセス。メールを検知するとcleanupプロセスに渡す。


メール送受信の流れの概要は,
外部からメールを受信した場合のプロセスは,
smtpd -> cleanup --> incoming --> qmgr --> active --> local

内部からメールを送信する場合のプロセスは,
sendmail --> postdrop --> maildrop --> pickup --> cleanup --> incoming --> qmgr --> active --> smtp


●インストール

実際にpostfixによるメールサーバの構築をします。
CentOS4ではsendmailとpostfix関連のパッケージが入っていると思うのでアンインストールしてソースからインストールします。
依存関係で必要なパッケージをおいておきたい場合は --nodeps をつけてアンインストールします。

例えばこんな感じ。

# rpm -e --nodeps sendmail

postfix ユーザと postfix, postdrop グループがなければ作成しておきます。

オプションの設定によってはpcre-develが必要になるかもしれません。

ソースの入手先は http://www.postfix.org
現時点での最新バージョンは postfix-2.3.7.tar.gz でした。
ではさっそくダウンロードしてインストール準備をしましょう。

# tar zxvf postfix-2.3.7.tar.gz -C /usr/local/src
# cd /usr/local/src/postfix-2.3.7

以前のコンパイル情報を初期化する場合は以下のコマンドを打ちます。

# make tidy

コンパイルオプションは必要に応じて適宜設定してください。
CCARGSにコンパイルオプション,AUXLIBSにライブラリを指定します。
特に拡張機能を有効にする必要がない場合は make とシンプルに入力です。

# make makefiles 'CCARGS=-DHAS_LDAP -DHAS_PCRE -I/usr/include/pcre -DUSE_SASL_AUT\H -DUSE_CYRUS_SASL -I/usr/include/sasl -DUSE_TLS -DDEF_MANPAGE_DIR=\"/usr/share/m\an\"' AUXLIBS="-ldb -lldap -llber -lz -lm -lpcre -lsasl2 -lssl -l crypto"

# make install

以下のようなことを聞いてきますがいろいろ聞いてくるが基本的にはデフォルトでOKです。
私は好みでcommand_directoryを /usr/local/sbin にしました。

install_root: [/]
tempdir: [/usr/local/src/postfix-2.3.7]
config_directory: [/etc/postfix]
daemon_directory: [/usr/libexec/postfix]
command_directory: [/usr/sbin]
queue_directory: [/var/spool/postfix]
sendmail_path: [/usr/sbin/sendmail]
newaliases_path: [/usr/bin/newaliases]
mailq_path: [/usr/bin/mailq]
mail_owner: [postfix]
setgid_group: [postdrop]
html_directory: [no]
manpage_directory: [/usr/share/man]
readme_directory: [no]

これでインストールは終了です。
設定は次回書きます。

2007年02月18日

postfixによるSMTPサーバの構築その2

前回でインストールまで済んだので今度は起動スクリプトを書いてシステム起動時にpostfixが起動するように設定しましょう。

スタートストップスクリプトを書きましょう。

# vi /etc/init.d/postfix
---
#!/bin/bash
#
# Startup script for the Postfix-2.3.7
#
# chkconfig: 35 99 1
# description: MTA Server program

export PATH="/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin"

LOCKFILE=/var/lock/subsys/postfix
POSTFIX=/usr/local/sbin/postfix


# ネットワークが利用可能かチェック
. /etc/sysconfig/network

if [ ${NETWORKING} = "no" ]; then
exit 0
fi


case "$1" in
start)
if [ -x $POSTFIX ]; then
if [ -f $LOCKFILE ]; then
echo "postfix already started!!"
else
touch $LOCKFILE
echo "Starting Postfix-2.3.7 Please wait : "
$POSTFIX start
sleep 5
fi
else
echo "postfix program Not Found"
fi
;;
stop)
if [ -x $POSTFIX ]; then
if [ -f $LOCKFILE ]; then
echo "Shutting down postfix: "
$POSTFIX stop
rm -f $LOCKFILE
sleep 5
else
echo "postfix already Stopped!!"
fi
else
echo "postfix program Not Found"
fi
;;
*)
echo "Usage: postfix {start|stop}" 1>&2
exit 1
esac
exit 0
---

スクリプトを書いたらシステムに登録します。

# chmod 755 /etc/init.d/postfix
# chkconfig --add postfix

これでランレベル3と5で起動するようになりました。

●基本設定

設定は/etc/postfix/main.cf で行います。
とりあえず基本的な設定をしましょう。

# vi /etc/postfix/main.cf
---
# ホスト名をFQDNで
myhostname = hostname.domain.com

# ドメイン名
mydomain = domain.com

# メール送信時に付けるドメイン名(@のうしろ)
myorigin = $myhostname

# 受信するインターフェイスの設定
inet_interfaces = all

# 受け取るドメイン
mydestination = $myhostname, $mydomain, localhost, localhost.$mydomain

# 中継を許可するネットワーク
mynetworks = 127.0.0.0/8, 192.168.1.0/24
---

それではpostfixを起動してみましょう。

# service postfix start

他のメールサーバからメールを送ってみてから/var/log/maillogを見るとエラーが出ています。
/etc/aliases.db がないと言われているのでnewaliases コマンドを打っておきます。

# newaliases

また,warning: dict_nis_init: NIS domain name not set というエラーが出たので
main.cfに以下を追加しました。

---
alias_maps = hash:/etc/aliases
---

postfixの設定ファイルの再読込みをします。

# postfix reload


これでエラーもなくなり基本的な動きが可能になりました。

postfixによるSMTPサーバの構築その3

前回でmain.cfへの基本設定がすんだのでいろいろなスパム対策をしましょう。

●送信元ホストによるアクセス制御

スパム対策など不必要なメールの受信をしないためにアクセス制御をしましょう。
アクセス制御には smtpd_client_restrictions を使います。

---
smtpd_client_restrictions =
        permit_mynetworks,
        check_client_access regexp:/etc/postfix/client_access,
        reject_unknown_client,
        permit
---

reject_unknown_clientのレスポンスコードはデフォルトで450ですがこれでは再送されてしまうため気になる人は550などにしましょう。
---
unknown_client_reject_code = 550
---

上の例では mynetworks で指定したネットワークを受信し,/etc/postfix/client_access ファイルによるアクセス制御を行い,reject_unknown_client でDNS逆引きができないサーバからの接続を拒否し,permitでそれ以外のデフォルト動作は接続を許可するという意味になります。
reject_unknown_client を指定すると結構メールをはじきますので注意が必要です。

regexp はそれ以降に指定したファイルの記述に正規表現を使うという意味です。書式は以下のような感じ。

---
/^223-123-45-67\.example\.net$/           OK
/\.domain\.com$/                                OK
/^223\.123\.45\.67$/                            REJECT
/^[^\.]*[0-9][^0-9\.]+[0-9]/                   450 may not be MX
---

/パターン/ 制御パラメータ
といった形式になります。
制御パラメータには,OK, REJECT, 4xx コメント, 5xx コメント, DISCARD コメント,などがあります。
4xxを指定した場合はエラーメッセージを返しメールは再送されますが,5xxを指定した場合はエラーメッセージをすぐに返し,メールは再送されません。


●送信元ドメインによるアクセス制御

ドメインによるアクセス制御は以下のようにします。

---
smtpd_sender_restrictions =
        permit_mynetworks,
        # 送信者のドメインがMX,Aレコードいずれでもない場合拒否
        reject_unknown_sender_domain,
        check_sender_access hash:/etc/postfix/sender_access,
        permit
---

reject_unknown_sender_domainもデフォルトレスポンスコードが450なので550にします。
---
unknown_address_reject_code = 550
---

sender_accessの書式はhashにしています。hashはいたって簡単。ただ,hashはpostmapコマンドでdbファイル形式に変換する必要があります。

# postmap /etc/postfix/sender_access

---
spammer@domain.com REJECT
domain.jp OK
spam.com REJECT
---


●RBLの利用

オープンリレー(第三者中継を許してしまっているサーバ)の情報を集め,データベースにしているサイトを利用して受信を拒否する設定が可能です。もし,データベースに登録されていれば受信を拒否出来ます。
設定は smtpd_client_restrictions に記述します。

---
reject_rbl_client list.dsbl.org
reject_rbl_client all.rbl.jp
---

RBL提供サイト一覧は以下のサイトで調べることが出来ます。

http://www.sdsc.edu/~jeff/spam/cbc.html

RBLサイトの中には精度に問題があるところもあるので慎重に選びましょう。


●メッセージ内容による制御

ヘッダー情報による制御を行うには以下の記述のコメントをはずし/etc/postfix/header_checksに制御したい内容を記述する。

header_checks = regexp:/etc/postfix/header_checks

# vi /etc/postfix/header_checks
---
/^X-Mailer:.*Emacs/ REJECT header_check RULE1
---

このように記述するとX-MailerにEmacsという文字を含んでいるとはじきます。またログには header_check RULE1 のコメントが書き込まれます。

同様にメッセージ内容による制御を行うには body_checks を使う。main.cfには以下のように記述する。

body_checks = regexp:/etc/postfix/body_checks

# vi /etc/postfix/body_checks

body_checksに制御したい内容を書きましょう。


●存在しないユーザ宛のメール

でたらめなユーザ宛によくきます。レスポンスコードは550になっていることを確認しましょう。

---
unknown_local_recipient_reject_code = 550
---

2007年02月21日

postfixによるSMTPサーバの構築その4

その他設定しておきたい項目をいくつか上げておきます。

●メールの配送関係の設定

何度配送しても配送できないメールの保存期間(デフォルト5日)

maximal_queue_lifetime = 1d

配送できないエラーメールの保存期間(デフォルト5日)

bounce_queue_lifetime = 1d

●メールサイズに関する設定

1つのメールで指定できる宛先の数

smtpd_recipient_limit = 50

1通のメールサイズ制限を行う

message_size_limit = 5120000 (5M)

メールボックスの最大容量

mailbox_size_limit = 51200000 (50M)

2007年10月16日

SMTP応答コード

SMTP応答コードを書いておきます。

200台と300台は正常コードです。

また,2桁目の意味は以下の通り。
x0x 文法エラー
x1x 付加メッセージ
x2x SMTP接続関連
x5x クライアント側の問題


211 System status, or system help reply
214 ヘルプメッセージ
220 準備完了
221 接続を閉じる
250 要求された処理は実行可能 完了
251 受信者が存在しないので[forward-path]に転送する
354 メールの入力開始 入力終了は「.」のみの行を送信
421 サービスは利用不能 接続を閉じる
450 メールボックスが利用できないため、要求された処理は実行不能
451 処理中にエラーが発生 要求された処理は失敗
452 記憶装置の空き領域が不十分なため、要求された処理は実行不能
500 文法に間違いがあるため、コマンドが理解できない
501 引数の文法に間違いがある
502 指示されたコマンドはこのシステムには実装されていない
503 コマンドの発行順序が間違っている
504 コマンドの引数が未定義
550 メールボックスが利用できないため、要求された処理は実行不能
551 受信者が存在しない
552 ディスク不足のため、要求された処理は実行不能
553 メールボックスの名前が不適切なため、要求された処理は実行不能
554 処理失敗

2011年09月15日

docomoへメールを送ってエラー

宛先不明の場合

The mail system

<*******@docomo.ne.jp>: host mfsmax.docomo.ne.jp[123.456.123.456] said: 550
Unknown user *****@docomo.ne.jp (in reply to RCPT TO command)

となる。
ドメイン指定拒否の場合

The mail system

<*******@docomo.ne.jp>: host mfsmax.docomo.ne.jp[123.456.123.456] said: 550
Unknown user *****@docomo.ne.jp (in reply to end of DATA command)

となる。