15.電子メ−ル・サ−バの設定 15-1. メ−ルリレ−構成の基本と運用 (1) 電子メ−ルの用語を再確認する `22/04 * メ−ルサ−バ/メ−ルクライアント メ−ルの用語について、"14-1. 電子メ−ル設定の基本 (1) メ−ル配送の仕組み" の最初 のところで一応定義してみたのだが、どうもまだ混乱している。今一度整理確認してみた い。ちょうど商用 Sendmail がうまい言い方をしている、これにならうことにしよう。メ −ルリレ−やメ−ルゲ−トウェイやはたまたメ−ルエクスチェンジャ−とこれまでいって きたのは、"メ−ルリレ−"。内部ネットワ−クにあって、 "メ−ルリレ−" からメ−ルを 受けるのは、"メ−ルストア" とする。"メ−ルリレ−" で外とのメ−ルのやりとりをして、 "メ−ルストア" に送る構成の場合である。"メ−ルリレ−" と "メ−ルストア" を1つの ホストでまかなう場合は、"メ−ルホスト" ということにしよう。 これら総称してメ−ル サ−バということにする。 "メ−ルストア" から更に部門用の "メ−ルストア" にメ−ル を送る場合、部門用のは特に "メ−ルハブ" と呼ぶことにしよう。 "メ−ルハブ" はサブ ドメイン構成の場合にも、部門用の "メ−ルストア" として呼ばれるようである。 更に MTA( Message Transfer Agent )、MUA( Mail User Agent )という用語も昔からある。 MTA は単純にはメ−ルサ−バのことである。sendmail や qmail などが稼働しているわけ である。しかしメ−ルサ−バというのは、2者の間で一方がサ−バならもう片方はクライ アントになっているのである。メ−ルを送る側のメ−ルサ−バは、クライアントの働きを していて、メ−ルを受ける側のメ−ルサ−バはまさにサ−バの働きをしているわけである。 このため MTA と一口にいっても役割は二通りあり、MUAである場合もあることに注意した い。メ−ルを送るだけのソフトは MUA、メ−ルクライアントという。Outlook Express と か Eudro 一杯あるのがそれである。これらのソフトはメ−ルを送るのは SMTPで、受ける のは POP である。"メ−ルストア" では POP サ−バが稼働していて、ユ−ザは MUA でメ −ルを取り出すことになる。あるいはユ−ザに sendmail などでメ−ルを直接配送する。 * メ−ルのリレ−とか中継の意味 -------------------------------------------------------------------------------- メ−ルをリレ−する、同じ意味での中継、これらはメ−ルを受け付けると解釈したらどう か。まだよそにメ−ルを転送するというイメ−ジでなくてだ。 -------------------------------------------------------------------------------- メ−ルサ−バ、ここで具体的にいうならば、メ−ルリレ−ではメ−ルが外からやって来た ものか、内から来たものなのか、そもそも区別することができない。これが sendmail.cf などで、SPAM対策やメ−ルの中継制限の設定に頭を悩ませる原因になっている。外か ら来たと想定したメ−ルはどうする、内部ネットワ−クから来たと想定したメ−ルはどう する。外、内を区別するのは SMTP プロトコルの MAIL FROM: でどこから、 RCPT TO: で どこへ。しかし Telnet でメ−ルを送って見れば分かるように、 MAIL FROM: のメ−ルア ドレスなどどないにでもなる。IPアドレスでも制限できるというが、POP によりプロバ イダを経由する場合は、そのプロバイダから発するメ−ル全部を制限することになってし まう。無い知恵絞って、ここら辺りまとめてみたが、どうもまだすっきりしない気がする。 [ よそ ] xxx@aaa.com から xxx@ccc.com へ ccc.com へ -------------- ----- ↑ ----||----------|メ−ルサ−バ|--------|MUA| [ 自サイト ] \ / -------------- ----- \ / xxx@bbb.com から xxx@nix.co.jj へ nix.co.jj -------------- -------------- ----- nix.com |メ−ルリレ−|------||----------|メ−ルサ−バ|--------| | -------------- -------------- ----- | ----- -------------- ------------ ----- |MUA|-----------|メ−ルストア|------|メ−ルハブ|--------|MUA| ----- POP → -------------- ------------ ← POP ----- ・メ−ルリレ−は aaa.com からのメ−ルは受け取る。 ccc.com ドメイン用の予備のメ −ルサ−バになってあげる場合。ccc.com ドメインの DNS の設定で、MX レコ−ドを 自サイト nix.co.jj をセカンダリ指定( MX レコ−ド追加し値を大きく )している。 ・メ−ルリレ−は bbb.com からのメ−ルは受け取らない。 bbb.com はSPAMメ−ル を送り付けてくるサイト。 または特定ユ−ザのアドレス katou@bbb.com からのメ− ルを受け取らない。ホスト名やIPアドレスでも制限できる。 ・メ−ルリレ−は nix.co.jj 宛のメ−ルは受け取る。 nix.co.jj は自サイトのドメイ ンである。nix.com 宛のメ−ルも受け取る。nix.com は自サイトのもう1つのドメイ ンである。バ−チャルドメイン設定の場合など。 ・メ−ルリレ−は nix.co.jj と nix.com からのメ−ルを受け取る。これはメ−ルスト アから来ることを想定してのことである。メ−ルリレ−とメ−ルストア間のメ−ル転 送は、お互いあらかじめホストを特定してのことになる。 他ドメインへ これがSPAMとなる ↑ 外出先の社員など ↑ MTA Relay ● ←― □ MUA、メ−ルクライアント ● ←― ■ 相手メ−ルサ−バ/ |↓ |↓ メ−ルクライアント MTA Store ○ 自ドメイン宛のメ−ル ○ 通常に来たメ−ル << case1 >> << case2 >> * 配送と転送、送信/受信、配信の用語 配送と転送は、機械的にメ−ルを送るような場合に先ず用いることにしよう。sendmailデ −モンが相手 MTA にメ−ルを送るのは配送。転送はともかく、 他のメ−ルアドレスに送 る場合のこととしよう。~/.forward ファイルで自動的にメ−ルを、 他のメ−ルアドレス に送るのはもちろん転送である。メ−ルリレ−とメ−ルストア間のやりとりは、どう呼ぶ のがふさわしいか。メ−ルを右から左へ流すということでは、メ−ルの中継である。また 大きく見れば配送でもある。時として使い分けることにしよう。配信というのは、電子メ −ルの用語としてはそぐわないような気がする。ファックスを配信するというような場合 にはいいような気がするが、使わないようにしよう。送信/受信はメ−ルを人が送るとか 受けるとかいう場合に用いることにしよう。メ−ルのクライアントでの操作である。 * IIJ の小冊子からの話 `25/08 「iij.news」2005/3-4, vol.69, "spamからメ−ルを守れ(管理者編)"。IIJはsendmail を使っている。sendmail は Postfix や qmail の台頭に刺激され、最新版ではSMTP AUTH や TLSなどの新機能も入ってきている。メ−ルサ−バという用語の確認と整理をしておく。 MUA(Mail User Agent), MSA(Message Submission Agent), MTA(Mail Transfer Agent), MDA(Mail Delivery Agent), MRA(Mail Retrieval Agent)。 役割をちゃんと分けようとい うこと。それにより設定が単純明快になる。最近 MSA は25番ポ−トではなく、Message Submission Agent (RFC2476)で、定義された587番ポ−トを使う場合も増えてきている。 ポ−ト番号は違っても、やりとりするプロトコルは SMTPそのものである。sendmail でも Maildir 形式のメ−ルボックスは利用できる。メ−ルボックスの形式は MTAには依存せず、 MDA と MRA に依存する。オライリ−の「sendmail クックブック−設定と運用のためのレ シピ集」がお勧めである。その後の続編の記事もぜひ参考にされたい。 (2) ファイアウォ−ル対応の構成 '96 -------------------------------------------------------------------------------- ファイアウォ−ルを介して外と内のメ−ルサ−バで構成する。いわゆるメ−ルリレ−構成。 -------------------------------------------------------------------------------- * ホストの構成 メ−ルリレ− | ※ 電子メ−ルは taro@nix.co.jj という ------- DNS -------- ようなアドレスで入って来るとする。 |hostA| MX hostA |Router| ------- -------- パブリックIPアドレス | | ----*-----*-------------*---------------------- バリアネット nix.co.jj | ------- IPパケットを通さない |hostG| ファイアウォ−ル ------- | ----------*-----*------------*-----------*----- 内部ネットワ−ク | | | ------- ------- ------- プライベ−トIPアドレス |hostB| |hostC| |hostD| ------- ------- ------- メ−ルストア メ−ルクライアント hostA のIPアドレス、 それに hostG のバリアネット側インタ−フェ−スのIPアドレ スはパブリックなIPアドレスである。他のホストはプライベ−トなIPアドレスで管理 されることになる。インタ−ネット向けの DNS には、hostA と hostG のみの情報があれ ばよい。内部ネットのホスト管理は DNS でも /etc/hosts でもいいが、 管理を簡素化す るため /etc/hosts による管理を行うものとする。 hostC、hostD はEWSを想定してい て、sendmail によりメ−ルストアから直接メ−ルが配送されるとする。 あるいはメ−ル ストアのホストで POP サ−バを稼働させ、POP アクセスにより、 メ−ルストアへ定期的 にメ−ルを取りに行ってもいい。POP はメ−ルクライアントのホストが、Windows や Mac の場合に使われる。Windows や Mac では sendmail は動かない。 * 電子メ−ルの配送経路 外部からの電子メ−ルは hostA か hostG のどちらかで受けることになる。hostA で受け ると内部ネットのホストに配送するため、hostG ではメ−ルを中継する細工が必要になる。 hostG で受ければ、そのまま内部ネットのホストに配送することが可能となる。 しかし、ここでは直接 hostA や hostG から電子メ−ルを各ユ−ザのホストに配送するの でなく hostB へ中継し、ここから配送することにする。 このようにメ−ルサ−バを二段 構えにすることによって、全体のメ−ル配送の信頼性を上げることができる。 外部からの電子メ−ルは MX レコ−ドに指定した hostA が受けて、すぐ hostB へ中継す るようにする。そして hostB から各ホストへメ−ルを配送する。この配送は DNS でなく、 /etc/hosts を見る sendmail により行うものとする。 内部ネットから外部への電子メ−ルは、先ずはメ−ルストアに送る。そしてメ−ルリレ− に中継し、ここから外部へ配送することになる。 メ−ルサ−バの二段構えの構成は、メ−ルリレ−のホストのメンテナンスする際に都合が いい。hostA の sendmail や named のプログラムをバ−ジョンアップするのに、 一時的 に hostA を止めたりする。その場合でもメ−ルストアは有効にしておくことができる。 * メ−ル送受信の記録ログについて `23/06 当初 hostA, hostB 共でメ−ルの記録ログを取っていた。特にそう意図して取っていた訳 でもない。sendmail.cf は CF ツ−ルなどで作成すると、ほぼ間違いなくメ−ル送信のコ マンドで、mail -d などとログを出すようになっている。それで、さらに /etc/hosts フ ァイルに loghost があると SunOS 4.1.x 並びに Solaris 2.x では /var/log/syslog フ ァイルにログを吐き出すようになる。hostB は最初、SunOS 4.1.x を充てていた。ディス ク容量が少なく、ログを取るのはしばらくして止めた。止めるのは簡単で /etc/hosts の 中の loghost を削るだけである。それからは hostA のメ−ルリレ−のホストだけでログ を取っている。毎日曜の午前3時10分にログを更新するようになっている。hostA では /var/log/syslog がアクティブで現在のログが取られ、クロ−ンによる更新作業で順に送 られ syslog.0 から syslog.7 までファイルは残る。 syslog.7 は次の更新で消去される ことになる。つまりログは8週分、コンピュ−タに記録されることになる。 ログは hostB では、今後も取るつもりはない。社内間のメ−ルの送受の記録は hostB で しか取ることができない、社外間のメ−ルの記録は取ることはできる。hostA でも社外間 の記録を取ることができる。それで十分だろう。特に社内間の記録まで取る必要があると は思えない。記録を取るのは、あくまでも何らかのトラブルが起きた場合ヘの備えである。 8週分残しておけばそれで十分だろう。決して、メ−ル利用者の検閲をするためではない。 上部から検閲を強要されるようなことがあったら、貴方は技術者の良心に従ってログを消 去しなければならない。hostA のメ−ルの記録ログは今のところ、hostA にそのまま取る ようになっている。hostA はWWWサ−バのホストでもあり外に向いている。DMZ 上に置 いているとはいえ、より安全を期してログは内部に転送するようにしたらどうか。メ−ル のやり取りの相手も、やはり情報漏洩から守るべき対象だろう。 転送する先は hostB で もいいだろうし、管理者専用のコンピュ−タでもいいだろう。 [ hostA メ−ルリレ−での設定 ] /etc/syslog.conf --------------------------------------------------------- | | |mail.debug ifdef(`LOGHOST', /var/log/syslog, @loghost) | | ↑ | /etc/hosts ――― -------------------------------------------|-- |127.0.0.1 localhost ↓ |202.241.128.3 hostA mail.nix.co.jj loghost |192.168.1.1 hostB /var/spool/cron/crontabs/root ------------------------------------------ |10 3 * * 0,4 /etc/cron.d/logchecker |10 3 * * 0 /usr/lib/newsyslog << /var/log/syslog.0 から 7 まで回す。 |15 3 * * 0 /usr/lib/fs/nfs/nfsfind |1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1 ・前から分 時 日 月 曜日を表わす。10 3 * * 0 は、毎日曜の午前3時10分。 ・/etc/rc2.d/S75cron で /usr/sbin/cron デ−モンが動く。 (3) メ−ル配送の等価テスト '96 -------------------------------------------------------------------------------- これは1996年当時、まだインタ−ネット接続する前に、メ−ルリレ−構成のメ−ルサ −バの設定をどうすればいいか検討、テストしたものである。ファイアウォ−ルのソフト もない状態で、メ−ルリレ−とメ−ルストアの機能に着目し、等価的なテストを行なった。 -------------------------------------------------------------------------------- * テスト構成 DNS は本当は hostA におきたいが、とりあえず hostG におくこととする。これでも上記 の配置と電子メ−ルの設定に関しては等価である。 hostname はそれぞれドメイン部のな い hostG, hostB, hostC, hostD とする。 メ−ルリレ− メ−ルストア メ−ルクライアント --------- --------- --------- --------- | hostG | named | hostB | | hostC | | hostD | --------- --------- --------- --------- INDY | .1 Apollo | .2 INDY | .3 Sun 4.1.x | .4 ------------------------------------------------------------------- 192.9.200.0 taro, netmaster ユ−ザ jiro, hana yosi sendmail sendmail sendmail sendmail sendmail.cf sendmail.cf sendmail.cf sendmail.cf resolv.conf /etc/hosts /etc/hosts /etc/hosts * hostG の設定 /etc/named.boot -------------------------------------------------------- |cache . /etc/named.ca |primary nix.co.jj /etc/named.hosts |primary 200.9.192.in-addr.arpa /etc/named.rev |primary 0.0.127.in-addr.arpa /etc/named.local /etc/named.hosts DNS の管理者用メ−ルアドレス ------------------------------------------- | --------- |$ORIGIN nix.co.jj. ↓ | IN SOA hostG.nix.co.jj. netmaster.hostG.nix.co.jj. ( | 1996040101 3600 300 3600000 360000 ) | IN NS hostG.nix.co.jj. | IN MX 0 hostG.nix.co.jj. |localhost. IN A 127.0.0.1 |hostG IN A 192.9.200.1 << hostG レコ−ドだけ記述した。 /etc/named.rev -------------------------------------------------------- |$ORIGIN 200.9.192.in-addr.arpa. | IN SOA hostG.nix.co.jj. netmaster.hostG.nix.co.jj. ( | 1996040101 3600 300 3600000 360000 ) | IN NS hostG.nix.co.jj. |1 IN PTR hostG.nix.co.jj. << hostG レコ−ドだけ記述した。 /etc/named.local -------------------------------------------------------- |$ORIGIN 0.0.127.in-addr.arpa. | IN SOA hostG.nix.co.jj. netmaster.nix.co.jj. ( | 1996040101 3600 300 3600000 360000 ) | IN NS hostG.nix.co.jj. |1 IN PTR localhost. /etc/named.ca -------------------------------------------------------- |nix.co.jj. 9999999 IN NS hostG.nix.co.jj. |hostG.nix.co.jj. 9999999 IN A 192.9.200.1 /etc/resolv.conf -------------------------- |hostresorder local bind |nameserver 192.9.200.1 /etc/hosts -------------------------------------- |192.9.200.1 hostG hostG.nix.co.jj |192.9.200.2 hostB /etc/sendmail.cf 万能 sendmail.cf.relay -------------------------------------------------------------------- |################################################################### |# |# 万能 sendmail.cf ファイル [ ftp.tic.com の m4 ファイル参考 ] |# |# メ−ルリレ−専用。サブドメインは対応しない。 |# |# Apollo SR10.4, SunOS 4.1.2-JLE, 4.1.4-JLE, Solaris 2.5.1, |# INDY IRIX 5.3 で使用を確認。uucp のメ−ル配送はサポ−トしない。 |#------------------------------------------------------------------ |# |# Dj$w.$D 部は注意が必要。hostname が FQDN の場合はこのまま。 |# hostname が FQDN でない場合は Dj$w とする。sendmail-8.8.x を |# 使う場合は FQDN 関係なく Dj$w とすること。 |# |# This sendmail.cf was written refered to m4 sendmail.cf |# in ftp.tic.com public directory. Original file are |# Copyright (c) 1993 by Texas Internet Consulting. |################################################################### |DVnix.1.0 |# |# [ 共通、ドメイン名が nix.co.jp の例 ] |# |DDnix.co.jj |Dj$w.$D << ホスト名はドメイン部を含まない。 |DMtcp | | |# ----------------------------------------------------- |# メ−ルゲ−トウェイのホスト用は、この間コメントにする。 |# ル−ルセット0が効かないようにするため。 |# ----------------------------------------------------- |#R$*<@[$+]> $#$M $@[$2] $:$1 |#R$*<@$j>$* $1<@>$2 |#R$*<@$=U.uucp>$* $1<@>$3 ------------------------------ |#R$*<@$D>$* $1<@>$2 | 万能 sendmail.cf で メ−ル | |#R$*<$*.>$* $1<$2>$3 | ゲ−トウェイと書かれている | |#R<@>:$* $@$>29$1 | ところは、メ−ルリレ−と読 | |#R$*<@> $@$>29$1 | み替えて下さい。 | |#R$*<@$w> $@$>29$1 ------------------------------ |#R<@$j>:$+ $@$>29$1 | |R$* $:$>9 $1 | |# [ 1. メ−ルゲ−トウェイのホスト用 ] この2行、下に注意書きあり |# ↓ |R$*<@$D> $#$M $@hostB $:$1<@$D> << taro@nix.co.jj を評価する。 |R$*<@$+.$D> $#$M $@hostB $:$1<@$D> << netmaster@hostG.nix.co.jj を評価する。 | |R$*<@$+>$* $#$M $@$2 $:$1<@$2>$3 |R$+%$+ $@$>29$1@$2 << ここはコメントにするとおかしくなる。 |R$+ $#local $:$1 << % Mail -v taro@nix.co.jj << 内部ネット内のユ−ザに電子メ−ルを打 % Mail -v taro << つ。指定はどちらでもよい。 注.sendmail.cf の注意 [ 1. メ−ルゲ−トウェイのホスト用 ] のすぐ下の2行を、次のように1行にまとめよう としてもできない、R$*<@$*.$D> $#$M $@hostB $:$1<@$D>。 netmaster@hostG.nix.co.jj はいいが、taro@nix.co.jj はダメになる。<@$*.$D> ここの $Dは nix.co.jj にマッチし、 $* 部は文法的に0個以上のト−クンを評価するはずで、@hostG.nix.co.jj も@nix.co.jj もマッチするはずなのだが、どうもうまくいかない。 * hostB の設定 : /etc/hosts 制御 ( メ−ルストア、Apollo ) /usr/lib/aliases ------------------------------------- |taro:taro@hostB.nix.co.jj << ドメイン部は付けても付けなくても構わ |jiro:jiro@hostC.nix.co.jj ない。hana:hana@hostC でもいい。 |hana:hana@hostC.nix.co.jj |yosi:yosi@hostD.nix.co.jj |netmaster:netmaster@hostB.nix.co.jj << DNS 管理者用。 /usr/lib/sendmail.cf 万能 sendmail.cf.relay -------------------------------------------------------- |DDnix.co.jj |Dj$w.$D |DMtcp | | |# ----------------------------------------------------- |# メ−ルゲ−トウェイのホスト用は、この間コメントにする。 |# ル−ルセット0が効かないようにするため。 |# ----------------------------------------------------- |R$*<@[$+]> $#$M $@[$2] $:$1 |R$*<@$j>$* $1<@>$2 |R$*<@$=U.uucp>$* $1<@>$3 ------------------------------ |R$*<@$D>$* $1<@>$2 | 万能 sendmail.cf で メ−ル | |R$*<$*.>$* $1<$2>$3 | サ−バ書かれているところは | |R<@>:$* $@$>29$1 | メ−ルストアと読み替えて下 | |R$*<@> $@$>29$1 | さい。 | |R$*<@$w> $@$>29$1 ------------------------------ |R<@$j>:$+ $@$>29$1 | |R$* $:$>9 $1 | |# [ 2. メ−ルサ−バのホスト用 ] |# |#R$*<@$+.$D>$* $#$M $@$2 $:$1<@$2.$D>$3 << 初めこれだった。下のに修正した。 |R$*<@$-.$D>$* $#$M $@$2.$D $:$1<@$2.$D>$3 << 内部ネットのメ−ルの配送用。 | |R$*<@$+>$* $#$M $@hostG $:$1<@$2>$3 << メ−ルリレ−にメ−ルを中継する。 |R$+%$+ $@$>29$1@$2 |R$+ $#local $:$1 /etc/resolv.conf なし。 /etc/hosts ------------------- |192.9.200.1 hostG |192.9.200.2 hostB |192.9.200.3 hostC |192.9.200.4 hostD $ /etc/nmconfig -h hostent_ascii << これらはApollo $ /etc/mkhosts /etc/hosts << 特有の処置です。 注.sendmail.cf の注意 aliases ファイルと sendmail.cf の記述の組み合わせで、 内部ネットへの電子メ−ルの 配送は次の場合も有効ではある。 内部ネットのメ−ル配送用の部分で <@$->$* の $- は ちょうど1個のト−クンを評価する。ここに来るまでル−ルセットを設定したり aliases の評価をして、アドレスの書き換えが行われる。 $- のちょうど1個のト−クンは例えば、 ユ−ザ taro の aliases で taro@hostB になった hostB を評価することになる。よって このような設定でも問題はない。 /usr/lib/aliases ----------------- |taro:taro@hostB << ドメイン部が入っていないことに注意。これでもOK。 * hostC の設定 : /etc/hosts 制御 ( メ−ルクライアント、INDY ) /etc/sendmail.cf 万能 sendmail.cf.relay -------------------------------------------------------- |DDnix.co.jj |Dj$w.$D << ここ注意。 |DMtcp |FL/etc/local_names |DRhostB | | |# ----------------------------------------------------- |# メ−ルゲ−トウェイのホスト用は、この間コメントにする。 |# ル−ルセット0が効かないようにするため。 |# ----------------------------------------------------- |R$*<@[$+]> $#$M $@[$2] $:$1 |R$*<@$j>$* $1<@>$2 |R$*<@$=U.uucp>$* $1<@>$3 |R$*<@$D>$* $1<@>$2 |R$*<$*.>$* $1<$2>$3 |R<@>:$* $@$>29$1 |R$*<@> $@$>29$1 |R$*<@$w> $@$>29$1 |R<@$j>:$+ $@$>29$1 |R$* $:$>9 $1 | |# [ 3. メ−ルクライアント用 ] |# |R$=L $#local $:$1 |R$+ $#$M $@$R $:$1 /etc/local_names ----------------- |jiro |hana /etc/resolv.conf -------------------- |hostresorder local << この設定を注目されたし。 /etc/hosts -------------------- |192.9.200.3 hostC |192.9.200.2 hostB |#192.9.200.1 hostG << hostG, hostD はなくても構わない。メ−ルストアの hostB |#192.9.200.4 hostD << さえ分かれば、電子メ−ルは hostD に届く。 * hostD の設定 : /etc/hosts 制御 ( メ−ルクライアント、SunOS 4.1.x-JLE ) ・sendmail のプログラムはNIS用のを使う。 ・sendmail.mx では /etc/hosts を見ない。 ・sendmail.cf は hostCと同じ内容とする。 ・/etc/resolv.confファイルはなしにする。 /etc/hosts -------------------- |192.9.200.4 hostD |192.9.200.2 hostB /etc/local_names ----------------- |yosi (4) メ−ル運用のトラブルと対策 `22/10〜 -------------------------------------------------------------------------------- 以下 Solaris 2.6 で sendmail-8.12.5 で cf 作成ツ−ル利用による sendmail.cf 使用。 -------------------------------------------------------------------------------- * メ−ルストアのディスクが一杯になった場合 メ−ルの添付は、1メガ位までにお願いしますと、本書の管理者さんは通達を出している とは思う。しかし、1クリックで添付できてしまうので、気なしに PowerPoint や Excel などのでかいファイルを Cc で社内の何十人もに送ってしまう輩がいる。あげく、メ−ル サ−バのホストの /var パ−ティションの容量が 100% になり、メ−ルの送受信ができな くなってしまう。社内のメ−ルは、メ−ルストアの /var/spool/mqueue に入り、 そこか ら Cc 展開して /var/mail/katou, satou などと、 各 POP ユ−ザのメ−ルボックスに入 る。その間に /var が一杯になったら、/var/spool/mqueue にメ−ルが残ったままになる。 mqueue に、でかいサイズのファイルがあるはずである。これをばっさり消去する。 通常 なら mqueue には何もファイルはないはずである。メ−ルはすぐに通過する。 具体的な処置について。ディスプレイに "... NOTICE: alloc: /var: file system full" というメッセ−ジが5秒間隔ぐらいで出るようになったら、 /var の容量が0になってい る。一応 # df -k でディスクの状態を確認してみる。 /var/adm/messages も見てみよう。 次に # ps -e で動いている sendmail を全部止める。 これで "file system full" のメ ッセ−ジが出なくなり、コマンドを入れやすくなる。 そして /var/spool/mqueue の中を 見て、でっかいサイズのファイルであるメ−ル本文と対応する制御ファイルを消す。溜ま ったメ−ルを # /usr/lib/sendmail -q で吐き出し、 # /usr/lib/sendmail -bd -q15m & で通常稼働に戻す。残留するメ−ルは次のメ−ルチェッカ−など使って処分する。 # cd /var/adm # grep full * messages:Apr 13 04:06:19 hostB unix: NOTICE: alloc: /: file system full messages:Apr 14 04:05:38 hostB unix: NOTICE: alloc: /: file system full * メ−ル送信の取り消し メ−ルを運用していると、メ−ル送ってしまったけど、やはり止めにしたい。何とかでき んかと言う輩もでてくる。社内間のメ−ルなら、各ユ−ザのメ−ルは、各人が POP3 アク セスして取り込むまで、/var/mail/xxx ファイルにメ−ルが溜まっている。メ−ルは一連 のファイルで、その中から不本意なメ−ルだけ削除したい訳である。このような要望にピ ッタリのソフトがあった。メ−ルチェッカ−という。ベクタ−のサイトなど見ると、一杯 フリ−ソフトもあるようだ。メ−ル受信の POP3 アクセスを応用したソフトウェアである。 まさに、Windows 用メ−ルチェッカ− 3.0 というフリ−ソフトが目についた。 紹介文に は "複数の POP サ−バ−にアクセスし、メ−ルをダウンロ−ドする事無く、 メ−ルの受 信状態を手動または自動で確認することができます。また、簡単に受信メ−ルの内容をプ レビュ−したり、不要な受信メ−ルの削除が行えます" と書いてあった。 * メ−ルリレ−のディスクが一杯になった場合 頭隠して尻隠さずみたいな話である。メ−ルストアで大きなサイズのメ−ル対策をして安 心していたら、外からだってでかいメ−ルは来る。メ−ルリレ−が受け切らないと、エラ −メ−ルになり、約5日間相手は再送を繰り返す。その間、定期的に外から過大なトラフ ィックが来ることになる。数メガのメ−ル5〜6本だけで専用線 128 Kbps の帯域は、数 時間一杯になっていた。訳がわからず DoS 攻撃ではと思ったが、 何のことはない自社の 出先または取り引き先から、Excel のデ−タを何人かに送っていたというようなことだっ た。社内から携帯電話へのメ−ル転送でも、トラブルが起こった。携帯側ではメ−ルサイ ズの制限をしているのだろうが、5メガとか大き過ぎるとエラ−になり、やはりメ−ルリ レ−が再送することがあった。これでも定期的に外に向かって過大なパケットを何日も送 り続ける。あわや、自サイトがSPAMの踏台にされたかと危惧した次第である。 * メ−ルリレ−に溜まったメ−ルの内容を確認してみる メ−ルリレ−の mqueue に次のようにファイルが溜まっているとする。dfxxx がメ−ル本 文、qfxxx はメ−ル制御のファイルである。本文が英語だけ ASCIIなら、# cat dfxxx で 表示できる。しかし日本語の場合は、ISO-2022-JP という変換がされているので、読むこ とはできない。そこで、dfxxx ファイルを自分宛にメ−ルを送れば、メ−ルソフトで読む ことができる日本語にして表示してくれる。 # cd /var/spool/mqueue; ls -l -rw------- 1 root smmsp 3682 Jan 15 08:10 dfh0ENAdXA020172 -rw------- 1 root smmsp 1179 Jan 15 14:23 qfh0ENAdXA020172 # cp dfh0ENAdXA020172 kkk # /usr/ucb/mail -s "test" katou@nix.co.jj < kkk 自分の普段使っているメ−ルソフト、Windows の Netscape でも INDY の Zmail でも。 -------------------------------------- |From: Super-User |Date: Wed Nov 4, 7:34am +0900 |To: katou@nix.co.jj | | ちゃんと読める日本語になって表示される ※メ−ルコマンドには /usr/bin/mail と UCB mail がある。 UCB mail は/usr/ucb/mail または /usr/ucb/Mail で、/usr/bin/mailx へのリンクになっている。 -r-x--s--x 1 bin mail 64376 Jul 16 1997 /usr/bin/mail -r-x--s--x 1 bin mail 127540 Jul 16 1997 /usr/bin/mailx * でかいメ−ルへの対策をする [ メ−ルストアのホストは ] InterScan VirusWall の機能を利用してメ−ルのサイズに制限を設ける。InterScan から どんなメッセ−ジのメ−ルが出るか、一度確認しておくこと。 [ メ−ルリレ−のホストは ] こっちでは sendmail で、メ−ルのサイズに制限は設けない。これまでのままとする。と もかく /var パ−ティションが、だいたいにおいて容量が少ないのだ。Solaris 2.6 では /usr/spool は /var/spool へのリンクになっている。 外付けのディスクを増設し、リン クを張るようにしよう。動いている sendmail を全部止め、シンボリックリンクを張って 再び sendmail を起動させる。/var/spool/clientmqueue にも、何かメ−ルの制御デ−タ のファイルができるが、そのままでいいだろう。 clientmqueue ディレクトリは cf ツ− ルで作成した sendmail.cfが使う。予備のメ−ルリレ−のホストでのテスト、ネットワ− クから切り離している、これで外にメ−ルを /usr/ucb/mail -v xxx とやって出してみる。 数分して DNS のドメイン検索エラ−でメ−ルが行かなかったログが /var/log/syslog に でき、メ−ルは /var/spool/clientmqueue/ に溜まった。 # cd /usr; ls -l spool lrwxrwxrwx 1 root root ... spool -> ../var/spool # cd /var/spool; ls -l drwxrwx--- 2 mmsp smmsp 512 Jan 15 14:27 clientmqueue drwxr-xr-x 4 root sys 512 Jul 18 1999 cron drwxr-xr-x 2 uucp uucp 512 Jul 18 1999 locks drwxrwxr-x 7 lp lp 512 Jul 27 1999 lp drwxr-xr-x 2 root bin 2560 Jan 15 14:48 mqueue drwxrwxrwt 2 bin bin 512 Jul 18 1999 pkg drwxr-xr-x 2 root lp 512 Jul 18 1999 print # cd /usr1 << 外付けのディスク /usr1 とする。パ−ミ # mkdir mqueue ションを合わす、# chmod 755 mqueue や # chgrp bin mqueue をやること。 # cd /var/spool # mv mqueue mqueue.old << ファイルが残っていれば、念のため残す。 # ln -s /usr1/mqueue /var/spool/mqueue << シンボリックリンクを張る。 * トラブルの原因の調査 計らずも同じような時期に、メ−ルの発信と受信で大きなサイズのメ−ルによるトラブル が起こった。定期的にインタ−ネットへのアクセスがやたら遅くなることから発して、一 体何が原因だろうと調べることになった。FireWall-1 の SNMPエ−ジェント機能を利用し て MRTG で、ファイアウォ−ル・ホストのイ−サネット・インタ−フェ−ス3ヵ所のパケ ットの出入りを見ることにした。これで、外からのパケットなのか内からのパケットなの か、DMZ なのか判断することができた。しかし MRTG では、どういうパケットなのかまで は分からない。次に内部ネットまたは DMZ ネットにパソコンをおいて Sniffer Basic で、 IPアドレスでパケットの流れを見ることにした。更に Sniffer Basicで、これはという パケットをキャプチャ−した。ただ時なしにキャプチャ−しても何も分からない、定期的 に出るトラフィックの始まりを見定め、セッションの頭からキャプチャ−しなければなら ない。ここまできて、ようやくパケットの中味を明らかにすることができ、正体は大きな メ−ルで、誰から誰へ送っているかまで知ることができた。結構、大変である。 * こっちの釘を叩いたらあっちの釘が出てきた まるでいたちごっこみたいな話で。InterScan でメ−ルのサイズを3メガぐらいに制限し たら、メ−ルを分割する輩が今度は現われた。それはそれで、一概に悪いとは言えないの だがとんでもないケ−スが。3メガ弱の添付ファイルを Outlook Expressで分割の指定を すると一体どうなるか。分割のサイズはデフォルト値が 60 KB になっている。 意味がや や取りにくいのだが、3000/60=50 で、つまり50個のメ−ルになるのである。 それを何 か変だなと思いつつ数回、繰り返したら100や200のメ−ルのSPAMもどきになっ てしまうのだ。因み、メ−ルの分割機能は Netscape Messenger にはないみたいである。 Outlook Express の [ツ−ル]->[アカウント]->[メ−ル]->[プロパティ]-> の画面で例え ば katou のプロパティという画面を見る。 --------------------------------------------------- | 送信 | □ 次のサイズよりメッセ−ジが大きい場合は分割する | ----------- ↑ | | 60 | KB 意味が取りにくいです。60KB 以上のメ−ルは、60KB のファ | ----------- イルに分割して送ります。200KB なら 60KBが3個と 20KBが | が1個のメ−ルにして送ります。こんな風にしてくれんかな。 ある日、見知らぬメ−ルサ−バの管理者からメ−ルが来た。『こんなんがありました、メ −ルを出すこと自体問題ないが、お宅のメ−ルサ−バの能力が足らないので、長時間こち らのメ−ルサ−バを占有してしまう。その間、他の人のメ−ルのやりとりができなくなっ てしまう。改善を求む』。大量のメ−ルが同じ所に送られる場合、相手と自分とでWAN の帯域が違うと、相手も待たせることになる。その結果、相手側では他のサイトからのメ −ルが受けられなくなる。多分、双方でセッションというかコネクションというか、ばっ とメ−ル送信の数だけ張られ、同時に処理が進んで行くのでないか。自分側が 128Kbpsと 小さいので、なかなか出ていかないのである。とりあえず sendmail を -q15m から -q1h にした。どうやら今日インタ−ネットでは、これまでのノウハウから -q1h とするのが普 通のようである。根本的な解決はWANの回線をアップすることには違いない。以下、解 決のための方法を挙げてみる。`23/06 のこと。 1) sendmail のパラメ−タを変更する /etc/mail/sendmail.cf CF ツ−ルの sendmail-8.9.1 と cfツ−ルの ------------------------------- sendmail-12.5 から値は拾ってきた。よく分 | | からないが、ConnectionRateThrottleをいじ |#O ConnectionRateThrottle=3 ればいいのでないか。設定の情報がまるでな |#O MaxDaemonChildren=12 い。3にするといいと書いてあるのを一つ見 |#O MaxRecipientsPerMessage=100 つけたが。よく分からない内は触れないこと。 2) メ−ルリレ−でのキュ−の処理時間を長くする /etc/rc2.d/S88sendmail これまでは正直のところ気なしに、-q15m で ------------------------------------- 稼働させていた。何らかの理由でメ−ルが行 | | かなかっても、15分経ったら再送する。こ |# /usr/lib/sendmail -bd -q15m & れで、今までは特に問題はなかったが。しか | /usr/lib/sendmail -bd -q1h & し大量メ−ルだと、その15分の内にさばけ | | ずに、15分経ったらまた再送してしまう。 3) smtpfeed プログラムを sendmail に導入する 多分ここでは、これは用途が違うような気がする。十分なWANの帯域があって、マルチ スレッドで、どんどんメ−ルを出すような場合に用いるのでないか。 sendmail でメ−ル を高速に配信したい場合に適用する。 smtpfeed は sendmail から呼び出される配送専用 のプログラムである。複数の smtpfeed プロセスができるのではなく、1個プロセスの中 で、並列に処理を行なう。DNS を引いて、同じ宛先や同じ MX レコ−ドの相手にはまとめ て送るようにする。メモリをたくさん食うらしい。保守性が難点とか。「fml バイブル」 深町賢一氏著、オライリ−出版、P.425 参照。それにこの本には "17章トラフィックを 制限する" に、メ−ル爆弾対策に fml の機能 MTI( Mail Traffic Information )、 評価 関数 SimpleBomberP()があると書かれていた。メ−ルのトラフィックを監視して、一気に メ−ルが送られてきた場合、一時的にメ−ルの配送を拒否するとあった。一応参考まで。 (5) メ−ル配送のテスト環境を確認 `24/09 * テスト環境の確認 2004年9月、必要があってメ−ルサ−バのテスト環境が必要になった。 Apollo コン ピュ−タを2台用いて、"(3)メ−ル配送の等価テスト" も見て、早速その環境を作ろうと したのだが、結構手間どった。sendmail.cf などの設定は、やはりかなり微妙である。そ れで改めて、動作を確認したところの設定を記載することにした。 Apollo のマシンに限 らず、このようなメ−ルサ−バのテスト環境があると、何かと便利である。読者の方々も 一ついかがであろうか。パソコンも1つ使って、パソコンのメ−ルソフトから、これらメ −ルサ−バに SMTP アクセスし、メ−ルを送信できる。では小生はこの時期、何をテスト したか。Linux に InterScan VirusWall を入れ、これらメ−ルサ−バの間において、 メ −ルの中継テストを行なったのである。InterScan VirusWall のパタ−ンファイル980 番問題というのがあって、急遽対応すべく検討した訳である。 メ−ルストア メ−ルリレ− ※ Apollo に入っていた sendmail を使った。 -------- -------- |mstore| ユ−ザ |mrelay| -------- katou -------- | .1 | .3 -------*--------------------*------ 192.168.1.0 hostname は node_aaaa node_bbbb node_aaaa $ /etc/ifconfig eth0 192.168.1.1 node_bbbb $ /etc/ifconfig eth0 192.168.1.3 * ホスト aaaa の設定 //node_aaaa/etc/hosts ----------------------- |127.0.0.1 localhost |192.168.1.1 mstore |192.168.1.3 mrelay $ /etc/nmconfig -h hostent_ascii << これらコマンドは /etc/hostsファイルを使う $ /etc/mkhosts /etc/hosts << 場合の Apollo のおまじない。 //node_aaaa/usr/lib/sendmail.cf ---------------------------------------- |DDnix.co.jj |Dj$w.$D |DMtcp | |# [ メ−ルクライアント用 ] |# |FL/etc/local_names |DRmstore | |# [ 2. メ−ルサ−バのホスト用 ] |R$*<@$+.$D>$* $#$M $@$2 $:$1<@$2.$D>$3 |R$*<@$+>$* $#$M $@mrelay $:$1<@$2>$3 |R$+%$+ $@$>29$1@$2 |R$+ $#local $:$1 | |# [ 3. メ−ルクライアント用 ] |R$=L $#local $:$1 |R$+ $#$M $@$R $:$1 /etc/local_names ---------------- |katou $ /usr/ucb/newaliases $ /usr/lib/sendmail -bd -q15m & [ テスト0 ] root $ /usr/ucb/mail -v katou@nix.co.jj test . EOT katou@nix.co.jj... Connecting to (local)... katou@nix.co.jj... Sent katou $ /bin/mail From daemon Thu Sep 23 13:47:24 2004 Received: by node_aaaa.nix.co.jj (5.65c/nix.1.0) id AA02844; Thu, 23 Sep 2004 13:47:23 +0900 Date: Thu, 23 Sep 2004 13:47:23 +0900 From: root Message-Id: <200409230447.AA02844@node_aaaa.nix.co.jj> To: katou@nix.co.jj test0 ? d * ホスト bbbb の設定 //node_bbbb/etc/hosts ----------------------- |127.0.0.1 localhost |192.168.1.1 mstore |192.168.1.3 mrelay //node_bbbb/etc/resolv.conf --------------------------- |nameserver 192.168.1.3 $ /etc/nmconfig -h hostent_bind << named を使う場合の Apollo のおまじない。 //node_bbbb/usr/lib/sendmail.cf ---------------------------------------- |DDnix.co.jj |Dj$w.$D |DMtcp | | |# ----------------------------------------------------- |# メ−ルゲ−トウェイのホスト用は、この間コメントにする。 |# ----------------------------------------------------- |#R$*<@[$+]> $#$M $@[$2] $:$1 |#R$*<@$j>$* $1<@>$2 |#R$*<@$=U.uucp>$* $1<@>$3 |#R$*<@$D>$* $1<@>$2 |#R$*<$*.>$* $1<$2>$3 |#R<@>:$* $@$>29$1 |#R$*<@> $@$>29$1 |#R$*<@$w> $@$>29$1 |#R<@$j>:$+ $@$>29$1 | |R$* $:$>9 $1 | |# [ 1. メ−ルゲ−トウェイのホスト用 ] |R$*<@$D> $#$M $@mstore.$D $:$1<@$D> << ここ2ヵ所 mstore.$D にしているこ |R$*<@$+.$D> $#$M $@mstore.$D $:$1<@$D> << とに注意。ただの mstoreだと、以下 | のようになり、mstore ホストにメ− |R$*<@$+>$* $#$M $@$2 $:$1<@$2>$3 ルを送ることができない。 |R$+%$+ $@$>29$1@$2 |R$+ $#local $:$1 ↓ node_bbbb $ /usr/ucb/mail -v katou@nix.co.jj test . EOT katou@nix.co.jj... Connecting to mstore (tcp)... katou@nix.co.jj... 550 Host unknown (Authoritative answer from name server) /etc/named.boot ---------------------------------------------------- |cache . /etc/named.ca |primary nix.co.jj /etc/named.hosts |primary 0.0.127.in-addr.arpa /etc/named.local |;primary 1.168.192.in-addr.arpa /etc/named.rev << これはなくてもメ−ル の送受信には関係ない。 /etc/named.ca ------------------------------------------------- |. 9999999 IN NS hostA.nix.co.jj. |hostA.nix.co.jj. 9999999 IN A 192.168.1.3 /etc/named.hosts ------------------------------------------------------------- |@ IN SOA hostA.nix.co.jj. katou.hostA.nix.co.jj. ( | 1 3600 3600 3600 3600 ) ; | IN NS hostA.nix.co.jj. | IN MX 1 mrelay.nix.co.jj. |localhost. IN A 127.0.0.1 |hostA IN A 192.168.1.3 |mrelay IN A 192.168.1.3 |mstore IN A 192.168.1.1 $ /usr/ucb/newaliases $ /usr/lib/sendmail -bd -q15m & $ /etc/named & * テスト1 node_aaaa $ /usr/ucb/mail -v kkk@nix.con << どこか別なドメイン名の適当なメ− test1 ルアドレスにメ−ルを送ってみる。 . node_bbbb $ ld /usr/spool/mqueue dfAA01714 qfAA01714 << ここにともかくメ−ルが溜まれば、ホスト aaaa から送信 できたことが分かる。dfAA01714 はメ−ルの本文である。 * テスト2 node_bbbb $ /usr/ucb/mail -v katou@nix.co.jj test2 . node_aaaa $ /bin/mail << katou でロッグイン、メ−ルが届いている。 * ホスト bbbb で named を動かさない場合 [ 設定その1 ] $ /etc/nmconfig -h hostent_ascii $ /etc/mkhosts /etc/hosts 設定その2でも、これらを同様やること。 sendmail.cf は同じで、mstore.$D のまま。 //node_bbbb/etc/hosts ------------------------------------- |127.0.0.1 localhost |192.168.1.1 mstore mstore.nix.co.jj |192.168.1.3 mrelay |192.168.1.9 nix.con ↑ 適当にこのように入れておけば、ホストaaaa から ???@nix.con 宛に、とりあえずメ−ル を出すことはできる。node_bbbb の /usr/spool/mqueue にメ−ルは溜まり、 メ−ルの制 御ファイル qXXX に、"Connection timed out during user open with nix.con" と出る。 [ 設定その2 ] //node_bbbb/etc/hosts ----------------------- |127.0.0.1 localhost |192.168.1.1 mstore |192.168.1.3 mrelay |192.168.1.9 nix.con //node_bbbb/usr/lib/sendmail.cf -------------------------------------- | | |# [ 1. メ−ルゲ−トウェイのホスト用 ] |R$*<@$D> $#$M $@mstore $:$1<@$D> |R$*<@$+.$D> $#$M $@mstore $:$1<@$D>