FreeBSD

sendmail のセットアップ

1. 大雑把な手順

FreeBSD をインストールした時に入っている sendmail.cf は、

という条件が揃う場合にはそのまま使うことができる。

サイトの都合でカスタマイズしたい場合は

という手順。

1.1 hostname.mc の例

my.domain に対するスプールホスト用の設定例

divert(0)
VERSIONID(`...')
OSTYPE(freebsd4)
DOMAIN(generic)

MASQUERADE_AS(`my.domain')dnl		@ の後ろをドメイン名にする
MASQUERADE_DOMAIN(`$j')dnl		自分の FQDN が書換え対象
EXPOSED_USER(``daemon news usenet postmaster MAILER-DAEMON'')
FEATURE(`limited_masquerade')dnl	書換えるドメインを制限
FEATURE(`masquerade_envelope')dnl	エンベロープも書換える
FEATURE(`allmasquerade')dnl		To:, Cc: などもすべて書換える

FEATURE(access_db, `hash -o -T<TMPF> /etc/mail/access')
FEATURE(blacklist_recipients)
FEATURE(local_lmtp)
FEATURE(mailertable, `hash -o /etc/mail/mailertable')
FEATURE(virtusertable, `hash -o /etc/mail/virtusertable')

define(`confCW_FILE', `-o /etc/mail/local-host-names')
define(`confMAX_MIME_HEADER_LENGTH', `256/128')
define(`confNO_RCPT_ACTION', `add-to-undisclosed')
define(`confPRIVACY_FLAGS', `authwarnings,noexpn,novrfy')

MAILER(local)
MAILER(smtp)

my.domain に属するクライアント用の設定例

divert(0)
VERSIONID(`...')
OSTYPE(freebsd4)
DOMAIN(generic)

MASQUERADE_AS(`my.domain')dnl		@ の後ろをドメイン名にする
MASQUERADE_DOMAIN(`$j')dnl		自分の FQDN が書換え対象
EXPOSED_USER(``daemon news usenet postmaster MAILER-DAEMON'')
FEATURE(`limited_masquerade')dnl	書換えるドメインを制限
FEATURE(`masquerade_envelope')dnl	エンベロープも書換える
FEATURE(`allmasquerade')dnl		To:, Cc: などもすべて書換える

define(`LOCAL_RELAY', `mx.my.domain.')
define(`MAIL_HUB', `mx.my.domain.')
define(`SMART_HOST', `mx.my.domain.')

define(`confCW_FILE', `-o /etc/mail/local-host-names')
define(`confMAX_MIME_HEADER_LENGTH', `256/128')
define(`confNO_RCPT_ACTION', `add-to-undisclosed')
define(`confPRIVACY_FLAGS', `authwarnings,noexpn,novrfy')

MAILER(smtp)

1.2 /etc/mail/access

他のホストからの転送を受けるかどうかを設定するファイル。 無ければ、自分で受けとるアドレスへのメイルのみ受け入れる。

サンプルが /etc/mail/access.sample にある。

1.3 /etc/mail/local-host-names

自分の FQDN 以外のアドレスも受けとる場合に作る。 例えば

#
# sample /etc/mail/local-host-names
#
foo.my.domain
bar.my.domain

となっていると、@foo.my.domain および @bar.my.domain 宛も受けとる。 自ホスト名を書く必要はない。 ワイルドカードは使えない。

2. アドレス関連

2.1 @ 以降をホスト名でなくドメインに

cf のデフォルトではホスト名が使われる。

戦略としては、メイルアドレスの書換えを利用して、自ホスト名 (FQDN) のみ希望のドメイン名に書換える手法をとる。

MASQUERADE_AS(`my.domain')dnl			From: 等を @my.domain にする
MASQUERADE_DOMAIN(`$j')dnl			自ホスト名が書換え対象
EXPOSED_USER(``daemon news usenet postmaster MAILER-DAEMON'')
FEATURE(`limited_masquerade')dnl		自ホスト名のみ書換える
FEATURE(`masquerade_envelope')dnl		エンベロープも書換える
FEATURE(`allmasquerade')dnl			Cc: のアドレスなども書換える

を定義。

なお、 EXPOSED_USER(`usernames ...') または EXPOSED_USER_FILE(`filename') で指定されたユーザーに関しては書換えは行なわれない。 これらが未定義であっても、root はデフォルトで入っている。 CF-3.7W では

root daemon news usenet postmaster MAILER-DAEMON

が定義されていたので、同様の動作を望む場合は

EXPOSED_USER(``daemon news usenet postmaster MAILER-DAEMON'')

を定義する。 ハイフンが入っているため `...' ではなく ``...'' で括る必要があることに注意。

※ limited_masquerade を使う理由

MASQUERADE_DOMAIN(または MASQUERADE_DOMAIN_FILE)と limited_masquerade を用いないと、仮想ドメインを扱う時に混乱が生じる。 具体的には、 ローカルで受けとるべき別々のアドレスを Cc: や From: で指定していても、 それらがすべて MASQUERADE_AS のアドレスに書換えられてしまう。

例) foo.my.domain と bar.my.domain が local-host-names にあって MASQUERADE_AS(`foobar.my.domain') かつ FEATURE(`allmasquerade') の場合

limited_masquerade を定義しないと

To: alpha@foo.my.domain
Cc: bravo@bar.my.domain
From: charlie
To: alpha@foobar.my.domain
Cc: bravo@foobar.my.domain
From: charlie@foobar.my.domain
に書き換わってしまう。 このようなことを防ぐために、limited_masquerade を使って自分の FQDN だけを書き換え対象とする。

2.2 ローカルに配送するメイルでもドメインを付加

CF-3.7W の ALWAYS_APPEND_DOMAIN=yes に相当。

FEATURE(`always_add_domain')

を定義する。

3. 受け取り

3.1 ドメインに対するメイルスプールにする

/etc/mail/local-host-names に受け取るホスト名・ドメイン名を列挙する。

3.2 サブドメイン以下をすべて受けとる

CF-3.7W の ACCEPT_LOWER=yes に相当する機能は cf には無い。

サブドメインの数がそれほど多くなく、変更が滅多にないのであれば、すべて local-host-names に書く手もある。 しかし、local-host-names ではワイルドカードは使えないので、変更があるたびに設定を変えなければならない。 それを避けるには

のいずれかで対応する。

3.3 自分では受け取らず全部ハブホストに転送

define(`LOCAL_RELAY', `hostname.')dnl	@ 以下がない時に送られるホスト
define(`MAIL_HUB', `hostname.')dnl	@my.host の時に送られるホスト
define(`SMART_HOST', `hostname.')dnl	@other.host @[x.y.z.w] の時の送り先

を全部同じホストに定義。 ホスト名の最後に . を付ける。

3.4 仮想ドメイン受け取り

まず /etc/mail/local-host-names でローカルに受け取るドメインに指定した上で /etc/mail/virtusertable にユーザー名のマッピングを記述するか、ユーザー名のマッピングが必要ないのであれば mailertable でも対応可能。

※ masquerading していて limited_masquerade を定義しない時は注意が必要。

既述の通り、To: Cc: From: のうちローカルで受けとるべきドメインがすべて MASQUERADE_AS のものに書換えられてしまうので、

MASQUERADE_EXCEPTION(`foo.my.domain bar.my.domain')

などと指定して、これらについて書換えが行なわれないようにする必要がある。

4. 配送関連

4.1 転送を許す IP アドレスを指定

CF-3.7W の MAIL_RELAY_RESTRICTION=yes と LOCAL_HOST_IPADDR='...' に相当。

FEATURE(access_db, `hash -o -T<TMPF> /etc/mail/access')

を定義した上で(標準の sendmail.cf でも定義されている)、/etc/mail/access に

192.168		RELAY

などと書く。

4.2 エラーメイルを postmaster にも送る

CF-3.7W の COPY_ERRORS_TO='...' に相当。

define(`confCOPY_ERRORS_TO', ``MAILER-DAEMON'')

を定義する。 デフォルトでは未定義。

4.3 DNS の MX レコードに応じて secondary MX になる

FEATURE(`relay_based_on_MX')

を定義すればよい。