coLinux日記

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

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でシェアする