Sendmail的配置
Sendmail对一般的系统管理者而言,往往是个不敢手的「禁区」 ,因为绝大多数系统的使用
者对E-Mail的需求与依赖的程度之高,可说是稍有分毫差错,系统管理者就要准备接受如雪片般飞
来的抗议与 抱怨!而Sendmail这个东东的「内函」,似乎又有点不太容易理解: 与设定有关
的sendmail.cf 档,如果不是下过一番死功夫,则读起来如同读天书一样,只知道里面有英文字与
数字!所以一般人总是能不 动则不动,只要能用就好。不过,很不幸的,一般跟著机器而来
的sendmail总是有著令人心惊胆跳的「附加功能」,就是常常都有一些可以让无聊人士作为侵入路
径的BUG 或後门,某些BUG 还可以让侵入 者经由Sendmail而取得最高权限的root!一旦root权限
被人拿走了, 那麽这机器就可被人任意屠宰,最恶劣的,还可能破坏系统!
Sun 在国内的使用人口相当的多,笔者对Sun 也稍微比较熟悉一点。不过,Sun的Sendmail却
是令人颇不敢恭维的,几乎可以说:只要还在使用Sun 的Sendmail而没有「常常」patch 的话,那
甚麽系统安全都不必谈了,谈了也是白谈;如果还在使用Sun 的Sendmail,那就如果系统抱著一颗
不定时炸弹,随时一个不注意,都可能引爆:(。这一点,大家可以翻一翻CERT或8lgm看一看,几乎
是只要有sendmail 的问题,Sun 大多跑了....。其他系统的Sendmail也不要偷笑,虽然大家的出
场率没有Sun 高,可是也常会问题的。 另一方面,Sendmail 8.6.9与之前的版本最近刚发现有
个ident方面的Bug 。如果方便的话,请大家务必换成最新版。如果不方便的话,在v8.6.5之後的
版本有个克难式的补救法,即在sendmail.cf 加入这麽一行:
Orident=0
表示不作ident 的检查。
v8.6.5之前的版本就一定要换成最新版。
本软体在系统安全方面,是目前评价最高的,目前已知的BUG都已经改好了,最主要的原因,
当然是要感谢作者Eric Allman ,他(或他们)能作到一发现重大的Bug (如系统安装)就立刻出新版
。本软体是一public domain ,可以在网路上各ftp server上找到其source code。由於该软体的
发展者把一些必要的设定步骤自动化了,所以,其实安装这个软体并不是想像中那麽样的困难。如
果连compile 的时间也算下去,顺利的话,不用半个小时就可以安装完毕!所以,「麦惊」啦!:
)
3.安装Sendmail
3.1 下载Sendmail最新版本
最新版本的Sendmail可以从
ftp://ftp.sendmail.org/pub/sendmail/ 得到!
如 sendmail.8.9.3.tar.gz 这是截止到文章发布的最新版本,size:1068290byte
有关最新版本的发布,请浏览Sendmail的主页
http://www.sendmail.org
3.2 安装Sendmail
用root登陆或su成root后,先把tar.gz的包解开tar fvxz sendmail.8.9.3.tar.gz,用make
-f 开始编译
编译完成后系统会产生系统设定文件,也就是sendmail.cf (一般这个文件都存放在/etc下)
接下来,这按几步继续安装: (注:~/sendmail为解开后的sendmail目录)
1.请切换至设定档目录~/sendmail/cf/cf 之下。找一个合适自己系统的XXXX.mc档。笔者一
般上是使用tcpproto.mc 这一个不用uucp的档。如果是用tcpproto.mc 这个档,笔者在solaris
2.3 试了,得记得在档中要加上一行:
OSTYPE(solaris2)
Sun 4.1.3 不必,其他系统就不晓得了。在目录 ~/sendmail/cf/ostype下有几个OSTYPE()可
以的 档,只有这个目录有资料的才可能能够OSTYPE()。还有, 如果是 system V的/bin/mail,似
乎就得要加OSTYPE()。
一句老话,详情请看DOCUMENT:~/sendmail/cf/README。这希望有经验的朋友能够补充:)
如果不小心忘了加上OSTYPE()会怎样?也不会怎样,只会有"unknow mailer error" 的错误,
然後信收不到。
有一点要提醒大家的,就是:在~/sendmail/cf/cf 所看到的各种系统的.mc 档,都
是Sendmail 8.6.x的作者 Eric Allman 「演示」给大家看的,所以,可以看到档名都有个"cs",
要是没有修改就用这些档的话,那一定会发生错误的。而要修改,有相当多地方要改,所以,如笔
者一般懒的人,用tcpproto.mc 还是比较简单又不会出错:)
2.好,选定了某一个合意的.mc 档,那接下来可执行m4产生.cf 档。请下指令:
# m4 XXX.mc > YYY.cf 如果是sun 4.1.3 ,可能系统会抱怨m4的版本太旧了。那请试一试用:
# /usr/5bin/m4 XXX.mc >YYY.cf
要是还是不行,那就请去抓新版的m4回来compile (可以在 http://www.gnu.org 找到gnu
的m4)。
这个步骤是要把compile好的files, install 到系统上去了。
罗嗦的我还是得再一次提醒您看看:把旧档案备份好了吗?
好,假设compile 的结果非常没挑战性的没有任何错误,产生.cf 档过程也没有甚麽值得注意
的讯息。所产生的.cf 档 也改好了。而且最重要的:作好旧档的备份(不是我要吓人,这是以防
万一)。
1.挑个老板没有在用mail的时间,快手快脚的切换至目录~/sendmail/src ,下指令:
# make -f Makefile.XXX install
系统会把compile出来的~/sendmail/src/sendmail与man document拷贝到它们该有的目录(
所以你还如果没有备份/usr/lib/sendmail ,那赶快祈祷待回不要出问题,要不然就赶快准备泪水
哭吧!
因为旧的会被compile 出来的sendmail覆盖)
2.切换至目录~/sendmail/cf/cf ,把产生出来的YYY.cf档拷贝到本系统sendmail.cf 应该在
的地方,
如:/etc或 /etc/mail 。
3.把旧sendmail daemon 的process 杀掉。(这应该不用我罗嗦吧!用ps -ax |grep
sendmail |grep -v grep 找出旧daemon的process(或head -1/etc/sendmail.pid 或 head -1
/etc/mail/sendmail.pid),然后用 kill -9 processID干掉它(或直接用 kill -9 `head -1
/etc/sendmail.pid`)。
4.启动新daemon。例如下指令:
/usr/lib/sendmail -bd -q30m
当然,保守一点,看旧的daemon怎麽跑,照旧的来下参数应该是没有问题。
这时,初步安装就已经完成了,接下来请看设置sendmail
3.3安装Sendmail注意事项
如果安装不成功,请参考下面的问题:
用vi或任一种编辑器,编辑的makefile档,作一点点 必要的修改。所要修改的地方不多,下
面是可能要修改的地方:
1."CC ="如果原档所用的compiler并不是我们系统的,这才要改。
2.本系统是否有安装Berkerlay 的New database?如果有,跳过本点,到第3点。 如果没有(
如:一般SunOS 都没有装),那麽请修改这几 行(下面以Makefile.SunOS为例,但其他系统也类
似):
A.在 DBMDEF= -DNDBM -DNEWDB -DNIS 一行,请改成: DBMDEF= -DNDBM -DNIS (即去
掉-DNEWDB)
B.把这两行REMARK起来: INCDIRS=-I/usr/sww/include/db --> #
INCDIRS=-I/usr/sww/include/db
LIBDIRS=-L/usr/sww/lib --> # LIBDIRS=-L/usr/sww/lib
C.修改LIBS= -ldb -ldbm -lresolv 这一行成: LIBS= -ldbm -lresolv (即去掉-db )
3.把nroff 的"-mandoc "参数改成一般系统可以接受的 "-man"(当然,这得依你的系统而定
,如果你是用groff,那就可以很愉快的直接使用,不必改这个参数:)。如果不改也并不会影
响sendmail的安装,只是不能看到格式化後的sendmail相关文件罢了。
关于DIRECTORY PERMISSIONS的问题你需要执行2条命令:
chmod go-w / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue
chown root / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue
许多系统的spool目录使用/usr/spool来代替/var/spool,设置别名的etc/mail取而代之的
是/etc,如果你要在sendmail.cf设置RunAsUser许选项,/var/spool/mqueue这个目录需
要RunAsUser 用户的权利,ok,这时开始编译Sendmail,执行这条命令
sendmail -v -bi
这时,开始初始化alias database. 如果它显示:
WARNING: writable directory /etc
WARNING: writable directory /usr/spool/mqueue
那么这个目录列出了不适当的写特权,应该避免多方面的的安全攻击。
4.1 设置Sendmail.cf
产生出来的YYY.cf一般得要改个地方才能正常的收信。请寻找"Cw",原来产生的.cf 档,Cw应
是:Cwlocalhost请在localhost 之後加上你那一台机器所有可能用来当收信地址的host name 。
例如我有一台机器叫:ftp.games.net.cn,而且也叫:gopher.games.net.cn,
而我希望这一台机器这两个名字都能收信,那我要这么作:
Cwlocalhost ftp.games.net.cn gopher.games.net.cn
顺便说一下,Cw之後只能写入本机器的名字,千万不能写入其他机器的名字,否则,甚麽地方
都能寄,那被写的就一定不能寄。
上面其实是简略的说法,如果你对DNS 也熟悉的话,可参考这节来作判断,判断是否须要在Cw
之後写入东东。否则请直接跳过这一小节,闭上眼睛把本机器所用的所有名字都写上就是了:)
1.在一台机器上,如果有多个名字(hostname),而是用CNAME 建立的,如:
$ORIGIN games.net.cn
ftp IN A 140.119.1.2
gopher IN CNAME ftp
那麽可以不必在Cw上标明。系统会透过DNS 找到其 Canonical name。
2.如果一台机器有多个名字,可是,每个名字是用A record 建立的。如:
$ORIGIN games.net.cn.
ftp IN A 192.168.25.2
gopher IN A 192.168.25.2
这种情况【一定】要记得在Cw後写上你所要收信的名字。如果这个忘了写,会有怎样的问题呢
?
忘了将会有从外面机器寄信来,没有写上的机器名将却收不到信,机器会抱怨:
"Local configuration error" 。
如:我的sendmail.cf中的Cw这行是如下: Cw games.net.cn
那我将无法使用这个地址:
[email protected]
而只能用
[email protected] 否则将出现上述错误。
如果发现了错误,那再加上去也就可以了。
3.如果一台机器有多interface ,各interface有其本身的名字,且要收信。
这个情况也要在Cw之後写明所有要收信的hostname。
ok!一个标准的sendmail.cf文件就设置完了!
4.2 设置access
打开/etc/mail/access,你会看到 (注意一些系统的access文件不再/etc/mail下,如找不到
请用whereis查找或检查是否安装正常)
# Check the /usr/doc/sendmail-8.9.3/README.cf file for a description
# of the format of this file. (search for access_db in that file)
# The /usr/doc/sendmail-8.9.3/README.cf is part of the sendmail-doc
# package.
#
# by default we allow relaying from localhost...
localhost.localdomain RELAY
localhost RELAY
如果您的IP地址是192.168.25.11的话,这样请在最后一行加上192.168.25.11 RELAY
其文件的最后三行应是:
localhost.localdomain RELAY
localhost RELAY
192.168.25.11 RELAY
加上这句话您就可以用sendmail发送接收mail了!但是如果您想让别人也可以使用sendmail的
话,他的IP是202.168.25.22,这样就在在最后一行加入202.168.25.22 RELAY
其文件的最后四行应是:
localhost.localdomain RELAY
localhost RELAY
192.168.25.11 RELAY
192.168.25.22 RELAY
我想,您现在一定有个疑问是,如果我想设置50个人用sendmail是不是需要加50个IP啊!?
嘿嘿,不用啦,是这样,sendmail考虑到多用户的时候,它准许你添入整个C类地址,(B类好
像也可以,我没try过!)
其格式如下:
localhost.localdomain RELAY
localhost RELAY
192.168.25 RELAY
这样,您就是把192.168.52这整个C都加入的sendmail中,这个C类地址的用户,如果在你的系
统里有账号的话,就可以使用sendmail收发信件了!
4.3 设置pop3
如果您需要pop3来接收信件,您需要打开pop3端口,
vi /etc/inetd.conf 查找到
# pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
把#号删掉。
vi /etc/services 查找到
#pop-3 110/tcp # POP version 3
把#号删掉。
这样,在restart inetd后,pop3 110端口就可以接信了!如果还是不行,请检查是否安装pop
3端口!
4.4 如何restart sendmail;inetd以及注意事项
有一点要提醒大家的,要用"kill -9 [pid-of-sendmail]" ,从新启动sendmail
如果用 kill -HUP 是不会发生作用的! (这是颇多人常遇到的问题,切记!)
在redhat6中用/etc/rc.d/init.d/sendmail restart即可!
inetd是/etc/rc.d/init.d/inetd restart
5.1 sendmail的别名和forward
(1) 关于直接用IP地址发信
mail user@[166.111.IP.Address]
只要用[]将IP地址括起来就行了
(2) 关于alias
sendmail在/etc下有两个文件 aliases和aliases.db, 后者是前者用newaliases
生成的别名数据库. 你可以手工编辑/etc/aliases, 然后运行newaliases更新数据库(其
实newaliases是个到sendmail的 symlink)
eg: nickname :
[email protected]
alias-name: real-user-account
则以后mail nickname就可以将信寄到
[email protected]处
而别人寄给
[email protected]的信就会转给真正的用户
real-user-account
(3) 关于forward
在你的$HOME目录下面编辑一个.forward文件, 里面写上你要forward的目的e-mail
地址或本机的用户名, 就可以自动将信 forward到相应地址
eg: .forward:
[email protected]
或 other-user-account
则给此人的e-mail会forward到hotmail或other-user-account处
(4) 关于vacation
去找一个vacation包(如RedHat的contrib中有vacation的rpm), 装上后就一个
/usr/bin/vacation程序和一个man.
先运行vacation, 它会让你编辑$HOME/.vacation.msg文件, 就是要发回给对方
告诉他你现在不看信的东西啦. 然后编辑$HOME/.forward文件, 写这样一句 \username,
"|/usr/bin/vacation username", username 要换回你自己的了然后运行vacation -I建
立$HOME/.vacation.db就好了 (看看man更详细)
(5) 关于sendmail的一些文件
/var/log/maillog sendmail的log, 分析错误有用
/var/spool/mail/$USER 进来的信, 每个用户一个文件
/var/spool/mqueue mail queue, 可以用mailq看队列中待发的信
(mailq也是 sendmail的symlink了)
dfxxxxxx 这是信的内容
qfxxxxxx 这是信的subject和别的信息 (反正每信一个号了, 配对的)
/etc/sendmail.cf sendmail的配置文件, 改动它可要小心
/etc/sendmail.cw 假如你的机器有好多alias的话就把名字写在
这个文件中, 这样写哪个都能收到信
5.2 限制邮件的大小
Modify /etc/sendmail.cf:
Mlocal, P=/bin/mail, F=lsDFMrmn, S=10, R=20/40,
Maxsize=1000000,
A=mail -d $u
Mprog, P=/usr/local/sendmail/smrsh, F=lsDFMeu, S=10, R=20/40, D=$z:/,
Maxsize=1000000,
A=sh -c $u
This limits incoming mail processed by by smrsh and /bin/mail to 1 million bytes.
You can do the same with the Mstmp, Mesmtp, and Mrelay statements to limit the
size of outgoing mail as well.
You can do the same with the Mstmp, Mesmtp, and Mrelay statements