Upload
yaasita
View
11.254
Download
0
Embed Size (px)
Citation preview
メールサーバをちゃんとする
BPS やました
今日話すこと
● postfixは安定してるので、デフォルトでもまあ動く● 運用がおざなり● 理解も含めてちゃんとしよう
参考● 弊社
mail: 8958 sent /day
今日話すこと
1. メールサーバ(MTA)の仕事
2. reject,deferをちゃんとする
3. メールキューをちゃんとする
4. セカンダリサーバをちゃんとする
5. Webアプリ送信方法をちゃんとする
6. まとめ
1.メールサーバ(MTA)の仕事
MUA MTA MTA
送信
MDA
POP3/IMAP
MDA
SMTP SMTP
MUA・・・ thuderbird,BeckyMTA ・・・ postfix,sendmail,qmailMDA・・・ maildrop等,(MTA)
今日はこの話
1.メールサーバ(MTA)の仕事
● 配送メールを他のサーバにrelayしたりメールボックスに保存したりする自分が受け取らないメールは拒否したり
relay
MTA MTA
MTA
Mail Box
reject
1.メールサーバ(MTA)の仕事
● キュー管理メールが一時的に送れないようならあとでまた送ろう機能(postfixならデフォルトで5日間再チャレンジする)
・・・・
MTA MTA
1.メール送るよー^o^あれ返事がない?
しばらくしてから送ろう
2.キューに入れておこう
1.メールサーバ(MTA)の仕事
● エラー通知配送できなかったことを送信者に伝えるbounceメール
1.メール送るね
2.駄目受け取らない
3.ゴメン無理だったw
MTA MTA
1.メールサーバ(MTA)の仕事
ステータスコード 受信側 送信側
2xx メールを受け取ったよ。 送信成功したからキューは消しとく
4xx(応答がない場合も)
今ちょっと受け取れない 後で送ろうキューに入れておく
5xx 今後もずっと受け取らない2度と送ってくるな
キューから消してエラー通知を送信者に送る
SMTPステータスコード
3xx系は省略
2.reject,deferをちゃんとする
● reject怖い⇒ 設定ミスでrejectしたメールは失われる機械的に送られるメーリングリストから削除されるかも
● MTAはキューにためて再送する仕組み(defer)があるので、メールサーバが落ちても(大抵は)メールが失われることはない
2.reject,deferをちゃんとする
● メールサーバが落ちても慌てない(キューに溜まるのですぐには消えない)
● 誤ってrejectしてしまうほうが被害が大きいかも
2.reject,deferをちゃんとする
● 自信が無かったらすぐには上げない外部からの25番ポートへの受信を絶って落ち着いて確認する
#確認ホスト以外は25番をブロックiptables -A INPUT -s 192.0.2.0/24 -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j DROP
2.reject,deferをちゃんとする
● SMTPを手で打ってちゃんと確認
(OP25Bの影響を受けないホストから確認する)OP25B = 大抵の個人向けISPは外向き25番の通信を禁止している
telnet 192.0.2.1 25220 example.com ESMTP PostfixHELO postfix250 example.comMAIL FROM: <[email protected]>250 2.1.0 OkRCPT TO: <[email protected]>250 2.1.5 Ok
3.メールキューをちゃんとする
● 配送できなかったメールはキューに溜まるけど監視してないと異常に気付けない
nagiosとかで監視してみる
3.メールキューをちゃんとする
● キューがあるところは全部見る(実はmailmanもキューを持つ)
3.メールキューをちゃんとする
● プラグイン入れても安心しないnagiosのcheck_mailqプラグインはバグがあるpostfixだとmailqが常にゼロだと判定される(←致命的)
修正箇所
宣伝nagiosのcheck_mailqプラググインがうまく動かないときnagiosでmailmanの監視をする
3.メールキューをちゃんとする
● 雑談メールサーバの異常をそのメールサーバを使って送ろうとしない
example.comメールサーバの異常を[email protected]に送っても届かない(←あたりまえ)
3.メールキューをちゃんとする
● nagiosだと contactを新しく定義して、Gmail等の違うメールアドレスを使う
※一部抜粋 define service { host_name mail service_description SMTPS contact_groups admins_gmail check_command check_smtp } define contact{ contact_name gmail..... email [email protected], [email protected] }define contactgroup{ contactgroup_name admins_gmail alias Nagios Administrators members gmail }
4.セカンダリサーバをちゃんとする
● こんな構成のセカンダリサーバ
secondary primary
*@example.comは全部受信してprimary
に転送するだけ
4.セカンダリサーバをちゃんとする
● 一度受信するのでbounceメールを送信する責任が生じる
secondary
primary
1. [email protected]をリレーする
2. [email protected]は存在しないのでprimaryがreject
3.送信者にbounceメール
4.セカンダリサーバをちゃんとする
● 後方散乱 (backscatter) メールに利用されやすい● キューが詰まりやすい
最初からsecondaryに送信する輩も多いので、primaryが生きててもガンガン届く
4.セカンダリサーバをちゃんとする
● 後方散乱 (backscatter)
secondary
RCPT TO: 存在しないアドレスMAIL FROM: SPAM送り先
2. 送ってないのにbounceメールが届く
1. primaryに送るも拒否される
4.セカンダリサーバをちゃんとする
● キューが詰まる
secondary
RCPT TO: 存在しないアドレスMAIL FROM: 存在しないアドレス
2. 送信先がいないのでキューに溜まる
1. primaryに送るも拒否される
4.セカンダリサーバをちゃんとする
● RBL,SPFを使って怪しい人はrejectする
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination, reject_rbl_client bl.spamcop.net, reject_rbl_client sbl.spamhaus.org, reject_rbl_client all.rbl.jp, check_policy_service unix:private/policy-spf
4.セカンダリサーバをちゃんとする
● SPFの限定子はSoftFail(~)が多いので、対応できなさそうならSoftFailもrejectする
SPF例
v=spf1 include:spf01.softbank.ne.jp include:spf02.softbank.ne.jp include:spf99.softbank.ne.jp ~all
v=spf1 +ip4:203.138.203.0/24 ~all
設定例postfix-policyd-spf-python Mail_From_reject = SoftFail
5.Webアプリ送信方法をちゃんとする
● サーバにpostfix入れるの('A`)メンドクセアプリから直接送ろう⇒突然の死(Gmailアカウント停止)
config.action_mailer.smtp_settings = { :enable_starttls_auto => true, :address => 'smtp.gmail.com', :port => 587, :domain => 'example.com', :authentication => :plain, :user_name => '[email protected]', :password => '123456'}
_人人人人人人_> 突然の死 < ̄Y^Y^Y^Y^Y ̄
5.Webアプリ送信方法をちゃんとする
● サーバの死=メールの消失⇒ MAIL FROMが適当だった場合、bounceメールすら受け取れないかも
● そこでMTAですよ⇒駄目でもキューに入れてリトライしてくれる⇒キューさえ見ておけばメール消失を防げる
5.Webアプリ送信方法をちゃんとする
● sendmailコマンドで送る⇒キューの管理が出来る⇒よほどの理由がないかぎりMTAに任せたほうが無難
△ web-app → 外のMTA → 受信者○ web-app → MTA → 外のMTA(必要なら) → 受信者
※外のMTA = Gmail等config.action_mailer.delivery_method = :sendmail
5.Webアプリ送信方法をちゃんとする
● 豆知識
web-app → MTA → 外のMTA(Gmailとか) → 受信者
突然のアカウント停止!→ Gmailから「535 authentication failed 」→ 5xx系エラーだからキューに溜まらない?
postfixの粋な計らいにより例外的にキューに入れてdefer扱いにしてくれる(smtp_sasl_auth_soft_bounceオプションがデフォルトyes)
postfix△!
6.まとめ
● 監視大事⇒ MTAやMDA等キューが溜まりそうなところは全部見る⇒ 日々のbounce,reject,sent量も見ておく(普段と違うことに気付けるようにする)
● テスト大事⇒ SMTPはSimple、めんどくさがらないでちゃんと見る
6.まとめ
● 運用状況をメールで送る
毎日のbounce,deferred,rejectを見てみる
宣伝
postfixの運用状況をレポートにして送信する
6.まとめ
● SMTPを確認する⇒expectとかで工夫するとそんなに面倒じゃない
require 'pty'require 'expect'
describe "mail" do it "relay access denied" do PTY.spawn("telnet mail.example.com 25") do |r,w| w.sync = true r.expect(/ESMTP Postfix/) { w.puts "HELO postfix" } r.expect(/^250/) { w.puts "MAIL FROM: [email protected]" } r.expect(/^250/) { w.puts "RCPT TO: [email protected]" } r.expect(/^554/) { w.puts "QUIT" } r.readline.match(/Relay access denied/) end endend
メールサーバをちゃんとする
\(^o^)/オワリ