coLinux日記

coLinuxはフリーソフトを種として、よろずのシステムとぞなれりける。

sendmail.cf のテスト方法まとめ

2007-05-26 18:00:15 | sendmail
長い間遊んできました sendmail (ここでは、8.14.1 ) ですが、今回で一応終わりにしたいと思います。

実際の sendmail.mc 作成で役立つのはこうもり本であることは間違いないですが、とても重いので、 sendmail のソースにある cf/README やインターネット上にあるその日本語訳cf/READMEなどを参考にすれば良いと思います。

次に作成された sendmail.cf のテスト方法をおさらいしてみます。

まず、sendmail をルールテスト・モードで起動します。

/usr/sbin/sendmail -bt -C./sendmail.cf

これで、プロンプト > が出力されて入力待ちになります。ここで、
> rule,rule,rule... アドレス

とルールセットとアドレスを指定すれば変換結果が得られるのが基本でしたね。

定義マクロの値とクラス・マクロの値の表示はそれぞれ、$ と $= が使えます。
> $j
> $=w

マクロの値を変えるには、.D と .C を使えばよいです。
> .Djnew.example.co.jp

=S に続いてルールセット番号またはシンボル名を指定すれば、ルールセットも表示できます。
> =S0
> =SParseLocal

=M は配信エージェントの表示ですが、すべての定義が表示されてしまいます。
> =M

/canon は、指定したホストの標準名を表示します。
> /canon www
getcanonname(www) returns fedora.example.co.jp
> 
標準名を得る様子は、デバッグ・スイッチ
> -d38.20 

を指定すればよいです。

さて、今までのルールセットのテストでは、呼び出すルールセットを順番に指定していましたがこれを /tryflags , /parse , /try を使ってテストしてみます。

/tryflags は、引数が、[ h | e ][ s | r ]で、ヘッダまたはエンベロープ、発信者または受信者を表します。
> /tryflags hs  (例: ヘッダの発信者アドレス)

/parse 受信者アドレス は、

3,0 で配信エージェント、受信者のホスト、受信者のアドレスの3組を求めてから、

その配信エージェントの R= 式の指示に従って、

受信者のアドレスを 2,エンベロープ用受信者ルールセット,final によって変換した結果を表示しています。
> /parse espiya@fedora.example.co.jp
.........
parse            returns: $# local $: espiya
2                  input: espiya
2                returns: espiya
EnvToL             input: espiya
EnvToL           returns: espiya
final              input: espiya
final            returns: espiya
mailer local, user espiya
>

/try 配信エージェント address は、
/tryflags の指示に従って、アドレスの種類を4つから選んでそれに応じて配信エージェントの R=式 または S=式 からルールセットを選び変換します。つまり、

/tryflags hs なら、 3,1,ヘッダ用発信者ルールセット,final
/tryflags hr なら、 3,2,ヘッダ用受信者ルールセット,final
/tryflags es なら、 3,1,エンベロープ用発信者ルールセット,final
/tryflags er なら、 3,2,エンベロープ用受信者ルールセット,final

のようなルールセットを使ってアドレスが変換されます。最後のケースは/parse の結果と一緒ですね。
> /try relay espiya@mail000.goo.ne.jp

これらは、配信エージェントで F=5 が指定されていた場合のルールセット5 の呼び出しまではテストしないので、それは自分で行う必要があります。

最後に、
> -d21.12

でルールの動作状況を詳しく見ることができます。

以上長い間 sendmail について見てきましたが、これでこうもり本なしでも簡単な sendmail.mc が作成できる気分になりました。

相変わらずcoLinux は安定していますが、Windows の update でリブートするときに、シャットダウンする必要があり残念です。また coLinux 用の Fedora Core 6 も出ましたので、そろそろ移行を考えています。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

sendmail.mc LOCAL_RELAYとMAIL_HUB

2007-05-24 00:16:02 | sendmail
引き続き sendmail 8.14.1 ネタですが、あともう少ししたら一応終わりにしたいと思います。

今回は、sendmail.mc で少し分かりにくい、LOCAL_RELAY と MAIL_HUB について調べてみました。

最初に、LOCAL_RELAY mcマクロですが、mc ファイルに指定するためには以下の行を追加します。

