Sendmail で仮想ドメインを設定する (CentOS 5.5)


仮想ドメインで複数のドメインを運用する

Sendmail に複数のドメインを登録して、それぞれのドメインのメールアドレスを独立して運用したい場合には、仮想ドメインとしてそれを登録する必要があります。

CentOS 5.5 では "/etc/mail/sendmail.mc" で、既に以下の設定がされていましたので、"/etc/mail/virtusertable.db" を利用して、すぐに仮想ドメインの設定が出来るようになっていました。

FEATURE(`virtusertable', `hash -o /etc/mail/virtusertable.db')dnl

仮想ドメインのメールアドレスを登録するには、この "/etc/mail/virtusertable.db" に追加して行くことになるのですが、はじめて仮想ドメインを追加するときだけ、"/etc/mail/local-host-names" ファイルにも追記する必要があります。

 

たとえば "xxxx.xxx.xx.jp" ドメインを扱っているとしたときに、新たに "yyyy.yyy.yy.jp" というドメインを仮想ドメインで扱うことを考えます。

はじめてこのドメインを仮想ドメインとして扱う場合、このドメインが自分の管轄であることを示すために、"/etc/mail/local-host-names" に次の行を追記します。

yyyy。yyy。yy。jp

これで sendmail を再起動すれば、このサーバーで "yyyy.yyy.yy.jp" ドメインを扱う準備が整います。

反映させたいタイミングは設定方針によって変わると思いますが、ともあれ CentOS 5.5 では "/etc/mail" ディレクトリー内であれば、次のコマンドで再起動することが出来るようになっています。

make restart

 

続いて、仮想ドメインを登録するために "/etc/mail/virtusertable" ファイルを編集します。

"virtusertable" では、"メールアドレス" と "受信アカウント" とを TAB 記号で区切って指定します。1 行ごとに 1 つずつその対を記載して行きます。そしてこのファイルをもとに "virtusertable.db" を作成するという流れになります。

 

例えば "user1@yyyy.yyy.yy.jp" というメールアカウントを発行して、それをローカルユーザー "yyyy-user1" で受信したいとした場合には、"virtusertable" ファイルには次の行を追加します。

user1@yyyy.yyy.yy.jp    yyyy-user1

"/etc/mail/virtusertable" ファイルを編集したら、次のようにしてそこから "/etc/mail/virtusertable.db" を生成します。

make virtusertable.db

これで、"user1@yyyy.yyy.yy.jp" 宛てに送信されてきた電子メールが、"yyyy-user1" のメールボックスに配信されるようになりました。

 

ちなみに、ここで指定した "yyyy-user1" がシステム上に存在しない場合には、ここで言う "user1@yyyy.yyy.yy.jp" 宛てのメールは "User unknown" エラーとして扱われるようでした。

もし意図的に "User unknown" として扱いたい場合には、アカウント名の代わりに "error:nouser User Unknown" を指定することで、それを実現することも出来るようにもなっています。

 

仮想ドメイン以外の宛先のメールを受信しないようにする

上記のような仮想ドメインの設定ですが、ひとつ注意しておきたいところがあります。

それは、たしかに "user1@yyyy.yyy.yy.jp" 宛ての電子メールが "yyyy-user1" のメールボックスに配信されるまでは良いのですけど、これが "yyyy-user1@xxxx.xxx.xx.jp" 宛てのメールであっても "yyyy-user1" へメールが配信されてしまいます。

さらには、"yyyy-user1@yyyy.yyy.yy.jp" というアドレスに送信した場合までも、"yyyy-user1" へメールが配信されることになります。

 

これはすなわち、Sendmail が受け入れるドメインとして "xxxx.xxx.xx.jp" と "yyyy.yyy.yy.jp" とが登録されていて、これらのドメイン宛ての電子メールは、基本的には @ 前の名前と同じ Linux アカウントに配送されるためです。

さらには "virtusertable" で "user1@yyyy.yyy.yy.jp" については特別に "yyyy-user1" へ配送するように設定がされているため、たくさんのメールアドレスを "yyyy-user1" へ配送してしまうという感じになります。

 

気にしなければそれまでなのかもしれないですが、このような無秩序な自由度は利用の面で大きな混乱を招く恐れがあるように思います。

そこで、あるメールアドレスは原則ひとつのローカルアカウントへ配送されるように設定する方法を検討してみたいと思います。

 

まず、考え方の要所としては次のようになるでしょうか。

  1. "virtusertable" に個別に登録されたメールの配信設定は、意図的に制御された配信先と思って問題ないでしょう。
  2. 存在する全てのローカルアカウントに対して、外からメールが送信できるのは好ましくないでしょう。
  3. あるドメインのメール配信用に作成したアカウントへ、無関係なドメインのメールが届くのは問題でしょう。

こういった観点からこれらを解消する方法を考えてみたところ、標準の仮想ドメインの機能を使って上手く行きそうな方法が考えられましたので、それで設定してみようと思います。

 

まず、原則として、"local-host-names" に登録したドメインはすべて、"virtusertable" にも登録するようにします。

この時 "/etc/mail/virtusertable" は次のようにして、原則すべての宛先へ送信された電子メールは、エラーとして扱うように設定します。

@xxxx.xxx.xx.jp    error:nouser User Unknown

@yyyy.yyy.yy.jp    error:nouser User Unknown

このようにすることで、原則、このドメイン宛てのメールは "User unknown" として、不達扱いにすることが可能です。

 

この上で、メール配信を "/etc/mail/virtusertable" へ記載して行きます。

その際の注意事項としては、当たり前ではありますが、先ほど記載した行よりも上に、正常に配信させたいメールアドレスを追記して行くことになるといったところでしょうか。

つまり、"user1@yyyy.yyy.yy.jp" 宛てに送信されたメールをローカルユーザー "yyyy-user1" へ配信したいといった場合には、"/etc/mail/virtusertable" は全体として次のような設定に仕上がります。

user1@yyyy.yyy.yy.jp    yyyy-user1

 

@xxxx.xxx.xx.jp    error:nouser User Unknown

@yyyy.yyy.yy.jp    error:nouser User Unknown

これで、明示的に設定したメールアカウントのみが、他のドメインと混在することなく、運用できるようになりました。

この方法ならしっかりとメール配信を管理者が制御できるようになると思います。