8.12.9 使用上 (仕様上 ?) の注意 root に suid しなくなった (起動時はポート 25 を bind するため、root です) ために、以下の条件が違います。 ・root を使わずにユーザ smmsp とグループ smmsp を使う。 こうすることで、セキュリティレベルが高くなった。 ・送受信共に、sendmail が常駐している必要がある。 LDA (Local Delivery Agent: ローカルメーラ) に送受信を任せるので、受信が不要でも常駐しなければなりません。 常駐せずに送信したい場合は 8.11 系 (8.11.7 が最終:2003-03-30) を使いましょう。 送信だけなら 8.11 系でも安心して使えます。 ・その他 access.db の書式に注意 access.db の書式が FEATURE(`access_db', `hash -T<TMPF> -o /etc/mail/access') に変更になっています。 従来の FEATURE(`access_db', `hash -o /etc/mail/access') では動作できません。 フォーマットに注意 cf のフォーマットは V10/Berkeley です。 8.12 系で初めて V10 が採用されたわけではありませんが、8.12 系に付属の cf は全て V10 になっています。 以前のバージョンの cf で sendmail を起動 (sendmail -bt -C sendmail.cf) をすると、 Warning: .cf file is out of date: sendmail 8.12.x supports version 10, .cf file is version n x は sendmail のバージョン n は cf のバージョン という警告が出ます。
・ユーザ smmsp の作成 (メール送信の際、8.12.x からはこのユーザを使う) $ su # groupadd smmsp # useradd -g smmsp smmsp Solaris の場合はこちらもやる # mkdir /export/home/smmsp # chown smmsp:smmsp /export/home/smmsp # usermod -d /export/home/smmsp smmsp
・cc の準備 (Linux は不要) DB_File (Perl モジュール) のインストールで cc が無いといってうるさいのでリンクを張ってしまう (Solaris のみ) Linux は既に張ってあるので必要無し。 $ su # cd /usr/bin/ # ln -s ../local/bin/gcc cc
・NEWDB (Berkelay DB) のインストール (Solaris の場合は入っていない) http://www.sleepycat.com/update/3.3.11/db-3.3.11.tar.gz をダウンロード $ tar xzf db-3.3.11.tar.gz $ cd db-3.3.11 $ cd build_unix $ ../dist/configure $ make $ su # make install /usr/local/BerkeleyDB.3.3/ にインストールされる リビルドは $ make clean $ make あるいは $ make realclean $ ../dist/configure $ make と書いてある。 Solaris の場合、Linux の様に /etc/ld.so.conf が無いのでリンクを張る $ su # cd /usr/lib/ # ln -s ../local/BerkeleyDB.3.3/lib/libdb-3.3.so libdb-3.3.so 最低限、これだけでも張る # ln -s ../local/BerkeleyDB.3.3/lib/libdb-3.so libdb-3.so # ln -s ../local/BerkeleyDB.3.3/lib/libdb.so libdb.so # ln -s ../local/BerkeleyDB.3.3/lib/libdb-3.3.a libdb-3.3.a # ln -s ../local/BerkeleyDB.3.3/lib/libdb-3.3.la libdb-3.3.la
・sendmail のインストール $ ncftpget sendmail.8.12.9.tar.sig $ tar xzf sendmail.8.12.9.tar.gz $ cd sendmail-8.12.9 devtools/OS/SunOS.5.8 (Solaris8 の場合: Linux は不要)
define(`confMAPDEF', `-DNEWDB -DNDBM -DNIS -DNISPLUS -DMAP_REGEX') -DNEWDB スイッチを追加 define(`confINCDIRS', `-I/usr/local/BerkeleyDB.3.3/include') 1行追加 define(`confLIBDIRS', `-L/usr/local/BerkeleyDB.3.3/lib') 1行追加 |
include(`../m4/cf.m4')dnl ※1 コマンドラインで指定するのが面倒なのでここで指定する divert(-1) divert(0)dnl VERSIONID(`$Id: generic-linux.mc,v 8.1 1999/09/24 22:48:05 gshapiro Exp $') OSTYPE(linux)dnl DOMAIN(generic)dnl RELAY_DOMAIN_FILE(`/etc/mail/relay-domains') スタティックなリレー許可ホストファイル (デフォルトなので省略可) FEATURE(`always_add_domain') ローカルユーザがドメイン名を省略してもドメイン名を付加する FEATURE(`virtusertable', `hash -o /etc/mail/virtusertable') 受信振り分け指定 FEATURE(`access_db', `hash -T<TMPF> /etc/mail/access') 接続許可/拒否ホスト指定 ※2 (dbm でも可) FEATURE(`dnsbl', `relays.ordb.org', `"550 Email rejected due to sending server misconfiguration - see "')dnl ORDB を利用しないなら不要 include(`poprelay.mc')dnl ※4 … poprelayd を使用しないなら不要 FEATURE(`greet_pause',`5000')dnl 8.13.1 からは access.db に GreetPause: が使用可能です MAILER(local)dnl MAILER(smtp)dnl # DNS の逆引きがおかしいサイトを拒否する設定 # RFORGED はマルチドメインのメールを拒否してしまうので、コメントアウトのほうが吉 LOCAL_RULESETS SLocal_check_relay R$* $: $&{client_resolve} RTEMP $#error $@ 4.7.1 $: "450 Access denied. Cannot resolve PTR record for " $&{client_addr} 管理する DNS が存在しないホスト (SERVFAIL) を拒否 |
# We probably want the access_db feature enabled. # |
example1.com example2.com |
who@example1.com who@overthere.com --- who@example1.com として届いたメールを who@overthere.com に送る (.forward と同じ機能) @example1.com example --- ***@example.com に届いたメールをローカルユーザ example に蓄積する @example2.com 550 error-message --- エラーステータスを返す |
other.com --- ***.other.com へのリレーを許可する 192.168.10.10 --- 192.168.10.10 へのリレーを許可する |
Connect:relay.com RELAY --- ***.relay.com からのリレーを許可する Connect:other.com OK --- ***.other.com からの受け取りを許可する Connect:192.168 REJECT --- 192.168.*.* からの接続を拒否する To:true.com OK --- @true.com への受け取りを許可する From:false@junk.com REJECT --- false@junk.com からの受け取りを拒否する (詐称は見抜けない) reject.com REJECT --- ***.reject.com からの接続を拒否する (デフォルトが Connect: になる) |
other.com --- ***.other.com からのリレーを許可する 192.168 --- 192.168.*.* からのリレーを許可する |
(空) |
# vi /etc/rc.d/init.d/sendmail
DAEMON=yes QUEUE=1h
# chmod ug+x /etc/rc.d/init.d/sendmail # chkconfig --add sendmail ・起動スクリプト (Solaris の場合) # vi /etc/init.d/sendmail
#!/bin/sh # chkconfig: 2345 80 30 # description: Sendmail # processname: sendmail # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Source sendmail configureation. if [ -f /etc/sysconfig/sendmail ] ; then . /etc/sysconfig/sendmail else DAEMON=no QUEUE=1h fi # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0 [ -f /usr/sbin/sendmail ] || exit 0 RETVAL=0 prog="sendmail" start() { # Start daemons. echo -n $"Starting $prog: " /usr/bin/newaliases > /dev/null 2>&1 if test -x /usr/bin/make -a -f /etc/mail/Makefile ; then make -C /etc/mail -s else for i in virtusertable access domaintable mailertable ; do if [ -f /etc/mail/$i ] ; then makemap hash /etc/mail/$i < /etc/mail/$i fi done fi daemon /usr/sbin/sendmail $([ "$DAEMON" = yes ] && echo -bd) \ $([ -n "$QUEUE" ] && echo -q$QUEUE) RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/sendmail return $RETVAL } stop() { # Stop daemons. echo -n $"Shutting down $prog: " killproc sendmail RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/sendmail return $RETVAL } # See how we were called. case "$1" in start) start ;; stop) stop ;; restart|reload) stop start RETVAL=$? ;; condrestart) if [ -f /var/lock/subsys/sendmail ]; then stop start RETVAL=$? fi ;; status) status sendmail RETVAL=$? ;; *) echo $"Usage: $0 {start|stop|restart|condrestart|status}" exit 1 esac exit $RETVAL
# chmod ug+x /etc/init.d/sendmail # cd /etc/rc0.d # ln -s ../init.d/sendmail K36sendmail # cd /etc/rc1.d # ln -s ../init.d/sendmail K36sendmail # cd /etc/rcS.d # ln -s ../init.d/sendmail K36sendmail # cd /etc/rc2.d # ln -s ../init.d/sendmail S88sendmail
#!/sbin/sh ERRMSG1='WARNING: /var/mail is NFS-mounted without setting actimeo=0,' ERRMSG2='this can cause mailbox locking and access problems.' case "$1" in 'start') if [ -f /usr/lib/sendmail -a -f /etc/mail/sendmail.cf ]; then if [ ! -d /var/spool/mqueue ]; then /usr/bin/mkdir -m 0750 /var/spool/mqueue /usr/bin/chown root:bin /var/spool/mqueue fi MODE="-bd" if [ -f /etc/default/sendmail ]; then . /etc/default/sendmail fi if [ -z "$QUEUEINTERVAL" ]; then QUEUEINTERVAL="15m" fi case $QUEUEINTERVAL in *s | *m | *h | *d | *w) ;; *) QUEUEINTERVAL="15m" ;; esac if [ $QUEUEINTERVAL -le 0 ]; then QUEUEINTERVAL="15m" fi /usr/lib/sendmail $MODE -q$QUEUEINTERVAL $OPTIONS & fi if /usr/bin/nawk 'BEGIN{s = 1} $2 == "/var/mail" && $3 == "nfs" && $4 !~ /actimeo=0/ && $4 !~ /noac/{s = 0} END{exit s}' /etc/mnttab; then /usr/bin/logger -p mail.crit "$ERRMSG1" /usr/bin/logger -p mail.crit "$ERRMSG2" fi ;; 'stop') /usr/bin/pkill -x -u 0 sendmail ;; *) echo "Usage: $0 { start | stop }" exit 1 ;; esac exit 0
pop-3 stream tcp nowait root /usr/sbin/tcpd in.pop3d -t /var/log/popper.log |
service pop3 { socket_type = stream wait = no user = root server = /usr/sbin/in.pop3d server_args = -t /var/log/popper.log log_on_failure += USERID disable = no } |
Sep 26 00:19:44.817 2001 [12892] (v4.0.3) POP login by user "who" at (client.example.com) 192.168.10.10 ユーザ who がホスト 192.168.10.10 から接続して認証されたという意味 |
#!/usr/local/bin/perl … perl のパスに合わせる |
#!/bin/sh # chkconfig: 2345 55 25 # description: POP before SMTP relay daemon # processname: poprelayd [ -x /usr/sbin/poprelayd ] || exit ; [ -d /var/run ] || exit ; case "$1" in start) /usr/sbin/poprelayd -d ;; stop) kill `cat /var/run/poprelayd.pid` ;; *) echo "Usage: $0 {start|stop}" ;; esac |
$ telnet mail.example.com 25 Connected to mail.example.com. Escape character is '^]'. 220 mail.example.com ESMTP Sendmail 8.12.9/8.12.9; Tue, 11 Mar 2003 11:50:18 +0900 helo mail.mydomain.com 250 mail.example.com Hello mail.mydomain.com [192.168.10.10], pleased to meet you mail from:<myname@mail.mydomain.com> 250 2.1.0 <myname@mail.mydomain.com>... Sender ok rcpt to:<yourname@mail.example.com> 250 2.1.5 <yourname@mail.example.com>... Recipient ok (will queue) data 354 Enter mail, end with "." on line by itself dear yourname. this is a test mail. . 250 2.0.0 h2B2l6qx031243 Message accepted for delivery quit 221 2.0.0 mail.example.com closing connection Connection closed by foreign host. |
relaychecker.pl
#!/usr/local/bin/perl use strict ; use Socket ; if ($ARGV[0] eq '') { print "Usage: $0 <ServerName>\n" ; exit ; } my $targ_host = $ARGV[0] ; my $my_host = 'mail.example.com' ; my $mail_from = 'checker@example.com' ; my $mail_to = 'somewhere@example.com' ; my @command = ( "helo $my_host", "mail from:<$mail_from>", "rcpt to:<$mail_to>", ) ; my $port = getservbyname('smtp','tcp') ; local *SOCK_SMTP ; socket(SOCK_SMTP, PF_INET, SOCK_STREAM, 0) ; my $target = sockaddr_in($port, inet_aton($targ_host)) ; if (! connect SOCK_SMTP, $target) { print "$targ_host can't connect.\n" ; exit ; } select SOCK_SMTP ; $| = 1 ; select STDOUT ; my $res = <SOCK_SMTP> ; print "$targ_host > $res" ; if ($res !~ /^2/) { print "server $targ_host response undefined.\n" ; } else { my $relay = 'Allow' ; my $cmd ; for ( my $i = 0 ; $i < @command ; $i ++ ) { $cmd = $command[$i] ; print "$targ_host < $cmd\n" ; print SOCK_SMTP "$cmd\n" ; my $res = <SOCK_SMTP> ; print "$targ_host > $res" ; if ($res !~ /^2/) { $relay = 'Deny' ; last ; } } $cmd = "quit" ; print "$targ_host < $cmd\n" ; print SOCK_SMTP "$cmd\n" ; my $res = <SOCK_SMTP> ; print "$targ_host > $res" ; print "$targ_host relay $relay\n" ; } close SOCK_SMTP ;