FreeBSD全能服务器安装手册(2)
时间:2007-01-04 10:28:06
来源: 作者:whsong 点击:次 出处:技术无忧
关键字:Free
FreeBSD全能服务器安装手册之文件服务器篇之C用户密码自主管理篇 ##############################增加FTP密码自助修改功能#########################
%%%%%%%%%%%%%%%%%%%%%config.php%%%%%%%%%%%%%%%%%%%%%
<?
$local="localhost";
$u_name="ftp";
$cpasswd="e89120d9dfeb";
$db_name="ftpusers";
//用户名、密码、数据库名字请自行修改为自己的
?>
<?
function local(){
global $local;
return $local;
}
function u_name(){
global $u_name;
return $u_name;
}
function passwd(){
global $cpasswd;
return $cpasswd;
}
function db_name(){
global $db_name;
return $db_name;
}
?>
%%%%%%%%%%%%%%%%%%%%connect.php%%%%%%%%%%%%%%%%%%%%%
<?
$connectino=mysql_connect(local(),u_name(),passwd()) or die ("数据库连接失败");
$select=mysql_select_db(db_name()) or die ("数据库打开失败");
?>
%%%%%%%%%%%%%%%%%%%index.php%%%%%%%%%%%%%%%%%%%%%%%
<?php
require("config.php");
if(!empty($_GET["action"])) {
if($_GET["action"]=="edit"){
require("connect.php");
$flag=0;
if(empty($_POST['passwd'])){
$flag=1;
echo "<script>alert('错误:原密码不能为空!');history.go(-1)</script>";
}
if(empty($_POST['passwd1'])){
$flag=1;
echo "<script>alert('错误:新密码不能为空!');history.go(-1)</script>";
}
if(empty($_POST['passwd2'])){
$flag=1;
echo "<script>alert('错误:确认新密码不能为空!');history.go(-1)</script>";
}
if((strlen($_POST["passwd1"])<1)||(strlen($_POST["passwd1"])>100)){
$flag=1;
echo "<script>alert('错误:您的新密码长度应该在8-16个字符之间');history.go(-1)</script>";
}
if((strlen($_POST["passwd2"])<1)||(strlen($_POST["passwd2"])>100)){
$flag=1;
echo "<script>alert('错误:您的新密码长度应该在8-16个字符之间');history.go(-1)</script>";
}
if($_POST["passwd1"]!=$_POST["passwd2"]){
$flag=1;
echo "<script>alert('错误:两次 新密码输入不一致 !');history.go(-1)</script>";
}
$passwd_old=md5($_POST['passwd']);
$passwd_new=md5($_POST['passwd1']);
if($flag==0){
$sql="select * from users where User='".$_POST['User']."' and Password='".$passwd_old."'";
$result=mysql_query($sql);
$myrow1=mysql_num_rows($result);
if($myrow1==0){
echo "<script>alert('原密码错误,请重新输入!');history.go(-1)</script>";
}else{
$sql ="update users set Password='".$passwd_new."' where User='".$_POST['User']."'";
$resulta=mysql_query($sql);
echo "修改成功!";
}
}
}
}else{
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>--修改密码</title>
</head>
<body>
<form name="form1" method="post" action="index.php?action=edit">
<table width="300" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#666666">
<tr>
<td><table width="300" border="0" cellspacing="1" cellpadding="0">
<tr>
<td height="22"><font color="#ffffff" class="pt9"><strong>修改FTP服务器登陆密码</strong></font></td>
</tr>
<tr>
<td bgcolor="#FFFFFF"><span class="pt9"> 用户名:</span>
<input name="User" style="border-style:solib;border-color:'#333333';border-width:1;" type="text" size="20"></td>
</tr>
<tr>
<td bgcolor="#FFFFFF"><span class="pt9"> 原密码:</span>
<input name="passwd" style="border-style:solib;border-color:'#333333';border-width:1;" type="password" size="20"></td>
</tr>
<tr>
<td bgcolor="#FFFFFF"><span class="pt9"> 新密码:</span>
<input name="passwd1" style="border-style:solib;border-color:'#333333';border-width:1;" type="password" size="20"></td>
</tr>
<tr>
<td bgcolor="#FFFFFF"><span class="pt9"> 密码确认:</span>
<input name="passwd2" style="border-style:solib;border-color:'#333333';border-width:1;" type="password" size="20"> </td>
</tr>
<tr>
<td height="22" bgcolor="#999999">
<input type="submit" name="Submit" value="提交">
<input type="reset" name="Submit2" value="还原"></td>
</tr>
</table></td>
</tr>
</table>
</form>
</body>
</html>
<?php
}
?>
%%%%%%%%%%%%%%%%%建立对应连接或虚拟主机%%%%%%%%%%%%%%%%%
编辑httpd.conf
ee /usr/local/etc/apache/httpd.conf
添加虚拟主机 passwd.chb.com
<VirtualHost 192.168.0.205>
DocumentRoot /home/passwd
ServerName passwd.chb.com
<Directory "/home/passwd ">
allow from all
Options +Indexes
</Directory>
</VirtualHost>
当然DNS里也要添加相应指向
测试FTP密码自助修改功能
http://passwd.chb.com
FreeBSD全能服务器安装手册之文件服务器篇之D安装参数详解篇
--with-everything: 编译一个几乎所有特性都开启的“大”服务器。
--with-paranoidmsg: 当该参数被开启,不论何种原因登录失败都将显示同样的信息给用户。不开启该参数是,密码问题将显示“验证失败”,被禁止用户将显示“对不起,我不信任你”。
--with-virtualchroot:通常一个用户使用chrooted(使用-A 和 -a 参数)命令不会转出他的home目录。开启该功能之后将使其成为可能:符号连接总是一起作用,甚至他们指向的目录不在用户的home目录内。这对于共享路径是一个非常拥有的功能(例如,每一个home目录下都有一个符号连接到/var/incoming)。该功能默认不开启。
--with-tls /
--with-largefile: 支持在32位架构下下载大于2 gigabytes 的文件。通过FTP传输一个如此之大的文件是一个较为奇怪的主意。并且你的文件系统,你的系统内核、你的FTP客户端也需要支持才行。并且当该功能被开启后,下载将会比不开启变慢(或需要耗费更多的CPU)。简单的说,不要应为好玩而开启该功能,除非你真的计划下载大于gigabytes的文件。
--with-welcomemsg: (为兼容)其它FTP服务器pure-ftp可以阅读 'welcome.msg' 。这是一个安全的缺陷(匿名用户可以上载'welcome.msg'文件到随机显示)。Pure-ftpd 默认使用 '.banner'文件。
--with-uploadscript: 自从0.98版开始, Pure-FTPd 开始关注上传。当一个上传成功完成之后,任何额外的程序或脚本可以被自动启动。该功能需要一个称为“pure-uploadscript”的程序安装在Pure-FTPd包内。
--with-cookie: 在用户登录的时候显示随机或定制的信息。
--with-virtualhosts: 支持虚拟主机。这意味着每个IP地址可以有不同的匿名FPT区域。如果服务器只有一个IP地址,就不需要该功能。但是如果有多个IP地址,并且需要一个客户端连接到IP xxx 去获得/etc/pure-ftpd/xxx/而不是~ftp/,就可以开启该功能。
--with-virtualroot / //虚拟root支持
--with-diraliases: 支持路径的别名。
--with-quotas: 开启虚拟限额,可以限制一个用户可以在他的帐号下存储的最大数字,也可以限制总的大小。
--with-sysquotas: 支持系统限额(非Pure-ftpd的虚拟限额)。只有在计划使用系统限额的时候启用。
--with-ratios: 支持上传/下载比。
--with-ftpwho: 支持'pure-ftpwho' 命令。开启这个功能需要额外的内存。当pure-ftp运行在standalone模式时比较好,在inetd模式下启用较慢。
--with-throttling: 支持带宽限制。
其它参数
--with-altlog: 除了系统输出,还支持一些特殊的文件格式,目前已实现了:CLF, Stats, W3C 和 xferlog 格式
CLF (通用日志格式)是Apache, WebFS, Roxen以及其它最常用 web 服务器的基本格式;该日志文件仅仅记录文件传输,可以被web流量统计软件(Analog, Webalizer, etc.) 所分析。Stats格式是一种专门为日志文件分析软件设计的特殊输出格式。W3C格式是一种商业日志分析软件(所有支持IIS日志的分析器)的标准格式。Xferlog 是一种源于wu-ftpd的格式。
--with-brokenrealpath: 一些 Solaris 版本中realpath()运行不可靠。如果altlog和(或)pure-uploadscript没有很好的运行,请用这个参数重新编译。
--with-certfile=<file>: 该file用来做SSL认证,默认为 /etc/ssl/private/pure-ftpd.pem .
--with-extauth: 支持额外的校验模块。大多数用户不需要此参数。.
所支持语言
--with-language=english
--with-language=german
--with-language=romanian
--with-language=french
--with-language=polish
--with-language=spanish
--with-language=danish
--with-language=italian
--with-language=brazilian-portuguese
--with-language=slovak
--with-language=dutch
--with-language=korean
--with-language=swedish
--with-language=norwegian
--with-language=russian
--with-language=traditional-chinese
--with-language=simplified-chinese
--with-language=hungarian
--with-language=catalan
--with-language=czech: change the language of server messages.
默认为英语。
--with-ldap: 支持原始的LDAP路径。当该功能被开启,系统帐号将被忽略。你同时需要使用OpenLDAP。如果OpenLDAP被安装在一个特定的位置,你可以使用--with-ldap=<directory> 的参数。
--with-minimal: 为了有效运用现代FTP客户端的功能,Pure-FTPd采用基本的FTP协议加扩展(SITE IDLE,SITE CHMOD, MLSD, ...)的方式 。使用 --with-minimal 参数,这些扩展间不会被编译。同样的,也就不会有standalone server, 不会有lookup for user/group names, 不会有 humor也不会有 ASCII 的支持。但是执行文件将会比默认安装更小。该参数你至少需要GCC 3.3 以上来编译。如果你还想减少(执行)文件大小,可以采用--without-globbing 关联--with-minimal参数。如果你建立一个嵌入系统,可以这样使用;在其它场合,为了避免客户的抱怨(特别是使用windows客户端的客户),请忘记它吧
--with-mysql: 使用MySQL来提供用户数据库。当开启该参数,系统帐号被忽略。使用该功能MySQL 客户端的库文件将被安装。如果MySQL安装在特殊位置,可以使用--with-mysql=<directory> 语法。
--with-nonroot: 设置服务以非root特权用户启动。任何普通用户都可以运行服务。这对于在服务器上只有一个受限帐号的情况非常有用。但是一些特性将不能使用,而且密码只能通过LDAP,SQL或PureDB进行校验。当虚拟 chroot 被开启,用户将被限制在服务启动的目录。这是一种不安全的模式,一般用于普通(非root)用户建立临时性的服务器。在standalone模式下,2121端口将被侦听。如果想采用nonroot模式,需要编译并安装该软件(./configure --prefix=... && make install-strip) . /sbin, /bin and /man 目录需要被写入 prefix,同时还需要增加运行pure-ftpd用户在 /etc 目录的读写权限。
--with-pam: 使用紧密校验模式。Don't use this option if your login/passwd pairs are always refused (but the real fix would be to
fix your PAM configuration). 需要创建一个 /etc/pam.d/pure-ftpd 文件来运用PAM校验。'pam' 路径中包含该文件的一个样本。
--with-peruserlimits: 开启每用户同时在线限制,在繁忙的服务器上避免该参数。
--with-pgsql: 使用 Postgres 提供用户数据库。当开启该参数,系统帐号将被忽略,Postgres客户端库将被安装。如果Postgres安装与特殊位置,可以使用--with-pgsql=<directory> 语法。
--with-probe-random-dev: Pure-FTPd 使用 /dev/arandom, /dev/urandom 或者/dev/random 设备来提供严格的随机数字。这些设备通常在编译时被探测。如果想编译一个二进制包在其它主机上运行,该参数将在运行时被探测。该参数在Linux和BSD系统上无效,但可以使用在Solaris 和 QNX上。
--with-puredb: 支持虚拟用户,一个本地的用户数据库,不用于系统帐号。
--with-boring: 显示 "professionnal-looking" 信息。
--with-privsep: 开启权限分离。
--withrendez-vous: 允许在MacOS X上支持Rendezvous。
--without-ascii: 不支持 7-bits 传输 (ASCII)。如果有客户使用windows客户端程序发送脚本和HTML文件,不要使用 该参数或让他们对你大叫。
--without-banner: 不使用初始标语,这是一种通过隐瞒获得的愚蠢的安全。
--without-capabilities: 如果性能库 (libcap) 被找到,Pure-FTPd 将使用其提供安全性。该参数不测试这个库是否存在。如果性能库没有正常工作,可以到ftp://ftp.kernel.org/pub/linux/libs/security/linux-privs/ 下载。
--without-globbing: 不包括全局代码。能够减少内存消耗但经常不能工作。大多数用户不需要使用--without-globbing。Globbing是一个不错的功能。
--without-humor: 如果你没有查看过源代码而使用这个参数,就只好祝你幸运了。
--without-inetd: 如果Pure-FTPd总是运行在standalone模式下,这个参数可以节约一些代码字节。不要同时使用 --without-inetd和
--without-standalone参数,可能会导致服务不能运行。这些参数在Pure-FTPd的二进制分发包上都没有使用,所以inetd和standalone都被支持。
--without-iplogging: 为了保守机密而不记录任何IP地址,除非是政治敏感的服务器。
--without-nonalnum: 非法文件名检查。只支持基本的字符。不要盲目的使用这个参数,或者接受用户的抱怨。
--without-unicode: 不接受非拉丁字符。如果服务器文件名不含特殊字符则推荐使用。
--without-sendfile: 在Linux, Solaris, HPUX 和 FreeBSD 内核, Pure-FTPd采用特殊系统调用(sendfile)尝试减少CPU和内存的使用。在大多数文件系统中该方式运行良好,但该优化并不能在所有文件系统中正常工作。用户曾经报告过SMBFS(Samba)在FreeBSD以及TmpFS和NTFS在Linux(服务器报告错误为“broken pipe”或“Error during write to data connection”)上通过Pure-FTPd下载文件失败。如果计划在上述文件系统中运行服务,就不得不使用
--without-sendfile 参数来定义一个工作区。同样来自PA-Risc Linux 的系统也需要这个参数。
--without-shadow: 忽略shadow密码,即使他们被自动探测到。这通常是一个坏主意,除非使用的是PAM, LDAP 或 SQL。Pure-FTPd 支持shadow密码有效期 (包括帐号和密码)。.
--without-standalone: FTP 服务器能够正常地以 standalone 模式运行(没有任何超级服务)。如果不需要该功能并且想要节省一些代码字节的话,就可以开启该参数。一个类似于g2s, xinetd或tcpserver 的超级服务将强制运行该服务,但是推荐使用standalone模式。
--without-usernames: 从不在在路径列表里输出用户和组名,而代之以UIDs和GIDs。这将提高安全和性能,但会有用户觉得不够友好。
--without-capabilities: 如果性能库 (libcap) 被找到,Pure-FTPd 将使用其提供安全性。该参数不测试这个库是否存在。如果性能库没有正常工作,可以到ftp://ftp.kernel.org/pub/linux/libs/security/linux-privs/ 下载。
--without-usernames: 从不在在路径列表里输出用户和组名,而代之以UIDs和GIDs。这将提高安全和性能,但会有用户觉得不够友好。
"--prefix=" 改变安装路径,默认为 "/usr/local/".
FreeBSD全能服务器安装手册之域名服务器篇之DNS(配置文件)篇
################################设置bind9.3.*##################################
BIND介绍
BIND(Berkeley Internet Name Domain)即伯克利因特网名字域系统,它是互联网软件联合会(ISC)的开放源代码软件包,BIND提供了解析器和名字服务器软件,解析器做实际的查询工作而名字服务器则提供响应, UNIX目前使用的DNS服务器主要是依靠BIND软件来实现的。
BIND已经有三个主要版本:BIND4、BIND8和BIND9。
BIND4在20世纪80年代末期面世,BIND 8发布于1997年,而BIND9则发布于2000年中期。没有BIND 5、6和7的版本,BIND 8是如此意义重大的一个更新版本,以至于大家觉得是使用一个老版本号两倍的版本号,而事实上并非真的如此,BIND 8与4.4 BSD是一起发布,因而所有版本号都升为8;目前BIND最新的版本是BIND9.3.0。
BIND 8融入了许多能够提高效率、稳定性和安全性的先进技术。BIND9甚至走得更远,具有多处理器支持、线程安全操作、实时安全性(公开密钥加密)、IPv6支持、增量区传送和一些其他特性。
BIND9是彻底重新设计和重新实现的,它将代码中针对操作系统的特定部分独立出来,因此能更容易地将BIND移植到非UNIX系统上。BIND9的内部机制有了显著不同,但是其配置步骤却保持不变。
BIND系统由三部分组成:回答查询的称为named的守护进程;联系DNS分布式数据库的服务器解析主机查询的库例程;DNS的命令行接口:nslookup、dig和host。以DNS的术语来说,类似named的一个守护进程(或者运行它的机器)称为“名字服务器”,与其联系的客户端程序称为“解析器”。
named配置文件的格式在BIND4和BIND 8之间发生了彻底的变化,新格式类似于gated.conf的格式。配置文件名也变了:在BIND4中是/etc/named.boot,而在BIND 8和9中/etc/named.conf,缓存文件和数据文件的格式保持不变。
##############################################################################################################################################################
%%%%%%%%%%%%%%%%%建立正反向解析目录%%%%%%%%%%%%%%
mkdir /etc/namedb/rev
mkdir /etc/namedb/hosts
%%%%%%%%%%%%%%%改变正反向解析目录属性%%%%%%%%%%%%%%
chown bind:bind /etc/namedb/rev
chown bind:bind /etc/namedb/hosts
chmod –R 755 /var/named/etc/namedb/rev
chmod –R 755 /var/named/etc/namedb/hosts
%%%%%%%%%%%%%生成正反向解析文件的例子文件%%%%%%%%%%%%
cd /etc/namedb
sh make-localhost
%%%%%%%%%%%%%%%%生成这正反向解析文件%%%%%%%%%%%%%%
cp /etc/namedb/master/localhost.rev /etc/namedb/rev/61.181.32.rev
cp /etc/namedb/master/localhost.rev /etc/namedb/hosts/tjhaina.net.hosts
%%%%%%%%%%%%%生成DNS服务器的key文件%%%%%%%%%%%%%%%
/usr/sbin/rndc-confgen > /etc/namedb/rndc.conf
%%%%%%%%%%%%%将key文件导入named.conf文件%%%%%%%%%%%%%
cd /etc/namedb
tail -n10 rndc.conf | head -n9 | sed -e s/#/ //g >> named.conf
(这个命令我也不知道为什么这么写!希望大家一起讨论)
%%%%%%%%%%%%%%%%设置DNS服务器的主域%%%%%%%%%%%%%%%
ee /etc/namedb/named.conf
zone "32.181.61.IN-ADDR.ARPA" {
type master;
file "/var/named/etc/namedb/rev/61.181.32.rev";
};
zone "tjhaina.net" {
type master;
file "/var/named/etc/namedb/hosts/tjhaina.net.hosts";
};
%%%%%%%%%%%%删除或注释掉DNS服务器的监听地址%%%%%%
ee /etc/namedb/named.conf
删除
20 listen-on { 127.0.0.1; };
注释掉
// listen-on { 127.0.0.1; };
rndc reload
(由于bind9在默认的情况下只是给自己,所以要去除监听地址listen-on { 127.0.0.1; };)
%%%%%%%%%%%%%设置DNS服务器反向解析文件%%%%%%%
ee /etc/namedb/rev/61.181.32.rev
$TTL 3600
@ IN SOA ns1.tjhaina.net. root.ns1.tjhaina.net. (
20050430 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ) ; Minimum
IN NS ns1.tjhaina.net.
205 IN PTR ns1.tjhaina.net.
205 IN PTR www.tjhaina.net.
205是你的IP地址
(增加反向解析PTR记录 注意:不建议全部的域名及二级域名增加PTR记录)
%%%%%%%%%%%%%设置DNS服务器的正向解析文件%%%%%%%
ee /etc/namedb/hosts/tjhaina.net.hosts
$TTL 3600
@ IN SOA ns1.tjhaina.net. root.ns1.tjhaina.net. (
20050621 ; Serial
3600 ; Refresh
900 ; Retry
3600000 ; Expire
3600 ) ; Minimum
IN NS ns1.tjhaina.net.
ns1 IN A 192.168.0.205
www IN A 192.168.0.205
mail IN A 192.168.0.205
tjhaina.net. IN MX 10 mail.tjhaina.net.
(注意:MX记录的添加要先做一个mail的A记录再做MX记录。MX记录添加的原则是用你的域名指向你的mail的二级域名。不过还有其他的添加方法大家自己可以找一下相关资料)
%%%%%%%%%%%%%设置本机DNS服务器地址%%%% %%%%%%%%%%%%
ee /etc/resolv.conf
添加
nameserver 127.0.0.1
nameserver 202.99.104.68
nameserver 202.99.96.68
nameserver 61.139.9.10
nameserver 202.102.128.68
nameserver 202.103.0.117
nameserver 202.103.44.5
%%%%%%%%%%%%%启动DNS服务器%%%%%%%%%%%%%%%%%%%%%
/usr/sbin/named -gc /etc/namedb/named.conf &
(& 表示后台运行)
/usr/sbin/rndc status
(查看DNS的启动情况)
(所以选这么多DNS是考虑到了冗余设计防止万一出错)
%%%%%%%%%%%%使DNS服务器和系统一起启动%%%%%%%%
ee /etc/rc.conf
添加
named_enable="YES"
rndc reload
_________________
FreeBSD全能服务器安装手册之域名服务器篇之DNS(数据库)篇
#################################下载并解压缩安装包################################
cd /usr/ports/dns/bind9
//下载bind9.3.1
make fetch
cd /usr/ports/distfiles/
//解压缩bind9.3.*
tar zxvf bind-9.3.*.tar.gz
chown -R root:wheel bind-9.3.*
###############################生成mysqldb.c文件##################################
cd /usr/ports/distfiles/bind-9.3.*/bin/named/
//生成mysqldb.c 注意:必须采用touch命令生成文件,因为有些时候用其他命令生成的文件是不能被程序识别的。
touch mysqldb.c
//编辑mysqldb.c
/* 增加以下内容(此为mysqldb.c的原版文档亦可从以下连接直*http://jaist.dl.sourceforge.net/sourceforge/mysql-bind/mysql-bind-0-1.tgz)*/
#include <config.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <mysql.h>
#include <isc/mem.h>
#include <isc/print.h>
#include <isc/result.h>
#include <isc/util.h>
#include <dns/sdb.h>
#include <dns/result.h>
#include <named/globals.h>
#include "mysqldb.h"
static dns_sdbimplementation_t *mysqldb = NULL;
struct dbinfo {
MYSQL *mysql;
char *database;
char *table;
char *host;
char *user;
char *passwd;
};
static void
mysqldb_destroy(const char *zone, void *driverdata, void **dbdata);
/*
* Canonicalize a string before writing it to the database.
* "dest" must be an array of at least size 2*strlen(source) + 1.
*/
static void
quotestring(const char *source, char *dest) {
while (*source != 0) {
if (*source == '/'')
*dest++ = '/'';
*dest++ = *source++;
}
*dest++ = 0;
}
/*
* Connect to the database.
*/
static isc_result_t
db_connect(struct dbinfo *dbi) {
dbi->mysql = mysql_init(0);
if (!mysql_real_connect(dbi->mysql, dbi->host, dbi->user, dbi->passwd, dbi->database, 0, NULL, 0))
return (ISC_R_FAILURE);
return (ISC_R_SUCCESS);
}
/*
* Check to see if the connection is still valid. If not, attempt to
* reconnect.
*/
static isc_result_t
maybe_reconnect(struct dbinfo *dbi) {
if (dbi->mysql != NULL)
return (ISC_R_SUCCESS);
return (db_connect(dbi));
}
/*
* This database operates on absolute names.
*
* Queries are converted into SQL queries and issued synchronously. Errors
* are handled really badly.
*/
static isc_result_t
mysqldb_lookup(const char *zone, const char *name, void *dbdata,
dns_sdblookup_t *lookup)
{
isc_result_t result;
struct dbinfo *dbi = dbdata;
MYSQL_RES *res;
MYSQL_ROW row;
char str[1500]="";
char *canonname;
UNUSED(zone);
canonname = isc_mem_get(ns_g_mctx, strlen(name) * 2 + 1);
if (canonname == NULL)
return (ISC_R_NOMEMORY);
quotestring(name, canonname);
snprintf(str, sizeof(str),
"SELECT TTL,RDTYPE,RDATA FROM %s WHERE lower(NAME) = lower('%s')", dbi->table, canonname);
isc_mem_put(ns_g_mctx, canonname, strlen(name) * 2 + 1);
result = maybe_reconnect(dbi);
if (result != ISC_R_SUCCESS)
return (result);
if (mysql_query(dbi->mysql, str)) {
return (ISC_R_FAILURE);
}
if (!(res = mysql_store_result(dbi->mysql))) {
return (ISC_R_NOTFOUND);
}
while ((row = mysql_fetch_row(res))) {
char *ttlstr = row[0];
char *type = row[1];
char *data = row[2];
dns_ttl_t ttl;
char *endp;
ttl = (ttlstr) ? strtol(ttlstr, &endp, 10) : 86400;
if (*endp != '/0') {
mysql_free_result(res);
return (DNS_R_BADTTL);
}
result = dns_sdb_putrr(lookup, type, ttl, data);
if (result != ISC_R_SUCCESS) {
mysql_free_result(res);
return (ISC_R_FAILURE);
}
}
mysql_free_result(res);
return (ISC_R_SUCCESS);
}
/*
* Issue an SQL query to return all nodes in the database and fill the
* allnodes structure.
*/
static isc_result_t
mysqldb_allnodes(const char *zone, void *dbdata, dns_sdballnodes_t *allnodes) {
struct dbinfo *dbi = dbdata;
MYSQL_RES *res;
MYSQL_ROW row;
isc_result_t result;
char str[1500]="";
UNUSED(zone);
snprintf(str, sizeof(str),
"SELECT TTL,NAME,RDTYPE,RDATA FROM %s ORDER BY NAME",
dbi->table);
result = maybe_reconnect(dbi);
if (result != ISC_R_SUCCESS)
return (result);
mysql_select_db(dbi->mysql,dbi->database);
if (mysql_query(dbi->mysql, str)) {
return (ISC_R_FAILURE);
}
if (!(res = mysql_store_result(dbi->mysql))) {
return (ISC_R_NOTFOUND);
}
while ((row = mysql_fetch_row(res))) {
char *ttlstr = row[0];
char *name = row[1];
char *type = row[2];
char *data = row[3];
dns_ttl_t ttl;
char *endp;
ttl = (ttlstr) ? strtol(ttlstr, &endp, 10) : 86400;
if (*endp != '/0') {
mysql_free_result(res);
return (DNS_R_BADTTL);
}
result = dns_sdb_putnamedrr(allnodes, name, type, ttl, data);
if (result != ISC_R_SUCCESS) {
mysql_free_result(res);
return (ISC_R_FAILURE);
}
}
mysql_free_result(res);
return (ISC_R_SUCCESS);
}
/*
* Create a connection to the database and save any necessary information
* in dbdata.
*
* argv[0] is the name of the database
* argv[1] is the name of the table
* argv[2] (if present) is the name of the host to connect to
* argv[3] (if present) is the name of the user to connect as
* argv[4] (if present) is the name of the password to connect with
*/
static isc_result_t
mysqldb_create(const char *zone, int argc, char **argv,
void *driverdata, void **dbdata)
{
struct dbinfo *dbi;
isc_result_t result;
UNUSED(zone);
UNUSED(driverdata);
if (argc < 2)
return (ISC_R_FAILURE);
dbi = isc_mem_get(ns_g_mctx, sizeof(struct dbinfo));
if (dbi == NULL)
return (ISC_R_NOMEMORY);
dbi->mysql = NULL;
dbi->database = NULL;
dbi->table = NULL;
dbi->host = NULL;
dbi->user = NULL;
dbi->passwd = NULL;
#define STRDUP_OR_FAIL(target, source)/
do {/
target = isc_mem_strdup(ns_g_mctx, source);/
if (target == NULL) {/
result = ISC_R_NOMEMORY;/
goto cleanup;/
}/
} while (0);
STRDUP_OR_FAIL(dbi->database, argv[0]);
STRDUP_OR_FAIL(dbi->table, argv[1]);
if (argc > 2)
STRDUP_OR_FAIL(dbi->host, argv[2]);
if (argc > 3)
STRDUP_OR_FAIL(dbi->user, argv[3]);
if (argc > 4)
STRDUP_OR_FAIL(dbi->passwd, argv[4]);
result = db_connect(dbi);
if (result != ISC_R_SUCCESS)
goto cleanup;
*dbdata = dbi;
return (ISC_R_SUCCESS);
cleanup:
mysqldb_destroy(zone, driverdata, (void **)&dbi);
return (result);
}
/*
* Close the connection to the database.
*/
static void
mysqldb_destroy(const char *zone, void *driverdata, void **dbdata) {
struct dbinfo *dbi = *dbdata;
UNUSED(zone);
UNUSED(driverdata);
if (dbi->mysql != NULL)
mysql_close(dbi->mysql);
if (dbi->database != NULL)
isc_mem_free(ns_g_mctx, dbi->database);
if (dbi->table != NULL)
isc_mem_free(ns_g_mctx, dbi->table);
if (dbi->host != NULL)
isc_mem_free(ns_g_mctx, dbi->host);
if (dbi->user != NULL)
isc_mem_free(ns_g_mctx, dbi->user);
if (dbi->passwd != NULL)
isc_mem_free(ns_g_mctx, dbi->passwd);
if (dbi->database != NULL)
isc_mem_free(ns_g_mctx, dbi->database);
isc_mem_put(ns_g_mctx, dbi, sizeof(struct dbinfo));
}
/*
* Since the SQL database corresponds to a zone, the authority data should
* be returned by the lookup() function. Therefore the authority() function
* is NULL.
*/
static dns_sdbmethods_t mysqldb_methods = {
mysqldb_lookup,
NULL, /* authority */
mysqldb_allnodes,
mysqldb_create,
mysqldb_destroy
};
/*
* Wrapper around dns_sdb_register().
*/
isc_result_t
mysqldb_init(void) {
unsigned int flags;
flags = 0;
return (dns_sdb_register("mysql", &mysqldb_methods, NULL, flags,
ns_g_mctx, &mysqldb));
}
/*
* Wrapper around dns_sdb_unregister().
*/
void
mysqldb_clear(void) {
if (mysqldb != NULL)
dns_sdb_unregister(&mysqldb);
}
####################################################################################
#############################生成mysqldb.h文件#####################################
cd /usr/ports/distfiles/bind-9.3.*/bin/named/include/
touch mysqldb.h
ee mysqldb.h
#include <isc/types.h>
isc_result_t mysqldb_init(void);
void mysqldb_clear(void);
###############################改变文件的运行权限###################################
chmod 755 /usr/ports/distfiles/bind-9.3.*/bin/named/mysqldb.c
chmod 755 /usr/ports/distfiles/bind-9.3.*/bin/named/include/mysqldb.h
#################################修改Makefile.in####################################
ee /usr/ports/distfiles/bind-9.3.*/bin/named/Makefile.in
从26行开始
# Add database drivers here.
#
DBDRIVER_OBJS =
DBDRIVER_SRCS =
DBDRIVER_INCLUDES =
DBDRIVER_LIBS =
改成
DBDRIVER_OBJS = mysqldb.@O@
DBDRIVER_SRCS = mysqldb.c
DBDRIVER_INCLUDES = -I'/usr/local/include/mysql'
DBDRIVER_LIBS = -L'/usr/local/lib/mysql' -lmysqlclient
#################################修改main.c ####################################
ee /usr/ports/distfiles/bind-9.3.*/bin/named/main.c
添加
#include <mysqldb.h>
################################注册mysqldb_init();################################
寻找: register
* Add calls to register sdb drivers here.
*/
/* xxdb_init(); */
mysqldb_init();
ns_server_create(ns_g_mctx, &ns_g_server);
寻找: unregister
################################注册mysqldb_clear();################################
/*
* Add calls to unregister sdb drivers here.
*/
/* xxdb_clear(); */
mysqldb_clear();
isc_log_write(ns_g_lctx, NS_LOGCATEGORY_GENERAL, NS_LOGMODULE_MAIN,
ISC_LOG_NOTICE, "exiting");
ns_log_shutdown();
#################################安装bind9.3.2######################################
cd /usr/ports/distfiles/bind-9.3.*
./configure
make
make install
make clean
#################################配置bind9.3.2######################################
/usr/local/sbin/rndc-confgen > /etc/namedb/rndc.conf
cd /etc/namedb
tail -n10 rndc.conf | head -n9 | sed -e s/#/ //g >> named.conf
###############################建立bind数据库######################################
mysql -uroot -ppassword
CREATE DATABASE bind9;
GRANT select,insert,update,delete,create,drop ON bind9.* TO bind9user@localhost IDENTIFIED BY 'password';
use bind9;
CREATE TABLE mydomain (
name varchar(255) default NULL,
ttl int(11) default NULL,
rdtype varchar(255) default NULL,
rdata varchar(255) default NULL
) TYPE=MyISAM;
###############################插入事例数据文件#####################################
INSERT INTO mydomain VALUES ('mydomain.com', 259200, 'SOA', 'mydomain.com. www.mydomain.com. 200309181 28800 7200 86400 28800');
INSERT INTO mydomain VALUES ('mydomain.com', 259200, 'NS', 'ns0.mydomain.com.');
INSERT INTO mydomain VALUES ('mydomain.com', 259200, 'NS', 'ns1.mydomain.com.');
INSERT INTO mydomain VALUES ('mydomain.com', 259200, 'MX', '10 mail.mydomain.com.');
INSERT INTO mydomain VALUES ('w0.mydomain.com', 259200, 'A', '192.168.1.1');
INSERT INTO mydomain VALUES ('w1.mydomain.com', 259200, 'A', '192.168.1.2');
INSERT INTO mydomain VALUES ('mydomain.com', 259200, 'Cname', 'w0.mydomain.com.');
INSERT INTO mydomain VALUES ('mail.mydomain.com', 259200, 'Cname', 'w0.mydomain.com.');
INSERT INTO mydomain VALUES ('ns0.mydomain.com', 259200, 'Cname', 'w0.mydomain.com.');
INSERT INTO mydomain VALUES ('ns1.mydomain.com', 259200, 'Cname', 'w1.mydomain.com.');
INSERT INTO mydomain VALUES ('www.mydomain.com', 259200, 'Cname', 'w0.mydomain.com.');
INSERT INTO mydomain VALUES ('ftp.mydomain.com', 259200, 'Cname', 'w0.mydomain.com.');
#############################在named.conf中加入主域################################
ee /var/named/etc/namedb/named.conf
zone "mydomain.com" {
type master;
notify no;
database "mysql bind9 mydomain localhost bind9user password";
};
%%%%%%%%%%%%删除或注释掉DNS服务器的监听地址%%%%%%
ee /var/named/etc/namedb/named.conf
删除
20 listen-on { 127.0.0.1; };
注释掉
// listen-on { 127.0.0.1; };
rndc reload
(由于bind9在默认的情况下只是给自己,所以要去除监听地址listen-on { 127.0.0.1; };)
%%%%%%%%%%%%%设置本机DNS服务器地址%%%% %%%%%%%%%%%%
ee /etc/resolv.conf
添加
nameserver 127.0.0.1
nameserver 211.98.2.4
nameserver 202.99.104.68
nameserver 202.99.96.68
nameserver 202.102.128.68
nameserver 202.103.0.117
nameserver 202.103.44.5
(所以选这么多DNS是考虑到了冗余设计防止万一出错)
###################################停止系统默认的bind###############################
mv /usr/sbin/named /usr/sbin/named.dist
mv /usr/sbin/rndc /usr/sbin/rndc.dist
mv /usr/sbin/dnssec-keygen /usr/sbin/dnssec-keygen.dist
mv /usr/sbin/dnssec-signzone /usr/sbin/dnssec-signzone.dist
mv /usr/sbin/named-checkconf /usr/sbin/named-checkconf.dist
mv /usr/sbin/named-checkzone /usr/sbin/named-checkzone.dist
mv /usr/sbin/rndc-confgen /usr/sbin/named-checkzone.dist
##################################启用新安装的bind###################################
ln -s /usr/local/sbin/named /usr/sbin
ln -s /usr/local/sbin/rndc /usr/sbin
ln -s /usr/local/sbin/dnssec-keygen /usr/sbin
ln -s /usr/local/sbin/dnssec-signzone /usr/sbin
ln -s /usr/local/sbin/named-checkconf /usr/sbin
ln -s /usr/local/sbin/named-checkzone /usr/sbin
ln -s /usr/local/sbin/rndc-confgen /usr/sbin
ln -s /var/named/etc/namedb/rndc.conf /etc/rndc.conf
####################################运行bind########################################
/usr/local/sbin/named -gc /etc/namedb/named.conf &
####################################测试bind运行情况################################
www# nslookup
> w1.mydomain.com
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: w1.mydomain.com
Address: 192.168.1.2
>
%%%%%%%%%%%%使DNS服务器和系统一起启动%%%%%%%%
touch /usr/local/etc/rc.d/named.sh
ee /usr/local/etc/rc.d/named.sh
增加
/usr/local/sbin/named -gc /etc/namedb/named.conf &
chmod 755 named.sh
############################设置系统服务启动顺序#####################################
cd /usr/local/etc/rc.d/
mv webmin.sh 001.webmin.sh
mv mysql.-server.sh 002.mysql.-server.sh
mv apache.sh 003.apache.sh
mv named.sh 004.named.sh
%%%%%%%%%%%%%%%%%%%%%删除无用启动脚本%%%%%%%%%%%%%%%%%%%%
rm webmin.sh
rm mysql.-server.sh
rm apache.sh
rm named.sh
电子邮件服务器选购
目前, 市场上有多种 Internet 邮件服务器产品供选择, 这些邮件服务器产品价格各异, 所提供的功能也有不少差别。 对于网络管理员来说, 如何根据自身业务的需求, 选择功能完备、价格合理的邮件服务器产品, 是一个多因素的综合决策问题。 选择邮件服务器时, 虽然需要考虑的因素有许多, 但主要应该着重考察产品的系统支持能力、服务协议支持能力、多邮件服务器支持能力、用户管理能力、邮箱 管理能力、客户端软件支持能力、通信能力、安全防护能力、系统管理能力、版本、 价格、升级与售后服务等以下十二个因素。
一、 系统支持能力
无论选择何种计算机产品, 系统的支持能力都是首先必须考虑的问题, 硬件产品如此, 软件产品同样如此。对于邮件服务器来说, 在系统支持能力方面应该考察以下 三个问题:
1) 服务器运行平台支持能力
对于一个软件服务器产品来说, 其运行平台的支持能力无非是单平台和跨平台两种。 如果一个网络管理员管理的网络支持多种操作系统并存运行, 且具有多个各自独立管理的邮件服务器, 则在必须考虑各个邮件服务器 协同工作和统一管理的方便时, 建议优先考虑跨平台产品。 否则, 可以仅考虑满足自己所使用平台的产品。
2) 业务处理能力
一些邮件服务器产品常常分为企业版本和标准版本,两者的产品价格有很大差别。前者主要供具有大量用户和有众多业务需要处理的集团用户使用,后者供中小规模的 集团用户使用。
3) 系统处理能力
邮件服务器的系统处理能力, 是指它在利用系统硬件平台和软件平台进行信息处理的能力。 针对支持多 CPU 的服务器平台, 目前一些邮件服务器可以对系统的进程 数量、每个进程所容许的客户连接数量、每个进程所允许的线程数量进行设置。
4) 负载均衡支持能力
为了适应用户业务量扩充的需要, 现在一些邮件服务器产品还具备一定程度的同平台下多服务器负载均衡支持能力。在这种工作模式下, 网络管理员可以根据业务需 求的增长, 随时添加邮件服务器, 经过适当的系统配置以后, 可以让多台服务器共同分担邮件业务处理工作。
二、 服务协议支持能力
邮件服务器是一种 Internet 网络服务软件产品, 而支撑着 Internet 众多网络服务的是各种服务协议。在选择邮件服务器产品的时候, 考察它在支持服务协议方面的能力, 是衡量产品性能的重要指标。
与邮件服务器产品有关的网络服务协议主要有以下6个:
1) SMTP 协议
SMTP 协议是简单的邮件传输协议(Simple Mail Transfer Protocol) 的缩写。这是最早出现的, 也是被普遍使用的最基本 Internet 邮件服务协议。
2) POP3 协议
POP 协议是邮局协议 (Post Office Protocol) 的缩写, 是一种允许用户从邮件服务器收发邮件的协议。与 SMTP 协议相结合, POP3 是目前最常用的电子邮件服务协议。
3) IMAP4 协议
IMAP 协议是 Internet 消息访问协议 (Internet Message Access Protocol) 的缩写, 现在常用的是版本 4, 它为用户提供了有选择的从邮件服务器接收邮件的功能、基于服务器的信息处理功能和共享信箱功能。 IMAP4 在用户登录到邮件服务器以后, 允许采取多段处理方式查询邮件。首先, 用户可以仅读取电子邮箱中的邮件信头(Message header); 然后, 用户可以选 择下载指定的邮件或者全部邮件。 IMAP4 在邮件服务器一端为用户保留邮件。
4) HTTP 协议和 HTML 语言
HTTP 协议是超级文本传输协议 (HyperText Transfer Protocol) 的缩写, 支持这个协议的邮件服务器, 可以提供通过 Web 的电子邮件收发服务。
5) MIME 协议
MIME 是多用途 Internet 邮件扩展 (Multipurpose Internet Mail Extensions) 协议的缩写。作为对 SMTP 协议的扩充, MIME 规定了通过 SMTP 协议传输非文本电子邮件附件的标准。目前, MIME 的用途早已经超越了收发电子邮件的范围, 成为在 Internet 上传输多媒体信息的基本协议之一。
6) LDAP 协议
LDAP 协议是轻量目录访问协议 (Lightweight Directory Access Protocol) 的缩写。通过将相关的内容存放在统一的目录之下, 目录服务为用户提供了基于客户/服务器工作方式的信息查询手段。
三、 多邮件服务器支持能力
支持多邮件服务器有两个方面的含义, 在物理上支持多个邮件服务器协同工作 和在逻辑上支持多个虚拟邮件服务器, 后者也称为多域邮件服务。
在物理上支持多个邮件服务器协同工作, 意味着该产品可以在复杂网络环境中, 构建多层次邮件服务。对于一个大型机构, 除了有企业级邮件服务器外, 还允许各个部门自行建立和管理部门级邮件服务器。企业级邮件服务器对外直接与 Internet 连接, 对内连接各个部门邮件服务器, 是纵向邮件服务的总汇节点。
所谓多域邮件服务, 就是通过一台物理服务器, 为多个独立注册 Internet 域名的机构或部门提供电子邮件服务。在外界看来, 这些机构或部门好象拥有自己专用的邮件服务器。所以, 它又称为虚拟邮件服务器。
四、 其他服务支持能力
1) 邮件寻呼服务
提供这种服务的邮件服务器在收到用户的电子邮件时, 可以根据发信人的要求, 将电子邮箱收到新邮件的情况或简单内容发送到收信人的寻呼机上或是手机上。
2) 邮件到传真机服务
有的邮件服务器还提供选件, 可以根据发信人的要求, 将电子邮箱收到的邮件发送到收信人指定的传真机上。
3) 邮件用户组服务
邮件用户组 (Mailing list) 服务又称为邮件列表, 是一种通过电子邮件进行专题信息交流的网络服务。
4) 网络新闻服务
网络新闻 (Network News) 是 Internet 上有共同爱好的用户, 为了相互交换意见组成的一种无形的用户交流网络。
5) 多语言服务
有的邮件服务器还提供多语言服务支持能力, 允许管理员和用户输入多种语言的定制文字信息, 并根据用户的国别特征自动选择相应的语言提供服务。
五、 用户管理能力
对于提供网络服务的系统管理员而言, 用户管理是最基本的管理。用户的管理首先是用户帐户的管理。 通常一个用户帐户包括一系列属性, 如帐户名称、帐户登录 密码、用户名称、帐户建立日期、帐户隶属的用户组、帐户电子邮箱的大小等。
考察一个邮件服务器的用户帐户管理功能, 首先应该注意其用户帐户类型的支持能力。目前邮件服务器支持的常见用户帐户类型包括普通帐户、别名帐户、转信帐户、自动信件回复帐户、匿名帐户和可编程机器人帐户等。
普通帐户是用户收发 电子邮件基本条件, 其帐户名称与邮件服务器的 Internet 主机域名, 构成了该用户的电子邮箱地址。
由于业务需要, 用户常常需要使用别名帐户 (Aliase Account)。 一个别名帐户通常 和一个或多个普通帐户相关联。 别名帐户收到电子邮件后, 会立即将其转发到与之相关 联的普通帐户。
当一个帐户被设置成为转信帐户 (Forwarding Account) 的时候, 它会将所接收的电子邮件自动转发到指定电子邮箱中。
被设置为自动信件回复帐户 (Autoresponder) 的电子邮箱,可以在收到信件后 按照事先设定的内容进行回复。
当需要通过公共电子邮箱提供信息查询服务的时候, 就需要用到匿名帐户 (Anonymous)。匿名帐户没有 密码。 任何人都可以阅读放入该邮箱的信件。
可编程机器人帐户 (Robot Account) 是目前一些邮件服务器提供的新功能。这里 的 "机器人" 是指可以被所接收电子邮件触发的计算机程序。当可编程机器人帐户的电子邮箱接收到信件的时候, 该程序立即启动, 按照程序设定的功能进行邮件自动处理。
考察邮件服务器的用户帐户管理功能, 还应该注意所提供的用户帐户建立方法。
手工输入建立用户帐户是最基本的方法。为了与所使用的操作系统平台更好的相结合, 现在许多邮件服务器还提供了直接沿用或引入操作系统用户的方法。
用户帐户信息如何保存, 维护、备份是否方便是邮件服务器用户管理能力的另一个侧面。 邮件服务器的用户帐户信息保存方式主要有两种: 建立专用用户数据库和使用操作系统用户数据库。
一个功能完备的邮件服务器产品, 应该为管理员提供用户帐户管理的多种手段。现在许多邮件服务器产品除了允许管理员 在本机登录进行用户信息维护外, 还允许管理员使用 Web 浏览器通过网络远程登录进行用户管理操作。允许用户自行维护个人帐户信息, 也是邮件服务器不可缺少的功能。
六、 邮箱管理能力
考察邮件服务器的邮箱管理能力时, 应该特别注意产品在为用户建立邮箱时 的存储方式。 目前主要有三种类型: 第一种是集中存放。 第二种是为每个用户邮箱建立一个计算机文件子目录。 第三种是为每个用户邮箱建立一个计算机文件。
在考察邮箱存储方式时, 还应该注意是否支持跨越物理磁盘存放。 能够并行访问多个物理磁盘的系统, 可以提供更高的用户服务响应速度。
1) 单一邮箱和多邮箱
由于所采用的邮件服务协议不同, 邮件服务器为每个用户提供的邮箱或者邮箱文件夹是不一样的。
2) 邮箱容量控制
为每个用户提供多大的邮件存储空间, 不同的邮件服务器提供了不同的设置手段。制约邮箱容量的最终硬件条件是可以使用的磁盘空间。
3) 收信邮箱管理
如何管理用户收信邮箱中的信件, 不同的邮件服务器提供的功能也不相同。对于政府部门或商业机构来说, 通常将电子邮件视为机构的财产, 不允许雇员使用机构的电子邮件系统收发与业务无关的私人信件。因此, 机构希望邮件服务器的管理员保留对用户邮件的监察权。这并不牵涉侵犯个人隐私权的问题。但是对于直接向个人提供公众电子邮件服务的机构来说, 就应该注意这个问题。
4) 发信邮箱管理
发信邮箱也称为发信队列。对于等待发送的信件, 邮件服务器应该提供的可设置功能包括投送间隔、重发间隔和次数、保留时间、无法投递信件处理方法等。是否具备对用户所发送邮件监察的功能,也是选择邮件服务器需要考虑的因素之一。 有的邮件服务器还可选择是否将所发送邮件的副本,送入管理员指定的位置存放备查。
七、 客户端软件支持能力
邮件服务器所支持的客户端邮件收发软件, 主要与服务器所使用的服务协议有关。 通常支持的有 SMTP/POP3 客户和 IMAP 客户, 有的还支持 Web 浏览器客户。
八、 通信能力
选择邮件服务器的时候,在通信方面进行考察主要涉及三个方面:
1) 连接方式支持能力
为了收发电子邮件, 邮件服务器通常工作在通过专线与 Internet 始终保持连接的 模式下。 如果一个机构的局域网, 是通过电话拨号与 Internet 服务供应商 ISP 的服务线路连接, 机构在局域网建立的邮件服务器作为邮件转发的中继, 那么就需要邮件服务器具备电话拨号通信支持能力。
2) 接入控制能力
当邮件服务器为用户提供连接服务的时候, 系统资源的占用情况与通信连接 数量成正比。 一些邮件服务器提供了设置界面, 可以通过参数对接入连接进行控制。
3) 通信带宽管理能力
当邮件服务器与外界连接传送信息的时候, 可能会占用大量的通信信道带宽。为了防止邮件服务器对带宽的过量占用, 一些邮件服务器可以对所占用的最大带宽进行设置。
九、 安全防护能力
邮件服务器的安全防护能力, 可以归纳为以下十三个方面的问题:
1) 用户身份认证能力
2) 合法客户网址设定能力
3) 抵制垃圾邮件的能力
4) 邮件内容过滤能力
5) 抵制商业邮件转发能力
6) 支持穿越防火墙的邮件服务能力
7) 支持代理服务器的能力
8) 支持堡垒主机的能力
9) 支持备份邮件服务器的能力
10) 检测和杀灭邮件病毒的能力
11) 抵制"拒绝服务"攻击的能力
12) 信息传输加密能力
13) 灾难恢复能力
十、 系统管理能力
对于邮件服务器管理员来说, 系统管理的前提首先是对系统工作情况的全面掌握, 然后是对系统运行性能的动态调整。 因此,产品至少应该提供以下三个方面的能力。
1) 审计能力
所谓审计 (Audit), 就是可以按照管理员选择的内容, 对邮件服务器提供的各种服 务连续进行工作情况记录, 针形成系统运行审计历史记录文件, 供管理员分析系统工作情况, 查找系 统故障原因使用。
2) 日志能力
日志 (Log) 主要是针对用户使用邮件服务器的情况连续进行记录。 邮件服务器所提供的日志功能, 应该允 许管理员可以选择日志监察对象。
3) 实时监控与性能调整能力
使用实时监控功能, 管理员可以对当前邮件服务器正在运行的各种服务进行实时 工作情况观察, 动态调整系统控制参数。
十一、版本、升级与售后服务能力
邮件服务器是一个通过网络为多用户服务的软件系统, 开发厂商不但根据所满足业务量的不同, 推出类型不同的版本, 还随着网络技术的进步不断发布产品的升级版本。
1) 版本
邮件服务器的不同类型版本, 主要针对不同业务量的应用。 如果按照所支持的用户 数量分类, 可以分为限用户数版本和不限用户数版本, 前者往往又分为几个档次。 如果 按照系统运行性能区分, 常分为标准版本 (Standard Edition) 和企业版本( Enterprise Edition), 前者适用于中小规模机构, 后者适用于大型机构或 Internet 服务供应商 ISP, 而且还可能具备支持多 CPU 处理的能力。 如果按照所运行的系统平台分类, 又常常分为 UNIX 系统版本和 Windows NT 系统版本。 另外, 各家厂商为了推销自己的产品, 还常常有供免费试用的版本。 这些版本往往在内部设置了试用期。超过了试用期就停止运行。
2) 升级支持
在选择邮件服务器的时候, 厂家对产品的升级支持也是一个非常重要的因素。同一产 品的不同类型版本, 在版本号、功能和升级速度方面常常不同。用户数量多的主流产品版本往往能够得到及时的升级。选择这样的产品, 才能够不断享受到开发厂家提供的新功能。
3) 售后服务支持
由于邮件服务器是一个软件技术产品, 厂家的售后服务支持能力非常重要。选择产品的时候, 要注意它是否有完备的用户手册和技术手册, 厂家能够提供什么方式和种类的售后技术服务支持。当产品升级的时候, 如何得到升级版本。
十二、 价格
价格在任何时候都是选择产品不可忽视的因素。 这涉及到成本核算。 一些邮件服务器产品价位较高, 有时并不仅仅是因为它的功能。那些同时支持在多种系统平台运行的产品, 往往价格高于在单一系统平台运行的产品。为了节省不必要的支出, 应该根据业务的实际需求选择产品,对产品的标准价格、增加用户许可的代价和产品升级价格等因素综合考虑。
最近几年来,基于Web的免费Email系统非常流行,当前,几个著名的免费Email网站基本上已经成为大多数人的选择,建立单纯提供免费Email服务的站点不再像以前那样受到热烈欢迎,但是提供Web界面的Email服务已经成为了一个商业站点为其注册成员提供的基本服务之一。
一个Email系统可以分为服务器端和客户端,Web界面的Email系统则是将Email客户放在了Web服务器端,因此Email系统所需要实现的是一个Web界面的Email客户。然而,由于这个Email系统要求用户数量较大,因此对于Email服务器也有特定的要求。
操作系统和用户数据库
由于提供Web和Email服务要求稳定性和性能特别高,因此一般都使用Unix作为服务器的操作系统,例如hotmail使用FreeBSD和Solaris,国内163等站点也是BSD系列。然而,Unix的标准Email系统也不合适用做这种大容量服务。有的Unix系统,例如当前版本的Linux,其用户标识只有16位,因此用户数量最多只能有64K,即使Unix系统本身支持32位的用户标识,考虑到性能因素,单台服务器支持的用户数量也不要超过10万。
为了具有支持更多用户的可扩展性,一般采用多台服务器同时提供服务,虽然此时仍然可以使用标准Unix用户作为Email用户,但考虑到安全性、性能以及可管理性,一般采用非Unix系统用户来作为Email用户。而保存用户数据通常采用支持网络访问的数据库形式,一般常用的有LDAP、标准数据库、以及Email系统自己实现的用户数据库。其中,LDAP由于是提供目录服务的标准,因此应该为最佳的选择,其常用的开放源代码实现为OpenLDAP;而标准数据库由于实现方便、可扩展性强,其中在Internet上最常用的为MySQL;此外,也有使用其他方式的实现。
邮件的保存
由于用户数量较大,如何保存用户的邮件就是一个非常重要的问题。传统Unix使用一个单一目录来保存所有用户的邮件,在用户数量较多时就极大的降低了文件系统的性能。只有使用多级目录,每个目录下的文件数量有限,才能降低打开文件时的系统消耗,或者不再使用简单的文件来保存邮件,而采用某一种封装形式。完全采取数据库形式来保存邮件,由于用户邮件操作多为文件操作,且大小变化较大,因此会造成性能和存储空间上较大的浪费。
由于用户数量巨大,并且也要求能被多台服务器同时访问,必须采用存储空间较大的服务器或服务器集群来保存,通过光纤通道或者网络文件系统NFS来共享存储空间,使得每个用户的邮件存储路径对于每个服务器都是一致的。光纤通道是一种非常昂贵的解决方法,更为常用的是使用NFS,可以使用专用的NFS服务器,如NetApp,或者使用带有RAID能力的PC Unix服务器。
当使用NFS共享存储空间的时候,一个非常重要的问题必须注意。由于NFS缺乏文件锁定机制,因此使用传统的用户邮件存储格式mailbox时,因为所有的邮件都保存在同一个文件中,因此进行邮件操作就必须加锁,以保证没有访问冲突,这就使得它不适合NFS存储方式。为了解决这个问题,qmail提出了Maildir存储方式,每个邮件作为单独的一个文件保存在用户个人的邮件目录下,就避免了加锁。因此,常见的免费邮件服务器,一般都采用Maildir方式来保存用户的邮件。
如果不打算使用共享文件系统的方式来保存用户的邮件,而打算让每个服务器只访问其自己硬盘存储空间上的用户邮件,那么Email服务器和客户端都需要进行定制,使它们能通过用户名来找到用户属于的真正服务器,将访问任务交给这个服务器完成。这种方法的缺点除了所需要的改动较大之外,系统结构复杂之外,还由于服务器是按用户进行分割的,不利于分担负载。其优点也是由于它不通过网络访问其他服务器,因此可以采用任意的邮件存储格式,包括采用强大的cyrus系统来保存邮件和提供服务。
邮件服务器软件
标准的Email软件,例如sendmail,虽然也提供了一些包括aliases等方法,来支持非Unix系统用户,但是这些能力对于实现这种Email系统是不够的。为了支持这些Email用户,必须使用自己的Email服务器软件。一般由于现有的Email软件都相当成熟,而且也都是开放源代码的软件,因此一般都是改动原有的Email软件,如sendmail、qmail等,使其支持特定的Email用户。完全重写一个Email服务软件,从成熟性、稳定性来看并不可取。
不管从性能上,安全性上考虑,sendmail并不是理想的选择,而且由于qmail本身就支持Maildir,因此就成为了常用的Email软件的基础开发平台。然而需要注意的是,qmail使用GPL许可进行保护,因此基于qmail进行的任何改动,原则上必须公开源代码,这对开发商业系统有一定障碍。当然可以通过不改动qmail,而改动相关的系统库函数,或者采用外挂的方式来绕过这个问题。另一个可选的基础Email软件是postfix,其本身就具备与LDAP、MySQL的接口,几乎不需要改动就能作为邮件系统的一部分。
Web客户端
Web界面Email系统的另一个重要的部分就是Web客户端,这一部分的功能将如同个人计算机中的OutLook,负责给用户提供访问自己邮件的能力。由于Web访问本身是无连接的,因此必须保证用户的安全性。基本上,安全性可以通过登录后建立的会话标识、临时目录,并在程序中进行验证来保证。
Web客户端必须以统一的方式来访问服务器,可以通过直接文件访问的方式来获得用户的邮件,或者通过POP3、IMAP等标准协议来访问。对于使用网络文件系统来共享用户邮件的系统,通过直接文件访问的方法最为直接和便利,也不需要额外的消耗。而通过POP3、IMAP协议来访问服务器,其直接的好处就是Web客户端和Email服务器相分离,提高了系统安全性。
当前,已经有一些相当成熟的开放源代码的Web客户端软件,其中IMP是采用PHP来实现的,通过IMAP协议访问服务器的Web邮件客户端软件。而WING则是采用Perl来实现的另一个Web客户端软件。这些开放源代码软件都相当不错,然而,将这些软件与自己的系统相集成,还会需要进行一定改动。此外,还应该遵循其许可要求,将改动的代码对外公开。
实现负载均衡
由于需要提供给大量的用户进行访问,因此单台服务器不能满足这个需要,而必须要使用多服务器的方式。除了按照功能性进行分割之外,如Web服务器、Email服务器以及文件服务器相分离,还需要对一些资源紧张的服务使用多服务器进行负载均衡。虽然当前一些商业厂家也提出了一些服务器集群的方案,但常用的简单而有效的方法还是DNS循环解析,Web服务器重定位和NAT负载均衡等几种。
DNS循环解析是为同一个名字分配多个IP地址,它用在Yahoo等相当大的站点上,实际效果也相当不错。而Web服务器重定位则是由Web服务器随机产生位于不同服务器上的真实页面URL,使不同的浏览器载入不同服务器上的页面,使用它只能实现Web客户端的负载均衡。而NAT负载均衡则利用第四层交换机,使同样的请求转向不同的服务器,除了昂贵的交换机之外,也有一些软件能完成NAT功能,我曾对FreeBSD的natd进行了改动,使其能支持负载均衡,对于因为交换机价格问题而不得不降低性能要求的使用者来讲,也是一种选择。
实例分析
当前在国内最流行的Web界面Email系统为网易公司的系统,它是采用qmail作为基本服务器软件,再加以改动的系统。它采用NFS网络文件系统作为用户邮件存储空间,使用Maildir作为邮件存储格式,提供多级目录以支持大量用户。其Web客户端为他们自己实现的,通过直接访问用户邮件的方式为用户提供服务。不考虑其软件的小问题,这种实现方式是非常流行且成熟的方式,大部分免费邮件服务系统都是采用的这种模式。
另一种方式是尽量利用已有的开放源代码软件,一种可行的方案是使用Postfix、OpenLDAP、cyrus和IMP来实现大容量Email系统,其中,主邮件服务器使用Postfix查询LDAP服务器,决定用户的真实邮箱地址,然后转发到真实邮件主机上,该主机通过LDAP查询确认,将邮件放入cyrus服务器中,而IMP通过登录cyrus,使用IMAP访问用户邮件。当用户增多,一台cyrus服务器不够时,可以将新添加的用户放置到新增加的服务器上,只需要在LDAP服务器设置相应的属性就可以了。在这种方式下,由于用户是严格按服务器分割造成了管理等困难之外,这种结构本身较为复杂。然而,如果用户数量不是很多,那么就不需要使用多台cyrus服务器和LDAP服务器,复杂程度就大大降低,比较适合中小型站点使用。
附录
Email软件的选择
在Internet中最常使用的工具可能就是电子邮件了,因此,建立一个站点所必须的一步工作就是构建一个安全、可靠的电子邮件系统。由于电子邮件是一种非常传统的工具,因此有非常多的软件可以用来达到这个目的,这里面包括从古老的uucp邮件到非常庞大的商业群件系统,如Lotus Domino Server,但使用最广泛的还是一种自由软件──sendmail,它支撑了当前Internet邮件系统的主体。
Sendmail的不足
无论从使用的广泛程度,还是从代码的复杂程度来讲,sendmail都是一个非常优秀的软件。如果使用它来构建网站的电子邮件系统,基本上不必费心,因为几乎所有的Unix的缺省配置中都内置这个软件,只需要设置好操作系统,它就能立即运转起来。然而,Internet用户的要求更为苛刻,纷纷指出sendmail中包含的各个不足之处。
第一个重要的缺点是它的安全性较差,这是因为当其作者Eric Allman最初开始写作这个软件的时候,Internet的用户还很少,因而安全性并不没有得到大家的重视。由于邮件系统需要处理的是外部发送来的各种各样的信息,甚至包含一些恶意数据,然而sendmail在大多数系统中都是以root身份运行,一旦出现问题,就会对系统安全造成严重影响。在这种情况下,要防止出现安全问题,仅仅依赖程序本身是不可取的,应该从系统结构出发,使程序拥有的特殊权限限制到最小。
此外,也是由于其早期的Internet用户数量及邮件数量都相当小,Sendmail的系统结构并不适合较大的负载,对于高负载的邮件系统,需要对Sendmail进行复杂的调整。例如,通常情况下sendmail只启动一个进程顺序向外发送邮件,如果邮件较多时就要花费相当长的时间。
使用Sendmail还会遇到的另一个问题是它的设置相当复杂,对于使用缺省设置来收发电子邮件,问题并不存在。当管理员打算进行一些特殊设置,以便利用Sendmail提供的复杂邮件处理能力时,就不得不面对复杂的宏和正则表达式。虽然现在Sendmail使用了宏预处理程序m4使设置更易于理解一些,但是掌握Sendmail的设置仍然是对系统管理员的一大挑战。
使用Qmail替代Sendmail
为了解决sendmail的安全问题,整个系统结构需要重新设计。基本的原则是将系统划分为不同的模块,有负责接收外部邮件的,有管理缓冲目录中待发送的邮件队列的,有将邮件发送到远程服务器或本地用户的。Qmail就是按照这个原则进行的设计,它由多个不同功能的小程序组成,只有必要的程序才是setuid程序(即以root用户权限执行),这样就减少了安全隐患,并且由于这些程序都比较简单一些,因此就可以达到较高的安全性。
这种按照Unix思路的模块化设计方法也使得Qmail具备较高的性能,因为如果需要,Qmail可以启动某个模块的多个实例来完成同一个任务,例如启动多个发送程序同时向外发送邮件,这对于提供邮件列表服务的邮件系统是非常有益的。这种方式也使得Qmail要占用较大的网络带宽,如果带宽有限,效果反而不好,但在当前网络性能大幅度提高的情况下,这种方式是非常合适的。
Qmail还提供一些非常有用的特色来增强系统的可靠性,例如,它提出了Maildir格式的邮件存储方式,这使得通过网络文件系统NFS存取邮件成为可能。此外,Qmail还具备一些非常别致的特色,它不仅仅提供了与Sendmail兼容的方式来处理转发、别名等能力,还可以用以Sendmail完全不同的方式来提供这些功能。从它的编译安装方式、提供的扩展功能和源代码的风格,可以看出其作者Dan Bernstein是一个极具个性化的程序员。正因为如此,对于Qmail的某些方面,有着一些争论,例如有些人认为Qmail的安装设置并不易于理解,很容易让人糊涂,而另一些人的看法则相反。基本上这是因为Qmail提供解决问题的方式,和Sendmail不大相同的缘故,这样对那些不太熟悉Sendmail的邮件系统管理员,反而更容易接受Qmail一些。
另一种替换软件:Postfix
Postfix同样也是采用了模块化的方式,但与Qmail不同的是,Postfix使用了一个主控进程进行监控。Postfix在很多方面都考虑到了安全问题,它甚至不向root分发电子邮件,以避免以root身份读写文件或启动外部程序。考虑到它的作者Wietse Venema曾编写了著名的安全软件TcpWrapper,并是SATAN程序的合作人员之一,Postfix的安全性是非常值得信赖的。
同样,Postfix的性能也非常不错,甚至在Qmail作者自己进行的测试中也表明,Postfix的性能和Qmail基本相当。但Postfix占用的内存要大一些,这主要是由于Postfix和Qmail在系统结构上的差异造成的。
与Qmail不同,Postfix更着眼于作为Sendmail的直接替换,使用Postfix替换Sendmail却相当简单,因为Postfix使用的很多文件和Sendmail一致,只需要在配置文件中指明原有Sendmail配置文件的位置就可以了,Postfix甚至还提供了sendmail和mailq程序,以保持兼容性。基本上,可以直接从Sendmail转换为使用Postfix,而不需要额外的设置。Postfix提供的安装配置方式也相当简单,它使用中心化的配置文件和非常易理解的配置指令。
Postfix提供的一些强大的功能主要在于多种数据库表查询方式,例如它支持DB、DBM、passwd文件、正则表达式、MySQL数据库以及LDAP方式的查询,用于支持系统级的别名、虚拟主机等。虽然在Qmail中也能支持这些功能,但没有象Postfix那样统一、简洁。此外,更改Postfix的设置之后,也不需要重新启动整个系统,只需要使用postfix reload就能完全刷新配置,这也避免了丢失邮件的可能性。
事实上,除了Qmail和Postfix之外,还有很多种邮件系统,例如Smail、Exim等,然而毫无疑问Qmail和Postfix是其中最优秀的,也是Sendmail最有力的竞争者。此外,还有一些商业邮件服务器产品,但一般情况下,购买商业邮件服务器软件大部分是冲着其提供的服务或者是附加功能来的,例如群件产品通常带有很多额外功能用于办公环境等。
至于在Sendmail、Postfix和Qmail之间进行选择,基本上依赖于用户自己的偏好。有些人喜欢Qmail提供的复杂特色,而有的人希望对Sendmail的替换能简单一些,也有人不打算更换,而坚持使用Sendmail的最新版本。对于一个熟悉Unix系统而又愿意改善邮件系统性能和安全性的管理员,应该转换为使用Postfix或Qmail,除非对Sendmail非常熟悉而保持了特殊的感情。在Postfix和Qmail之间,它们各自有一批忠心拥护者,选择哪个都是可行的。基本上,Postfix作为一个较新的软件,其影响力正在增加,有些原本使用Qmail的使用者,也开始转向Postfix,这可能是因为Postfix的风格更通俗的原因。
FreeBSD全能服务器安装手册之邮件服务器篇--qmail基本介绍
qmail的基本介绍
qmail是在unix系统上的一个邮件程序。qmail程序是由dan bernstein开发出来的为标准的unix服务器提供邮件传输代理的(mail transfer agent,mta)功能的,用来替代sendmail。qmail因特网主页http://www.qmail.org。
_________________
FreeBSD全能服务器安装手册之qmail篇
###################################下载软件包##################################
Part 1 - Download the Software(http://www.qmailrocks.org/downloads/qmailrocks.tar.gz)
mkdir /downloads
cd /downloads
tar zxvf qmailrocks.tar.gz
##################################安装qmail主程序##############################
Part 2 - Installing Qmail Itself
/downloads/qmailrocks/scripts/install/qmr_install_freebsd-s1.script
脚本内容请参考------qmail安装脚本篇qmr_install_freebsd-s1.script
###############################################################################
/downloads/qmailrocks/scripts/util/qmail_patches.script
脚本内容请参考------qmail安装脚本篇qmail_patches.script
cd /usr/src/qmail/qmail-1.03
make man
make setup check
./config-fast mail.tjhaina.net
/usr/ports/mail/qmail
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
cd /usr/src/qmail/ucspi-tcp-0.88/
make
make setup check
/usr/ports/sysutils/ucspi-tcp
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
cd /package/admin/daemontools-0.76
package/install
reboot
/usr/ports/sysutils/daemontools
################################Part 3 - EZmlm##################################
Part 3 - EZmlm
cd /downloads/qmailrocks/
tar zxvf ezmlm-0.53-idx-0.41.tar.gz
cd ezmlm-0.53-idx-0.41
make
make setup
/usr/ports/mail/ezmlm
############################Part 4 - Qmail-Autoresponder ##########################
Part 4 - Qmail-Autoresponder
#pkg_add -r qmail-autoresponder
cd /downloads/qmailrocks
pkg_add qmail-autoresponder-0.96.1.tbz
/usr/ports/mail/qmail-autoresponder
################################part 5 - Vpopmail################################
Part 5 - Vpopmail(I would like to install vpopmail with MySQL integration)
mkdir -p ~vpopmail/etc
mysql -u root -p
CREATE DATABASE vpopmail;
GRANT select,insert,update,delete,create,drop ON vpopmail.* TO vpopmailuser@localhost IDENTIFIED BY 'password';
quit
mysql -u vpopmailuser -p
quit
upload
iGENUS.mysql
mysql -u root -p < /home/chb/iGENUS.mysql
脚本内容请参考------qmail安装脚本篇iGENUS.mysql
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
cd /downloads/qmailrocks
tar zxvf vpopmail-5.4.9.tar.gz
cd vpopmail-5.4.9
./configure /
--disable-roaming-users /
--enable-logging=p /
--disable-ip-alias-domains /
--disable-passwd /
--enable-clear-passwd /
--disable-domain-quotas /
--enable-auth-module=mysql /
--enable-many-domains /
--enable-auth-logging /
--enable-sql-logging /
--enable-valias /
--disable-mysql-limits
make
make install-strip
chown vpopmail:vchkpw ~vpopmail/etc
echo "localhost|0|vpopmailuser|password|vpopmail" > ~vpopmail/etc/vpopmail.mysql
chown vpopmail:vchkpw ~vpopmail/etc/vpopmail.mysql
chmod 640 ~vpopmail/etc/vpopmail.mysql
/home/vpopmail/bin/vadddomain 你的域名
之后回提示输入域管理员的密码
/home/vpopmail/bin/vadduser 邮件用户@你的域名
之后回提示输入邮件用户的密码
/usr/ports/mail/vpopmail
#############################Part 6 - Vqadmin###################################
Part 6 - Vqadmin
cd /downloads/qmailrocks
tar zxvf vqadmin-2.3.6.tar.gz
cd vqadmin-2.3.6
./configure /
--enable-cgibindir=/usr/local/www/cgi-bin /
--enable-htmldir=/usr/local/www/html
make
make install-strip
Now you will need to add the following to your server's Apache configuration file (usually called httpd.conf)
ee /usr/local/etc/apache/httpd.conf
在末尾添加
<Directory "/usr/local/www/cgi-bin/vqadmin">
deny from all
Options ExecCGI
AllowOverride AuthConfig
Order deny,allow
</Directory>
cd /usr/local/www/cgi-bin/vqadmin
ee .htaccess
AuthType Basic
AuthUserFile /usr/local/etc/apache/conf/vqadmin.passwd
AuthName vQadmin
require valid-user
satisfy any
mkdir /usr/local/etc/apache/conf
chown www .htaccess
chmod 644 .htaccess
htpasswd -bc /usr/local/etc/apache/conf/vqadmin.passwd admin password
chmod 644 /usr/local/etc/apache/conf/vqadmin.passwd
apachectl stop
apachectl start
http://192.168.0.205/cgi-bin/vqadmin/vqadmin.cgi
/usr/ports/mail/vqadmin
##############################Part 7 - Maildrop###################################
Part 7 - Maildrop
cd /downloads/qmailrocks
tar zxvf maildrop-1.6.3.tar.gz
cd maildrop-1.6.3
./configure /
--prefix=/usr/local /
--exec-prefix=/usr/local /
--enable-maildrop-uid=root /
--enable-maildrop-gid=vchkpw /
--enable-maildirquota
make
make install-strip
make install-man
/usr/ports/mail/maildrop
##############################Part 8 - Qmailadmin#############################
Part 8 - Qmailadmin
cd /downloads/qmailrocks
tar zxvf qmailadmin-1.2.3.tar.gz
cd qmailadmin-1.2.3
./configure /
--enable-cgibindir=/usr/local/www/cgi-bin /
--enable-htmldir=/usr/local/www/html/directory /
--enable-autoresponder-path=/usr/local/bin/qmail-autoresponder
make
make install-strip
/usr/ports/mail/qmailadmin
####################################Part 9 - Finalizing Qmail#######################
Part 9 - Finalizing Qmail
/downloads/qmailrocks/scripts/finalize/freebsd/finalize_freebsd.script
脚本内容请参考------qmail安装脚本篇finalize_freebsd.script
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ee /var/qmail/supervise/qmail-pop3d/run
Find "mail.example.com" and change it to your server's hostname. For example: mail.mydomain.com.
ee /var/qmail/supervise/qmail-smtpd/run
Find "mail.example.com" and change it to your server's hostname. For example: mail.mydomain.com
qmailctl stop
echo '127.:allow,RELAYCLIENT=""' >> /etc/tcp.smtp
qmailctl cdb
echo b.s.d@163.com > /var/qmail/alias/.qmail-root
where "some_address" is the system user or email address you want these addresses aliased to.
echo b.s.d@163.com > /var/qmail/alias/.qmail-postmaster
where "some_address" is the system user or email address you want these addresses aliased to.
echo b.s.d@163.com > /var/qmail/alias/.qmail-mailer-daemon
where "some_address" is the system user or email address you want these addresses aliased to.
ln -s /var/qmail/alias/.qmail-root /var/qmail/alias/.qmail-anonymous
chmod 644 /var/qmail/alias/.qmail*
##########################Part 10 - Uninstalling Sendmail###########################
Part 10 - Uninstalling Sendmail
killall sendmail
mv /usr/sbin/sendmail /usr/sbin/sendmail.old
mv /usr/lib/sendmail /usr/lib/sendmail.old(this may not apply if there is no sendmail link or binary in this location)
chmod 0 /usr/lib/sendmail.old /usr/sbin/sendmail.old
Now we will need to instruct FreeBSD not to attempt to start Sendmail upon startup. This is done by make the following
modification to the /etc/rc.conf file:
Change sendmail_enable="YES" to sendmail_enable="NONE"
ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
#ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail
########################Part 11 - Starting up qmail#################################
Part 11 - Starting up qmail
/downloads/qmailrocks/scripts/util/qmr_inst_check
脚本内容请参考------qmail安装脚本篇qmr_inst_check
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
qmailctl stop
qmailctl start
telnet localhost 110
you should see something like this:
Trying 192.168.1.10...
Connected to 192.168.1.10.
Escape character is '^]'.
+OK <16658.1054485137@yourserver.com>
user postmaster@mydomain.com (enter your username here. remember to use the full e-mail address)
+OK
pass your_password
+OK
quit
+OK
Connection closed by foreign host.
This is the sign of a successfull POP connection to the server!
Now try sending mail to that same user from another location. Telnet to 110 again and run the "list" command and you should
see the message that your send...
telnet localhost 110
Trying 192.168.1.10...
Connected to 192.168.1.10.
Escape character is '^]'.
+OK <16658.1054485137@yourserver.comt>
user postmaster@mydomain.com (again, remember to log in with the full email address of the user)
+OK
pass your_password
+OK
list
+OK
1 323 (there's your message!)
.
quit
+OK
Connection closed by foreign host.
########################Part 12 - Installing Courier IMAP & IMAP SSL################
Part 12 - Installing Courier IMAP & IMAP SSL
cd /downloads/qmailrocks/
/usr/bin/bunzip2 courier-imap-3.0.8.tar.bz2 (Note: some systems may use bunzip2 instead of bunzip)
#bunzip courier-imap-3.0.8.tar.bz2
tar xvf courier-imap-3.0.8.tar
cd courier-imap-3.0.8
./configure /
--prefix=/usr/local /
--exec-prefix=/usr/local /
--without-authdaemon /
--with-authvchkpw /
--without-authldap /
--disable-root-check /
--with-ssl
make
make install-strip
cd /usr/local/etc
cp imapd.dist imapd
cp imapd-ssl.dist imapd-ssl
/usr/local/sbin/mkimapdcert
ee imapd-ssl
#make sure IMAPDSSLSTART=YES
cp /usr/local/libexec/imapd.rc /usr/local/etc/rc.d/imap.sh
cp /usr/local/libexec/imapd-ssl.rc /usr/local/etc/rc.d/imaps.sh
/usr/local/etc/rc.d/imap.sh start
/usr/local/etc/rc.d/imaps.sh start
telnet localhost 143
Trying 192.168.1.10...
Connected to 192.168.1.10.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE STARTTLS]
Courier-IMAP ready. Copyright 1998-2003 Double Precision, Inc. See COPYING for distribution information.
a login postmaster@mydomain.com my_password
a OK LOGIN Ok. (successful login!)
a logout (logs you out)
* BYE Courier-IMAP server shutting down
a OK LOGOUT completed
Connection closed by foreign host.
<!--cd /downloads/qmailrocks
tar zxvf courierpassd-1.1.0-RC1.tar.gz
cd courierpassd-1.1.0-RC1
./configure --with-couriersrc=/downloads/qmailrocks/courier-imap-3.0.8
make
make install-->
#########################Part 14 - Clam Antivirus & Spamassassin####################
Part 14 - Clam Antivirus & Spamassassin
安装Clamav
cd /usr/ports/security/clamav
make
make install
make clean
注:选中CURL
reboot
测试
/usr/local/bin/clamscan -r -i /usr/local/www/data
----------- SCAN SUMMARY -----------
Known viruses: 32358
Scanned directories: 47
Scanned files: 866
Infected files: 0
Data scanned: 10.32 MB
I/O buffer size: 131072 bytes
Time: 41.750 sec (0 m 41 s)
升级病毒库
/usr/local/bin/freshclam -l /var/log/clamav/clam-update.log
ClamAV update process started at Fri May 6 00:12:24 2005
WARNING: Your ClamAV installation is OUTDATED - please update immediately!
WARNING: Local version: 0.83 Recommended version: 0.84
Downloading main.cvd [*]
main.cvd updated (version: 31, sigs: 33079, f-level: 4, builder: tkojm)
Downloading daily.cvd [*]
daily.cvd updated (version: 871, sigs: 1178, f-level: 4, builder: ccordes)
Database updated (34257 signatures) from database.clamav.net (IP: 61.8.0.16)
Clamd successfully notified about the update.
FreeBSD全能服务器安装手册之qmail安装脚本篇
本次安装中所用到的脚本:
qmr_install_freebsd-s1.script
qmail_patches.script
iGENUS.mysql
finalize_freebsd.script
qmr_inst_check
script:1
############qmr_install_freebsd-s1.script内容##############
#!/bin/sh
#An automation script to start the installation of qmail, ucspi-tcp and daemontools
#Specially formulated for Redhat, Fedora, RHEL and Whitebox Linux. :)
echo "Creating initial qmail directories..."
echo
sleep 2
cd /downloads/qmailrocks
mkdir -p /var/qmail
mkdir /usr/src/qmail
echo "Done!"
echo
sleep 2
echo "Creating all needed users and groups..."
echo
sleep 2
#######
#Script to add users and groups for FreeBSD
#Add all need Qmail users and groups
pw groupadd nofiles
pw useradd alias -g nofiles -d /var/qmail/alias -s /sbin/nologin
pw useradd qmaild -g nofiles -d /var/qmail -s /sbin/nologin
pw useradd qmaill -g nofiles -d /var/qmail -s /sbin/nologin
pw useradd qmailp -g nofiles -d /var/qmail -s /sbin/nologin
pw groupadd qmail
pw useradd qmailq -g qmail -d /var/qmail -s /sbin/nologin
pw useradd qmailr -g qmail -d /var/qmail -s /sbin/nologin
pw useradd qmails -g qmail -d /var/qmail -s /sbin/nologin
#Add vpopmail users/groups
pw groupadd vchkpw
pw useradd vpopmail -g vchkpw -m -d /usr/home/vpopmail -s /sbin/nologin
#######
echo "Done!"
echo
sleep 2
echo "Unpacking qmail, ucspi-tcp and daemontools..."
echo
sleep 2
cd /usr/src/qmail
tar zxvf /downloads/qmailrocks/qmail-1.03.tar.gz
tar zxvf /downloads/qmailrocks/ucspi-tcp-0.88.tar.gz
mkdir -p /package
chmod 1755 /package
cd /package
tar zxvf /downloads/qmailrocks/daemontools-0.76.tar.gz
echo "Done!"
echo
sleep 2
echo "Next, we setup special logging directories..."
echo
sleep 2
mkdir /var/log/qmail
cd /var/log/qmail
mkdir qmail-send qmail-smtpd qmail-pop3d
chown -R qmaill:wheel /var/log/qmail
chmod -R 750 /var/log/qmail
echo "Done!"
echo
sleep 2
echo "And set up the supervise script directories..."
echo
sleep 2
mkdir /var/qmail/supervise
cd /var/qmail/supervise
mkdir -p qmail-smtpd/log qmail-send/log qmail-pop3d/log
chmod +t qmail-smtpd qmail-send qmail-pop3d
echo "Setting conf-split and conf-spawn"
echo
sleep 2
echo 211 > /usr/src/qmail/qmail-1.03/conf-split
echo 255 > /usr/src/qmail/qmail-1.03/conf-spawn
echo "All steps completed!"
echo
sleep 2
##############################################################################################################################################################
script:2
############### qmail_patches.script内容##############
#!/bin/sh
#An automation script to start the installation of qmail, ucspi-tcp and daemontools
#Specially formulated for Redhat, Fedora, RHEL and Whitebox Linux. :)
echo "Creating initial qmail directories..."
echo
sleep 2
cd /downloads/qmailrocks
mkdir -p /var/qmail
mkdir /usr/src/qmail
echo "Done!"
echo
sleep 2
echo "Creating all needed users and groups..."
echo
sleep 2
#######
#Script to add users and groups for FreeBSD
#Add all need Qmail users and groups
pw groupadd nofiles
pw useradd alias -g nofiles -d /var/qmail/alias -s /sbin/nologin
pw useradd qmaild -g nofiles -d /var/qmail -s /sbin/nologin
pw useradd qmaill -g nofiles -d /var/qmail -s /sbin/nologin
pw useradd qmailp -g nofiles -d /var/qmail -s /sbin/nologin
pw groupadd qmail
pw useradd qmailq -g qmail -d /var/qmail -s /sbin/nologin
pw useradd qmailr -g qmail -d /var/qmail -s /sbin/nologin
pw useradd qmails -g qmail -d /var/qmail -s /sbin/nologin
#Add vpopmail users/groups
pw groupadd vchkpw
pw useradd vpopmail -g vchkpw -m -d /usr/home/vpopmail -s /sbin/nologin
#######
echo "Done!"
echo
sleep 2
echo "Unpacking qmail, ucspi-tcp and daemontools..."
echo
sleep 2
cd /usr/src/qmail
tar zxvf /downloads/qmailrocks/qmail-1.03.tar.gz
tar zxvf /downloads/qmailrocks/ucspi-tcp-0.88.tar.gz
mkdir -p /package
chmod 1755 /package
cd /package
tar zxvf /downloads/qmailrocks/daemontools-0.76.tar.gz
echo "Done!"
echo
sleep 2
echo "Next, we setup special logging directories..."
echo
sleep 2
mkdir /var/log/qmail
cd /var/log/qmail
mkdir qmail-send qmail-smtpd qmail-pop3d
chown -R qmaill:wheel /var/log/qmail
chmod -R 750 /var/log/qmail
echo "Done!"
echo
sleep 2
echo "And set up the supervise script directories..."
echo
sleep 2
mkdir /var/qmail/supervise
cd /var/qmail/supervise
mkdir -p qmail-smtpd/log qmail-send/log qmail-pop3d/log
chmod +t qmail-smtpd qmail-send qmail-pop3d
echo "Setting conf-split and conf-spawn"
echo
sleep 2
echo 211 > /usr/src/qmail/qmail-1.03/conf-split
echo 255 > /usr/src/qmail/qmail-1.03/conf-spawn
echo "All steps completed!"
echo
sleep 2
############################## qmail_patches.script内容###########################
###############################################################################
script:3
%%%%%%%%%%%%%%%%%%iGENUS.mysql%%%%%%%%%%%%%%%%%%%%%
DROP DATABASE vpopmail;
CREATE DATABASE vpopmail;
USE vpopmail;
CREATE TABLE `address` (
`id` int(11) unsigned NOT NULL auto_increment,
`pw_id` int(5) NOT NULL default '0',
`name` varchar(64) NOT NULL default '',
`email` varchar(128) NOT NULL default '',
UNIQUE KEY `id` (`id`),
KEY `pw_id` (`pw_id`)
) TYPE=MyISAM PACK_KEYS=1 ;
CREATE TABLE `admin` (
`id` int(10) unsigned NOT NULL auto_increment,
`site_id` int(10) unsigned NOT NULL default '0',
`domain` varchar(128) NOT NULL default '',
`quota` smallint(5) unsigned NOT NULL default '0',
`total` smallint(5) unsigned NOT NULL default '0',
`createtime` timestamp(14) NOT NULL,
`login` char(1) NOT NULL default '',
`cur_total` smallint(5) NOT NULL default '0',
`cur_quota` smallint(5) NOT NULL default '0',
`gid` varchar(11) NOT NULL default '',
`expiration_time` timestamp(14) NOT NULL,
`flag` int(10) unsigned NOT NULL default '0',
`maxmsg` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`id`),
UNIQUE KEY `domain` (`domain`)
) TYPE=MyISAM PACK_KEYS=1 ;
CREATE TABLE `card` (
`id` int(5) unsigned NOT NULL auto_increment,
`pw_id` int(5) unsigned NOT NULL default '0',
`LinkMan` varchar(64) NOT NULL default '',
`CompanyName` varchar(100) NOT NULL default '',
`address` varchar(255) NOT NULL default '',
`Position` varchar(32) NOT NULL default '',
`PhoneNumber` varchar(16) NOT NULL default '',
`Mobile` varchar(12) NOT NULL default '',
`Email` varchar(128) NOT NULL default '',
`Partaker` varchar(32) NOT NULL default '',
`Memo` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM ;
CREATE TABLE `lastauth` (
`user` char(32) NOT NULL default '',
`domain` char(64) NOT NULL default '',
`remote_ip` char(18) NOT NULL default '',
`timestamp` bigint(20) NOT NULL default '0',
PRIMARY KEY (`user`,`domain`)
) TYPE=MyISAM;
CREATE TABLE `logs` (
`pw_id` int(5) default '0',
`ip` varchar(15) NOT NULL default '',
`action` varchar(15) NOT NULL default '',
`time` datetime default NULL,
`content` varchar(64) NOT NULL default '',
`email` varchar(128) NOT NULL default ''
) TYPE=MyISAM;
CREATE TABLE `message` (
`id` int(5) unsigned NOT NULL auto_increment,
`title` varchar(255) NOT NULL default '',
`body` text NOT NULL,
`createtime` datetime NOT NULL default '0000-00-00 00:00:00',
`updatetime` datetime NOT NULL default '0000-00-00 00:00:00',
`pw_domain` varchar(64) NOT NULL default '',
UNIQUE KEY `id` (`id`)
) TYPE=MyISAM ;
CREATE TABLE `personal` (
`id` int(11) unsigned NOT NULL auto_increment,
`pw_id` int(5) NOT NULL default '0',
`truename` varchar(10) NOT NULL default '',
`fax` varchar(20) NOT NULL default '',
`telephone` varchar(15) NOT NULL default '',
`sex` int(1) NOT NULL default '0',
`year` int(4) NOT NULL default '0',
`MONTH` int(2) NOT NULL default '0',
`DAY` int(2) NOT NULL default '0',
`education` varchar(4) NOT NULL default '',
`marital` int(1) NOT NULL default '0',
`occupation` varchar(15) NOT NULL default '',
`companyname` varchar(30) NOT NULL default '',
`province` varchar(6) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM PACK_KEYS=1 ;
CREATE TABLE `scheduler` (
`id` int(11) unsigned NOT NULL auto_increment,
`begin_time` int(11) unsigned default NULL,
`end_time` int(11) unsigned default NULL,
`title` varchar(255) NOT NULL default '',
`body` varchar(255) NOT NULL default '',
`pw_id` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`id`)
) TYPE=MyISAM ;
CREATE TABLE `stow` (
`id` int(5) unsigned NOT NULL auto_increment,
`pw_id` int(5) unsigned NOT NULL default '0',
`Name` varchar(128) NOT NULL default '',
`http` varchar(255) NOT NULL default 'http://',
`memo` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`)
) TYPE=MyISAM ;
create table vpopmail (
pw_id int(5) unsigned NOT NULL auto_increment,
pw_name varchar(32) NOT NULL default '',
pw_domain varchar(64) NOT NULL default '',
pw_passwd varchar(40) NOT NULL default '',
pw_uid int(11) default NULL,
pw_gid int(11) default NULL,
pw_gecos varchar(64) default NULL,
pw_dir varchar(160) default NULL,
pw_shell varchar(20) default NULL,
pw_clear_passwd varchar(16) default NULL,
createtime timestamp(14) NOT NULL,
PRIMARY KEY (pw_id),
KEY pw_name (pw_name,pw_domain) )
TYPE=MyISAM PACK_KEYS=1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
script:4
################# finalize_freebsd.script##############
#!/bin/sh
echo "This scripts will perform 3 functions:/n
1. Copy all supervise scripts to their proper locations./n
2. Copy the qmail rc and qmailctl scripts to their proper locations and create needed symlinks./n
3. Set all needed permisions on all supervise scripts./n"
echo
echo "Press ENTER to proceeed"
read
echo
sleep 2
echo "Copying supervise scripts to their correct locations..."
echo
sleep 2
cp /downloads/qmailrocks/scripts/finalize/freebsd/pop3d_run /var/qmail/supervise/qmail-pop3d/run
cp /downloads/qmailrocks/scripts/finalize/freebsd/pop3d_log /var/qmail/supervise/qmail-pop3d/log/run
cp /downloads/qmailrocks/scripts/finalize/freebsd/smtpd_run /var/qmail/supervise/qmail-smtpd/run
cp /downloads/qmailrocks/scripts/finalize/freebsd/smtpd_log /var/qmail/supervise/qmail-smtpd/log/run
cp /downloads/qmailrocks/scripts/finalize/freebsd/send_run /var/qmail/supervise/qmail-send/run
cp /downloads/qmailrocks/scripts/finalize/freebsd/send_log /var/qmail/supervise/qmail-send/log/run
echo Done!
echo
sleep 2
echo "Copying rc and qmailctl scripts to proper locations..."
echo
sleep 2
cp /downloads/qmailrocks/scripts/finalize/rc /var/qmail/
cp /downloads/qmailrocks/scripts/finalize/qmailctl /var/qmail/bin/
echo Done!
echo
sleep 2
echo "Setting needed permisions..."
echo
sleep 2
chmod 755 /var/qmail/rc /var/qmail/bin/qmailctl
chmod 751 /var/qmail/supervise/qmail-pop3d/run
chmod 751 /var/qmail/supervise/qmail-pop3d/log/run
chmod 751 /var/qmail/supervise/qmail-smtpd/run
chmod 751 /var/qmail/supervise/qmail-smtpd/log/run
chmod 751 /var/qmail/supervise/qmail-send/run
chmod 751 /var/qmail/supervise/qmail-send/log/run
echo ./Maildir > /var/qmail/control/defaultdelivery
echo 255 > /var/qmail/control/concurrencyremote
chmod 644 /var/qmail/control/concurrencyremote
echo 30 > /var/qmail/control/concurrencyincoming
chmod 644 /var/qmail/control/concurrencyincoming
ln -s /var/qmail/bin/qmailctl /usr/bin
ln -s /var/qmail/supervise/qmail-send /var/qmail/supervise/qmail-smtpd /var/qmail/supervise/qmail-pop3d /service
echo "Done!"
echo
sleep 2
echo "Script Complete!"
echo
################# finalize_freebsd.script##############
#######################################################
script:5
################# qmr_inst_check内容###################
#!/bin/sh
# Qmailrocks, 2003-12-05
# I've modified Dave Sill's script slightly to accomodate
# the variations between his Qmail installation and the
# Qmailrocks.org installation. The Qmailrocks version
# of this script takes into account the slightly different
# loggind directory setup and a few permissions differences.
# http://www.qmailrocks.org/downloads/scripts/qmr_inst_check
# Dave Sill, 2003-11-10
# http://lifewithqmail.org/inst_check
# set to n if you're not running a pop3 server, y if you are
CHECKPOP=y
CHECKSEND=y
QMHOME=/var/qmail
LBIN=/usr/local/bin
OK=1
if [ $# -eq 1 ]; then
if [ "$1" = "-v" ]; then
VERB=y
else
VERB=n
fi
fi
if [ ! -d $QMHOME ]; then
echo "! Couldn't find qmail's home directory, $QMHOME!"
else
if [ "$VERB" = y ]; then
echo "$QMHOME exists"
fi
for i in alias bin boot control doc man queue supervise users; do
if [ ! -d $QMHOME/$i ]; then
echo "! Couldn't find $QMHOME/$i!"
OK=0
elif [ "$VERB" = y ]; then
echo "$QMHOME/$i exists"
fi
done
if [ ! -f $QMHOME/rc ]; then
echo "! $QMHOME/rc is missing"
OK=0
elif [ ! -x $QMHOME/rc ]; then
echo "! $QMHOME/rc is not executable"
echo "...try: chmod 755 $QMHOME/rc"
OK=0
elif [ `head -1 $QMHOME/rc|cat -vet` != '#!/bin/sh$' ]; then
echo "! $QMHOME/rc has bad magic cookie"
echo "...try: dos2unix $QMHOME/rc"
OK=0
elif [ "$VERB" = y ]; then
echo "$QMHOME/rc is executable and has a valid magic cookie"
fi
fi
for i in alias qmaild qmaill qmailp qmailq qmailr qmails; do
grep "^$i:" /etc/passwd >/dev/null
if [ $? -ne 0 ]; then
echo "! Couldn't find $i user in /etc/passwd"
OK=0
elif [ "$VERB" = y ]; then
echo "$i user exists"
fi
done
for i in qmail nofiles; do
grep "^$i:" /etc/group >/dev/null
if [ $? -ne 0 ]; then
echo "! Couldn't find $i group in /etc/group"
OK=0
elif [ "$VERB" = y ]; then
echo "$i group exists"
fi
done
for i in tcprules tcpserver; do
if [ ! -x $LBIN/$i ]; then
echo "! Couldn't find $LBIN/$i from ucspi-tcp"
OK=0
elif [ "$VERB" = y ]; then
echo "$i from ucspi-tcp is installed"
fi
done
for i in multilog softlimit setuidgid supervise svok svscan tai64nlocal; do
if [ ! -x $LBIN/$i ]; then
echo "! Couldn't find $LBIN/$i from daemontools"
OK=0
elif [ "$VERB" = y ]; then
echo "$i from daemontools is installed"
fi
done
if [ ! -d /service ]; then
echo "! /service directory is missing"
OK=0
elif [ "$VERB" = y ]; then
echo "/service directory exists"
fi
if [ -f /etc/inittab ]; then
grep "^SV" /etc/inittab >/dev/null
if [ $? -ne 0 ]; then
echo "! Couldn't find SV entry in inittab"
OK=0
elif [ "$VERB" = y ]; then
echo "svscan /service is configured to run via /etc/inittab"
fi
PS="ps -ef"
else
grep "svscanboot" /etc/rc.local >/dev/null
if [ $? -ne 0 ]; then
echo "! Couldn't find 'csh -cf '/command/svscanboot &' in /etc/rc.local"
OK=0
elif [ "$VERB" = y ]; then
echo "/command/svscanboot is configured to run via /etc/rc.local"
fi
PS="ps -waux"
fi
SVRUN=`$PS | grep "svscan /service" | grep -v grep`
if [ -z "$SVRUN" ]; then
echo "'! svscan /service' doesn't seem to be running"
OK=0
elif [ "$VERB" = y ]; then
echo "svscan /service is running"
fi
if [ ! -f $QMHOME/control/defaultdelivery ]; then
echo "! Couldn't find $QMHOME/control/defaultdelivery"
OK=0
elif [ ! -s $QMHOME/control/defaultdelivery ]; then
echo "! $QMHOME/control/defaultdelivery is empty"
OK=0
elif [ "$VERB" = y ]; then
echo "$QMHOME/control/defaultdelivery looks OK"
fi
if [ ! -f $QMHOME/bin/qmailctl ]; then
echo "! $QMHOME/bin/qmailctl is missing"
OK=0
elif [ ! -s $QMHOME/bin/qmailctl ]; then
echo "! $QMHOME/bin/qmailctl is empty"
OK=0
elif [ `head -1 $QMHOME/bin/qmailctl|cat -vet` != '#!/bin/sh$' ]; then
echo "! $QMHOME/bin/qmailctl has bad magic cookie"
echo "...try: dos2unix $QMHOME/bin/qmailctl"
OK=0
elif [ ! -x $QMHOME/bin/qmailctl ]; then
echo "! $QMHOME/bin/qmailctl is not executable"
echo "...try: chmod 755 $QMHOME/bin/qmailctl"
OK=0
elif [ "$VERB" = y ]; then
echo "$QMHOME/bin/qmailctl looks OK"
fi
if [ ! -L /usr/bin/qmailctl ]; then
echo "! /usr/bin/qmailctl is missing"
echo "...try: ln -s $QMHOME/bin/qmailctl /usr/bin"
OK=0
elif [ "$VERB" = y ]; then
echo "/usr/bin/qmailctl exists"
fi
SVCDIRS="qmail-send qmail-send/log qmail-smtpd qmail-smtpd/log"
if [ "$CHECKPOP" = "y" ]; then
SVCDIRS="$SVCDIRS qmail-pop3d qmail-pop3d/log"
fi
for i in $SVCDIRS; do
if [ ! -f $QMHOME/supervise/$i/run ]; then
echo "! $QMHOME/supervise/$i/run file is missing"
OK=0
elif [ `head -1 $QMHOME/supervise/$i/run|cat -vet` != '#!/bin/sh$' ]; then
echo "! $QMHOME/supervise/$i/run has bad magic cookie"
echo "...try: dos2unix $QMHOME/supervise/$i/run"
OK=0
elif [ ! -x $QMHOME/supervise/$i/run ]; then
echo "! $QMHOME/supervise/$i/run file is not executable"
OK=0
elif [ "$VERB" = y ]; then
echo "$QMHOME/supervise/$i/run looks OK"
fi
done
if [ ! -f $QMHOME/control/concurrencyincoming ]; then
echo "! $QMHOME/control/concurrencyincoming is missing"
echo "...try: echo 30 >$QMHOME/control/concurrencyincoming"
OK=0
elif [ "$VERB" = y ]; then
echo "$QMHOME/control/concurrencyincoming looks OK"
fi
LOGDIRS="/var/log/qmail /var/log/qmail/qmail-smtpd"
if [ "$CHECKPOP" = "y" ]; then
LOGDIRS="$LOGDIRS /var/log/qmail/qmail-pop3d"
fi
if [ "$CHECKSEND" = "y" ]; then
LOGDIRS="$LOGDIRS /var/log/qmail/qmail-send"
fi
for i in $LOGDIRS; do
if [ ! -d $i ]; then
echo "! $i is missing"
echo "...try: mkdir -p $i"
OK=0
elif [ "`ls -ld $i|awk '{print $3}'`" != "qmaill" ]; then
echo "! $i has wrong owner, should be qmaill"
echo "...try: chown qmaill $i"
OK=0
elif [ "`ls -ld $i|awk '{print $1}'`" != "drwxr-x---" ]; then
echo "! $i has wrong mode, should be 750"
echo "...try: chmod 750 $i"
OK=0
elif [ "$VERB" = y ]; then
echo "$i looks OK"
fi
done
SVCLINKS="/service/qmail-send /service/qmail-smtpd"
if [ "$CHECKPOP" = "y" ]; then
SVCLINKS="$SVCLINKS /service/qmail-pop3d"
fi
for i in $SVCLINKS; do
if [ ! -L $i ]; then
echo "! $i is missing"
echo "...try: ln -s $QMHOME$i $i"
OK=0
elif [ "$VERB" = y ]; then
echo "$i exists"
fi
done
if [ ! -f /etc/tcp.smtp ]; then
echo "! /etc/tcp.smtp is missing"
echo "...try: echo '127.:allow,RELAYCLIENT=/"/"' >>/etc/tcp.smtp"
OK=0
elif [ "$VERB" = y ]; then
echo "/etc/tcp.smtp exists"
fi
if [ ! -f /etc/tcp.smtp.cdb ]; then
echo "! /etc/tcp.smtp.cdb is missing"
echo "...try: $QMHOME/bin/qmailctl cdb"
OK=0
elif [ "$VERB" = y ]; then
echo "/etc/tcp.smtp.cdb exists"
fi
AHOME=`grep "^alias:" /etc/passwd | awk -F: '{print $6}'`
if [ -z "$AHOME" ]; then
echo "! Couldn't find user alias's home directory"
OK=0
else
for i in root postmaster mailer-daemon; do
if [ ! -f $AHOME/.qmail-$i ]; then
echo "! Alias for $i is missing"
echo "...try: echo me >$AHOME/.qmail-$i"
OK=0
elif [ "$VERB" = y ]; then
echo "$i alias exists"
fi
done
fi
if netstat -a | grep smtp | grep -i listen >/dev/null; then
if $PS | grep sendmail | grep -v grep >/dev/null; then
echo "! Sendmail is still running"
echo "...try: $RCDIR/init.d/sendmail stop"
OK=0
elif $LBIN/svok /service/qmail-smtpd; then
if [ "$VERB" = y ]; then
echo "/service/qmail-smtpd is running"
fi
else
echo "! Something is listening on port 25 (not tcpserver/qmail-smtpd)"
echo "...try: disabling current MTA"
OK=0
fi
fi
if [ "$CHECKPOP" = "y" ]; then
if netstat -a | grep pop | grep -i listen >/dev/null; then
if $LBIN/svok /service/qmail-pop3d; then
if [ "$VERB" = y ]; then
echo "/service/qmail-pop3d is running"
fi
else
echo "! Something is listening on port 110 (not tcpserver/qmail-pop3d)"
echo "...try: disabling other POP server"
OK=0
fi
fi
fi
for i in /usr/lib/sendmail /usr/sbin/sendmail; do
if [ -f $i -a ! -L $i ]; then
echo "! $i is a file, should be a link"
echo "...try: uninstalling current MTA or: mv $i $i.old; ln -s $QMHOME/bin/sendmail $i"
OK=0
elif [ ! -f $i ];then
echo "! $i is missing"
echo "...try: ln -s $QMHOME/bin/sendmail $i"
OK=0
elif [ "$VERB" = y ]; then
echo "$i exists"
fi
done
if [ $OK -eq 1 ]; then
echo "Congratulations, your Qmailrocks.org Qmail installation looks good!"
elif [ "$VERB" = y ]; then
echo "! Potential problems were found with your LWQ installation"
fi
################# qmr_inst_check内容###################
#######################################################
访问技术无忧网,软硬件通吃保你技术无忧!中文网址http://www.技术无忧.com 或 http://www.技术无忧.net












文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面