Postfixの設定方法

更新日2023-04-05 (水) 10:03:46

メールのリレー等

外向けのメールサーバと内部にユーザアカウントのあるサーバという構成にしたとき 外部から内部へのリレーの仕方について

   ----------------                           ---------------
   |DMZ上のサーバ |-----------(F/W)-----------|内部のサーバ |
   ----------------                           ---------------
                         構成

DMZ上のサーバから内部サーバへリレー

/etc/postfix/main.cfで 以下の行(#で始まる部分以外)を記述

# TRANSPORT MAP
#
# Insert text from sample-transport.cf if you need explicit routing.
transport_maps = hash:/etc/postfix/transport

/etc/postfix/transportに2行追加

ドメイン宛(@hogehoge.ac.jp)

hogehoge.ac.jp smtp:[192.168.1.2] (又はsmtp:xxx.hogehoge.ac.jp)

その他マシンも宛ても送る(@xxx.hogehoge.ac.jp)この記述ではドメイン宛はリレーしない。(両方必要)

.hogehoge.ac.jp smtp:[192.168.1.2] 

設定が完了したら、(変更するごとに実行の必要あり)

# /usr/sbin/postmap /etc/postfix/transport

/etc/postfix/transport変更するごとに実行し、/etc/rc.d/init.d/postfix reloadも行う必要がある

postmapを実行したときのログ(/var/log/maillog)

Jan 19 11:01:00 vmware40 postfix/pickup[1987]: 9A6DD1BB8A3: uid=0 from=<root>
Jan 19 11:01:00 vmware40 postfix/cleanup[2532]: 9A6DD1BB8A3: message- id=<20070119020100.9A6DD1BB8A3@vmware40.abc-u.ac.jp>
Jan 19 11:01:00 vmware40 postfix/qmgr[1988]: 9A6DD1BB8A3: from=<root@vmware40. abc-u.ac.jp>, size=624, nrcpt=1 (queue active)
Jan 19 11:01:00 vmware40 postfix/smtp[2534]: 9A6DD1BB8A3: to=<root@vmware40.abc-u.ac.jp>, orig_to=<root>, relay=uso5004.mie-chukyo-u.ac.jp[192.244.75.246], delay=0, status=sent (250 Ok: queued as B3579A1C00B)
Jan 19 11:01:00 vmware40 postfix/qmgr[1988]: 9A6DD1BB8A3: removed

内部サーバのサーバからDMZ上へリレー

/etc/postfix/main.cf の以下の部分を編集

local_recipient_maps =
	あて先不明なメールの処理を記述するパラメータで、何も指定しないことで、あて先不明のメールを処理する。
myoriginが設定してあれはドメインなしアドレスはこの設定とは無関係に送れる
relayhost = [192.168.1.2]	デフォルトのリレーホストを指定。	
fallback_transport = smtp:[192.168.1.2]
	ローカルに登録されていないユーザへのメールを転送する先を記述。
ただし、myoriginでそのサーバに転送されるのでローカルからそのサーバに送るときは意味がない
relayhostはその他のサーバに送るときにもリレーしてくれる。
myoriginを転送先に設定すればよい。これはラウンドロビンなんかの複数サーバで同一
ドメインで受けて、存在しないユーザを別サーバに転送するときなんかに有効か?

ただし、転送先アドレスが受信できないとエラーで帰ってくる。(例えばyy@xxx.abc.ac.jpが宛先のとき転送先がxxx.abc.ac.jpを受け取れない場合)

受け取れないときののログ

Jan 19 11:14:56 uso5004 postfix/qmgr[27447]: 526BEA1C00B: from=<okada@vmware40. abc-u.ac.jp>, size=569, nrcpt=1 (queue active)
Jan 19 11:14:56 uso5004 postfix/smtp[2541]: 526BEA1C00B: to=<okada@vmware40.abc-u.ac.jp>, relay=none, delay=0, status=bounced (Name service error for name=vmware40.abc-u.ac.jp type=A: Host not found)
Jan 19 11:14:56 uso5004 postfix/cleanup[1748]: 70374A1C00C: message- id=<20070119021456.70374A1C00C@uso5004.abc.ac.jp>
Jan 19 11:14:56 uso5004 postfix/qmgr[27447]: 70374A1C00C: from=<>, size=2392, nrcpt=1 (queue active)
Jan 19 11:14:56 uso5004 postfix/smtp[2541]: 70374A1C00C: to=<okada@vmware40.abc-u.ac.jp>, relay=none, delay=0, status=bounced (Name service error for name=vmware40.abc-u.ac.jp type=A: Host not found)

たとえばuso500xなんかで自分以外ユーザに送るときTo:にabcとすればabc@abc.ac.jpとなるようにするにはmain.cfで

myorigin = abc.ac.jp

とする。もっともfromもデフォルトでは@abc.ac.jpになってしままうが・・・ また、メーラではDelivered-To:は@以降が補完されるが、To:は補完されないものもある

コマンドラインからmailコマンドで実験するときはmyoriginでTo:が補完されるので設定しておいたほうがいい。

また。myorigin設定したドメインのメールサーバに本サーバにローカルから投函されたメールが自動的に配送される。(fallback_transportの設定とは無関係に配送)

(e.g.) 宛先okadaでここに投函するとokada@(myoriginの値)というアドレスが宛先になり、(myoriginの値)サーバに転送

ドメイン等を変更して転送

abc.comにユーザabcがいない場合aaa.comに転送

[Aサーバ]  --(abc@abc.com) -->[abc.comサーバ] ==(abc@aaa.comとして) ==> [aaa.comサーバ]
local_recipient_maps = 
luser_relay = $user@aaa.com

Postfix2.xのインストール

ここからDownload.

postfixというユーザとpostfix,postdropというグループを作成。rpmで旧バージョンで インストールされているとすでに作成されている。

/etc/passwd

postfix:x:128:128:postfix:/var/spool/postfix:

/etc/group

postfix:x:128:
postdrop:x:129:
$ tar zxvf postfix-2.2.5.tar.gz
$ cd postfix-2.2.5
$ make (./configureはしない)
make -f Makefile.in MAKELEVEL= Makefiles
(echo "# Do not edit -- this file documents how Postfix was built for your  machine."; /bin/sh makedefs) >makedefs.tmp
set +e; if cmp makedefs.tmp conf/makedefs.out; then rm makedefs.tmp; \
else mv makedefs.tmp conf/makedefs.out; fi >/dev/null 2>/dev/null

(略)
[src/tlsmgr]
gcc -Wmissing-prototypes -Wformat  -g -O -I. -I../../include -DLINUX2 -c  tlsmgr.c
gcc -Wmissing-prototypes -Wformat  -g -O -I. -I../../include -DLINUX2 -o tlsmgr tlsmgr.o ../../lib/libmaster.a ../../lib/libtls.a ../../lib/libglobal.a ../../ lib/libutil.a -ldb -lnsl -lresolv
cp tlsmgr ../../libexec

$ su
# /etc/rc.d/init.d/postfix stop
# /etc/rc.d/init.d/pop-before-smtp stop
# make upgrade (make installをするとインストール先等いろいろ聞かれるが、
        upgradeだと現在の/etc/postfix/main.cfから判断してくれる。
                rpmインストールされているときは upgradeが簡単)

