$Id: cf.html,v 1.9 2000-05-11 10:15:59+09 naito Exp $ここに述べていることは, すべて私が実行した方法であり, これによる損害等については, 一切私は責任を持ちません. 各自の責任で行なって下さい.
パッケージの使用方法は, CF に付属する
README.jpn を読んで下さい.
極めてわかりやすく書いてあります.
ここでは, sendmail.cf を作成するための definition file 中で,
SPAM 対策のとり方について説明します.
以後, CF のパッケージは
$CFSRCDIR に展開されているとします.
これらの条件を整理して書き直してみると, 以下の2条件の両方にマッチしたメールのみを中継する設定を行なえば良いことがわかります.
null-v8.def を適当な名前 (ここでは, OSの名前をつけて, solaris-null.def としておきます.) につけ変えて, 以下を変更します.
OS_TYPE=solaris2.6 # OSの指定. SPOOL_HOST='mailhost.math.nagoya-u.ac.jp' # メールサーバの指定. ALWAYS_APPEND_DOMAIN=yes # 内部へのメールであってもドメイン名をつける.このような定義ファイルを作成して, make を
make solaris-null.cfと実行すると, solaris-null.cf が作成されます.
ところが, なぜか, 内部へのメールはエンベロープFROMにドメイン名がつかないので, このあと, cf ファイルを手で修正します. cf ファイルの変更点は以下の通りです.
#Dmmy.domain.nameを
Dmmath.nagoya-u.ac.jpに変更します. これによって, $m は "math.nagoya-u.ac.jp" となります.
#Dj$w.$mをコメント・アウトします. これにより, $j は "hostname.math.nagoya-u.ac.jp" となります.
R$=S $@$1@$jの次の行に
R$+ $@$1@$mを付け加えます. これによって, エンベロープFROMにドメイン名を持たないものに対して, ドメイン名をつけることができます. ここで, sendmail.cf 中の LHS と RHS の間は TAB で区切られていることに注意します.
sendmail-v8.def を適当な名前 (ここでは, OSの名前をつけて, server.def としておきます.) につけ変えて, 以下を変更します. (各変数の意味は, CF のドキュメントを参照してください)
OS_TYPE=solaris2.6 MY_DOMAIN=math.nagoya-u.ac.jp MY_NAME=rabbit OFFICIAL_NAME='$w.$m' MY_ALIAS=mailhost FROM_ADDRESS='$m' RECIPIENT_GENERIC=yes REWRITE_GENERIC_FROM=yes REWRITE_GENERIC_TO=yes REWRITE_LOCAL_ON_RELAY=generic ACCEPT_ADDRS='$m' ACCEPT_LOWER=yes ONE_TOKEN_HOST=reject REDIRECT=yes ALWAYS_APPEND_DOMAIN=yes RES_NUMERIC=no USERTABLE_MAPS='snowy.math.nagoya-u.ac.jp=dbm:/etc/mail/sendmail/ut.snowy \ tintin.math.nagoya-u.ac.jp=dbm:/etc/mail/sendmail/ut.snowy \ eagle.math.nagoya-u.ac.jp=dbm:/etc/mail/sendmail/ut.eagle' TRUSTED_USERS='root postmaster' NIS_DOMAIN=numath-sol ERROR_MODE='mail' TIMEOUT_QUEUERETURN='4d' TIMEOUT_QUEUEWARN='1d' ALLOW_BOGUS_HELO='True' HSTAT_DIR='.hoststat' # ここまでは sendmail 中継制限とは直接関係しない. MAIL_RELAY_RESTRICTION=yes # SMTP 接続に関する条件 CHECK_HOST_ALLOW=/etc/mail/sendmail/check_host_allow CHECK_HOST_DENY=/etc/mail/sendmail/check_host_deny CHECK_RELAY_DEFAULT=allow # (allow/deny) default # 【条件1】を処理する部分. LOCAL_HOST_IPADDR=/etc/mail/sendmail/local_host_ipaddr LOCAL_HOST_DOMAIN=/etc/mail/sendmail/local_host_domain # 【条件2】を処理する部分. CLIENT_HOST_IPADDR=/etc/mail/sendmail/client_host_ipaddr CLIENT_HOST_DOMAIN=/etc/mail/sendmail/client_host_domain CLIENT_FROM_DOMAIN=/etc/mail/sendmail/client_from_domain # 【条件6】を処理する部分. SPAM_LIST=dbm:/etc/mail/sendmail/spamlist # 【条件3】を処理する部分. ROAM_HOST_IPADDR=/etc/mail/sendmail/roam_host_ipaddr ROAM_HOST_DOMAIN=/etc/mail/sendmail/roam_host_domain ROAM_USERS=/etc/mail/sendmail/roam_users # 【その他】 CLIENT_DENY_TO=/etc/mail/sendmail/client_deny_to ALLOW_RECIPIENT_DOMAIN=/etc/mail/sendmail/allow_recipient_domain ALLOW_RELAY_FROM=/etc/mail/sendmail/allow_relay_from ALLOW_RELAY_TO=/etc/mail/sendmail/allow_relay_to REJECT_EXTERN_SRR=noここまでの設定で完成していない部分は, 【条件4】を処理するパートです. これに関しては, 手で sendmail.cf を書き換えることで対応します.
----- /etc/mail/sendmail/local_host_ipaddr 133.6.130.5 -----/etc/mail/sendmail/local_host_domain rabbit.math.nagoya-u.ac.jp -----
----- /etc/mail/sendmail/client_host_ipaddr 133.6.130 133.6.86. -----/etc/mail/sendmail/client_host_domain math.nagoya-u.ac.jp -----/etc/mail/sendmail/client_from_domain math.nagoya-u.ac.jp -----この例では, math.nagoya-u.ac.jp というエンベロープFROMを持つメールだけが中継されます.
----- /etc/mail/sendmail/roam_host_ipaddr 133.6.47.111 133.6.47.112 -----/etc/mail/sendmail/roam_host_domain foo.math.nagoya-u.ac.jp bar.math.nagoya-u.ac.jp -----/etc/mail/sendmail/roamusers userA@math.nagoya-u.ac.jp userB@math.nagoya-u.ac.jp -----この例では, SMTP 接続元が一致して, userA@math.nagoya-u.ac.jp または userB@math.nagoya-u.ac.jp というエンベロープFROMを持つメールだけが中継されます.
----- /etc/mail/sendmail/spam_list foo@bar.com comment 1.1.1.1 comment bar.ac.jp comment -----この例では, dbm を利用しているので, ファイルを書き換えたあと,
makemap dbm spam_list < spam_listによってデータベースをアップデートする必要があります. 最後に "comment" というのがついているのは, データベースを作成するときに, makemap がエラーを出さないためのダミーのフィールドです.
userA@2.2.2.2 commentというファイルを APOP のログを監視しているデーモンが作成して, 即座にデータベースをアップデートすると仮定します. このテキストファイルは /etc/mail/sendmail/roaming であるとします.
F{RoamDom} -o /etc/mail/sendmail/roam_host_domainという行が見つかります. この直後に
Kroaming dbm -a@allow@ -o /etc/mail/sendmail/roamingを追加します. これは, /etc/mail/sendmail/roaming.dir と /etc/mail/sendmail/roaming.pag というデータベースからの読み出しを指定しているマクロです.
R$={RoamIP}$* $| $* $| $* $@ $>Check_mail_roam $4 R$* $| $*$={RoamDom} $| $* $@ $>Check_mail_roam $4 R$={LocalIP}$* $| $* $| $* $@ $>Check_mail_local $4 R$* $| $*$={LocalDom} $| $* $@ $>Check_mail_local $4 R$={ClientIP}$* $| $* $| $* $@ $>Check_mail_client $4 R$* $| $*$={ClientDom} $| $* $@ $>Check_mail_client $4という行が見つかります. この行の直後に
R$* $| $* $| $*<@$=m>$* $: $1 $| $2 $| $(roaming $3@$1 $) $| $3<@$4>$5 R$* $| $* $| $* @allow@ $| $*<@$=m> $@ $>Check_mail_local $4<@$m> R$* $| $* $| $* $| $* $: $1 $| $2 $| $4を追加します.
${client_addr} $| ${client_name} $| sender<@sender_domain>というものが来ていますから, 追加した1行めで, sender_domain が $m に一致していれば, sender@${client_addr} をデータベース roaming から検索します. もし, 一致するエントリが存在すれば, LHS は
${client_addr} $| ${client_name} $| comment @allow@ | sender<@sender_domain>と書き替ります. したがって, 追加した2行めにマッチし, その場合, 内部からのメールと認識すれば良いので, check_mail_local ルールセットに行きます.
R$={RoamIP}$* $| $* $| $* $| $* $@ $>Check_rcpt_roam $4 $| $5 R$* $| $*$={RoamDom} $| $* $| $* $@ $>Check_rcpt_roam $4 $| $5 R$={LocalIP}$* $| $* $| $* $| $* $@ $>Check_rcpt_inside $4 $| $5 R$* $| $*$={LocalDom} $| $* $| $* $@ $>Check_rcpt_inside $4 $| $5 R$={ClientIP}$* $| $* $| $* $| $* $@ $>Check_rcpt_inside $4 $| $5 R$* $| $*$={ClientDom} $| $* $| $* $@ $>Check_rcpt_inside $4 $| $5という行が見つかります. この行の直後に
R$* $| $* $| $*@$=m $| $* $: $1 $| $2 $| $(roaming $3@$1 $) $| $4 $| $5 R$* $| $* $| $* @allow@ $| $* $| $* $@ $>Check_rcpt_inside $4 $| $5 R$* $| $* $| $* $| $* $| $* $: $&{client_addr} $| $&{client_name} $| $&f $| $5を挿入します.
${client_addr} $| ${client_name} $| from@address $| sender<@sender_domain>というものが来ています. その後の書き換えは check_mail ルールセットの場合と同じです.
R$-@ $@ $>Check_mail_client $1<@>を挿入します.
R$- $@ $>Check_mail_remote $1 user R$-@ $@ $>Check_mail_remote $1 userを挿入します.
現実的には, CLIENT_* は内部のホストをすべて指定し, ROAM_* には, ダイアル・アップ接続(内部ホスト)と, 特別な外部のホスト(教官の自宅にあるドメインなど)を指定しています. さらに, ダイアル・アップ接続などでは, 特別に許可した外部のメールアドレス(たとえば, プロバイダのアドレス) などで発信を認める必要があります.
ここまでの設定であると, これらがコンフリクトしているので, それを修正するために, 以下のような変更を行います.
check_mail ルールセットでの
R$={RoamIP}$* $| $* $| $* $@ $>Check_mail_roam $4 R$* $| $*$={RoamDom} $| $* $@ $>Check_mail_roam $4 R$={LocalIP}$* $| $* $| $* $@ $>Check_mail_local $4 R$* $| $*$={LocalDom} $| $* $@ $>Check_mail_local $4 R$={ClientIP}$* $| $* $| $* $@ $>Check_mail_client $4 R$* $| $*$={ClientDom} $| $* $@ $>Check_mail_client $4を
R$={LocalIP}$* $| $* $| $* $@ $>Check_mail_local $4 R$* $| $*$={LocalDom} $| $* $@ $>Check_mail_local $4 R$={ClientIP}$* $| $* $| $* $@ $>Check_mail_client $4 R$* $| $*$={ClientDom} $| $* $@ $>Check_mail_client $4 R$={RoamIP}$* $| $* $| $* $@ $>Check_mail_roam $4 R$* $| $*$={RoamDom} $| $* $@ $>Check_mail_roam $4に変更し,
check_rcpt ルールセットでの
R$={RoamIP}$* $| $* $| $* $| $* $@ $>Check_rcpt_roam $4 $| $5 R$* $| $*$={RoamDom} $| $* $| $* $@ $>Check_rcpt_roam $4 $| $5 R$={LocalIP}$* $| $* $| $* $| $* $@ $>Check_rcpt_inside $4 $| $5 R$* $| $*$={LocalDom} $| $* $| $* $@ $>Check_rcpt_inside $4 $| $5 R$={ClientIP}$* $| $* $| $* $| $* $@ $>Check_rcpt_inside $4 $| $5 R$* $| $*$={ClientDom} $| $* $| $* $@ $>Check_rcpt_inside $4 $| $5を
R$={LocalIP}$* $| $* $| $* $| $* $@ $>Check_rcpt_inside $4 $| $5 R$* $| $*$={LocalDom} $| $* $| $* $@ $>Check_rcpt_inside $4 $| $5 R$={ClientIP}$* $| $* $| $* $| $* $@ $>Check_rcpt_inside $4 $| $5 R$* $| $*$={ClientDom} $| $* $| $* $@ $>Check_rcpt_inside $4 $| $5 R$={RoamIP}$* $| $* $| $* $| $* $@ $>Check_rcpt_roam $4 $| $5 R$* $| $*$={RoamDom} $| $* $| $* $@ $>Check_rcpt_roam $4 $| $5に変更します.
さらに, Check_mail_client ルールセットの
R$- $@ OK user R$-<@$=w> $@ OK user@localhost R$-<@$*$={ClientFrom}> $@ OK user@good.domainの直後に
R$* $: $&{client_name} $| $1 R$* $: $&{client_addr} $| $1 # Now, we have "${client_addr} $| ${client_name} $| original_token" R$={RoamIP}$* $| $* $| $* $@ $>Check_mail_client_and_roam $4 R$* $| $*$={RoamDom} $| $* $@ $>Check_mail_client_and_roam $4 R$* $| $* $| $* $: $3を挿入し, 新しいルールセット Check_mail_client_and_roam を追加します.
SCheck_mail_client_and_roam R$- $#error $@ 5.7.1 $: 553 FQDN addressing required R$-@ $#error $@ 5.7.1 $: 553 FQDN addressing required R$*<@$*>$* $: $1<@$2>$3 $| $1@$2$3 R$* $| $={RoamUsers} $@ OK matches to {RoamUsers} R$* $| $* $#error $@ 5.7.1 $: 553 Sorry, your address is not for our domainこのルールセットに到達するものは, CLIENT_* , ROAM_* の両方に一致し, エンベロープFROMが CLIENT_FROM に一致しないものに限ります. そこでエンベロープFROMが ROAM_USERS に一致したものだけをOKと見なし, そうでないものはエラーと処理します.
# destination address check (localization) R$* $| <@$=w>:$* $1 $| $>3 $3 strip my acceptables R$* $| $*<@$=w> $1 $| $>3 $2 strip my acceptables R$* $| <@$*$={AcceptDom}>:$* $1 $| $>3 $4 strip my acceptables R$* $| $*<@$*$={AcceptDom}> $1 $| $>3 $2 strip my acceptablesの中間に2行追加します.
# destination address check (localization) R$* $| <@$=w>:$* $1 $| $>3 $3 strip my acceptables R$* $| $*<@$=w> $1 $| $>3 $2 strip my acceptables ######### (Naito for lower one token) R$* $| <@$-.$=m>:$* $1 $| $>3 $4 strip my acceptables R$* $| $*<@$-.$=m> $1 $| $>3 $2 strip my acceptables ######### R$* $| <@$*$={AcceptDom}>:$* $1 $| $>3 $4 strip my acceptables R$* $| $*<@$*$={AcceptDom}> $1 $| $>3 $2 strip my acceptablesこれで, *.math.nagoya-u.ac.jp 宛のメールも受け取ることができます.
こんなに書き換えるのなら, もう少し整理して書き換えた方が良いような気になってきましたが...