sendmail 付属 cf による
バーチャルドメインメールサーバーの構築

2000/10/14
2000/11/15

この文書はコピーフリー・無保証です。


0. 想定している環境

ここで想定している環境は次のものです。

 

メールサーバーの不正リレー対策は次のように行います。

  1. envelope from がバーチャルドメインであるユーザーのSMTPはリレーする
  2. envelope to がこのホストであるものはlocalメーラーに渡す
  3. 上記以外のメールは reject する

おおまかな手順は次のようになります

  1. sendmailの入手または環境確認 ( sendmail付属のcfが利用できること)
  2. 必要な外部ファイル(chk-rcpt.m4など)入手と所定のディレクトリへのインストール
  3. メールサーバーのための config.mc マクロの作成
  4. マクロより sendmail.cf の作成
  5. /etc/sendmail.cw へバーチャルドメイン追加 (8.10.x 以降は名前がちがう)
  6. /etc/mail/access へバーチャルドメイン追加とmakemap
  7. /etc/mail/virtusertable へバーチャルユーザー追加とmakemap

上記以外にDNSへバーチャルドメインを追加する必要があります。

ここでは TurboLinux-6.1 Server 上の

sendmail-8.9.3
sendmail-8.11.1

で行っていますが、基本的にどのOSでも同じようにできます。


1. sendmail-8.9.3 によるバーチャルドメインメールサーバーの例

1.1. 必要な環境

chk-rcpt.m4 を取得する

http://www.sendmail.org/~ca/email/rules/alpha/chk-rcpt.m4

chk-rcpt.m4 は (sendmaildir)/cf/hack にインストールしておきます。
(Windows等で転送した場合は改行コードに注意)


1.2. cf のマクロファイル作成