set -e; for i in src/util src/global src/dns src/tls src/master src/postfix   
src/smtpstone src/sendmail src/error src/pickup src/cleanup src/smtpd src/local
src/lmtp src/trivial-rewrite src/qmgr src/oqmgr src/smtp src/bounce src/pipe
src/showq src/postalias src/postcat src/postconf src/postdrop src/postkick src/
postlock src/postlog src/postmap src/postqueue src/postsuper src/qmqpd src/
spawn src/flush src/verify src/virtual src/proxymap src/anvil src/scache src/
discard src/tlsmgr; do \
 (set -e; echo "[$i]"; cd $i; make 'CC=gcc -Wmissing-prototypes -Wformat '   update MAKELEVEL=) || exit 1; \
done
[src/util]

(略)

Editing /etc/postfix/master.cf, adding missing entry for discard service
Editing /etc/postfix/master.cf, adding missing entry for tlsmgr service

    Note: the following files or directories still exist but are no
    longer part of Postfix:
 
     /etc/postfix/pcre_table /etc/postfix/regexp_table

You have mail in /var/spool/mail/okada

/etc/postfix/main.cf を編集
/etc/postfix/aliases に root: 自分のアカウント名 を追加

# /usr/sbin/postfix check
(何も帰らない)
# /etc/rc.d/init.d/postfix start
# /etc/rc.d/init.d/pop-before-smtp start

運用設定

インストール後に設定するファイルは/etc/postfix/main.cfで 以下の内容ように設定する