define(`LOCAL_RELAY',  `mail.example.co.jp')

これによって生成される sendmail.cf 内で、以下の定義マクロが追加されました。
DRmail.example.co.jp

また、Slocaladdr=5 内で、
R< > $+        $: < $R > $1        try relay

が追加されました。これは、Mlocal の F=式で F=5 が指定されている場合に呼び出されるルールセットです。従って、LOCAL_RELAY とは、local なホスト宛とみなされたメールをエイリアス展開後に別のホストに転送するための機能といえるようです。

普通のローカルユーザ宛のアドレスでは、Parse1 ルールセットで、
$# local $: ユーザ名

に変換されますので、例えば、
> 5 espiya
..................
localaddr    returns: $# relay $@ mail.example.co.jp 
                         $: espiya < @ mail.example.co.jp >
>

となって、LOCAL_RELAY へ再転送されます。(出力は適当に折り曲げてあります。)MXレコードで複数のホストが指定してあり、サブサーバが受けたメールを本サーバに一極集中的に集めるのには便利ですね。

次に MAIL_HUB mcマクロを見てみます。mcファイルでの指定は次のようになります。

define(`MAIL_HUB',  `mail.example.co.jp')dnl

生成される sendmail.cf ファイルは
DHmail.example.co.jp

の定義マクロ追加と、Slocaladdr=5 内で、
R< > $+      $: < $H > $1         try hub

が追加されています。$R が $H に変わっただけですね。つまりどちらかを使えば良いみたいです。

それはともかく、明らかに2つの mc マクロは、ローカルユーザ宛てのメールに対する書き換え用です。

しかも、同じ lhs を持っているので、2つ同時に指定しても最初に定義されているRコマンドの方にだけヒットしてしまうのではないでしょうか。というわけでこれらを使うにはどちらか一方だけ使う方が良いみたいです。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

sendmail.mc ルールセット1でマスカレード

2007-05-16 23:54:18 | sendmail
coLinux日記なのに、sendmail日記みたいになっていますが、前回に続いて、sendmail.mc を作ってみます。今まで書いていなかったのですが、mcファイルのコメントはどのようになっているのでしょうか。m4 のコメントそのままなら、行の先頭文字が # であればコメントのはずです。しかし、cf ではこれが成り立ちません。その理由は、cf/m4/cfhead.m4 の中で、
changecom(^A)    ^A は、0x01

と指定されているからです。これによってコメントデリミタは、# から ^A 文字に変わっています。従って、sendmail.mc のなかでコメントにして処理を無効にするには、先頭に dnl マクロを挿入するのが正しいといえます。

さて前回、SMART_HOST が分かったので、今回は、

「外に送るメールはすべて、自分の使っているプロバイダのメールサーバに転送を頼む。」

という普通のメーラのようなことをして見ます。

現在 spam メールの多くが直接 pc などから送られてくるので、普通のプロバイダでは直接外のメールサーバとの通信を許していません。( Outbound Port 25 Blocking :: OP25B ) したがって、coLinux から外部にメールを送る方法として通常のメーラのようなことをすることにしました。更にここの coLinux では 仮想ドメイン example.co.jp を使っているので、その場合正しいアドレス変換を行わないと、返信をうまく受け取れないばかりでなく、spam とみなされて拒否される可能性があるので慎重に行いたいです。

せっかく sendmail 8.14.1 を使っているので新しいオプションも使います。
ここでは、自分が使っているプロバイダのメールサーバと登録している自分のアドレスを

mail.example.com
myname@abc.example.com

とします。普段使っているメーラはメールサーバと、

HELO mail.example.com (または EHLO mail.example.com)
MAIL FROM <myname@abc.example.com>
RCPT TO <espiya@mail000.goo.ne.jp>

のように、smtp でやり取りしますから、HELO とエンベロープ発信者アドレスは書き換えたいです。

sendmail の場合、HELO は通常は、$j が使われますが、新しい mcマクロ confHELO_NAME を使うと書き換えられるみたいです。ヘッダやエンベロープの発信者アドレスの変換は、sendmail の用語でいう「マスカレード」ですが、普通は FEATURE(genericstable) などを使うと思います。それではつまらないので、ここでは思い切ってルールセット1 (Sender Rewriting) を使ってみます。

sendmail.mc は、
divert(0)dnl
VERSIONID(`TEST 2007 0002')
OSTYPE(linux)dnl
DOMAIN(generic)dnl
define(`SMART_HOST', `mail.example.com')dnl
define(`confHELO_NAME', `mail.example.com')dnl
MAILER(local)dnl
MAILER(smtp)dnl
LOCAL_CONFIG
FG/etc/mail/real-name
D{o_domain}abc.example.com
D{o_name}myname
LOCAL_RULE_1
R$=G                    $@ ${o_name} < @ ${o_domain} . >
R$=G < @ $j . >         $@ ${o_name} < @ ${o_domain} . >

ここで、/etc/mail/real-name は、
root
espiya

と複数ユーザも扱えるようにしてみました。つまり、発信者アドレス
espiya
や
root < @ fedora . example . co . jp . > 

などを、
myname < @ abc . example . com >

に変換して、mail.example.com にメールを転送するようにしたつもりです。ルールセット1 の Rコマンドはもちろんあらかじめテストして決めました。1文字の定義マクロを利用しようとしたのですが、大文字小文字も含めてほとんどが使われているらしいので断念しました。ルールセット1 を使うとすべて場合で発信者アドレスに影響するので制限がありますが、ルールセット1をどうしても使ってみたかったので気にしないことにします。

作成された sendmail.cf の変更は、前に紹介した定義マクロ S の指定以外では、
・ LOCAL_CONFIG 以下は定義マクロの最後の方に追加。
・ O HeloName=mail.example.com を指定。
・ ルールセット 1 が新たに作成され、Ssender=1 の中に、
  sendmail.mc で指定した2つの Rコマンドを追加。

のようになりました。LOCAL_RULE_1 が指定されると自動的にルールセット1 が定義されますね。テストしてみます。
$ ./sendmail -bt -C./sendmail.cf
.............
> 3,0 espiya@mail000.goo.ne.jp
............................
canonify  returns: espiya < @ mail000 . goo . ne . jp>
............................
parse     returns: $# relay $@ mail . example . com $: espiya < @ mail000 . goo . ne . jp >
>
> 3,1,EnvFromSMTP,final espiya@fedora.example.co.jp
............................
final     returns: myname @ abc . example . com
>
> 3,1,HdrFromSMTP,final espiya@fedora.example.co.jp
............................
final     returns: myname @ abc . example . com
>
> 2,MasqSMTP,final    espiya < @ mail000 . goo . ne . jp . >
............................
final     returns: espiya @ mail0000 . goo . ne . jp
> /quit
$

最終的なアドレスや送り先が希望通りになっていますね。このように、sendmailの設定は、自分の出したいメールの発信者および受信者アドレスが正しく変換され、正しい配信エージェントを使って、正しいホストに送られるかどうかを調べながら調整すれば良いようです。

実際に本当のサーバとアドレスにしてテストしてみたところうまくいきました。EHLO もうまく置き換わっていました。受信者アドレスの特殊な書き換えは、LOCAL_RULE_2 で行えばうまくいく場合もあると思います。やはり sendmail.cf を少し知っていると sendmail.mc の設定も何とかなります。

ここで、テストといっても書き換えがうまくいっているかどうかぐらいですので、実際運用なら更にテストが必要です。また、テストで /tryflags や /try がありますがそのうち使ってみたいです。まあ、blog ですからテストはいつも適当です。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

sendmail.mc の SMART_HOST

2007-05-03 23:28:15 | sendmail
長い間 sendmail.cf を見てきましたが、実際には cf を使って、sendmail.mc から作成するので、sendmail.cf を知る必要はないように思えます。しかし、cf は m4 のマクロですから sendmail の設定を簡単に作成するには便利ですが、設定のすべてが分かるわけではないです。やはり sendmail.cf を知ってないといけないのではという気持ちから、あえて sendmail.cf がどうなっているかを見てみたわけです。

確かに、sendmail.cf は難しいですが、ほとんど修正する必要がないためあまり深く考えなくても困らないように思えます。

今後は、sendmail.mc の設定を調べてみたいと思いますが、その場合も sendmail.cf はどのように変わるのかを見るように心がけたいと思います。

まず、SMART_HOST を見てみます。これは、

「外部に送るメールはすべてこのホストに送って、そのホストから送ってもらう。」

という機能ですね。これは defineマクロでの定義ですので、sendmail.mc は次のようにしました。

VERSIONID(`TEST 2007 0001')
OSTYPE(linux)dnl
DOMAIN(generic)dnl
define(`SMART_HOST', `mail.example.co.jp')dnl
MAILER(local)dnl
MAILER(smtp)dnl

送るホスト名は、mail.example.co.jp です。sendmail.cf の変更は、

DS



DSmail.example.co.jp

なるだけです。つまり、定義マクロ S が設定されるだけです。これが、Parse1 ルールセットで使われて、
espiya < @ mail000 . goo . ne . jp . > が、

R$* < @ $* > $*         $: $>MailerToTriple < $S > $1 < @ $2 > $3

によって、

< mail . example . co . jp > espiya < @ mail000 . goo . ne . jp . > 

を入力として MailerToTriple ルールセットが呼ばれて、
定義マクロ S が空値の場合は

R< > $*                 $@ $1 

でそのまま戻るところ、S が定義されているので、

R< $+ > $*              $#relay $@ $1 $: $2 

によって、

$# relay $@ mail . example . co . jp $: espiya < @ mail000 . goo . ne . jp . >

になるみたいです。

$@ の送り先のホスト名が置き換わっていますね。その直前で、
R< $=w > $*             $@ $2

があるので、SMART_HOST は自分自身を指定しても無意味になりますね。

ここで、relay を定義している Mコマンドを見ますと、
・ エンベロープ発信者ルールセットは、EnvFromSMTP
・ ヘッダ用発信者ルールセットは、    HdrFromSMTP
・ エンベロープ受信者ルールセットは、MasqSMTP
・ ヘッダ用受信者ルールセットは、    MasqSMTP

です。esmtp との違いは、EnvToSMTP が MasqSMTP になっているところです。ここで、MasqSMTP に渡される入力は、配信エージェントの 3組のアドレス( $: 以下)です。
SMasqSMTP
R$* < @ $* > $*       $@ $1 < @ $2 > $3
R$+                   $@ $1 < @ *LOCAL* >

SEnvToSMTP
R$+                   $: $>PseudoToReal  $1
R$+                   $: $>MasqSMTP  $1
R$* < @ *LOCAL* > $*  $: $1 < $ $j . > $2

SPseudoToReal
R$< @ $+ > $*         $@ < @ $1 > $2
R$+ < @ $+ .UUCP. >   $: < $2 ! > $1
R$+ < @ $* > $*       $@ $1 < @ $2 > $3
.............

ほとんど違いがないみたいです。
次回は、発信者アドレスの書き換えに挑戦するつもりです。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする