freebsd.mcの概要                                                        戻る

 FreeBSDに標準的に付いて来るsendmail.cfは非常に高機能になっており、多くの場合、DNSがきちんと設定されており、正引き・逆引き共に間違いなく自分のホスト名解決ができれば、そのまま使うことができます。
 まず、freebsd.mcがどのような機能を持っているかを解説します。リスト1を見て下さい。これは、4.3-RELEASEに向けてコード凍結直後の4.3-BETAに添付されているfreebsd.mcです。コメント部分は訳してあります。
 dnlで始まる部分はコメントです。また、divert(-1)からdivert(0)の間もコメントです。

リスト1 freebsd.mc
divert(-1)
#
# Copyright (c) 1983 Eric P. Allman
# Copyright (c) 1988, 1993
#	The Regents of the University of California.  All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software
#    must display the following acknowledgement:
#	This product includes software developed by the University of
#	California, Berkeley and its contributors.
# 4. Neither the name of the University nor the names of its contributors
#    may be used to endorse or promote products derived from this software
#    without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#

#
#  これは 4.4 BSD をベースとするシステム一般用の設定です。
#  カスタマイズする場合は、あなたの環境に見合った適切な名称のファイルに
#  コピーし、そちらを変更して下さい。
#
#  .mc ファイルの最良のドキュメントは
#  /usr/share/sendmail/cf/README または
#  /usr/src/contrib/sendmail/cf/README です。
#

