17-5. sendmail-8.13.8 のコンパイル (1) Mail-Relay 予備マシンにやってみる * 現状マシンでの sendmail のバックアップ # cd /etc # cp -r mail mail.kkk # cd /usr/lib # cp sendmail sendmail.kkk # cp mail.local mail.local.kkk # cd /usr/bin # cp mailstats mailstats.kkk # cp vacation vacation.kkk # cp mail mail.kkk # cd /usr/sbin # cp makemap makemap.kkk * Mail-Relay 予備マシンは SS5 マシンを停止するには # shutdown -i0 -g0 とやる。 i0 は init 0、g0 は直ちにシャッ トダウンする。ok プロンプトが出た状態でマシンは停止する、boot と入れると再起動す る。リブ−トは # reboot または # init 6 でできる。# shutdown -y -g 0 -i 5 とする と電源も落として停止する。 * 作業する際のマシンの環境変数 # /bin/csh 元の環境変数 PATH は /usr/sbin と /usr/bin。 # setenv PATH /usr/local/bin:/usr/ccs/bin:$PATH # gcc -v GNU Cコンパイラのバ−ジョン Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.6/2.95.2/specs gcc version 2.95.2 19991024 (release) # dmesg マシンのスペック確認 メモリ 128MB Mar 13 12:59 SunOS Release 5.6 Version Generic_105181-23 [UNIX(R) System V Release 4.0] Copyright (c) 1983-1997, Sun Microsystems, Inc. vac: enabled in writeback mode cpu0: FMI,MB86907 (mid 0 impl 0x0 ver 0x5 clock 170 MHz) mem = 131072K (0x8000000) avail mem = 127078400 | * sendmail のインスト−ルで追加されたもの /etc/mail/helpfile, statistics /usr/sbin/praliases, makemap, mailstats, editmap /usr/lib/smrsh これは元は入ってなかった、今回入った。 /usr/bin/newaliases, mailq, hoststat, purgestat は /usr/lib/sendmail へのリンク。 /usr/bin/rmail, /usr/lib/mail.local これらは元々のである。インスト−ルしようとし たが失敗している。# sh Build install の表示に Build force-install せよと出ていた。 # cd /usr/local/BerkeleyDB.4.2/lib 注意、デ−タベ−スもコンパイルしてインスト− # cp libdb-4.2.so /usr/lib ルする。できたライブラリをコピ−しておくこと。 * 設定のための一時的なIPアドレスの付け替え Mail-Relayの予備マシンは、IPアドレスも本番機のを設定して、普段はネットワ−クか ら切り離して単独で置いている。Mail-Relay マシンがおかしくなったら、 ばかちょんで 置き換えることができるようにするためである。今回の Greet Pause 設定のため、 単独 のままでの作業はやりにくい。そのためマシンを 192.168.1.0ネットワ−クに一時的に置 き作業することにした。これで新しい sendmail をコンパイルして、動作チェックをする。 # ifconfig hme0 192.168.1.4 とやって、いろいろ作業した。そしてやおら #newaliases やったら反応がなかった。マシンを # reboot して # newaliases やったら直ぐにできた。 マシンのIPアドレスが元に戻ったからできたということだった。/etc/hostsファイルの 192.168.2.1 を 192.168.1.4 に変更してやったらできた。 □Router □hostA' |.1 |.3 仮想IP ----------------------------- 202.241.128.0 |.2 □hostA -------.2 |.1 192.168.2.0 Mail-Relayの予備マシンは、本番マシンと |hostG|-------------------- 同じ設定にして、ネットワ−クと切り離し ------- □hostB ◆ て置いておく。今回、◆に一時的に設置。 |.2 |.1 |.4 ----------------------------- 192.168.1.0 /etc/mail/mailertable /etc/nsswitch.conf /etc/hostname.le0 ------------------------------- ------------------- ------------------ |nix.co.jj esmtp:[192.168.1.1] |hosts: files dns |hostA /etc/mail/access /etc/resolv.conf /etc/defaultrouter ------------------------------ --------------------- ------------------ |Connect: 192.168.1.1 RELAY |domain nix.co.jj |192.168.1.2 |To: nix.co.jj RELAY |nameserver 127.0.0.1 |#192.168.2.2 |nix.co.jj RELAY | /etc/hosts VVV.mc sendmail.cf の元 ---------------------------------------------- ------------------- |127.0.0.1 localhost localhost.nix.co.jj |Dwmail |192.168.1.4 hostA mail.nix.co.jj loghost |Dmnix.co.jj |#192.168.2.1 hostA mail.nix.co.jj loghost | | |192.168.1.1 hostB [ ついでにテスト ] Mail-Relay の予備マシン ◆ で、# /usr/ucb/mail -v katou@nix.co.jj とやると hostB の Mail-Store へメ−ルは届く。差出人は Super-User [root@nix.co.jj] である。 下の ようにしたら katou@nix.co.jj へのメ−ルは予備マシン内で破棄されるのか。 だめ破棄 されなかった。Mail-Relay ホストでは安全のため katou アカウントは登録してない、メ −ルを破棄させるためには、このホストにアカウントの登録が必要である。 /etc/aliases *** 予備 Mail-Relay ホスト内 *** -------------------------------- |nobody: /dev/null |#Postmaster: katou@nix.co.jj |#MAILER-DAEMON: katou@nix.co.jj |katou: /dev/null << この設定は効かない。katou:/dev/null でもだめ。 * 他のバ−ジョンの sendmail の制御ファイルは `28/08 /usr/lib/mail/cf/ と /etc/mail/ に Solaris 9 に、最初から入っている sendmailの制 御ファイルがある。FireWall-1 のマシンは、sendmail の設定をいじってないので、OS のインスト−ルしたままの状態が残っている。下記の sendmail は 8.12.10 である。 /usr/lib/mail/cf/main.cf, submit.cf, subsidiary.cf は /etc/mail/ のと同じ。 /etc/mail/sendmail.cf は /etc/mail/subsidiary.cf と同じ。 # ls -F /usr/lib/mail README cf/ domain/ feature/ m4/ mailer/ ostype/ sh/ # ls /usr/lib/mail/cf Makefile main.mc submit.mc subsidiary.mc main.cf submit.cf subsidiary.cf # ls /etc/mail Mail.rc helpfile main.cf submit.cf aliases local-host-names sendmail.cf subsidiary.cf aliases.db mailx.rc sendmail.hf trusted-users sendmail の新しいバ−ジョンをダウンロ−ドしてきて、 インスト−ルするとこれらのフ ァイルは一部置き変わる。Mail-Relayマシンで変わったのを、とりあえず確認できたのは /usr/local/source/sendmail-8.14.1/cf/cf/submit.cf が /etc/mail/submit.cf になっ ていた、同じファイルである。/etc/mail の main.cf と subsidiary.cf はいわば設定の 参考にあるだけで、sendmail に使われてはいない。 /etc/mail/sendmail.cf が他のメ− ルサ−バからのメ−ルをさばくのに使われる。 submit.cf は sendmail-8.12.x で導入さ れたようで、この自身のマシンで mail コマンドを打つなどして出たメ−ルを安全に捌く。 /etc/mail/submit.cf ファイルは /usr/lib/sendmail -Ac -q15m で使われる。submit.cf ファイルを別な名前に変えて #/etc/rc2.d/S88sendmail start やったら、"/etc/mail/su bmit.cf: line 0: cannot open: ファイルもディレクトリもありません" と出た。 (2) Berkeley DB のコンパイル * Berkeley DB のソ−スの入手 久しぶりのコンパイル、本当は sendmail の方を先にコンパイルしようとしたのだが。 Oracle のサイトにあった。Berkeley DB 4.2.52.tar.gz with AES encryption (3.9M)。 # cd /usr/local/source # zcat db-4.2.52.tar.gz | tar xvf - GNU の gzip で圧縮されているファイルの解凍。 # cd db-4.2.52; ls -F LICENSE db185/ db_verify/ fileops/ os_vxworks/ README db_archive/ dbinc/ hash/ os_win32/ btree/ db_checkpoint/ dbinc_auto/ hmac/ perl/ build_unix/ db_deadlock/ dbm/ hsearch/ qam/ build_vxworks/ db_dump/ dbreg/ java/ rep/ build_win32/ db_dump185/ dist/ libdb_java/ rpc_client/ clib/ db_load/ docs/ lock/ rpc_server/ common/ db_printlog/ env/ log/ tcl/ crypto/ db_recover/ examples_c/ mp/ test/ cxx/ db_stat/ examples_cxx/ mutex/ txn/ db/ db_upgrade/ examples_java/ os/ xa/ # ls -al build_unix -r--r--r-- 1 100 100 181 11月 18日 1999年 .IGNORE_ME lrwxrwxrwx 1 1003 root 12 3月 14日 13:58 tags -> ../dist/tags # cd dist # mkdir build # setenv CC gcc # ../configure # make /usr/bin/sh ./libtool --mode=compile gcc -c -I. -I../. ../../mutex/mut_pthread.c mkdir .libs gcc -c -I. -I../.. ../../mutex/mut_pthread.c -fPIC -DPIC -o .libs/mut_pthread.o gcc -c -I. -I../..-O ../../mutex/mut_pthread.c -o mut_pthread.o >/dev/null 2>&1 gcc -c -I. -I../.. ../../mutex/mut_pthread.c -fPIC -DPIC -o .libs/mut_pthread.o gcc -c -I. -I../..-O ../../mutex/mut_pthread.c -o mut_pthread.o >/dev/null 2>&1 | えらい時間かかった20分以上。 | gcc -o .libs/db_verify .libs/db_verify.o .libs/util_cache.o .libs/util_sig.o ./.libs/libdb-4.2.so -Wl,--rpath -Wl,/usr/local/BerkeleyDB.4.2/lib creating db_verify /usr/bin/sh ./libtool --mode=execute true db_verify # cd /usr/local/source/db-4.2.52/dist/build # make install rm -f libdb.a test ! -f .libs/libdb-4.2.a || \ ln -s .libs/libdb-4.2.a libdb.a test -f .libs/libdb-4.2.a || \ (test -f libdb-4.2.a && ln -s libdb-4.2.a libdb.a) Installing DB include files: /usr/local/BerkeleyDB.4.2/include ... Installing DB library: /usr/local/BerkeleyDB.4.2/lib ... cp -p .libs/libdb-4.2.so /usr/local/BerkeleyDB.4.2/lib/libdb-4.2.so chmod +x /usr/local/BerkeleyDB.4.2/lib/libdb-4.2.so cp -p .libs/libdb-4.2.lai /usr/local/BerkeleyDB.4.2/lib/libdb-4.2.la cp -p .libs/libdb-4.2.a /usr/local/BerkeleyDB.4.2/lib/libdb-4.2.a ranlib /usr/local/BerkeleyDB.4.2/lib/libdb-4.2.a chmod 644 /usr/local/BerkeleyDB.4.2/lib/libdb-4.2.a cp -p libdb.a /usr/local/BerkeleyDB.4.2/lib/libdb.a ranlib /usr/local/BerkeleyDB.4.2/lib/libdb.a chmod 644 /usr/local/BerkeleyDB.4.2/lib/libdb.a ---------------------------------------------------------------------- Libraries have been installed in: /usr/local/BerkeleyDB.4.2/lib If you ever happen to want to link against installed libraries in a given directory, LIBDIR, you must either use libtool, and specify the full pathname of the library, or use the `-LLIBDIR' flag during linking and do at least one of the following: - add LIBDIR to the `LD_LIBRARY_PATH' environment variable during execution - add LIBDIR to the `LD_RUN_PATH' environment variable during linking - use the `-Wl,--rpath -Wl,LIBDIR' linker flag See any operating system documentation about shared libraries for more information, such as the ld(1) and ld.so(8) manual pages. ---------------------------------------------------------------------- Installing DB utilities: /usr/local/BerkeleyDB.4.2/bin ... cp -p .libs/db_archive /usr/local/BerkeleyDB.4.2/bin/db_archive cp -p .libs/db_checkpoint /usr/local/BerkeleyDB.4.2/bin/db_checkpoint cp -p .libs/db_deadlock /usr/local/BerkeleyDB.4.2/bin/db_deadlock cp -p .libs/db_dump /usr/local/BerkeleyDB.4.2/bin/db_dump cp -p .libs/db_load /usr/local/BerkeleyDB.4.2/bin/db_load cp -p .libs/db_printlog /usr/local/BerkeleyDB.4.2/bin/db_printlog cp -p .libs/db_recover /usr/local/BerkeleyDB.4.2/bin/db_recover cp -p .libs/db_stat /usr/local/BerkeleyDB.4.2/bin/db_stat cp -p .libs/db_upgrade /usr/local/BerkeleyDB.4.2/bin/db_upgrade cp -p .libs/db_verify /usr/local/BerkeleyDB.4.2/bin/db_verify Installing documentation: /usr/local/BerkeleyDB.4.2/docs ... * ライブラリが入ったところ # ls /usr/local/BerkeleyDB.4.2/lib libdb-4.2.a libdb-4.2.so libdb.a libdb-4.2.la libdb-4.so libdb.so (3) sendmail-8.13.8 のコンパイル * ソ−スプログラムの入手と展開 http://sendmail.org/ を見たら、最新版 Sendmail 8.14.0 が出ていた。しかしその前に リリ−スされた Sendmail 8.13.8 の方が安定版という感じだった。8.13.8 より前のメジ ャ−・リリ−スは 8.12.11 だが、 セキュリティ・ホ−ルに対するパッチを当てることが 必要だった。8.13.8 でいいだろう。sendmail.8.13.8.tar.Z 2,830 KB をホ−ムペ−ジか ら ftp アクセスしてダウンロ−ドした。 # cd /usr/local/source # uncompress sendmail.8.13.8.tar.Z # tar xvf sendmail.8.13.8.tar # cd sendmail-8.13.8; ls -F Build* Makefile devtools/ libsmdb/ rmail/ CACerts PGPKEYS doc/ libsmutil/ sendmail/ FAQ README editmap/ mail.local/ smrsh/ INSTALL RELEASE_NOTES include/ mailstats/ test/ KNOWNBUGS cf/ libmilter/ makemap/ vacation/ LICENSE contrib/ libsm/ praliases/ # cd /usr/local/source/sendmail-8.13.8/devtools; ls -F M4/ OS/ README Site/ bin/ # ls OS/Sun* OS/SunOS OS/SunOS.5.10 OS/SunOS.5.3 OS/SunOS.5.6 OS/SunOS.5.9 OS/SunOS.4.0 OS/SunOS.5.11 OS/SunOS.5.4 OS/SunOS.5.7 OS/SunOS.5.1 OS/SunOS.5.2 OS/SunOS.5.5 OS/SunOS.5.8 # ls Site README site.config.m4.sample # cp OS/SunOS.5.6 Site/site.SunOS.6.5.m4 .../devtools/Site/site.SunOS.5.6.m4 入っていたそのまま。 ------------------------------------------------------------------ |# $Id: SunOS.5.6,v 8.20 2002/03/21 23:59:26 gshapiro Exp $ | |dnl DO NOT EDIT THIS FILE. |dnl Place personal settings in devtools/Site/site.config.m4 | |define(`confCC', `gcc') |define(`confLDOPTS_SO',`-G') |define(`confSONAME',`-h') |define(`confBEFORE', `sysexits.h') |define(`confMAPDEF', `-DNDBM -DNIS -DNISPLUS -DMAP_REGEX') |define(`confENVDEF', `-DSOLARIS=20600') |define(`confSM_OS_HEADER', `sm_os_sunos') |define(`confLIBS', `-lsocket -lnsl -lkstat') |define(`confMTCCOPTS', `-D_REENTRANT') |define(`confMTLDOPTS', `-lpthread') |define(`confMBINDIR', `/usr/lib') |define(`confEBINDIR', `/usr/lib') |define(`confSBINGRP', `sys') |define(`confINSTALL', `${BUILDBIN}/install.sh') |define(`confDEPEND_TYPE', `CC-M') |PUSHDIVERT(3) |sysexits.h: | if [ -r /usr/include/sysexits.h ]; \ | then \ | ln -s /usr/include/sysexits.h; \ | fi |POPDIVERT * コンパイル&インスト−ル # setenv LD_LIBRARY_PATH /usr/local/BerkeleyDB.4.2/lib << これやること。 .../devtools/Site/site.SunOS.5.6.m4 使用するデ−タベ−スを変更する。 --------------------------------------------------------------- | | |dnl define(`confMAPDEF', `-DNDBM -DNIS -DNISPLUS -DMAP_REGEX') |define(`confMAPDEF', `-DNEWDB -DMAP_REGEX') |define(`confINCDIRS', `-I/usr/local/BerkeleyDB.4.2/include') << この2 |define(`confLIBDIRS', `-L/usr/local/BerkeleyDB.4.2/lib') << つ追記。 | | ※-DNDBM は new DBM のこと。-DNEWDB は new Berkeley DB のこと。指定を 無しにすると、マシンに入っているデ−タベ−スを使うという指示になる。 # cd /usr/local/source/sendmail-8.13.8 # sh Build << これで全部のモジュ−ルをコンパイルする。 # ls -F obj.SunOS.5.6.sun4 << このディレクトリができて一杯ファイルができた。 editmap/ libsmdb/ mail.local/ makemap/ rmail/ smrsh/ libsm/ libsmutil/ mailstats/ praliases/ sendmail/ vacation/ editmap libsmdb mail.local makemap rmail smrsh libsm libsmutil mailstats praliases sendmail vacation # /etc/rc2.d/S88sendmail stop # sh Build install << インスト−ルする。コンパイルがうまく行かなか ったら、できた obj.SunOS.5.6.sun4 ディレクト # /etc/rc2.d/S88sendmail start リごと削除して、再度コンパイルすること。 * コンパイルがおかしい場合 ・Solaris 2.6 に標準で入っていたデ−タベ−スではだめ site.SunOS.5.6.m4 で define(`confMAPDEF', `-DNDBM') としてコンパイルしてみた。一 応インスト−ルもできたが、実行したらおかしかった。古くてダメということらしい。 # newaliases /etc/mail/sendmail.cf: line 141: readcf: map mailertable: class dbm not available /etc/mail/sendmail.cf: line 144: readcf: map access: class dbm not available ・これはどうだったかな、忘れた ともかく個別のディレトリに入って Build を打つと、その部分だけコンパイルする。 # cd /usr/local/source/sendmail-8.13.8/sendmail # ./Build Configuration: pfx=, os=SunOS, ... rroot=5.6, arch=sun4, sfx=, variant=optimized Making in /usr/local/source/sendmail-8.13.8/obj.SunOS.5.6.sun4/sendmail gcc -o sendmail main.o alias.o ... version.o /usr/local/source/sendmail-8.13.8/o bj.SunOS.5.6.sun4/libsmutil/libsmutil.a /usr/local/source/sendmail-8.13.8/ob j.SunOS.5.6.sun4/libsm/libsm.a -lresolv -lsocket -lnsl -lkstat map.o: In function `ndbm_map_open': map.o(.text+0x1e5c): undefined reference to `dbm_dirfno' map.o(.text+0x1e68): undefined reference to `dbm_pagfno' map.o: In function `ndbm_map_lookup': map.o(.text+0x20c4): undefined reference to `dbm_dirfno' map.o(.text+0x20fc): undefined reference to `dbm_pagfno' collect2: ld returned 1 exit status make: *** [sendmail] Error 1 ・こんな失敗もありました # cd /usr/local/source/sendmail-8.13.8 # sh Build Making all in: /usr/local/source/sendmail-8.13.8/libsm | ranlib libsm.a gcc -O -I. -I../../include -I/usr/local/BerkeleyDB.4.2/include -DNEWDB -DSOLARIS=20600 -c t-event.c -o t-event.o gcc -o t-event -L/usr/local/BerkeleyDB.4.2/lib t-event.o libsm.a -ldb -lresolv -lsocket -lnsl -lkstat ============================================================ ./t-event ld.so.1: ./t-event: 重大なエラー: libdb-4.2.so: open に失敗しました:ファイルもデ make[1]: *** [t-event] Killed ィレクトリもありません。 make[1]: *** Deleting file `t-event' | # setenv LD_LIBRARY_PATH /usr/local/BerkeleyDB.4.2/lib これをやるとうまく行った。 ・ちゃんとコンパイルできた後 # newaliases ld.so.1: newaliases: 重大なエラー: libdb-4.2.so: open に失敗しました: ファイル.. # cp /usr/local/BerkeleyDB.4.2/lib/libdb-4.2.so /usr/lib/libdb-4.2.so をやったら うまく行った。newaliases の実体は sendmail である。sendmail プログラムは実行する 際に libdb-4.2.so を参照する。これをデフォルトのライブラリパスのディレクトリに置 くか、ライブラリパスに /usr/local/BerkeleyDB.4.2/lib/ 加えるかしなければならない。 * sendmail の新しい機能 sendmail 8.10.x 以降には milter 機能というのが入った。メ−ルのフィルタリングなど を外のプログラムにやらせる。Apache の動的モジュ−ルみたいなものか。 コンパイルし 直さなくても新しいモジュ−ルが使えるということ。メ−ルの認証システムである SPF用 の spfmilter がそうである。別なプログラムとして実行される。 もう一つ気付いたので smrsh( sendmail restrited shell )という機能。少なくとも sendmail 8.12.x には入っ ている。sendmail の処理では、/etc/mail/aliase や ~/.forward ファイルからプログラ ムを起動することができる。 ~/.forward では vacation プログラムがしばしば使われる。 smrsh はこれらのプログラムの起動をユ−ザなどで制限するようにする。 (4) sendmail.cf の Greet Pause 設定 * 現状の sendmail.cf 元の mc ファイル # cd /usr/local/source/sendmail-8.13.8/cf/cf # cat UUU.mc << 現在使用している sendmail-8.12.5 の mc ファイルをコピ−し Dwmail た。UUU.mc とする。 Dmnix.co.jj VERSIONID(`Mr. Ikken Katou: 2007/03/15') OSTYPE(solaris2)dnl dnl DOMAIN(generic)dnl undefine(`UUCP_RELAY')dnl undefine(`BITNET_RELAY')dnl FEATURE(`nouucp',`reject')dnl define(`confPRIVACY_FLAGS',`goaway')dnl define(`confDOMAIN_NAME',`$w.$m')dnl define(`always_add_domain')dnl MASQUERADE_AS(`nix.co.jj')dnl MASQUERADE_DOMAIN(`nix.co.jj')dnl FEATURE(`masquerade_entire_domain')dnl FEATURE(`nocanonify',`canonify_hosts')dnl FEATURE(`accept_unresolvable_domains')dnl FEATURE(`accept_unqualified_senders')dnl define(`confMAX_HEADERS_LENGHT',`32768')dnl define(`confMIME_FORMAT_ERRORS',`False')dnl FEATURE(`mailertable')dnl FEATURE(`access_db')dnl MAILER(local)dnl # cd /usr/local/source/sendmail-8.13.8/cf/cf # sh Build UUU.cf Using M4=/usr/local/bin/m4 rm -f UUU.cf /usr/local/bin/m4 ../m4/cf.m4 UUU.mc > UUU.cf || ( rm -f UUU.cf && exit 1 ) echo "### UUU.mc ###" >>UUU.cf sed -e 's/^/# /' UUU.mc >>UUU.cf chmod 444 UUU.cf * sendmail 稼働の確認 # telnet localhost 25 /etc/mail/sendmail.cf はこれまでのままでやってみる。 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mail.nix.co.jj ESMTP Sendmail 8.13.8; Thu, 15 Mar 2007 10:19:39 +0900 (JST) quit 221 2.0.0 mail.nix.co.jj closing connection Connection closed by foreign host. * makemap コマンド # which makemap /usr/sbin/makemap この makemap を使うこと、これが今回入ったプログラム。 # makemap hash access < access # makemap hash mailertable < mailertable # cd /etc/mail この makemap コマンドはダメ。前から入っているやつ。 # ./makemap hash access < access makemap: Need to recompile with -DNEWDB for hash support * Greet Pause 機能を定義してみる # cd /usr/local/source/sendmail-8.13.8/cf/cf VVV.mc --------------------------------- | | |MAILER(local)dnl |MAILER(smtp)dnl | |FEATURE(`greet_pause',`5000')dnl 最後に追加記述してみた。 # sh Build VVV.cf Using M4=/usr/local/bin/m4 rm -f VVV.cf /usr/local/bin/m4 ../m4/cf.m4 VVV.mc > VVV.cf || ( rm -f VVV.cf && exit 1 ) *** ERROR: FEATURE() should be before MAILER() echo "### VVV.mc ###" >>VVV.cf sed -e 's/^/# /' VVV.mc >>VVV.cf GREET_PAUSE は MAILER 定義の前に入れてくれと出た、そのようにして。 # grep greet *.cf VVV.cf:##### $Id: greet_pause.m4,v 1.4 2004/07/06 20:49:51 ca Exp $ ##### VVV.cf:### greet_pause: lookup pause time before 220 greeting VVV.cf:SLocal_greet_pause VVV.cf:Sgreet_pause VVV.cf:R$* $: <$1> $| $>"Local_greet_pause" $1 VVV.cf:# FEATURE(`greet_pause',`5000')dnl # /etc/rc2.d/S88sendmail stop # cp VVV.cf /etc/mail/sendmail.cf # /etc/rc2.d/S88sendmail start # telnet localhost 25 Greet Pause を設定すると、次の 220 .. メッセ−ジが出 Trying 127.0.0.1... て来るのに時間がかかる。Greet Pause で設定した時間分 Connected to localhost. だけ経って出て来る。やってみればこの動きが見える。 Escape character is '^]'. ↓ 220 mail.nix.co.jj ESMTP Sendmail 8.13.8; Thu, 15 Mar 2007 13:54:03 +0900 (JST) * 15秒待たせている間にコマンドを叩く # telnet localhost 25 FEATURE(`greet_pause',`15000')dnl にして Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. helo 192.168.1.18 << ちゃっと helo コマンドを叩いてみた、15秒以内に。 554 ここ化けた ESMTP not accepting messages 250 mail.nix.co.jj Hello localhost [127.0.0.1], pleased to meet you quit # tail /var/log/syslog 拒絶したことが分かる。 | Mar 15 14:32:22 hostA sendmail[469]: starting daemon (8.13.8): SMTP+queueing@01:00:00 Mar 15 14:32:43 hostA sendmail[472]: l2F5WaUh000472: rejecting commands from localhost [127.0.0.1] due to pre-greeting traffic * 待ち時間を0にしてみる /etc/mail/access つまり Greet Pause を設定しない状態と一緒のこと。 ------------------------------ |Connect: 192.168.1.2 RELAY |To: nix.co.jj RELAY |GreetPause:127.0.0.1 0 # cd /etc/mail # makemap hash access < access このホストで # telnet localhost 25 をやって、 コマンドを打ってメ−ルを出してみる。 helo localhost, mail from: katou@nix.co.jj, rcpt to: root とやると、このホストの root 宛にメ−ルがちゃんと来た。このホスト 127.0.0.1 からのアクセスは通したという ことである。次に # telnet localhost 25 をやって、すぐに quitで終了させたのが次の ログである。これは発信元 MTAが通常の時間を待たずに、コネクションを切った場合にで て来るログに相当する。ここでは 発信元 MTA が telnet アクセスということである。こ のログが出るというこは、メ−ルの発信元がspam発信源だった可能性が高い。 # tail /var/log/syslog Mar 15 14:41:59 hostA sendmail[486]: l2F5fptj000486: localhost [127.0.0.1] did not issue MAIL/EXPN/VRFY/ETRN during connection to MTA (5) sendmail のアクセス制御ファイル -------------------------------------------------------------------------------- このマシンはネットワ−クにつながないでやってみた。 マシンでは named は稼働させる こと。named がないとメ−ルを送ることができない。sendmail.cf 用の mc ファイルでは Greet Pause の設定はここではしてないものとする。 あるいは Greet Pause の設定をし ている場合は、/etc/mail/access で "GreetPause:127.0.0.1 0" とする。 -------------------------------------------------------------------------------- * FEATURE(`access_db')dnl の記述と意味 FEATURE(`access_db',`hash -o -T /etc/mail/access')dnl という記述が、いろん な所を見ていると書いてある。別にこんな書き方をしなくてもよい。ここで VVV.mc では FEATURE(`access_db')dnl と書いているだけである。できた VVV.cf を見ると、もうこん なようになっている。ハイフン 'o' オ−の意味は、該当するファイル accessがなくても エラ−にしないという意味らしい。一応 FEATURE(`access_db',.. の記述だけはしておい て、後々 access ファイルを作成して使うかも知れないということらしい。 # grep hash VVV.cf VVV.cf:Kmailertable hash /etc/mail/mailertable VVV.cf:Kaccess hash -T /etc/mail/access * この記述はだめ /etc/mail/access 上から3行はこれまで記述していたもの。5行目 ------------------------------- に追記してみた。makemap をやると5行目がおか |Connect: 192.168.1.2 RELAY しいと出る。5行目の To: satou.. を To:satou |To: nix.co.jj RELAY とブランクをなくしたらエラ−は出なくなった。 |nix.co.jj RELAY |#GreetPause:127.0.0.1 0 コメントはシャ−プにする。 |To: satou@nix.co.jj DISCARD ここの記述が肝心、一番上に持って行ってもダメ。 # makemap hash access < access 一応これで5行目以外は設定は有効になっている。 makemap: access: line 5: key to:: duplicate key * これは効いている /etc/mail/access Connect: や To: の後にブランクを入れるとおか ------------------------------- しいみたい。とりあえず、全部ブランクはなしに |Connect:192.168.1.2 RELAY した方がいい。"nix.co.jj RELAY" などの間はブ |To:nix.co.jj RELAY ランクでもタブでもいいみたい。まだこのホスト |nix.co.jj RELAY からメ−ルの送信までの確認はやってない。 |To:katou@nix.co.jj REJECT # makemap hash access < access とりあえずエラ−は出なくなった。 * これも一応はできた /etc/mail/access わざと上2行の Connect: とTo: の後にブランク ------------------------------- を今一度入れてみた。To:katou@nix.co.jj のと |Connect: 192.168.1.2 RELAY こはブランクなしで。 これでも一応 makemap は |To: nix.co.jj RELAY エラ−は出なかった。DISCARD が働くかどうかは、 |nix.co.jj RELAY 以下で確認していく。 |To:katou@nix.co.jj DISCARD * DISCARD した際の様子 /etc/mail/access FEATURE(`blacklist_recipients')dnlも定義した。 ------------------------------- 定義しないと "To:katou@nix.co.jj DISCARD" は |Connect: 192.168.1.2 RELAY 有効にならない。システムログには discardと出 |To: nix.co.jj RELAY る。メ−ルは送られることなく捨てられたことが |nix.co.jj RELAY 分かる。 blacklist_recipients は宛先に対して |To:katou@nix.co.jj DISCARD のことになる。REJECT 指定も同様。 # /usr/ucb/mail -v katou@nix.co.jj Subject: 555 555 . 送信終了 # katou@nix.co.jj... Connecting to localhost.nix.co.jj. via relay... 220 mail.nix.co.jj ESMTP Sendmail 8.13.8; Fri, 16 Mar 2007 13:21:45 +0900 (JST) >>> EHLO mail.nix.co.jj 250-mail.nix.co.jj Hello localhost [127.0.0.1], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 250-ETRN 250-DELIVERBY 250 HELP >>> MAIL From: SIZE=63 250 2.1.0 ... Sender ok >>> RCPT To: >>> DATA 250 2.1.5 ... Recipient ok 354 Enter mail, end with "." on a line by itself >>> . 250 2.0.0 l2G4Ljla000840 Message accepted for delivery katou@nix.co.jj... Sent (l2G4Ljla000840 Message accepted for delivery) Closing connection to localhost.nix.co.jj. >>> QUIT 221 2.0.0 mail.nix.co.jj closing connection # mail No mail. # ls /var/spool/mqueue ここにも溜まってない。 # tail /var/log/syslog 1) Mar 16 13:21:45 hostA sendmail[839]: l2G4Ljhm000839: from=root, size=63, class=0, nrcpts=1, msgid=<200703160421.l2G4Ljhm000839@mail.nix.co.jj>, relay=root@localhost 2) Mar 16 13:21:46 hostA sendmail[840]: l2G4Ljla000840: ruleset=check_rcpt, arg1=, relay=localhost [127.0.0.1], discard 3) Mar 16 13:21:46 hostA sendmail[840]: l2G4Ljla000840: from=, size=365, class=0, nrcpts=1, msgid=<200703160421.l2G4Ljhm000839@mail.nix.co.jj>, proto=ESMTP, daemon=MTA, relay=localhost [127.0.0.1] 4) Mar 16 13:21:46 hostA sendmail[840]: l2G4Ljla000840: discarded 5) Mar 16 13:21:46 hostA sendmail[839]: l2G4Ljhm000839: to=katou@nix.co.jj, ctladdr=root (0/1), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=30063, relay=localhost.nix.co.jj. [127.0.0.1], dsn=2.0.0, stat=Sent (l2G4Ljla000840 Message accepted for delivery) [ sendmail ログレベルについて ] sendmail.cf の中のログレベルの記述は "0 LogLevel=9"、 これがデフォルトの値である。 ログレベル "1" と "2" と "3" ではどうなるか。 ログの 1) と 5) が同じ長さ内容で出 てきた、2),3),4) は出て来なかった。 つまり個々のログの内容が簡単にされるのでなく、 ログの出る数が減るということである。 しかし、そのため "discarded" と書いたログが 出なくなった訳で、これでは意味をなさない。DISCARD が効いたメ−ルの数を知りたい訳 で、上記のログで "discarded" が2回出たのを1回にしたいのである。 しつこくログレ ベルを変えてやってみた。"9"〜"5" は変わらず。ログレベル "4" にしたら 1),2),5) が 出た。というわけで、これからの sendmail の運用では "0 LogLevel=4" とする。 [ メ−ルのエンベロ−プ部はここ ] メ−ルソフトに出て 誰から どこから 来る差出人、宛先で 1) Mar 16 13:21:45 hostA ... from=root, relay=root@localhost はない。 誰へ どこへ 5) Mar 16 13:21:46 hostA ... to=katou@nix.co.jj, relay=localhost.nix.co.jj. * REJECT は出て来るメッセ−ジが変 /etc/mail/access REJECT は送信者に理由を伝える。Access Denied ------------------------------- とメッセ−ジを返すと本なんかに書いてあったが。 | | やってみたら "User unknwon" と返した。それで |To:katou@nix.co.jj REJECT 合っているのかな。テストは付録を参照のこと。 * DISCARD 対象でない人に送った [ 内部の人へ ] # /usr/ucb/mail -v satou@nix.co.jj 一応、内部の人のメ−ルアドレスとする。 Subject: 444 444 . # cd /var/spool/mqueue ちゃんとスプ−ルに溜まった、これでよし。 # ls -l -rw------- 1 root smmsp 4 3月 21日 14:02 dfl2L52SZZ001336 -rw------- 1 root smmsp 828 3月 21日 14:02 qfl2L52SZZ001336 # rm * 確認したので溜まったメ−ルを消しておく。 [ 外部の人へ ] # /usr/ucb/mail -v kkk@sss.co.jj access に "To:kkk@sss.co.jj DISCARD"と書いた。 Subject: 555 このマシンはネットワ−クにつながないでやって 555 みた。sss.co.jj ドメイン名のIPアドレスが引 . けないので、"送信終了"のとこで止まったままに 送信終了 なったみたい。デ−モンがこんなのができていた。 access が効く前に DNS 検索でだめになった。 # ps -ef UID PID PPID C STIME TTY TIME CMD root 983 1 0 3月 16 ? 0:00 /usr/lib/sendmail -bd -q1h smmsp 1354 1 1 14:09:57 pts/0 0:00 mail -i -v kkk@sss.co.jj root 1295 1 0 13:47:44 ? 0:00 /usr/local/sbin/named # kill 1354 * relay_mail_from は使わなくていい 指定したメ−ルアドレスからのメ−ルを中継する。到着したメ−ルのエンベロ−プのFrom と一致するか見る。昨今の sendmail は第三者中継は許さないようになっている。つまり かつてのspamメ−ル、自社には全然関係ないメ−ルを、自社のメ−ルサ−バを使って メ−ルを送る話。自社のメ−ルサ−バにメ−ルは来るのだが、エンベロ−プは自社宛では ない。 FEATURE(`relay_mail_from') は katou@spam.con などメ−ルアドレス全体の一致、 FEATURE(`relay_mail_from',`domain') では xxx@spam.con, xxx@sub.spam.con が一致を 許すとか。しかし、エンベロ−プ部は偽造できるので、この設定オプションは使わない方 がいいだろう。多分、有用な場合はロ−ミングサ−ビスとか言うのだろうが、普通のメ− ルの運用では先ず必要ないと思う。また access ファイルの設定に制御の理解の妨げにな るので、はなから考慮しないでおくのがよい。この件でだいぶ手間取ってしまった。 /etc/mail/access ---------------------- |From:spam.con RELAY * どれが本当か頭を混乱させる説明 「Solrais 9 システム管理ハンドブック」初版の P.239 記述、こちら側の受取人のブラッ クリスト blacklist_recipients、到着したメ−ルのエンベロ−プの Toと一致するかみる。 P.231 には一見、逆の意味かと見受けられる記述がある。多分言葉足らずで、 access_db を有効にすると、先ずはユ−ザ名/ドメイン名/ホスト名の発信者のエンベロ−プで制限 をかけることができる。そして更に blacklist_recipients を加えると、受信者のエンベ ロ−プでも制限をかけることが可能になる。と読むべきなのだろう。 P.240 には access の記述でエンベロ−プの From、To タグを省略すると Connectタグを指定したものとされ ると書いてある。下記の sendmail の README 記述のように、タグなしの記述設定はしな い方がよさそうである。エンベロ−プ部とIPアドレス/ホスト名では意味が全然違う。 * タグのないエントリはやめてくれ /usr/local/source/sendmail-8.13.8/cf/README の "SENDMAIL CONFIGURATION FILES" の 2458行目からの記事。3つのタグが使える。タグのないエントリはダメ、非難される。 Entries in the access map should be tagged according to their type. Three tags are available: Connect: connection information (${client_addr}, ${client_name}) From: envelope sender To: envelope recipient エンベロ−プで判断される。 Notice: untagged entries are deprecated. 本文の From:、To: ではない。 * このマシンからメ−ルを出せなくする /etc/mail/access # /usr/ucb/mail -v katou@nix.co.jj とやって ------------------------------- # tail /var/log/syslog で discard と出て来る |Connect: 192.168.1.2 RELAY のを確認した。127.0.0.1 でなく、このマシンの |To: nix.co.jj RELAY IPアドレスの 192.168.1.4 にしたら discard |127.0.0.1 DISCARD せず、メ−ルは katou@nix.co.jj へ行った。 | |#Connect:127.0.0.1 DISCARD タグなしは Connect と同じ働きをするのを確認。 * 予備マシンで REJECT の設定をしたテスト [ 内部のメ−ルアドレスに送ってみた ] 予備マシンはネットワ−クにつないでもつながなくても、ここでのテスト結果は同じ。 /etc/mail/access ------------------------------- 送信者である root にメ−ルが行ったのが分かる。 |Connect: 192.168.1.2 RELAY でも内容がおかしい気がする。 "Access Denied" |To: nix.co.jj RELAY というメッセ−ジではない。マシン単体でのテス |nix.co.jj RELAY トでは、動作の確認はここまでか?。何かおかし |To:katou@nix.co.jj REJECT いのか。否 DMZ に仮置きしても同じだった。 # /usr/ucb/mail -v katou@nix.co.jj # cat /var/mail/root ところどころ日付の部分を削った。 From MAILER-DAEMON Fri Mar 16 15:32:52 2007 Received: from mail.nix.co.jj (localhost [127.0.0.1]) by mail.nix.co.jj (8.13.8/8.13.8) .. for .. Received: from localhost (localhost) by mail.nix.co.jj (8.13.8/8.12.5/Submit) From: Mail Delivery Subsystem To: root@mail.nix.co.jj MIME-Version: 1.0 Content-Type: multipart/report; report-type=delivery-status; boundary="l2G6Wpar000996.1174026771/mail.nix.co.jj" Subject: Returned mail: see transcript for details Auto-Submitted: auto-generated (failure) Content-Length: 1631 This is a MIME-encapsulated message --l2G6Wpar000996.1174026771/mail.nix.co.jj The original message was received .. from root@localhost ----- The following addresses had permanent fatal errors ----- katou@nix.co.jj (reason: 550 5.2.1 ... Mailbox disabled for this recipient) (expanded from: katou@nix.co.jj) ----- Transcript of session follows ----- ... while talking to localhost.nix.co.jj.: >>> DATA <<< 550 5.2.1 ... Mailbox disabled for this recipient 550 5.1.1 katou@nix.co.jj... User unknown <<< 503 5.0.0 Need RCPT (recipient) このマシンの中の katou宛に送ろう としているみたい。そんなユ−ザは --l2G6Wpar000996.1174026771/mail.nix.co.jj いないと、跳ねられているみたい。 Content-Type: message/delivery-status Reporting-MTA: dns; mail.nix.co.jj Final-Recipient: RFC822; katou@nix.co.jj Action: failed Status: 5.2.1 Remote-MTA: DNS; localhost.nix.co.jj Diagnostic-Code: SMTP; 550 5.2.1 ... Mailbox disabled for this recipient --l2G6Wpar000996.1174026771/mail.nix.co.jj Content-Type: message/rfc822 Return-Path: Received: (from root@localhost) by mail.nix.co.jj (8.13.8/8.12.5/Submit) .. for katou@nix.co.jj .. From: Super-User To: katou@nix.co.jj Subject: 555 555 --l2G6Wpar000996.1174026771/mail.nix.co.jj-- [ 外部のメ−ルアドレスに送ってみた ] ( 予備マシンは DMZ に設置した ) /etc/mail/access # cd /etc/mail ------------------------------- # makemap hash access < access |Connect: 192.168.1.2 RELAY |To: nix.co.jj RELAY |nix.co.jj RELAY |To:ikken@tcp-ip.or.jj REJECT /etc/aliases # newaliases -------------------------------- |nobody: /dev/null |Postmaster: katou@nix.co.jj |MAILER-DAEMON: katou@nix.co.jj |root: katou@nix.co.jj << これを追加した。 # /usr/ucb/mail -v ikken@tcp-ip.or.jj 今度は外部のメ−ルアドレスに送ってみた。 このマシンの /etc/mail/access の "To:ikken@tcp-ip.or.jj REJECT" で拒否されて、送 信者である rootに送れない旨のメ−ルを返す。/etc/aliasesに"root: katou@nix.co.jj" と記述したので、Mail-Store に送り POP でメ−ルをかとうが受け取ったところ。 内部ネットのパソコンの Outlook でメ−ルを受けたところ ----------------------------------------------------------------- |差出人: Mail Delivery Subsystem [MAILER-DAEMON@nix.co.jj] |宛先 : root@mail.nix.co.jj |件名 : Return mail:see transcript for details |----------------------------------------------------- |The original message was received at Thu, 29 Mar ... |from root@localhost | | ----- The following addresses had permanent fatal errors ---- |ikken@tcp-ip.or.jj | (reason: 550 5.2.1 ... Mailbox disabled for this recipient) | (expand from: ikken@tcp-ip.or.jj) | | ----- Transcript of session follows ----- |... while talking to localhost.nix.co.jj: |>>> DATA |<<< 550 5.2.1 ... Mailbox disabled for this recipient |550 5.1.1 ikken@tcp-ip.or.jj... User unknwon |<<< 503 5.0.0 Need RCPT (recipient) | |---------------------------------------------- | □ATT01345.dat ■qqq ----------------------------------------------- ■qqq をクリックして見た中身 ----------------------------- |差出人: Super-User |宛先 : ikken@tcp-ip.or.jj |件名 : qqq |---------------------------- |henomohe -----------------------------