----- config.mc
divert(-1)
include(`/usr/lib/sendmail-cf/m4/cf.m4')
OSTYPE(`linux')dnl
define(`confDEF_USER_ID',``8:12'')
define(`ALIAS_FILE',`/etc/aliases')
define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl
undefine(`UUCP_RELAY')dnl
undefine(`BITNET_RELAY') dnl
FEATURE(always_add_domain)
FEATURE(masquerade_entire_domain)
FEATURE(masquerade_envelope)
EXPOSED_USER('root daemon')
FEATURE(`use_cw_file')dnl
FEATURE(`local_procmail')dnl
FEATURE(`nouucp')dnl
FEATURE(`mailertable', `hash -o /etc/mail/mailertable')dnl
FEATURE(`virtusertable', `hash -o /etc/mail/virtusertable')dnl
FEATURE(`access_db', `hash -o /etc/mail/access')dnl
FEATURE(`relay_entire_domain')
dnl ## following 3 lines are chk-rcpt.m4
define(`_RELAY_ACCESS_FROM_')
define(`_RELAY_ACCESS_FROM_DOMAIN_')
HACK(chk-rcpt)
dnl ##
MAILER(smtp)dnl
MAILER(procmail)dnl
----- config.mc end

1.3. Makefile の変更

config.mc を 作成したあと、以後の構築が面倒なので、そこにある Makefile に追加してしまいましょう。

----- Makefile
ALL= generic-bsd4.4.cf generic-hpux9.cf generic-hpux10.cf \
	generic-osf1.cf generic-solaris2.cf \
	generic-sunos4.1.cf generic-ultrix4.cf \
	cs-hpux9.cf cs-osf1.cf cs-solaris2.cf \
	cs-sunos4.1.cf cs-ultrix4.cf \
	s2k-osf1.cf s2k-ultrix4.cf \
	chez.cs.cf huginn.cs.cf mail.cs.cf mail.eecs.cf mailspool.cs.cf \
	python.cs.cf ucbarpa.cf ucbvax.cf vangogh.cs.cf knecht.cf \
	config.mc <--- このへん
----- Makefile end

1.4. config.cf ファイルの作成

(sendmaildir)/cf/cf で make コマンドを入力すれば作成されます。
m4 マクロは記述に間違いがあると思わぬところでエラーになるので *.mc については十分に確認しましょう。


1.5. アクセス制限のためのファイル作成

アクセス制限のためのファイルは /etc/mail/access のハッシュDB ( /etc/mail/access.db ) です。

ようにするには、各ドメインに対して RELAY を記述すればそうなります。
REJECT を記述すればそのドメインからのアクセスは拒否されるようになります。

----- /etc/mail/access
3bit.co.jp RELAY
tukusi.ne.jp RELAY
spammer.domain REJECT <-- 拒否したい場合
----- /etc/mail/access end

アクセス制限については

http://www.sendmail.org/tips/relaying.html

に有用な情報が記述されています。


1.6. バーチャルユーザー登録のためのファイル作成

バーチャルユーザー登録のためのファイルは/etc/mail/virtusertable のハッシュDB ( /etc/mail/virtusertable.db )です。
このファイルは一度しかパーズされないので、間接参照はできないので注意してください
( info->webmaster->root とはできないので info->root, webmaster->root とする)

----- /etc/mail/virtusertable
info@tukusi.ne.jp webmaster@tukusi.ne.jp
info@3bit.co.jp sasaki@3bit.co.jp
#
# webmaster@tukusi.ne.jp sasaki@tukusi.ne.jp とすると
# webmaster -> sasaki は通るが
# info -> sasaki にはならない
----- /etc/mail/virtusertable end

1.7. 扱えるホスト名の定義

ここでは、ホスト名をマスクしてメールアドレスを与えるので
受け取るホスト名として、ドメイン部分を sendmail.cw に与えてやる必要があります。

----- /etc/sendmail.cw
tukusi.ne.jp
3bit.co.jp
----- /etc/sendmail.cw end

1.8. ユーザー追加時のまとめ

定義ファイル sendmail.cf を作成したあとの作業は、ドメインやユーザーを追加するたびに必要となります。
これらをまとめると、次の手順になります。

ドメイン追加時

  1. /etc/sendmail.cw に追加したドメインを記述する
  2. /etc/mail/access に追加したドメインを RELAY で記述し makemap を行う

ユーザー追加時

  1. /etc/mail/virtusertable にユーザーのメールアドレスを追加し makemap を行う

2. sendmail-8.11.1 によるバーチャルドメインサーバーの例

sendmail-8.10.x 以降の場合 check_rcpt ルールはデフォルトで存在しますので chk-rcpt.m4 を取得する必要はありません。

sendmail-8.10.x 以降は cf/README にあるように、定義ファイルの名前と位置がかなり変更されていることに注意してください。

----- sendmail-8.11.1/cf/README part
+----------------+
| FILE LOCATIONS |
+----------------+
sendmail 8.9 has introduced a new configuration directory for sendmail
related files, /etc/mail. The new files available for sendmail 8.9 --
the class {R} /etc/mail/relay-domains and the access database
/etc/mail/access -- take advantage of this new directory. Beginning with
8.10, all files will use this directory by default (some options may be
set by OSTYPE() files). This new directory should help to restore
uniformity to sendmail's file locations.

Below is a table of some of the common changes:

Old filename New filename
------------ ------------
/etc/bitdomain /etc/mail/bitdomain
/etc/domaintable /etc/mail/domaintable
/etc/genericstable /etc/mail/genericstable
/etc/uudomain /etc/mail/uudomain
/etc/virtusertable /etc/mail/virtusertable
/etc/userdb /etc/mail/userdb

/etc/aliases /etc/mail/aliases
/etc/sendmail/aliases /etc/mail/aliases
/etc/ucbmail/aliases /etc/mail/aliases
/usr/adm/sendmail/aliases /etc/mail/aliases
/usr/lib/aliases /etc/mail/aliases
/usr/lib/mail/aliases /etc/mail/aliases
/usr/ucblib/aliases /etc/mail/aliases

/etc/sendmail.cw /etc/mail/local-host-names
/etc/mail/sendmail.cw /etc/mail/local-host-names
/etc/sendmail/sendmail.cw /etc/mail/local-host-names

/etc/sendmail.ct /etc/mail/trusted-users

/etc/sendmail.oE /etc/mail/error-header

/etc/sendmail.hf /etc/mail/helpfile
/etc/mail/sendmail.hf /etc/mail/helpfile
/usr/ucblib/sendmail.hf /etc/mail/helpfile
/etc/ucbmail/sendmail.hf /etc/mail/helpfile
/usr/lib/sendmail.hf /etc/mail/helpfile
/usr/share/lib/sendmail.hf /etc/mail/helpfile
/usr/share/misc/sendmail.hf /etc/mail/helpfile
/share/misc/sendmail.hf /etc/mail/helpfile

/etc/service.switch /etc/mail/service.switch

/etc/sendmail.st /etc/mail/statistics
/etc/mail/sendmail.st /etc/mail/statistics
/etc/mailer/sendmail.st /etc/mail/statistics
/etc/sendmail/sendmail.st /etc/mail/statistics
/usr/lib/sendmail.st /etc/mail/statistics
/usr/ucblib/sendmail.st /etc/mail/statistics

Note that all of these paths actually use a new m4 macro MAIL_SETTINGS_DIR
to create the pathnames. The default value of this variable is
`/etc/mail/'. If you set this macro to a different value, you MUST include
a trailing slash.
----- sendmail-8.11.1/cf/README part end

これらの位置が変更されていることを十分把握した上で、config.mc を下記のように定義します。
aliases の位置など、define()マクロによって変更できます。
(下記の例ではコメントにしています)

なお
MAILER(smtp)dnl
MAILER(procmail)dnl
は procmail が先にあると、エラーとなりますので注意してください。

----- config.mc
OSTYPE(`linux')dnl
DOMAIN(`generic')dnl
dnl ##
dnl ## use old aliases location
dnl ## define(`confDEF_USER_ID',``8:12'')
dnl ## define(`ALIAS_FILE',`/etc/aliases')dnl
dnl define(`confPRIVACY_FLAGS', `authwarnings,needmailhelo,noexpn,novrfy')dnl
dnl ##
define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl
undefine(`UUCP_RELAY')dnl
undefine(`BITNET_RELAY') dnl
FEATURE(`always_add_domain')
FEATURE(`masquerade_entire_domain')
FEATURE(`masquerade_envelope')
EXPOSED_USER('root daemon')
FEATURE(`local_procmail')dnl
dnl ## sendmail.cw --> /etc/mail/local-host-names
FEATURE(`use_cw_file')dnl
dnl ##
FEATURE(`nouucp', `reject')dnl
FEATURE(`mailertable', `hash -o /etc/mail/mailertable')dnl
FEATURE(`virtusertable', `hash -o /etc/mail/virtusertable')dnl
FEATURE(`access_db', `hash -o /etc/mail/access')dnl
FEATURE(`relay_local_from')
dnl FEATURE(`promiscuous_relay')
dnl FEATURE(`relay_entire_domain')
dnl ## following 2 line appere since sendmail-8.10.x
FEATURE(`virtuser_entire_domain')
FEATURE(`relay_mail_from', `domain')
dnl ##
MAILER(smtp)dnl
MAILER(procmail)dnl
----- config.mc

上記の定義で、ローカルIPと考えられるアドレスからの接続はリレーの対象となり、他からの接続は access に定義されていないものはリレーされないようになります。
なおこの例では access への記述は domain での定義も有効にしています。

もしdomainによるenvelope fromでの許可をしない場合は

FEATURE(`relay_mail_from')

と定義しておけばドメイン名ベースのリレーは行われません。


3. おまけ

nullclient を利用したメールスプールを持たないサーバーの定義ファイル例

ここで想定されている環境は次のようなものです。

この例は FreeBSD-3.4R + sendmail-8.11.1 上でのものです。

----- config.mc
divert(0)dnl
OSTYPE(bsd4.4)dnl
DOMAIN(generic)dnl
FEATURE(`nullclient', `mail.3bit.co.jp.')
MASQUERADE_AS(`3bit.co.jp')
FEATURE(`always_add_domain')
FEATURE(`masquerade_entire_domain')
FEATURE(`masquerade_envelope')
EXPOSED_USER(`root daemon news usenet postmaster')
FEATURE(`access_db', `hash -o /etc/mail/access')
FEATURE(`relay_mail_from', `domain')
MAILER(local)dnl
MAILER(smtp)dnl
----- config.mc

注意点は2つです。

  1. FEATURE(`nullclient', `mail.some.domain.')のホスト名には最後に '.' をつけること。
  2. FEATURE(`nullclient', `mail.some.domain.') はMASQUERADE_AS(`some.domain') より先であること。さもなければ、hubhostに指定した値(mail.some.domain)にマスクされることになる。

 


ホームページへ戻る

2001/01/09

Nobuyuki  SASAKI            Sapporo JAPAN