Archive for the ‘linux’ Category
以前、「指定したドメインのメールを受け取る」という話で、
個別に指定したドメインは自分で受け取ってしまうということをやったが、
これの応用版として、「指定したドメイン以外はすべて自分で受け取る」
これは、よく大量メールの配信テストなどをしているときに、適当にメールアドレスを作って、
仮に、本当にそのドメインがあったとしても、外にメールが飛ばないということができる。
このような完全一致ではなく、あるパターンに一致したときには・・・となると、
設定に正規表現を使う方がよりスムーズだ。
そのために、Postfixで正規表現が使えるかを確認しよう。
確認方法
#postconf -m btree cidr environ hash ldap nis pcre proxy regexp static unix
のように、regexpやpcreが表示されれば問題ない。
(これからの例はregexpなので、pcreを使う場合の正規表現は別の形になるかもしれない。)
では、具体的に、あるメールアドレスがPostfixはどのように処理されるのだろうか?
http://www.postfix-jp.info/trans-2.2/jhtml/transport.5.html
を見ると、どのようにメールの配信方法が決定されるかがわかる。
以前は、このmydestinationを使ってしまったので、
非常に簡単にまた、直観的に設定できた。
今回は、virtual_mailbox_domainsを使って、
その設定に正規表現を使うようにする。
まず、正規表現を使う場所を決める。
つまり、どの処理から分岐をするか?ということだ。
そこには、そのまま、virtual_mailbox_domains に、 virtual_mailbox_mapsを使うことにした。
まず、以下のファイルを作成する。
/etc/postfix/virtual_mailbox_maps.regexp
/(.*)/!/(coltware.com)$/ /dummy/Maildir/
(ファイル名にルールはありません。)
これで、coltware.comというサーバ以外のサーバは、/dummy/Maildir/というディレクトリにMaildir形式で保存される。
自分サーバ向けは、mydestinationで指定されているので、このように、すべてに一致(.*)で、
かつ(coltware.com)以外ということにした。
本当に設定する前に、正しく正規表現が動くのかテストしましょう。
postmap -q "テストする文字列" regexp:/etc/postfix/virtual_mailbox_maps.regexp
で、結果(/dummy/Maildir/の文字列)が返ってきます。
もちろん、coltware.comのドメインの場合には、何も帰ってきません。
では実際の設定です。
virtual_mailbox_base = / virtual_mailbox_maps = regexp:/etc/postfix/virtual_mailbox_maps.regexp virtual_mailbox_domains = $virtual_mailbox_maps virtual_uid_maps = static:89 virtual_gid_maps = static:89
ここで、virtual_mailbox_baseは、先ほど、/dummy/Maildir/と指定したときに前に、このパスがつくのだが、
私は設定時に今後も完全にパスを指定したかったので”/”としました。
また、
virtual_uid_maps = static:89 virtual_gid_maps = static:89
は、メールファイルが保存されるときの、uidとgidなので、好きなuid,gidを設定してください。
で、この後に、postfixを再起動してください。
とこのようにすることで、自宅内にたてたテストメール配信サーバも、間違っても自分のサーバにしか飛ばないというわけです。
また、いろいろと正規表現をカスタマイズしていくことで、いろいろと出来てきます。
また、今回は、virtual_mailbox_domainsを使いましたが、あるドメインの配信先をsmtpからlocalに変えるという概念のほうが、よりわかりやすいので、transport_mapsを使ってもいいのですが、自分宛にメールが送られてから、そのメールをどのようにするか?
という設定を含めると、自分的には面倒なので使いませんでした。
余談:
これは本文とはまったく関係がないのですが、クラウドなどでよりサーバの設計はアプリケーションエンジニアのほうに仕事が移ってくるでしょう。
それに、このような要件は、サーバ構築で発生するわけではなく、機能定義で出てきます。
したがって、アプリケーションエンジニアがミドルウェアがどの程度までできるか?ということを把握することは非常に大切です。
また、これらの要件がまっさらから作ろうとすると非常に多くのコストがかかってしまいます。
クラウド時代の到達とともに、アプリケーションエンジニアが、サーバ構成・システム構成から設計できることは、スピードとコストを最大限にするためにも、今後ますます重要になってくるのではないでしょうか?
一見すごく簡単そうなのに、ちょっとはまってしまったので記録。
システムがなんか変な時に、topコマンドをまず見てみる。
でも、遅い時がわかっているが、自分がその時にtopコマンドを実行できないなどという場合には、
topコマンドをバッチモードでしかも、cronで定期的に動かせばいい。
マニュアルを
http://www.linux.or.jp/JM/html/procps/man1/top.1.html
見ればわかるが、覚書のために自分が使う手順を載せておく。
top -n 1 -b
これで1回限り、TOPコマンドの結果が出力される。
したがって、これをcronで起動させればいいので、
*/10 * * * * top -n 3 -b > /tmp/top_`date +%H%M.txt`
のようにしておけば、10分毎に3回のTOPコマンドの結果を/tmpの下に保存しておける。
ちなみに、
`date +%H%M`
としているのは、あまり日ごとの結果を取っておいてもしかたがないとおもったので、
毎日同じファイルに上書きするためです。
ところが、あれ!?
書き出されない。
/var/log/message
をみると
top -n 3 -b > /tmp/top_`date +
ってなぜか、+以降表示されていない。
http://www.linux.or.jp/JM/html/cron/man5/crontab.5.html
をみると、”%”に特別な意味があるらしい。
“+”から特別な意味があるらしいとよんでしまってしまったので、ちょっとはまった。
次に、きちんとファイルはできたが中身がない。。。
しょうがないので、標準エラーを標準入力に出力されるようにしたら・・・・
TERMの変数がないとのこと。
結局、きちんと動くようにしたものは
*/10 * * * * export TERM=vt100;top -n 1 -b > /tmp/top.`date +\%H\%M`.txt 2>&1
これです。
結果でから問題が毎回見つかるようなプロセスがあれば、
さらに、プロセスIDから/proc/[プロセスID]の下を見ていけばもっと詳細な情報がわかる。
まあ、ここから先は実際に問題がtopコマンドで見れたら書いていくと思います。
シェルを使ってファイルから1行ずつよみこみ、カンマで区切って処理をしたーい。
なんて時に、
while read LINE do // ここでsplitをつかってごにょごにょと・・・・ done < input.txt
ってな感じで、1行を切り分けていた。
ここでごにょごにょと書いたのも、いつもこの部分を忘れてしまい、
あー昔書いたやつをさがして・・・
と見つからず、いろいろと探していたら、もっといいやり方を知った。
まあ、たまにブラウズもいいものだと・・・
では、
while IFS=, read f1 f2 f3 do echo "$f1は1つ目のフィールド" echo "$f2は2つ目のフィールド" done < input.txt
というように、カンマで分割した形で変数にセットしてくれるので、楽だ・・・・
ちなみに、IFSとはInternal field separatorsの略らしい。
Postfix とdovecotを使ってSMTP AUTHを使えるようにする必要性が出てきた。
というのも、gmailではSMTP AUTHが必須になっているので、このテストのためにもこの設定が必要だ。
このSMTP AUTHの問題さえ解決できれば私が作っているAdobe AIR版SMTPライブラリでメールがGmailを使って送れるようになる。
すでに、POP3版もできているので、これがそろえば送受信が行える。
幸いにも認証方法はLOGIN PLAINになっているので、dovecotで十分だ。
ちなみに、Postfixとdovecotのインストールがされていることが前提なので注意。
さて、PostfixでSMTP AUTHを使えるようにするにはというのをさがしてみるとPostfixの再インストールがされているものばかり。
しかし、最近インストールしたものなので、再インストールは必要ないだろうということで、それを確認する。
#postconf -a cyrus dovecot
SMTPの認証にcyrusというのとdovecotが使えると出力されているので、問題なくdovecotが使えるのが確認できた。
このあたりの確認方法は
man postconf
と打てば使いかたは出てくる。
-a List the available SASL server plug-in types. The SASL plug-in type is selected with the smtpd_sasl_type configuration parameter by specifying one of the names listed below. cyrus This server plug-in is available when Postfix is built with Cyrus SASL sup- port. dovecot This server plug-in requires the Dovecot authentication server. This feature is available with Postfix 2.3 and later.
と出てきたので、Version が2.3より新しければだいたい大丈夫なのかもしれない。
また、postconfはこれから設定ファイルを変更するのだが、その設定がきちんと設定されているかなどを確認するのにも使う。
(私自身、スペルを間違ってしまってはまってしまったなんて時に、これを使って再確認する。)
さて、Postfixとdovecotの設定を行う。
詳しい設定は、http://www.postfix.org/SASL_README.html#build_dovecotにあるので、こちらを見てほしい。
しかし、ここではプログラム確認のためのサーバなのでセキュリティやら何やらの設定はいらない。
できるだけ、何の制約もなく使えるようにしたいので、必要最低限の設定を行う。
なので、実際の運用に使うものの設定ではないので、ご注意頂きたい。
/etc/postfix/main.cf 以下を追加
smtpd_sasl_auth_enable = yes smtpd_sasl_authenticated_header = yes broken_sasl_auth_clients = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth
/<どこかのパス>/dovecot.conf
以下のような記述が既にあるので、下記を参考に変更、もしくは頭の#を取って設定を有効にする。
auth default {
mechanisms = plain login
:
途中省略
:
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}
これで、postfixとdovecotを再起動すれば問題ない。
ちなみに、テストで
$telnet localhsot 25 <-- (入力) 220 localhost ESMTP Postfix EHLO localhost <-- (入力) 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-AUTH PLAIN 250-AUTH=PLAIN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN AUTH LOGIN <-- (入力) 334 VXNlcm5hbWU6 xxxxxxxxxx <-- (入力)ここにLogin Userをbase64した形で入力 334 UGFzc3dvcmQ6 yyyyyyyyyy <-- (入力)ここにPasswordをbase64した形で入力 235 2.0.0 Authentication successful QUIT <-- (入力) 221 2.0.0 Bye
ちなみに、
334 VXNlcm5hbWU6
などのように出力されるが、
これは、
334 Username:
と出力されている。VX..の部分がBASE64でエンコードされているだけだ。
また、UGFzc3dvcmQ6は「Password:」と出力されている。
このあたりが、BASE64でどうせセキュリティがほとんどないのに、このようになっている意味はよくわからない。
今回はFlexとか関係なくちょっとメールについてのお話です。
Postfixとなっていますが、基本的なネタはPostfixとは関係がありませんし、電子メールを知らない人には「へー」そんなふうにしてメルマガとかっておくられているんだー。ということを知っていただければと思います。
ただ、私はそんな手法に1つに名前がついているとは知りませんでした。
それがVERPというらしいです。
ちなみに、PostfixのVERP Howtoはこちらです。
さて、皆さんが受信しているメルマガとかのメールヘッダを見たことをがありますか?
今回はメールヘッダの部分で、Return-Pathという項目についてです。こちら、メールを配信して、エラーとなった場合などにそのメールアドレスに返事を返すためのメールアドレスです。ではメールを書くときにFromなどでもエラーが帰ってくるのですが、これはFromとこのReturn-Pathが同じようにしているだけなのです。基本的にエラーはこのReturn-Pathに帰るのです。
メルマガなどでメールを送るときには、このReturn-PathのメールアドレスとFromのメールアドレスを違ったものにします。
つまり、機械的なエラーはReturn-Pathに帰り、返事はFromというようにするのです。
こうするのは、機械的なエラーを自動的に処理したいからなのです。
このPostfixのVERPの機能で説明すれば、
user@domain へメールを送りたいときに、このReturn-Pathには owner-listname+user=domain@origin のようなメールアドレスにすると説明には書いてあります。
そう、Return-Pathに送り先の情報が隠れているのです。
これで、user@domainにメールが届かない場合には、owner-listname+user=domain@origin がメールを受け取るので、そのメールアドレスを見れば、だれ宛のメールがエラーなのかわかるというわけです。
ちなみに、通常のメルマガではこんな簡単なふうにはしないでしょう。
たいてい、何やら暗号らしきアルファベットやら、数字やらがあるとおもいますが、これが送り主のみ知っている内部のユーザ識別IDというわけです。
ただ、こういった機能がPostfixにはデフォルトであるのですね。びっくりです。
ただし、この機能は使わないほうがいいですよ。
携帯とかのメールアドレスで最大までつける人がいるんですよ。
そしたら、そのメールアドレスにほかの情報をつけるんで、最大をこえますよね。
そのせいでメールが送れなくなることがあるんです。
エラーを追跡するための情報が原因でエラーになるなんてしゃれにならないですからね。