mydomain = abc.ac.jp
以下の2つは送り元にホスト名を入れるか否かを決める
myorigin = $myhostname <:---user@xxx.domain.jp
myorigin = $mydomain   <:---user@domain.jp
mydestination = $myhostname, localhost.$mydomain
(もし、ドメインのメールサーバにして、ドメイン宛てのメールを受け取るときは
mydestination = $myhostname, localhost.$mydomain, $mydomain
とする)
mynetworks = 192.xxx.xxx.0/24, 127.0.0.0/8, 10.0.0.0/8
smtpd_recipient_restrictions = permit_mynetworks,reject_non_fqdn_recipient,
      check_client_access hash:/etc/postfix/pop-before-smtp,
      check_relay_domains
(pop-before-smtpの設定)
relayhost = mail.abc.ac.jp
(リレーホストの設定)
#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version) (Vine Linux)
smtpd_banner = $myhostname ESMTP $mail_name
(これはメールサーバの素性をあかさないための設定

#Edit by JE2ISM
##allow_percent_hack = no
allow_percent_hack = yes

#Edit by JE2ISM
# Limit Mssege 30MB
message_size_limit = 31457280
(一度に送れるメッセージサイズのMax default:10MB)
# MailBox Size 400MB
mailbox_size_limit = 409600000
(MailBoxの最大容量 default:50MB)

メールアドレスが間違っているとき「unknown user: "f05999"」 のようなメッセージを送信元に返すときは

unknown_local_recipient_reject_code = 550

rejectするだけで送信元にメッセージを返さないなら

unknown_local_recipient_reject_code = 450
550:メールで拒否を通知(reject mail) 450:一定時間後に再試行(try again later)

以下のようなパラメータも追加できる

disable_vrfy_command=yes
vrfyコマンドを無効にする。vrfyコマンドとはユーザーが存在するかどうか問い合わせるためのもの
smtpd_helo_required=yes
helo/ehloコマンドを要求する。helo/ehloコマンドは接続元のホストを識別するための
コマンド。自らのホスト名を通知しない接続を拒否するように設定しておく。
strict_rfc821_envelopes=no
RFC821の形式に合わないアドレスは拒否する。RFC821はSMTPによるメール転送を定めた 規格。

スパム対策

ただし、これを行うと全てそれらのサイトからのメールを拒否するので注意

maps_rbl_domains=relays.ordb.org

rblとは不正中継を行う可能性があるサイトのブラックリスト

smtpd_client_restrictions=reject_maps_rbl, reject_unknown_client
reject_maps_rblは上で指定したブラックリストに登録されたホストからの接続を拒否
reject_unknown_clientはnameの逆引きができないとき接続を拒否するせって

同時に送れるメッセージの制限

default_destination_concurrency_limit
パラメータ (デフォルト: 20) は同じ配送先に同時に送ることができるメッセージの
数 メッセージ1件ごとにコネクション張るには1にする

特定の配送チャネル (local, smtp, uucp 等)に対して上書きすることができる

local_destination_concurrency_limit パラメータは 同じローカル受信者に対して
同時に配送するメッセージの数を制御します. 2くらいが推奨

変更後は

# /etc/rc.d/init.d/postfix reload

で変更内容を反映させる。

リレーチェックをしてくれるサイトRBL.JP

そのチェックで以下のような%入りアドレスでリレーするとチェックされたときは main.cfの

allow_percent_hack = no

allow_percent_hack = yes

にする。

[リレーチェックの結果] 中継テスト その6

>>> RSET
<<< 250 Ok
>>> MAIL FROM: <spamtest@xxx.xxx.xx.xxx>
<<< 250 Ok
>>> RCPT TO: <relaytest%rbl.jp@[xxx.xxx.xx.xxx]>
<<< 250 Ok
relay accepted!! 

spam対策

Headerでチェック

main.cfに

#header_checks = regexp:/etc/postfix/header_checks

のコメントをはずす

/etc/postfix/header_checks に

# It refuses by a partner's subject.

/^Subject: je2ism/       REJECT
(Subject欄がje2ismで始まるメールを拒否)

# It refuses in a FROM address.

#/^From: okada/          REJECT
(From欄がokadaで始まるメールを拒否)
/^From:.*<#.*@.*>/ REJEC
(From欄が何もないメールは拒否)
/^From: .*@abc.ne.jp/        REJECT
(From欄がabc.ne.jpからのメールは拒否)

本文でチェック

main.cfに

body_checks=regexp:/etc/postfix/body_checks

を追加 /etc/postfix/body_checksに

/spam/REJECT
(本文中にspamというキーワードがあればメールを拒否)
/name=.*\.scr/  REJECT
(添付ファイルが.scrが含まれればメールを拒否)

変更後は

# /etc/rc.d/init.d/postfix reload

を実行

別ドメインのメールも受け取れるようにする

/etc/postfix/main.cfの

mydestination = $myhostname, localhost.$mydomain, $mydomain, abc.ne.jp
                                                            ^^^^^^^^追加ドメイン
にドメイン名を追加する。
IPアドレス指定は[192.168.1.1]のように指定する

送られたメールアカウントでコマンドを実行するには

/etc/postfix/aliasesに

(アカウント名): "|(コマンドパス)"
comingout: "|/home/postgres/comingout/perl/comingout.pl"
のように記入する

DDNS

DDNS(dyndns.org)のMail Exchanger (optional)に指定 したメールを受け取るときにも必要。 例えば

Mail Exchanger (optional): abc.ne.jp

と設定すると

wwwism.dyndns.org.   86400INMX10 abc.ne.jp.

とDNSに書かれ、 abc.ne.jpにwwwism.dyndns.org宛てメールが転送される。 Backup MX?:DDNSのIPにもメールを転送するときにチェックを入れる。普通はチェックの必要なし。

自宅にメールサーバを立ち上げルータでPort25(smtp)をフォワードさせるときはMail Exchanger:にwwwism.dyndns.orgとしてpostfixの設定をwwwism.dyndns.orgも受信可能にするとokada@wwwism.dyndns.orgでメールが受け取れる。

自宅のサーバをsmtpサーバに設定

main.cfを

myhostname = pc85xxxx.axxgo2.ne.jp  <---DHCPで割り振られたHost名

mydomain = axxgo2.ne.jp     <---プロバイダのドメイン名

mydestination = $myhostname, localhost.$mydomain $mydomain

mynetworks = 168.168.10.0/24, 127.0.0.0/8

relayhost = mail.axxgo2.ne.jp    <---プロバイダのsmtpサーバ

キューの表示

$ mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
2932C2DEA16*    2761 Fri Jan  6 03:20:03  MAILER-DAEMON
                                         info@mail.uzwr.com

1C34F2DEA53*    2655 Fri Jan  6 06:48:21  MAILER-DAEMON

                                         info@mail.wubv.com
(略)

63E992DE9F1     7372 Fri Jan  6 02:38:31  MAILER-DAEMON
                 (connect to rothen.net[216.168.224.70]: Connection timed out)
                                         colmonr@rothen.net
6B76F2DEA1C     5917 Thu Jan  5 21:24:13  MAILER-DAEMON
(host mx1.mail.yahoo.co.jp[202.93.77.231] said: 421 VS14-RT5 Mailbox bounce  arrival rate exceeds system limit (#4.2.2))
                                         fkirij798@yahoo.co.jp
-- 1471 Kbytes in 202 Requests.

キュー削除

Postfix2.1以降なら、

bounce_queue_lifetime = 86400

でユーザが出したメールとは別に、bounceした結果作成されるメールがキューに留まる時間を制御。デフォルトは5日(432000 MAX:8640000)

その他のキュー関係

queue_run_delay (デフォルト: 1000 秒) 

キュー マネージャが遅延メールのキューをスキャンする頻度。

maximal_queue_lifetime (デフォルト: 5 日) 

メッセージが 配送不能として送り返されるまでにキューに留まる期間。

minimal_backoff_time (デフォルト: 1000 秒) 

メッセージが 検索されない最小時間および「死亡」配送先に手を出さない最小時間。

maximal_backoff_time (デフォルト: 4000 秒) 

配送に 失敗してからメッセージを見ない最大時間。

(手動で対処) mailq と打ち込んで,キューにメールが数百 以上たまっていたら,

mailq | grep MAILER-DAEMON | sort +3 > hoge

とかして,数時間以上たった MAILER-DAEMON からのメールのキューについては,

postsuper -d キュー番号
# /usr/sbin/postsuper -d 8B3296529B
postsuper: 8B3296529B: removed
postsuper: Deleted: 1 message

でメールキューから削除,通常ユーザ権限でかまいませんので sendmail -q を実行すれば,キューにたまったメールを全て配送する

メッセージの内容表示

postcat -q QUEUE_ID

メッセージキューの強制転送(全部)

postfix flush

不明な宛先にバウンスさせない

自分のサーバ存在しないアカウント宛のメールを受けないようにする これで、メールアドレスを詐称された無実の人にも無用なエラーバウンスを出さなくなる

main.cf

local_recipient_maps = $alias_maps unix:passwd.byname

2.xはデフォルトでOn 1.xも使える。 奥村先生参考ページ


元ページ

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS