外向けのメールサーバと内部にユーザアカウントのあるサーバという構成にしたとき 外部から内部へのリレーの仕方について
---------------- --------------- |DMZ上のサーバ |-----------(F/W)-----------|内部のサーバ | ---------------- --------------- 構成
/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
/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
ここから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
で変更内容を反映させる。
そのチェックで以下のような%入りアドレスでリレーするとチェックされたときは 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!!
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(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も使える。 奥村先生参考ページ