divert(0)
VERSIONID(`$FreeBSD: src/etc/sendmail/freebsd.mc,v 1.10.2.8 2001/03/06 02:12:59 gshapiro Exp $')
OSTYPE(bsd4.4)
DOMAIN(generic)

FEATURE(access_db, `hash -o /etc/mail/access')
FEATURE(blacklist_recipients)
FEATURE(local_lmtp)
FEATURE(mailertable, `hash -o /etc/mail/mailertable')
FEATURE(relay_based_on_MX)
FEATURE(virtusertable, `hash -o /etc/mail/virtusertable')

dnl リアルタイムブラックホールリストを利用する場合はコメントを外し
dnl ます (推奨!)。情報は http://maps.vix.com/rbl/ にあります。
dnl FEATURE(dnsbl)
dnl RBL 用のあなた独自のリジェクトメッセージを設定したい場合、こちらを
dnl 代わりに有効にします。
dnl FEATURE(dnsbl, `blackholes.mail-abuse.org', `"550 Mail from " $&{client_addr} " rejected, see http://mail-abuse.org/cgi-bin/lookup?" $&{client_addr}')

dnl その他の DNS ベースなブラックホールリスト
dnl -----------------------------------------
dnl MAPS リアルタイム SPAM スットパー (RSS): http://mail-abuse.org/rss/
dnl FEATURE(dnsbl, `relays.mail-abuse.org', `"550 Mail from " $&{client_addr} " rejected; see http://mail-abuse.org/cgi-bin/nph-rss?" $&{client_addr}')

dnl MAPS ダイアルアップユーザリスト (DUL): http://maps.vix.com/dul/
dnl FEATURE(dnsbl, `dialups.mail-abuse.org', `"550 Mail from dial-up rejected; see http://mail-abuse.org/dul/enduser.htm"')

dnl ORBS も DNS ベースなブラックホールリストの多くを提供しています。
dnl http://www.orbs.org/usingindex.html を参照。

dnl ダイアルアップユーザはコメントを外しこれを適切に定義しましょう。
dnl define(`SMART_HOST', `your.isp.mail.server')

dnl デフォルトである /etc/mail/local-host-names の位置を変更したい場合
dnl は、最初の行のコメントを外し、次の行をコメントにします。
dnl define(`confCW_FILE', `-o /etc/mail/sendmail.cw')
define(`confCW_FILE', `-o /etc/mail/local-host-names')

dnl IPv4 に加えて IPv6 でもメイルを受信したい場合は、以下の行の両方と
dnl ものコメントを外します。
dnl DAEMON_OPTIONS(`Name=IPv4, Family=inet')
dnl DAEMON_OPTIONS(`Name=IPv6, Family=inet6')

define(`confMAX_MIME_HEADER_LENGTH', `256/128')
define(`confNO_RCPT_ACTION', `add-to-undisclosed')
define(`confPRIVACY_FLAGS', `authwarnings,noexpn,novrfy')
MAILER(local)
MAILER(smtp)
VERSIONID(`$FreeBSD: src/etc/sendmail/freebsd.mc,v 1.10.2.6 2001/02/28 02:50:54 gshapiro Exp $')
 この.mcファイルのバージョンをあらわします。 CFのDEF_ID=に相当します。
OSTYPE(bsd4.4)
 OS種別です。 これによって、ローカルメイラのパスなどのOS固有の値が設定されます。 引数は、cf/ostype/*2)にある.m4ファイルから.m4を除いた名前です。 CFのOS_TYPE=に相当します。 これは必須です。 FreeBSDはbsd4.4のままで変更する必要ありません。
DOMAIN(generic)
 サイト固有の設定をcf/domain/に置いておき、取り込むことができます。 引数は、cf/domain/にある.m4ファイルから.m4を除いた名前です。 独自の設定ファイルを使わない場合はgenericを指定しておきます。
FEATURE(access_db, `hash -o /etc/mail/access')
 アクセスデータベース機能を有効にします。 アクセスデータベースを使うことで、特定ドメインからのメイルを許可したり拒否することができるようになります。 CFのSPAM_LIST=に近いですが、より細かい設定ができます。 加えて、リレー可否の設定も行うことができます。 基本的に、SPAM対策やリレーの可否はaccess_dbのみで全てまかなうことができます。
 外部データベースを使用しますので、/etc/mail/accessを変更した場合、makemapコマンドを使用して/etc/mail/access.dbに反映させます。 /etc/mail/accessを変更しても、sendmailの再起動は必要ありません。 なお、-oが指定されていますので、本機能を使用しないのであれば、/etc/mail/accessを用意する必要はありません。
FEATURE(blacklist_recipients)
 access_dbを使って、ローカルの特定の受信者宛や自ドメインの特定ホスト宛のメイルをブロックすることができるようになります。 ローカルユーザを指定する場合、「ユーザ名@」と書きます。
 CFのREJ_RCPT_LIST=に近いですが、access_dbを使用する点が異なります。
FEATURE(local_lmtp)
 ローカルへのメイル配送時にLMTP*3)を使用します。 CFには特にこれに対応する設定項目はありませんが、
LOCAL_MAILER_FLAG_ADD='z' LOCAL_MAILER_ARGS='mail.local -l'
を指定するのと等価です。 FreeBSDのローカル配信エージェントである/usr/libexec/mail.localはLMTP対応 ですので、指定しておきます。
FEATURE(mailertable, `hash -o /etc/mail/mailertable')
 特定ドメイン向けのメイルの配送経路を/etc/mail/mailertableで指定できるようになります。 CFのMAILERTABLE=に相当します。 なお、外部データベースを使用しますので、/etc/mail/mailertableを変更した場合、makemapコマンドを使用して/etc/mail/mailertable.dbに反映させます。 /etc/mail/mailertableを変更しても、sendmailの再起動は必要ありません。 なお、-oが指定されていますので、本機能を使用しないのであれば、/etc/mail/mailertableを用意する必要はありません。
FEATURE(relay_based_on_MX)
 送られてきたメイルの宛先のホスト部についてMXレコードを引いて、MXレコードが自ホストを指していた場合には、そのメイルのリレーを許可します。 これにより、セカンダリMXを受け持つ際にそのサイトへのリレーを許可する設定を入れる必要がなくなります。
 CFのLOWER_MX_OK=yesに相当します。
 この設定によって、SPAMのリレーに悪用されることはありません。 しかし、外部の者が彼らのサイト宛のメイルをリレーするのに利用する抜け道があります。 便利な機能ですが、気になる方は使わないようにコメントアウトした方が良いかもしれません。*4)
FEATURE(virtusertable, `hash -o /etc/mail/virtusertable')
 CFではバーチャルドメインの運用をするにはUSERTABLE_MAPS=を使用しますが、これに等価な機能はcfにはありません。 cfではvirtusertableを使用します。 USERTABLE_MAPSではドメイン毎にマップファイルを用意するのに対し、virtusertableは全てのバーチャルドメインをひとつのマップファイルで管理します。 また、USERTABLE_LOCAL_REWRITE=yesで提供される発信者アドレスの書き換えはcfではgenericstableで行います。
 virtusertableはオリジナルアドレスと実際の配信先との組からなります。 配信先がユーザ部のみの場合、ローカル宛となります。
 オリジナルアドレスに@domainのようにユーザ部が書かれていない場合は、そのドメイン宛のメイルは全て単一の配信先に配信されます。 また、オリジナルアドレスのユーザ部は%1として渡されますので、
@foo.org %1@example.com
のように書くこともできます。
 なお、外部データベースを使用しますので、/etc/mail/virtusertableを変更した場合、makemapコマンドを使用して/etc/mail/virtusertable.dbに反映させます。 /etc/mail/virtusertableを変更しても、sendmailの再起動は必要ありません。 なお、-oが指定されていますので、本機能を使用しないのであれば、/etc/mail/virtusertableを用意する必要はありません。
 バーチャルドメイン宛のメイルを自ホストで受け取ることができるように、オリジナルアドレスのホスト部は全てクラス{w}またはクラス{VirtHost}に記述されている必要があります。 クラス{VirtHost}はVIRTUSER_DOMAIN()またはVIRTUSER_DOMAIN_FILE()で指定します。
 クラス{w}には/etc/mail/local-host-namesに書いたホストが反映されます。 freebsd.mcでは元々confCW_FILEが指定されていますので、local-host-namesに書く方が簡単かもしれません。
define(`confCW_FILE', `-o /etc/mail/local-host-names')
 DOMAIN(generic)内でFEATURE(`use_cw_file')が指定されています。 ローカルとして扱うホスト名を表すクラス{w}に/etc/mail/local-host-namesからホスト名を取り込みます。 -oが指定されていますので、本機能を使用しないのであれば、/etc/mail/local-host-namesを用意する必要はありません。
define(`confMAX_MIME_HEADER_LENGTH', `256/128')
 MIMEヘッダの最大長を制限します。 MIMEヘッダによるバッファオーバーラン攻撃からクライアントを守ります。
define(`confNO_RCPT_ACTION', `add-to-undisclosed')
 To:ヘッダが付いていない場合に、
To: undisclosed-recipients:;
を付加します。
 CFのNO_RECIPIENT_ACTION=add-to-undisclosedと等価です。
define(`confPRIVACY_FLAGS', `authwarnings,noexpn,novrfy')
 プライバシ・フラグを設定します。 CFのPRIVACY_FLAGS=と等価です。
MAILER(local)
MAILER(smtp)
 配信エージェントを指定します。 引数は、cf/mailer/にある.m4ファイルから.m4を除いた名前です。 localとsmtpは必須です。
 以上がfreebsd.mcの概要です。通常使いそうな機能が既にほとんど定義されていることがお分かり頂けたことと思います。
 さて、外部ファイルを使用する機能が多いことに気付かれたことと思います。昔はメイルを受け取るべきホスト名やメイル配送経路などのホスト固有の設定をsendmail.cf 内に記述していました。しかし、最近は外部ファイルに書いおくのがお奨めです。そうしておくと、sendmail.cfをいじる必要性がほとんどなくなり、同じsendmail.cfを複数のホストで共有できるようになります。また、データベースを使用するものについては、マップが大きくてもsendmailの起動が遅くなるようなことはありませんし、変更を加えてもsendmailを再起動する必要がありません。ただし、外部データベースを変更した場合は、図2のようにmakemapを実行してデータベースを作り直す必要があります。
図2 makemapの実行
# makemap hash /etc/mail/mailertable < /etc/mail/mailertable
 これまで見てきましたように、freebsd.mcでは、標準で/etc/mail/access、/etc/mail/mailertable、/etc/mail/virtusertable、/etc/mail/local-host-namesが外部ファイルとして利用できるように設定されていますので、これらのファイルを適宜編集することで、ほとんどのニーズに対応できることと思います。なお、これらのうちlocal-host-names以外はデータベースです。
 設定を積極的に外部ファイルに出していくかどうかはサイトの管理方針や好みによると思いますので、うまく使い分けていくと良いでしょう。

自分好みのsendmail.cfに仕立てる

 では、多くの人がカスタマイズしそうな機能について説明していきます。

メイルを受け取りたいホスト名

 多くのサイトが、ドメイン名宛のメイルを受け取るように設定しているでしょう。 CFではACCEPT_ADDRS=です。 cfでは、/etc/mail/local-host-namesに受け取りたいドメイン名を書いておきます。 8.9.X以前はこのファイル名はsendmail.cwだったので間違わないよう注意しましょう。
 この設定はもちろん.mcファイルに書くこともできます。この場合、LOCAL_DOMAIN()を使って、以下のように.mcファイル内で直接書きます。
LOCAL_DOMAIN(`example.com')
 CFのACCEPT_LOWER=に相当するマクロはcfにはありません。等価な処理をさせたい場合は、LOCAL_RULE_0を使って直接ルールを埋め込みます。リスト2にACCEPT_LOWER=yes相当の例を挙げておきます。
リスト2 ACCEPT_LOWER=yesの代用
LOCAL_RULE_0
R$* < @ $* .$m. > $*		$1 < @ $m. > $3

($mはホスト名のドメイン部分を保持している定義マクロです。もちろん、ドメイン名を明に指定しても構いません。)

メイルのFrom:

 freebsd.mcだと、メイルの発信時に自動的に付加されるFrom:にはホスト名が含まれます。ドメイン名だけにしてホスト名は隠したい場合は、CFだと
FROM_ADDRESS='$m'
を指定していることでしょう。 cfでは、
MASQUERADE_AS(`$m') FEATURE(`masquerade_envelope')
と書きます。ただし、REWRITE_GENERIC_FROM=yes相当の動きをし、最初から From:にFQDNが指定されていた場合も、ホスト名が消えるよう書き換えられてしまいます。あらかじめFrom:が付いていた場合は書き換えないようにするには、
FEATURE(`limited_masquerade')
も併せて指定すると良いでしょう。このオプションを指定すると、MASQUERADE_DOMAIN()またはMASQUERADE_DOMAIN_FILE()で指定されたドメインのみが書き換えられるようになります。
 また、CFでRECIPIENT_GENERIC=yesを指定して、To:やCc:などの配送先指定フィールドがユーザ名のみの時にドメイン名を補うようにしている場合、
FEATURE(`allmasquerade')
も併せて指定します。

信頼できるユーザ

 メイリングリストを運用している場合、CFのTRUSTED_USERS=で信頼できるユーザを追加していることと思います。 cfではconfTRUSTED_USERを使用して
define(`confTRUSTED_USERS', `uucp majordom')
のように指定します。あるいは、
define(`confCT_FILE', `-o /etc/mail/trusted-users')
を指定して、/etc/mail/trusted-usersに信頼できるユーザ記述するようにすることもできます。ちなみに、以前はこのファイルはsendmail.ctという名称でしたが、変更になっています。

デフォルトの配送先

 ファイアウォールなどがあり特定のSMTPサーバを経由しないとメイルを出せないような環境や、ダイアルアップなどでISPのSMTPサーバを経由してメイルを出すようにするには、CFだと、
DIRECT_DELIVER_DOMAINS='example.com' DEFAULT_RELAY='smtp:gateway.example.com'
のような設定をしていると思います。 cfだとSMART_HOSTを使います。
define(`SMART_HOST', `gateway.example.com')
を指定することで、ローカル宛以外のメイルはgateway.example.com宛に送られるようになります。
 CFのDIRECT_DELIVER_DOMAINS=に相当するマクロはありませんので、組織内宛はダイレクトに送るようにするには、/etc/mail/mailertableに
example.com smtp:example.com .example.com smtp:%1.example.com
というように書いてあげれば良いです。ここで、第1フィールドは転送したいドメイン名です。第2フィールドは転送先の指定で、メイラ:ホスト名のペアです。上記例の1行目はexample.comにのみマッチしそのサブドメインはマッチしません。サブドメインを含めて全てマッチさせたい場合は2行目も必要です。
 上記例での第2フィールドに指定されたホスト名はMXレコードを検索されます。 MXレコードを検索させたくない場合は、
example.com smtp:[mail.example.com]
のようにホスト名を[]で囲んで記述します。
 mailertableを使用せず、sendmail.cf内に書きたい場合は、LOCAL_NET_CONFIGを用いてルールを直接記述します。例えば、上記例だとリスト3のようになります。
リスト3 LOCAL_NET_CONFIGによる記述例
LOCAL_NET_CONFIG
R$* < @ $* example.com. > $*	$#smtp $@ $2example.com. $: $1 < @ $2example.com. > $3

アドレスの補完

 ファイアウォール内などでメイル宛先のDNSを引けない場合や、自サイトがワイルドカードMXを使っている場合には注意が必要です。 CFだとデフォルトがCANON=oneとなっており、メールアドレスのアドレス部が1語であるもののみネームサーバを参照して補完を試みるようになっていますので問題は生じませんが、cfだとデフォルトは補完を行うようになっていますので、問題が生じることがあります。
FEATURE(`nocanonify', `canonify_hosts')
を入れておきましょう。

エンベロープFROMのチェック

 8.9以降ではエンベロープFROMにDNSで引けないドメイン名が含まれていると、メイルの受け取りを拒否するようになっています。ファイアウォール内とかDNSで送信者のアドレスを引くことができないような環境だと、
FEATURE(`accept_unresolvable_domains')
を加えて、エンベロープFROMのチェックを行わないようにする必要があります。これはCFでUSE_SENDER_DNS_CHECK=noを指定するのと等価です。
 また、エンベロープFROMにドメイン部がないと、メイルを受け取りません。そのようなメイルも受け取りたい場合は、
FEATURE(`accept_unqualified_senders')
を指定します。 CFでNEED_SENDER_DOMAIN=noとCHECK_FROM_FQDN=noを指定するのに相当します。

リレー制限

 おそらく、多くのサイトが、サイト外からのメイルのリレーは禁止するが、サイト内からのメイルはリレーを許可していることでしょう。
 freebsd.mcでは、relay_based_on_MXによるリレーのみが許可されています。また、access_db機能が組み込まれていますので、access_dbを使ってアクセス制御を行うことができます。つまり、access dbでRELAYとして許可されたホストあるいはドメインからのリレーが許可されます。これ以外にも、access_dbは非常に多くの機能を持っています。
 あるいは、RELAY_DOMAINを使って以下のように.mcファイル内に直接書いておくこともできます。
RELAY_DOMAIN(`example.com')
RELAY_DOMAINには、ドメイン名やIPアドレスを指定することができます。
 また、FEATURE(relay_entire_domain)を指定すると、クラス{m}で定義されたドメイン全体に対してリレーが許可されるようになります。

Message-Id:不正

 CFでHDR_REJECT_BADMID=yesを指定し、Message-Id: ヘッダの内容に@が含まれない場合に受信を拒否している方も多いでしょう。 cfにはこれに対応するマクロはありませんのでリスト4のようにLOCAL_RULESETSを使って記述します。この例では、HDR_REJECT_ACTION=discardの場合と等価になっています。
リスト4 Message-Id:不正メイルへの対処
LOCAL_RULESETS
HMessage-Id: $>CheckMessageId

SCheckMessageId
R< $+ @ $+ >		$@ OK
R$*			$#discard $: discard

戻る