Postfix電子郵件系統精要

孤劍發表於2013-07-27

來源: http://sery.blog.51cto.com/10037/45500

Postfix 電子郵件系統精要
 
配置一個postfix郵件系統,遠比我先前的想象複雜。這次共配置2個postfix系統,花了不少精力,其間也經歷不少麻煩,還好,最後都做成了!在配置過程中,參考了《postfix權威指南》和網上其他人寫的文章,但在實際的配置中,完全按照這些文件還是不易順利完成。現在此行文披露我做這個事情的全部過程,希望對大家的工作有所幫助。
◆執行環境
作業系統是centos 5,其下載地址為[url]www.centos.org[/url],它是redhat as 5最佳的替代品(原因:開源且免費下載);postfix使用的版本是postfix-2.2.10.tar.gz,postfix([url]www.postfix.org[/url])當前的穩定版本是2.4,由於2.4不支援SASL,所以我選了老一點的版本。其他所需的軟體在下表列出:
 
名稱
用途
下載地址
Apache (httpd-2.2.0)
Web方式管理郵件
[url]www.apache.org[/url]
Php (php-5.2.3)
Php 直譯器,與apache一起使用
[url]www.php.org[/url]
Mysql (mysql-5.0.41)
用資料庫儲存使用者資訊
[url]www.mysql.com[/url]
Postfixadmin(postfix-2.1.0)
郵件帳號後臺web管理工具
[url]http://sourceforge.net/projects/postfixadmin/[/url]
SASL(cyrus-sasl-2.1.21.tar.gz)
驗證方法
[url]http://ftp.andrew.cmu.edu/pub/cyrus-mail/[/url]
Authlib(courier-authlib-0.59.3.tar.bz2)
與SASL一起做驗證
[url]http://www.courier-mta.org/download.php[/url]
Postfix
郵件系統主程式
[url]http://www.postfix.org[/url]
Courier-imap (courier-imap-4.1.3.tar.bz2)
Pop3及IMAP服務
 
Perl (perl-5.8.8)
直譯器
[url]http://www.cpan.org[/url]
Maildrop (maildrop-2.0.4.tar.bz2)
郵件投遞代理,直觀的講就是把收到的郵件轉發到使用者的郵箱目錄
Clamav (clamav-0.91.2.tar.gz)
防毒軟體
amavisd-new(amavisd-new-2.5.2.tar.gz)
掃描郵件病毒
 
Spamassassin(SpamAssassin3.2.3)
防垃圾郵件
[url]http://spamassassin.apache.org/[/url]
Pcre (pcre-7.2.tar.bz2)
安裝Imap需要–Perl相容正規表示式
[url]http://www.pcre.org[/url]
Extmail (extmail-1.0.1.tar.gz)
webmail
 
◆準備工作
1、下載所需的軟體:照上面給出的地址找到下載URL,然後用wget下載。由於伺服器一般不安裝 xwindow這樣的桌面環境,那怎樣知道下載檔案的url呢?用windows呢,通過securecrt這樣的ssh工具連線和管理遠端linux伺服器,這樣就很容易辦到了。在實際的工作中,我習慣把檔案下載到/root目錄,原因是普通使用者看不見我下載的東西。
 
圖 1
2、清理系統:不管你喜不喜歡,安裝系統時sendmail這個郵件服務軟體已經安裝上去了,可是一山不容二虎,既然我們選定了功能強大的postfix,那麼sendmail就一邊歇著吧。執行命令 rpm -e -nodeps sendmail 就達到這個目的了。第2個需要解除安裝的軟體是SASL,為什麼要解除安裝它呢?因為系統自帶的版本不太容易與authlib正常配合,所以需要把它刪除掉。第3 個要刪除的是perl.本打算用系統自帶的perl,可是在執行命令 perl -MCPAN -e  shell時居然出現”segment fault”,導致很多功能不能使用,看來也只好刪了重灌一個。下面總結一下這個過程:
1、SASL
(1)列出包
rpm -qa | grep sasl
cyrus-sasl-2.1.19-5.EL4
cyrus-sasl-gssapi-2.1.19-5.EL4
cyrus-sasl-devel-2.1.19-5.EL4
cyrus-sasl-ntlm-2.1.19-5.EL4
cyrus-sasl-md5-2.1.19-5.EL4
cyrus-sasl-sql-2.1.19-5.EL4
cyrus-sasl-plain-2.1.19-5.EL4
(2)刪除包
rpm –e –nodeps cyrus-sasl-2.1.19-5.EL4  cyrus-sasl-gssapi-2.1.19-5.EL4 cyrus-sasl-devel-2.1.19-5.EL4  //把上面查查來的全部列在這後面全解除安裝掉。nodeps前面是兩”-“!
然後進目錄/usr/lib查一下 ls –al /usr/lib | grep sasl 應該沒有目錄sasl及sasl2了。
2、Perl
(1)列出包
rpm -qa | grep perl
perl-DateManip-5.42a-3
perl-XML-Encoding-1.01-26
perl-LDAP-0.31-5
perl-XML-LibXML-Common-0.13-7
groff-perl-1.18.1.1-3
openssl-perl-0.9.7a-43.1
…………(省略若干)
perl-suidperl-5.8.5-12.1.1
(2)刪除包
rpm –e –nodeps perl-DateManip-5.42a-3   //照上面的例子刪除所以的包。由於包太多,用一個//rpm命令後面帶的引數太長,建議一個一個收拾。注:用yum remove perl刪除更方便
執行完刪除命令後,再執行命令perl –v,如果出現“-bash: perl: command not found”則表明已經把perl清理掉了。
3、建立郵件系統執行時所需的使用者和組:建立使用者和組絕不僅僅是為了練習userad和groupadd這兩個命令,因為安全方面的原因,一些軟體不能以root使用者來執行,甚至在安裝過程中,如果沒有為該軟體預先建立使用者,安裝將不能進行下去,因此,我們在這裡先建立這些執行postfix系統所需的使用者和組。對centos或redhat等發行版而言,用命令useradd建立使用者時也就建立了一個同名的組,而另外一些linux發行版(如debian)或unix(如solaris 10),建立使用者時並不會同時建立同名的組,這需要手動執行命令單獨建立所需的組。下面我用表格的方式列出postfix系統所需要建立的使用者及組的情況:
使用者名稱
組名
作用
備註
mysql
Mysql
資料庫mysql執行使用者
 
vmail
Vmail
Postfix虛擬郵件帳號所使用的使用者及組
uid,gid:1001,1001
postfix
Postfix
Postfix主程式使用的帳號和組
 
 
Postdrop
Postfix  setgid_group
setgid_group=postdrop
amavis
Amavis
郵件掃描
 
clamav
Clamav
病毒掃描
 
這裡有2個值得注意的地方,它們是vmail使用者、組及postdrop組。在postfix郵件系統中,有好幾個程式是以vmail來執行的(這些情況將在後面逐個說明);postdrop這個組,我看了很多人寫的文件,無一例外的都有建立這個組的操作,但沒有任何人說明這個組是幹什麼用的,給人很突兀的感覺,因此我在這裡特別把它列出來了-它的作用是setgid_group-在postfix的主配置檔案main.cf裡標明瞭的。
 
[root@mail ~]# grep postdrop /etc/postfix/main.cf
setgid_group = postdrop
 
◆安裝apache,mysql和php
1、apache
tar zxvf httpd-2.2.0.tar.gz
cd httpd-2.2.0
./configure -prefix=/usr/local/apache -enable-so //選項prefix,enanle前面是兩個”-“
make
make install
上述步驟執行完畢後,將生成目錄/usr/local/apache,進入這個目錄檢查一下,看相關的檔案和目錄是否存在?下圖是一個正確安裝apache後的目錄結構:
 
圖 2
執行命令 /usr/local/apache/bin/httpd -l檢查編譯進來的模組有哪些。最主要的是mod_so模組。即下面最後一個mod_so.c。這樣做的目的是為了以模組方式載入php.現在我們先不忙著配置apache,等到後面再做這個工作。
2、mysql
tar zxvf mysql-5.0.41.tar.gz
cd mysql-5.0.41
./configure -prefix=/usr/local/mysql
make,make install     //安裝完成
useradd mysql
cp support-files/my-medium.cnf  /etc/my.cnf
cd /usr/local/mysql
/usr/local/mysql/bin/mysql_install_db  –user=mysql //初始化資料庫
chown -R root .
chown -R mysql var
chgrp -R mysql .
echo “/usr/local/mysql/lib/mysql”>>/etc/ld.so.conf
ldconfig
echo “export PATH=$PATH:/usr/local/mysql/bin”>>/etc/profile
source /etc/profile
紅色字型這幾行命令如果不在此處執行的話,以後在安裝courier-authlib將出現不少麻煩,切記!!設定mysql路徑的目的是將來需要使用mysql-config檔案.
 
3、php
cd         //進/roor目錄
tar zxvf php-5.2.3.tar.gz
cd php-5.2.3
./configure -prefix=/usr/local/php -with-apxs2=/usr/local/apache/bin/apxs -with-mysql=/usr/local/mysql  //如果不先安裝mysql,這一步將不能進行下去
make;make install
cp  php.ini-dist /usr/local/php/lib/php.ini
在配置過程中,除了指定安裝目錄外,還有-with-apxs2和-with-mysql這兩個選項。-with-apxs2的作用是與 apache的工具apxs配合,產生模組檔案到目錄/usr/local/apache/modules/,同時在apache的配置檔案中寫入一行 “LoadModule php5_module        modules/libphp5.so”;
[root@myest modules]# ll
total 12212
-rw-r–r–  1 root root     8873 Jul 30 14:55 httpd.exp
-rwxr-xr-x  1 root root 12473318 Jul 31 09:29 libphp5.so
選項-with-mysql的作用非常重要,如果不加這個,以後在使用web管理工具postfixadmin時將出現不能連線資料庫的錯誤。接著我們需要把php與apache整合在一起,這個過程很簡單,由於在安裝php時已經完成了一部分工作,接下來只要在apache的配置檔案 httpd.conf加上”AddType application/x-httpd-php .php”這麼一行就行了(注意:.php前面有一個空格)。在目錄/usr/local/apache/htdocs下建立一個最簡單的php測試檔案,其內容為:
 
vi test.php
<?
 
phpinfo();
?>
檢查一下apache配置檔案是否正確(/usr/local/apache/bin/apachectl -t),輸出”Syntax OK”後就可以啟動apache服務(/usr/local/apache/bin/apachectl start)。在別的機器的瀏覽器輸入我們配置的這個伺服器的url,正常的話,將得到類似下圖的頁面:
 
圖 3
上面幾個軟體的安裝相對來說還是比較容易操作的,這裡我全是用GNU原始碼定製安裝,這相對於2進位制包的安裝方式而已,有幾個好處:①軟體的相互依賴性較小(安裝過rpm包的人對這個應該有深刻的認識)。②跨平臺。這樣的安裝方式適用各種unix/linux系統。③維護方便。使用了選項- prefix指定安裝目錄,所有的檔案目錄都集中在這個安裝目錄裡,維護起來非常方便。因此,在這裡強烈推薦大家適用GNU原始碼方式安裝。
◆安裝和配置SASL、Authlib
最好先安裝courier-authlib。為什麼呢?因為後面配置 SASL驗證smtp時需要authlib的socket路徑。
1、安裝和配置courier-authlib
1)安裝
tar jxvf courier-authlib-0.59.3.tar.bz2
cd courier-authlib-0.59.3
./configure –with-redhat –with-authmysql=yes –with-mailuser=vmail –with-mailgroup=vmail –with-mysql-libs=/usr/local/mysql/lib/mysql –with-mysql-includes=/usr/local/mysql/include/mysql
–prefix=/usr/local/authlib –without-stdheaderdir
make
make install
make install-configure
一般情況下,anthlib的安裝應該是容易完成的。安裝完成後,我們先找出配置檔案中authdaemonvar的設定,這個值是幹什麼用的呢?它是後面SASL驗證SMTP所必須的,因此需要先把它找出來,以便後面的配置能夠準確無誤。關於這個問題的教訓,在配置sasl的時候再做說明。在我的安裝中,authdaemonvar的設定如下:
 
[root@mail ~]# grep “authdaemonvar” /usr/local/authlib/etc/authlib/authdaemonrc
##NAME: authdaemonvar:2
# authdaemonvar is here, but is not used directly by authdaemond.  It`s
authdaemonvar=/usr/local/authlib/var/spool/authdaemon
(2)配置authlib.在目錄/usr/local/authlib/etc/authlib中,修改檔案authdaemonrc及authmysqlrc。
 
vi /usr/local/authlib/etc/authlib/authdaemonrc 
authmodulelist=”authmysql”
authmodulelistorig=”authmysql”
DEBUG_LOGIN=2
 
修改上面3項,其他的項保持不便。這個修改前2行表示用mysql認證模組;把DEBUG_LOGIN的值有預設的“0”改成“2”的用意是執行postfix時有更多的資訊輸出,通過生成的日誌以幫助排錯。
 
vi /usr/local/authlib/etc/authlib/authmysqlrc 
MYSQL_SERVER localhost
MYSQL_USERNAME postfix
MYSQL_PASSWORD postfix
MYSQL_DATABASE postfix
MYSQL_SOCKET /tmp/mysql.sock
MYSQL_USER_TABLE mailbox
#MYSQL_CRYPT_PWFIELD password
MYSQL_CLEAR_PWFIELD password
DEFAULT_DOMAIN sery.com
MYSQL_UID_FIELD `1001`
MYSQL_GID_FIELD `1001`
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD `/var/mailbox/`
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD maildir
MYSQL_QUOTA_FIELD concat(quota,’S’)
MYSQL_WHERE_CLAUSE active=`1`
照上面的格式修改,這是比較容易出錯的地方,要特別小心。我曾經把MYSQL_USER_TABLE mailbox這一項的mailbox寫成mailbov導致sasl驗證一直沒法通過!特別注意MYSQL_UID_FIELD和MYSQL_GID_FIELD欄位的值,這裡是‘1001’,也可以是其它的,但一定要與vmail使用者及組相一致(id vmail可以得出這2者的值)
2、安裝和配置SASL.
(1)安裝
tar zxvf cyrus-sasl-2.1.21.tar.gz
cd cyrus-sasl-2.1.21
./configure  –disable-anon -enable-plain –enable-login  –enable-sql –with-mysql=/usr/local/mysql  –with-mysql-includes=/usr/local/mysql/include/mysql  –with-mysql-libs=/usr/local/mysql/lib/mysql  –with-authdaemond
make
make install
如果在編譯過程(make)出現錯誤,如“client.c:64: error: static declaration of `global_callbacks` follows non-staticdeclaration saslint.h:112…”,需要加一個補丁程式,然後再執行編譯過程。補充:如果使用cyrus-sasl-2.1.21這個版本,則不會出現這個問題.
用vi在當前位置建立補丁檔案,起名為sasl.patch,其內容包括:
 
— cyrus-sasl-2.1.20/lib/client.c~     2003-11-11 11:26:06.000000000 -0500
+++ cyrus-sasl-2.1.20/lib/client.c      2005-05-31 22:34:14.000000000 -0400
@@ -61,7 +61,7 @@
 
 static cmech_list_t *cmechlist; /* global var which holds the list */
 
-static sasl_global_callbacks_t global_callbacks;
+sasl_global_callbacks_t global_callbacks;
 
 static int _sasl_client_active = 0;

ln -s /usr/local/lib/sasl2 /usr/lib/sasl2  //sasl的安裝目錄是/usr/local/lib/sasl
echo “/usr/local/lib” >> /etc/ld.so.conf  //指定動態連線庫的位置
ldconfig                   //共享動態連結庫生效
(2) 配置
建立檔案 /usr/local/lib/sasl2/smtpd.conf,並加入如下內容:
pwcheck_method: authdaemond
mech_list: PLAIN LOGIN
log_level: 3
authdaemond_path: /usr/local/authlib/var/spool/authdaemon/socket
最後一行authdaemond_paeth的設定來自anthlib 的配置檔案authlibdaemonrc,千萬不要把這個弄錯了,我當初的smtp驗證一直通不過就是由於這個原因。通過檢視程式也可以知道這個路徑(前提是authlib正常執行了),如下圖所示:
 
圖 4
Sasl2需要使用檔案/usr/local/authlib/var/spool/authdaemon/socket,但預設情況下,其屬性是744,需要把它加上執行許可權,以便檔案屬組(主)而外的其它使用者可以執行。執行命令
chmod +x /usr/local/authlib/var/spool/authdaemon
即可,如果不這樣處理,smtp驗證無一例外會失敗的。那麼這裡所說的其它使用者是什麼使用者呢?答:postfix。

◆安裝和配置postfixadmin
Postfixadmin是postfix郵件系統的web管理工具,有了這個工具,管理和維護使用者帳號就方便多了。假如不用工具,就需要手動修改資料庫,誰願意這樣做?安裝postfixadmin比較簡單,解壓包postfixadmin-2.2.11.tar.gz,然後把它移動到某個目錄下,其過程如下:
cd /root
tar zxvf postfixadmin-2.2.11.tar.gz
mv postfixadmin-2.2.11 /var/www/postfixadmin
現在postfixadmin的目錄是/var/www/postfixadmin,為了能夠讓它按照我們的意願工作,需要用命令 chown -R vmail:vmail /var/www/postfixadmin 更改屬主。這樣,postfixadmin的安裝就算完成了。接著我們來配置它,這個過程要複雜一點,我在這裡分幾步進行。
(1)修改相關的配置檔案。Postfixadmin第一個需要修改配置檔案是config.inc.php, 但事實上卻沒有這個檔案,不要緊,把config.inc.php.sample搬過來就是了(cp config.inc.php.sample config.ini.php),再來看一下目錄結構:
 
[root@mailserv2 postfixadmin]# pwd
/var/www/postfixadmin
[root@mailserv2 postfixadmin]ll
total 236
drwxr-xr-x 2 vmail vmail  4096 Sep 16 16:06 ADDITIONS
drwxr-xr-x 2 vmail vmail  4096 Sep 16 19:31 admin
-rw-r–r– 1 vmail vmail  1195 Sep 16 16:06 BACKUP_MX.TXT
-rw-r–r– 1 vmail vmail 10155 Sep 16 16:06 CHANGELOG.TXT
-rw-r—– 1 vmail vmail  4700 Sep 16 16:14 config.inc.php
-rw-r–r– 1 vmail vmail  4694 Sep 16 16:06 config.inc.php.sample
-rw-r—– 1 vmail vmail  3774 Sep 16 16:06 create-alias.php
-rw-r—– 1 vmail vmail  7379 Sep 16 19:24 create-mailbox.php
-rw-r–r– 1 vmail vmail  4910 Sep 16 16:06 DATABASE_MYSQL.TXT
-rw-r–r– 1 vmail vmail  4955 Sep 16 16:06 DATABASE_PGSQL.TXT
-rw-r—– 1 vmail vmail  2497 Sep 16 19:30 delete.php
-rw-r—– 1 vmail vmail  1727 Sep 16 16:06 edit-active.php
-rw-r—– 1 vmail vmail  3013 Sep 16 16:06 edit-alias.php
-rw-r—– 1 vmail vmail  4026 Sep 16 16:06 edit-mailbox.php
-rw-r—– 1 vmail vmail 25031 Sep 16 16:06 functions.inc.php
drwxr-xr-x 2 vmail vmail  4096 Sep 16 16:06 images
-rw-r—– 1 vmail vmail  3994 Sep 16 16:06 index.php
-rw-r–r– 1 vmail vmail  2655 Sep 16 16:06 INSTALL.TXT
drwxr-xr-x 2 vmail vmail  4096 Sep 16 16:06 languages
-rw-r–r– 1 vmail vmail  1651 Sep 16 16:06 LANGUAGE.TXT
-rw-r–r– 1 vmail vmail  5375 Sep 16 16:06 LICENSE.TXT
-rw-r—– 1 vmail vmail  1743 Sep 16 16:06 login.php
-rw-r—– 1 vmail vmail   494 Sep 16 16:06 logout.php
-rw-r—– 1 vmail vmail   869 Sep 16 16:06 main.php
-rw-r–r– 1 vmail vmail   981 Sep 16 16:06 motd-admin.txt.orig
-rw-r–r– 1 vmail vmail   262 Sep 16 16:06 motd.txt
-rw-r–r– 1 vmail vmail   262 Sep 16 16:06 motd-users.txt
-rw-r—– 1 vmail vmail  4827 Sep 16 16:06 overview.php
-rw-r—– 1 vmail vmail  2314 Sep 16 16:06 password.php
-rwxr-xr-x 1 vmail vmail   392 Sep 16 16:08 postfix_chmod.sh
-rw-r—– 1 vmail vmail  3233 Sep 16 16:06 search.php
-rw-r—– 1 vmail vmail  2119 Sep 16 16:06 sendmail.php
-rw-r—– 1 vmail vmail  5506 Sep 16 16:06 setup.php
-rw-r—– 1 vmail vmail  4204 Sep 16 16:06 stylesheet.css
-rw-r–r– 1 vmail vmail   456 Sep 16 16:06 TABLE_BACKUP_MX.TXT
-rw-r–r– 1 vmail vmail  3737 Sep 16 16:06 TABLE_CHANGES.TXT
drwxr-xr-x 2 vmail vmail  4096 Sep 16 16:06 templates
-rw-r–r– 1 vmail vmail  2303 Sep 16 16:06 UPGRADE.TXT
drwxr-xr-x 2 vmail vmail  4096 Sep 16 16:06 users
-rw-r—– 1 vmail vmail  1949 Sep 16 16:06 variables.inc.php
-rw-r—– 1 vmail vmail  1965 Sep 16 16:06 viewlog.php
drwxr-xr-x 2 vmail vmail  4096 Sep 16 16:06 VIRTUAL_VACATION
在上面的目錄輸出中,我將要處理的檔案或目錄用了粗字型來標識了,先從config.ini.php動手吧。
 
[root@mailserv2 postfixadmin]# more config.inc.php
 
//
// Postfix Admin
// by Mischa Peters
// Copyright (c) 2002 – 2005 High5!
// License Info: [url]http://www.postfixadmin.com/?file=LICENSE.TXT[/url]
//
// File: config.inc.php
//
if (ereg (“config.inc.php”, $_SERVER[`PHP_SELF`]))
{
   header (“Location: login.php”);
   exit;
}
 
// Postfix Admin Path
// Set the location to your Postfix Admin installation here.
$CONF[`postfix_admin_url`] = “;
$CONF[`postfix_admin_path`] = “;
 
// Language config
// Language files are located in `./languages`.
$CONF[`default_language`] = `cn`;
 
// Database Config
// mysql = MySQL 3.23 and 4.0
// mysqli = MySQL 4.1
// pgsql = PostgreSQL
$CONF[`database_type`] = `mysql`;
$CONF[`database_host`] = `localhost`;
$CONF[`database_user`] = `postfixadmin`;
$CONF[`database_password`] = `postfixadmin`;
$CONF[`database_name`] = `postfix`;
$CONF[`database_prefix`] = “;
…………………………省略若干……………………………………….
// Mailboxes
// If you want to store the mailboxes per domain set this to `YES`.
// Example: /usr/local/virtual/domain.tld/username@domain.tld
$CONF[`domain_path`] = `YES`;
// If you don`t want to have the domain in your mailbox set this to `NO`.
// Example: /usr/local/virtual/domain.tld/username
$CONF[`domain_in_mailbox`] = `NO`;
…………………………省略若干……………………………………….
// Default Domain Values
// Specify your default values below. Quota in MB.
$CONF[`aliases`] = `1000`;
$CONF[`mailboxes`] = `1000`;
$CONF[`maxquota`] = `1000`;
…………………………省略若干……………………………………….
// Quota
// When you want to enforce quota for your mailbox users set this to `YES`.
$CONF[`quota`] = `NO`;
// You can either use `1024000` or `1048576`
$CONF[`quota_multiplier`] = `1024000`;
…………………………省略若干……………………………………….
?>
被改動過的內容用紅色粗體標記出來了,這些值可根據實際情況作修改。下一個需要修改的檔案是create-mailbox.php:
[root@mailserv2 postfixadmin]# more  create-mailbox.php
 
//
// Postfix Admin
// by Mischa Peters
// Copyright (c) 2002 – 2005 High5!
// License Info: [url]http://www.postfixadmin.com/?file=LICENSE.TXT[/url]
……………………………………省略若干…………………………………….
$tQuota = $CONF[`maxquota`];
system(“sudo /usr/sbin/maildirmake.sh $fDomain “.$_POST[`fUsername`]);
if ($fMail == “on”)
……………………………………省略若干…………………………………….
?>
紅色字型那行是需要插入的,它的位置在210行,不要把位置放錯了,因為檔案中有2行是”$tQuota = $CONF[`maxquota`];”一定要把它放在第209行的那個”$tQuota = $CONF[`maxquota`];”的後面才會有作用。在這裡,很有必要解釋一下插入這行的作用–在php指令碼中執行系統的shell指令碼–直接的後果就是建立使用者的郵箱目錄,這與執行在linux下執行命令列sudo /usr/sbin/maildirmake.sh sery.com sey相當。接下來我們修改檔案delete.php:
[root@mailserv2 postfixadmin]# vi delete.php
……………………………………….省略很多………………………………
 
require (“./variables.inc.php”);
require (“./config.inc.php”);
require (“./functions.inc.php”);
include (“./languages/” . check_language () . “.lang”);
$SESSID_USERNAME = check_session();
……………………………………….省略很多………………………………     $result = db_query (“SELECT * FROM mailbox WHERE username=`$fDelete` AND domain=`$fDomain`”);
      $userarray=explode(“@”,$fDelete);
      $user=$userarray[0];
      $domain=$userarray[1];
      system(“sudo /usr/sbin/maildirdel.sh $domain $user”);
……………………………………….省略很多………………………………
 ?>
紅色字型標示的那4行是需要插入的,位置也是至關重要的,不能弄錯。到了這一步,還是沒有完成,還需要進目錄admin裡修改2個同名檔案 admin/create-mailbox.php和admin/delete.php,修改的方法是一樣的,只是插入位置的行號不同(如 admin/create-mail在200行的位置插入),見下面的截圖:
 
圖 5
這裡有一個疑惑:為什麼在不同的目錄下有相同的檔案呢?這是出於安全方面的原因。Postfixadmin把管理員分成2種:超級郵件系統管理員和一般郵件系統管理員,在admin目錄裡的是超級管理員的目錄,而普通的郵件系統管理員在/var/www/postfixadmin這個目錄。在上述過程中,我們使用了2個shell指令碼/usr/sbin/maildirdel.sh及/usr/sbin/maildirmake.sh,這些指令碼的內容和作用將在後面安裝配置maildrop時一併給出。
(2) 在mysql中建立postfix所需的資料庫。
 
[root@mailserv2 ~] # cd /var/www/postfixadmin 
[root@mailserv2 ~] # mysql -u root < DATABASE_MYSQL.TXT
(3) 測試postfixadmin。先修改apache的配置檔案/usr/local/apache/conf/httpd.conf,加入如下內容:
Alias /postfixadmin /var/www/postfixadmin
<Directory /var/www/postfixadmin>
     Options Indexes FollowSymLinks
     AllowOverride None
     Order allow,deny
     Allow from all
</Directory>
 
<Directory “/var/www/postfixadmin/admin”>
    AuthType Basic
    Options None
    AllowOverride None
    Order allow,deny
    Allow from all
    AuthName “sery.mail Access”
    AuthUserFile /usr/local/apache/conf/htpasswd
    Require valid-user
</Directory>
 
儲存後重起apache服務(/usr/local/apache/bin/apachectl restart),然後在別的機器的瀏覽器輸入郵件伺服器的url如:[url]http://mail.sery.com/postfixadmin[/url] 
 
圖 6
點選連結 setup,如果出現的都是ok,則表明postfixadmin配置正確。
 
圖 7
 
預設情況下,很有可能沒有安裝pcre(Perl Compatible Regular Expressions)這個軟體包。這個包是必須的,如果沒有這個包,安裝courier-maildrop將不能正常進行,關於pcre的安裝,我們把它放到maildrop安裝這一部分。
Postfix安裝和配置
這是郵件系統的核心部分,因此安裝和配置是比較複雜的,特別是做配置時要格外小心,有時還需要反覆修改,反覆測試。
(1)安裝postfix.
[root@mailserv2 ~]# cd
[root@mailserv2 ~]# tar zxvf  postfix-2.2.11.tar.gz
[root@mailserv2 ~]# cd postfix-2.2.11
[root@mailserv2 postfix-2.2.11]# make -f Makefile.init makefiles `CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include/mysql -DUSE_SASL_AUTH -I/usr/local/include/sasl` `AUXLIBS=-L/usr/local/mysql/lib/mysql -lmysqlclient -lz -lm -L/usr/local/lib -lsasl2`
如果沒有意外,make這一步很快就執行完了,接下來就是安裝,使用的命令是:
[root@mailserv2 postfix-2.2.11]# make install
程式先自動執行一陣子,然後會進入互動狀態,等待使用者的輸入,一般情況下,一路回車即可完成所有的安裝。
(2)配置postfix。Postfix有本身有2個需要修改的配置檔案/etc/postfix/main.cf和/etc/postfix/master.cf,因為我們要用mysql虛擬帳號,因此需要手動加一些配置檔案,下面挨個來做這些配置。
①main.cf。這個檔案有很多行註釋,察看起來不是很方便,先用命令 [root@mailserv2 postfix]# sed -n `/^#/!p`  /etc/postfix/main.cf > /etc/postfix/main.cf.new 去掉註釋行並生成新檔案/etc/postfix/main.cf.new,然後再把它覆蓋到 /etc/postfix/main.cf (cp /etc/postfix/main.cf.new /etc/postfix/main.cf)。修改後的檔案如下所示:
[root@mailserv2 postfix]# more main.cf
 
config_directory = /etc/postfix
readme_directory = no
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
html_directory = no
setgid_group = postdrop
command_directory = /usr/sbin
manpage_directory = /usr/local/man
daemon_directory = /usr/libexec/postfix
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
queue_directory = /var/spool/postfix
mail_owner = postfix
###########################################################
content_filter = smtp-amavis:[127.0.0.1]:10024
max_use = 10
 
#=====================BASE=========================
myhostname = mail2.sery.com
mydomain = mail.sery.com
myorigin = $mydomain
mydestination = $myhostname localhost localhost.$mydomain
mynetworks = 127.0.0.0/8 220.94.159.0/24
inet_interfaces = all
 
#=====================Vritual Mailbox settings======================
virtual_mailbox_base = /var/mailbox
virtual_mailbox_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql/mysql_virtual_domains_maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql/mysql_virtual_alias_maps.cf
virtual_uid_maps = static:1001
virtual_gid_maps = static:1001
virtual_transport = maildrop
maildrop_destination_recipient_limit = 1
maildrop_destination_concurrency_limit = 1
 
#====================QUOTA========================
message_size_limit = 14336000
virtual_mailbox_limit = 20971520
virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Sorry, the user`s maildir has overdrawn his diskspace quota, please try again later.
virtual_overquota_bounce = yes
 
#====================SASL========================
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_invalid_hostname,
reject_non_fqdn_hostname,
reject_unknown_sender_domain,
reject_non_fqdn_sender,reject_non_fqdn_recipient,
reject_unknown_recipient_domain,reject_unauth_pipelining,
reject_unauth_destination,
permit
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous
smtpd_sasl_application_name = smtpd
smtpd_banner=$myhostname ESMTP “Version not Available”
 
alias_maps = hash:/etc/aliases
unknown_local_recipient_reject_code = 450
上述配置中,需要特別注意的是mydomain和myhostname,這2個項的值不要設定成一樣,否則postfix將不能正確啟動。第2個要注意的地方是 virtual_uid_maps及virtual_gid_maps的值,它是vmail使用者的uid和vmail組的gid,與前面的檔案 /usr/local/authlib/etc/authlib/authmysqlrc的 “MYSQL_UID_FIELD””MYSQL_GID_FIELD”一定要保持一致,本案的uid和gid都是1001.任何情況下,通過執行
root@mailserv2 postfix]#  id vmail
uid=1001(vmail) gid=1001(vmail) groups=1001(vmail)
察看uid和gid。”content_filter = smtp-amavis:[127.0.0.1]:10024″這一行是防病毒和反垃圾郵件用的,稍後再做說明。
②建立目錄/etc/postfix/mysql,然後手動建立四個配置檔案:mysql_virtual_alias_maps.cf, mysql_virtual_domains_maps.cf,mysql_virtual_mailbox_limit_maps.cf, mysql_virtual_mailbox_maps.cf。這4個檔案的內容分別如下:
[root@mailserv2 mysql]# more mysql_virtual_alias_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = alias
select_field = goto
where_field = address
 
[root@mailserv2 mysql]# more mysql_virtual_domains_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = domain
select_field = description
where_field = domain
 
[root@mailserv2 mysql]# more mysql_virtual_mailbox_limit_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = mailbox
select_field = quota
where_field = username
 
[root@mailserv2 mysql]# more mysql_virtual_mailbox_maps.cf
user = postfix
password = postfix
hosts = localhost
dbname = postfix
table = mailbox
select_field = maildir
where_field = username
另外一個配置檔案是/etc/postfix/master.cf,由於需要修改的地方不是很多,可以先在這裡把它配置好。
[root@mailserv2 postfix]# more master.cf
#
# Postfix master process configuration file.  For details on the format
# of the file, see the Postfix master(5) manual page.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       –       n       –       –       smtpd
#submission inet n      –       n       –       –       smtpd
#       -o smtpd_etrn_restrictions=reject
#       -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#smtps    inet  n       –       n       –       –       smtpd
#  -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes
#submission   inet    n       –       n       –       –       smtpd
#  -o smtpd_etrn_restrictions=reject
#  -o smtpd_enforce_tls=yes -o smtpd_sasl_auth_enable=yes
#628      inet  n       –       n       –       –       qmqpd
pickup    fifo  n       –       n       60      1       pickup
cleanup   unix  n       –       n       –       0       cleanup
qmgr      fifo  n       –       n       300     1       qmgr
#qmgr     fifo  n       –       n       300     1       oqmgr
tlsmgr    unix  –       –       n       1000?   1       tlsmgr
rewrite   unix  –       –       n       –       –       trivial-rewrite
bounce    unix  –       –       n       –       0       bounce
defer     unix  –       –       n       –       0       bounce
trace     unix  –       –       n       –       0       bounce
verify    unix  –       –       n       –       1       verify
flush     unix  n       –       n       1000?   0       flush
proxymap  unix  –       –       n       –       –       proxymap
smtp      unix  –       –       n       –       –       smtp
# When relaying mail as backup MX, disable fallback_relay to avoid MX loops
relay     unix  –       –       n       –       –       smtp
        -o fallback_relay=
#       -o smtp_helo_timeout=5 -o smtp_connect_timeout=5
showq     unix  n       –       n       –       –       showq
error     unix  –       –       n       –       –       error
discard   unix  –       –       n       –       –       discard
local     unix  –       n       n       –       –       local
virtual   unix  –       n       n       –       –       virtual
lmtp      unix  –       –       n       –       –       lmtp
anvil     unix  –       –       n       –       1       anvil
scache    unix  –       –       n       –       1       scache
#
# ====================================================================
# Interfaces to non-Postfix software. Be sure to examine the manual
# pages of the non-Postfix software to find out what options it wants.
#
# Many of the following services use the Postfix pipe(8) delivery
# agent.  See the pipe(8) man page for information about ${recipient}
# and other message envelope options.
# ====================================================================
#
# maildrop. See the Postfix MAILDROP_README file for details.
# Also specify in main.cf: maildrop_destination_recipient_limit=1
#
maildrop  unix  –       n       n       –       –       pipe
  flags=DRhu user=vmail:vmail argv=/usr/local/maildrop/bin/maildrop -d ${recipient}
#
# The Cyrus deliver program has changed incompatibly, multiple times.
#
old-cyrus unix  –       n       n       –       –       pipe
  flags=R user=cyrus argv=/cyrus/bin/deliver -e -m ${extension} ${user}
# Cyrus 2.1.5 (Amos Gouaux)
# Also specify in main.cf: cyrus_destination_recipient_limit=1
cyrus     unix  –       n       n       –       –       pipe
  user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}
#
# See the Postfix UUCP_README file for configuration details.
#
uucp      unix  –       n       n       –       –       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender – $nexthop!rmail ($recipient)
#
# Other external delivery methods.
#
ifmail    unix  –       n       n       –       –       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  –       n       n       –       –       pipe
  flags=Fq. user=foo argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient
 
#############################################################################
#                antispam                                                   #
#############################################################################
smtp-amavis unix – – n – 2 smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
  -o disable_dns_lookups=yes
 
localhost:10025 inet n – n – – smtpd
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o mynetworks=127.0.0.0/8
  -o smtpd_helo_restrictions=
  -o smtpd_client_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o strict_rfc821_envelopes=yes
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000
這個配置檔案,”flags=DRhu user=vmail:vmail argv=/usr/local/maildrop/bin/maildrop -d ${recipient}”是修改過的,flags前面必須有2個空格,這點值得注意。至於”argv= /usr/local/maildrop/bin/maildrop”則是maildrop安裝的路徑及maildrop二進位制執行檔案的位置,當我們安裝maildrop檔案時,一定要和這個位置相一致。檔案從註釋框 “antispam”後的一部分內容,是過濾垃圾郵件用的。
到這裡,postfix的配置檔案基本上算配好了,但是其它相依賴的軟體還沒有安裝和配置好,因此不能執行和測試postfix,等所有的相關軟體安裝和配置正確後再進行這個步驟。

Corurier-imap安裝配置
Postfix只是實現郵件系統的smtp功能,pop3或imap則需要另外的軟體來實現,這個軟體就是courier-imap(當然也有別的軟體可以選擇)。
(1)安裝courier-imap
 
[root@mailserv2 ~]# cd
[root@mailserv2 ~]# tar jxvf courier-imap-4.1.3.tar.bz2
[root@mailserv2 ~]# cd courier-imap-4.1.3
 [root@mailserv2courier-imap-4.1.3]#./configure  –prefix=/usr/local/imap  –with-redhat 
–disable-root-check  –enable-unicode=utf-8,iso-8859-1,gb2312,gbk,gb18030
–with-trashquota  –with-dirsync –with-mysql-libs=/usr/local/mysql/lib/mysql –with-mysql-includes=/usr/local/mysql/include/mysql/ –with-authmysql –with-authmysql=yes
[root@mailserv2 courier-imap-4.1.3]# make
[root@mailserv2 courier-imap-4.1.3]# make install
[root@mailserv2 courier-imap-4.1.3]# make install-configure
 
(2)修改配置檔案/usr/local/imap/etc/pop3d及/usr/local/imap/etc/imapd。把/usr/local/imap/etc/pop3d 檔案的行”POP3DSTART=NO”改成”POP3DSTART=YES”,再依照這個形式把檔案 /usr/local/imap/etc/imapd的行”IMAPDSTART=NO”改成”IMAPDSTART=YES”即可。
(3)複製檔案 courier-imap.sysvinit到目錄/usr/local/imap/sbin,以便於啟動imap的守護程式。
[root@mailserv2 courier-imap-4.1.3]# cp courier-imap.sysvinit /usr/local/imap/sbin/imapd
(4)測試imap服務。
[root@mailserv2 courier-imap-4.1.3]# /usr/local/imap/sbin/imapd  start
Starting Courier-IMAP server: imap pop3
◆安裝courier-maildrop
Maiidrop的作用是本地投遞,即把收到的郵件移動到相應的使用者目錄。在前面配置postfix的時候,我們已經把與maildrop相關的東西寫進檔案/etc/postfix/master.cf了,因此這裡就不再敘述。前面的步驟我們也提到過pcre 這個軟體,它是安裝maildrop所必須的,所以需要先安裝這個軟體(如果系統不存在這個軟體的話)。
 
[root@mailserv2 courier-imap-4.1.3]# cd
[root@mailserv2 courier-imap-4.1.3]# tar jxvf pcre-7.2.tar.bz2
[root@mailserv2 courier-imap-4.1.3]# cd pcre-7.2
[root@mailserv2 courier-imap-4.1.3]# ./configure
[root@mailserv2 courier-imap-4.1.3]# make
[root@mailserv2 courier-imap-4.1.3]# make install
//安裝pcre應該是非常容易的事情,片刻之間就可搞定,接下來安裝maildrop.在執行配置過程中,需要很多選項,不要疏漏。
[root@mailserv2 pcre-7.2]# cd
[root@mailserv2 pcre-7.2]# tar jxvf maildrop-2.0.4.tar.bz2
[root@mailserv2 pcre-7.2]# cd maildrop-2.0.4
[root@mailserv2 maildrop-2.0.4]# ./configure  –prefix=/usr/local/maildrop  –enable-
sendmail=/usr/sbin/sendmail –enable-trusted-users=`root vmail`  –enable-syslog=1 
–enable-maildirquota  –enable-maildrop-uid=1001  –enable-maildrop-gid=1001  –with
-trashquota –with-dirsync
[root@mailserv2 maildrop-2.0.4]# make
[root@mailserv2 maildrop-2.0.4]# make install
[root@mailserv2 maildrop-2.0.4]# cp /usr/local/maildrop/bin/maildrop /usr/bin
 
下面的命令簡單驗證maildrop
 
[root@mailserv2 ~]# maildrop –v
maildrop 2.0.4 Copyright 1998-2005 Double Precision, Inc.
GDBM extensions enabled.
Courier Authentication Library extension enabled.
Maildir quota extension enabled.
This program is distributed under the terms of the GNU General Public
License. See COPYING for additional information.
輸出內容一定要有”Courier Authentication Library extension enabled”這一行。如果沒有這個輸出,那是非常不幸的事情了,返回去挨個排錯吧。那麼這個”Courier Authentication Library extension enabled”是怎麼一回事呢?這表明maildrop已經和前面我們安裝配置的SASL和courier-authlib緊密結合在一起了。
知道maildrop把郵件移動到哪個使用者目錄還是非常有必要的,這個操作就是maildrop的日誌記錄。這裡我們建立一個新檔案/etc/maildroprc,這個檔案就2行內容:
 
[root@mailserv2 mailbox]# more /etc/maildroprc
logfile “/var/mailbox/maildrop.log” 
to “$HOME/$DEFAULT”
我們來看一個正常執行的postfix郵件系統的maildrop日誌,就會對maildrop有更清楚的認識。
 
[root@mailserv2 mailbox]# tail  maildrop.log
Date: Sat Oct  6 12:45:20 2007
From: “Saundra Y. Echols” <saundra@MS13.HINET.NET>
Subj: No girls laugh at me now, haha, i laugh at them
File: /mail/mailbox//sery.com/magazine/                              (3355)

上面的日誌表明收到一封來自Saundra@ms13.hinet.net的信,maildrop把郵件移動到目錄/mail/mailbox/sery.com/magazine。

很可惜maidrop沒有建立和刪除郵件使用者目錄的能力,在配置postfixadmin時,我們提到需要使用2個shell指令碼 /usr/sbin/maildirdel.sh及/usr/sbin/maildirmake.sh,這2個指令碼的作用就是用來彌補maildrop不能建立/刪除目錄這個缺陷的。
 
[root@mailserv2 ~]# more /usr/sbin/maildirmake.sh
#!/bin/bash
set -e
if [ ! -d /var/mailbox/$1 ]
then
mkdir /var/mailbox/$1
fi 
chown -R vmail:vmail /var/mailbox/$1
cd “/var/mailbox/$1”
/usr/local/imap/bin/maildirmake $2
mkdir /var/mailbox/$1/$2/Maildir
chown -R vmail:vmail /var/mailbox/$1/$2
 
[root@mailserv2 ~]# more /usr/sbin/maildirdel.sh
#!/bin/bash
rm -rf /var/mailbox/$1/$2
這2個指令碼由web呼叫,而web(apache)的執行使用者為vmail,出於安全考慮,我們給vmail使用者的許可權非常有限,為了保證這2個 shell指令碼能正常執行,需要使用sudo這個工具來完成這個任務。儘管可以使用vi這樣的編輯器來修改/etc/sudoers這個配置檔案,但還是不及visudo可靠,因為visudo可以對修改的內容做語法檢查,如果更改不正確,儲存檔案是會給出提示。把行”vmail ALL = NOPASSWD: /usr/sbin/maildirmake.sh , /usr/sbin/maildirdel.sh”追加到檔案末尾即可!
有的時候,在postfixadmin裡建立新的郵件帳號,帳號倒是建立成功了,卻並沒有在指定的位置生成相應的虛擬使用者目錄,從網上收集的資訊來看,這個問題似乎很普遍,我本人也被這個問題困擾過–以vmail 使用者手動執行sudo /usr/sbin/maildirdel.sh就能建立目錄,用web方式就是不行-實驗多次才找出原因,原來是/etc/sudoers裡需要把 “Defaults    requiretty”這行註釋掉。有人可能要問,你怎麼知道要這樣做呢?答:我是通過看apache日誌知道要這樣乾的。
郵件病毒檢查和垃圾郵件過濾
抗病毒使用軟體是clamav,安裝時一定要用當前的最新版本。垃圾郵件過濾可使用一個名為SpamAssassin的perl模組。通過採用amavisd-new這個容器,可以把clamav和SpamAssassin整合起來。
(1)安裝配置clamav.
[root@mailserv2 ~]# useradd clamav
[root@mailserv2 ~]# cd
[root@mailserv2 ~]# cd clamav-0.91.2
[root@mailserv2 ~]# ./configure –prefix=/usr/local/clamav –with-dbdir=/usr/local/share/clamav –disable-zlib-vcheck 
[root@mailserv2 ~]# make
[root@mailserv2 ~]# make install
Clamav有2個配置檔案,一個主配置檔案/usr/local/clamav/etc/clamd.conf,一個病毒更新配置檔案/usr/local/clamav/etc/ freshclam.conf。現把修改好的配置檔案列於下面:
 
[root@mailserv2 ~]# more /usr/local/clamav/etc/freshclam.conf | sed -n `/^#/!p`
DatabaseDirectory /usr/local/share/clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogVerbose yes
LogSyslog yes
LogFacility LOG_MAIL
DatabaseOwner amavis
DatabaseMirror db.CN.clamav.net
 
DatabaseMirror database.clamav.net
[root@mailserv2 ~]# more /usr/local/clamav/etc/clamd.conf | sed -n `/^#/!p`
LogFile /var/log/clamav/clamd.log
LogSyslog yes
LogVerbose yes
PidFile /var/run/clamav/clamd.pid
DatabaseDirectory /usr/local/share/clamav
LocalSocket /var/run/clamav/clamd.socket
StreamMaxLength 20M
User amavis
ScanMail yes
ScanArchive yes
這2個檔案有很多註釋,我用sed把它過濾掉了。Clamd.conf中,有”User amavis”這樣一行。為什麼不用預設的使用者clamav而使用amavis呢?這樣做的目的是為了與amavis-new結合在一起。既然沒有這個使用者,就手動建立一個(useradd amavis)。接下來需要手動建立一些目錄並賦予相應的許可權,用來記錄日誌等用途;我把它作成一個shell指令碼,直接執行即可,指令碼的內容如下所示:
 
 [root@mailserv2 ~]# more  /root/clamav.sh
   #!/bin/bash
   # create directory for clamav
    mkdir /var/log/clamav 
chmod -R 744 /var/log/clamav 
chown -R amavis:amavis /var/log/clamav 
chown -R amavis.amavis /usr/local/share/clamav 
mkdir /var/run/clamav 
chmod 700 /var/run/clamav 
chown amavis.amavis /var/run/clamav
指令碼執行成功後,再執行 [root@mailserv2 ~]# /usr/local/clamav/bin/freshclam 手動更新病毒庫。
(2)安裝和配置avamvis-new。解壓包amavisd-new-2.5.2.tar.gz,然後把它移動到相關的位置。這裡還是用一個指令碼來做這個事情,指令碼的內容如下:
 
[root@mailserv2 ~]# more /root/amavis.sh
#!/bin/bash
cd /root
tar amavisd-new-2.5.2.tar.gz
cd  amavisd-new-2.5.2
mkdir -p /var/amavis /var/amavis/tmp /var/amavis/var /var/amavis/db 
chown -R amavis:amavis /var/amavis 
chmod -R 750 /var/amavis 
cp amavisd /usr/local/sbin/ 
chown root /usr/local/sbin/amavisd 
chmod 755 /usr/local/sbin/amavisd 
cp amavisd.conf /etc/ 
chown root /etc/amavisd.conf 
chmod 644 /etc/amavisd.conf
mkdir /var/virusmails 
chown amavis:amavis /var/virusmails 
chmod 750 /var/virusmails
執行完指令碼後別忘記檢查一下是否都按我們的意願工作,如/usr/local/sbin目錄是否有檔案amavisd。
Amavisd的配置檔案/etc/amavisd.conf比較複雜,需要修改的內容如下:
 
$max_servers=8;  
$daemon_user = `amavis`; 
$daemon_group = `amavis`; 
$mydomain = `sery.com`; 
$db_home = “$MYHOME/db”; 
$inet_socket_port = 10024; 
$sa_tag_level_deflt = -100;  
$sa_tag2_level_deflt = 6.3;  
$sa_kill_level_deflt = $sa_tag2_level_deflt; 
$virus_admin = “virusalert@$mydomain”; 
$sa_spam_subject_tag = `***SPAM*** `; 
$notify_method = $forward_method; 
$forward_method = `smtp:127.0.0.1:10025`;  
$final_virus_destiny = D_DISCARD; 
$final_banned_destiny = D_DISCARD; 
$final_spam_destiny = D_PASS; 
[`ClamAV-clamd`, 
&ask_daemon, [“CONTSCAN {}n”, “/var/run/clamav/clamd.socket”], 
qr/bOK$/, qr/bFOUND$/, 
qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
上述修改確認無誤後,執行 [root@mailserv2 ~]# /usr/local/sbin/amavisd debug 測試amavis。一般而言,測試皆不能正常進行,因為所需要的很多perl模組很可能沒有被安裝。還好,報錯資訊給出了所需的模組。這時你需要到[url]www.cpan.org[/url]下載相關的模組,然後安裝;也可能遇到包依賴,再下載依賴的包,安裝這個依賴,再反回來安裝先前那個包,如此反覆,很是煩人,極考驗人的耐性。等到 /usr/local/sbin/amavisd debug 輸出沒有錯誤方才完成。有另外一種方法,即執行 [root@mailserv2 ~]# perl MCPAN -e shell ,然後執行 cpan> install Time::HiRes 這樣的命令挨個安裝缺少的perl模組。根據我的經驗,這樣幹很耗時,並且有的模組用這種方法安裝還不靈,所以還不如在網站下載模組安裝有效。下面給出一個perl模組的安裝例項:
 
[root@mailserv2 ~]# cd
[root@mailserv2 ~]# tar zxvf BerkeleyDB-0.32.tar.gz
[root@mailserv2 ~]# cd BerkeleyDB-0.32
[root@mailserv2 ~]# perl Makefile.PL
[root@mailserv2 ~]# make
[root@mailserv2 ~]# make install
修正:用cpan 加模組名(如 cpan  Compress::Zlib),比較省事.
解決”Can`t locate Crypt/OpenSSL/RSA.pm in @IN”報錯的方法:cpan Crypt::OpenSSL::RSA即可.其它的perl模組可如法炮製.
 
Webmail安裝配置
可供postfix選擇的webmail不是很豐富,通過比較,我選擇extmail作為postfix的webmail客戶端工具,本來 extmail也包括像postfixadmin這樣的web管理工具(extman),因為前面我們已經用了postfixadmin, 這裡我只用extmail。
下載ExtMail-Solution-Linux-0.1.tar.gz後解壓,然後把它移動到目錄/var/www/extsuite/extmail。在apache的配置檔案httpd.conf末尾追加下面的內容以便使用者可以通過web方式訪問extmail:
 
DirectoryIndex  index.html index.php  index.cgi
ScriptAlias /extmail/cgi/   /var/www/extsuite/extmail/cgi/
<Directory “/var/www/extsuite/extmail/cgi”>
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>
 
Alias /extmail /var/www/extsuite/extmail/html
<Directory /var/www/extsuite/extmail/html>
     Options Indexes FollowSymLinks
     AllowOverride None
     Order allow,deny
     Allow from all
</Directory>
 
儲存檔案,重啟apache服務即可在瀏覽器輸入郵件伺服器的url訪問了。
 
圖 8
如果少了相應的perl模組,web頁面會給出提示,按照提示把perl模組安裝上去就正常了。到這裡,extmail的配置還沒有完呢,至少還有 2個檔案需要修改,這2個檔案是webmail.cf和 /var/www/extsuite/extmail/html/default/index.html.前一個是extmail的配置檔案,後一個是頁面檔案顯示方式。
webmail.cf的內容:更改過的內容用斜體紅色字型顯示
 
[root@mailserv2 extmail]# more webmail.cf
# sys_config, the config file and webmail programe root
SYS_CONFIG = /var/www/extsuite/extmail/
 
# sys_langdir, the i18n dir
SYS_LANGDIR = /var/www/extsuite/extmail/lang
 
# sys_templdir, the template dir
SYS_TEMPLDIR = /var/www/extsuite/extmail/html
 
# sys_warn, show system warning or not, default to yes
SYS_SHOW_WARN = 0
 
# sys_permit_noquota, permit an account without qouta?
SYS_PERMIT_NOQUOTA = 1
 
# sys_sess_dir, the session dir
SYS_SESS_DIR = /tmp/
 
# sys_log_on = 1 | 0 – enable logging or not
SYS_LOG_ON = 1
 
# sys_log_type = file|syslog|nsyslog, syslog will save login
# or error info into mail.*, nsyslog is a replacement to syslog
# that will send log message to network syslogd
SYS_LOG_TYPE = syslog
 
# sys_log_file – path to log file, if sys_log_type = file
SYS_LOG_FILE = /var/log/extmail.log
 
# sys_sess_timeout, session timeout, default 3 hours (3h) format:
# number+(s|m|h|d|M|y); or only number, the 0 means that the
# session will last for 0 seconds, but if you specify the
# sys_sess_cookie_only = 1 then it means the session will expire
# after you close your browser ?
SYS_SESS_TIMEOUT = 0
 
# sys_sess_cookie_only = 0|1 use cookie only or include cgi “sid”
# parameter ? if set to true(1), the session will be expired after
# sys_sess_timeout if there is no any active request from browser
SYS_SESS_COOKIE_ONLY = 1
 
# sys_user_psize, user default page_size
SYS_USER_PSIZE = 10
 
# sys_user_tsize, user mail subject truncate size, valid type:
# auto    => full text
# screen1 => 800×600
# screen2 => 1024×768
# screen3 => 1280×1024
SYS_USER_SCREEN = auto
 
# sys_user_lang, user default language
SYS_USER_LANG = en_US
 
# sys_user_template, user default template
SYS_USER_TEMPLATE = default
 
# sys_user_charset, user default charset
SYS_USER_CHARSET = utf-8
 
# sys_user_trylocal, user default outgoing encoding mechanism
SYS_USER_TRYLOCAL = 1
 
# sys_user_timezone, user default timezone
SYS_USER_TIMEZONE = +0800
 
# sys_user_* default parameters
SYS_USER_CCSENT = 0
SYS_USER_SHOW_HTML = 1
SYS_USER_COMPOSE_HTML = 1
SYS_USER_CONV_LINK =1
SYS_USER_ADDR2ABOOK = 1
 
# sys_min_pass_len, minimal password length, default 2
SYS_MIN_PASS_LEN = 2
 
# sys_mfilter_on, default is off
SYS_MFILTER_ON = 1
 
# sys_netdisk_on, default is off
SYS_NETDISK_ON = 0
 
# sys_debug_on, default is off
SYS_DEBUG_ON = 0
 
# sys auth type, mysql/ldap/authlib
SYS_AUTH_TYPE = mysql
 
# maildir_base, the base dir of user maildir, use absolute path
# if not set.
SYS_MAILDIR_BASE = /var/mailbox
 
# sys_auth_schema, vpopmail1/vpopmail2/virtual
# vpopmail1 => all user accounts in one table
# vpopmail2 => accounts in per domain table
SYS_AUTH_SCHEMA = virtual
 
# crypt_type, the default encrypt type of password, possible type
# currently is crypt|cleartext|plain|md5|md5crypt|plain-md5|ldap-md5|sha|sha1
SYS_CRYPT_TYPE = md5crypt
 
# if mysql, all relate parameters should prefix as SYS_MYSQL
SYS_MYSQL_USER = postfix
SYS_MYSQL_PASS = postfix
SYS_MYSQL_DB = postfix
SYS_MYSQL_HOST = localhost
SYS_MYSQL_SOCKET = /tmp/mysql.sock
# table name
SYS_MYSQL_TABLE = mailbox
SYS_MYSQL_ATTR_USERNAME = username
SYS_MYSQL_ATTR_DOMAIN = domain
SYS_MYSQL_ATTR_PASSWD = password
# sys_mysql_attr_clearpw – attribute to save clear password, useful for
# postmaster withdraw the original passwd if the end user forgot, but
# we highly recommend that you don`t enable it for security reason
# SYS_MYSQL_ATTR_CLEARPW = clearpwd
SYS_MYSQL_ATTR_QUOTA = quota
SYS_MYSQL_ATTR_NDQUOTA = netdiskquota
SYS_MYSQL_ATTR_HOME = homedir
SYS_MYSQL_ATTR_MAILDIR = maildir
# service enable/disable attributes
# comment them out if you don`t want their function
SYS_MYSQL_ATTR_DISABLEWEBMAIL = disablewebmail
SYS_MYSQL_ATTR_DISABLENETDISK = disablenetdisk
SYS_MYSQL_ATTR_ACTIVE = active
 
# if ldap, all relate parameters should prefix as SYS_LDAP
SYS_LDAP_BASE = o=extmailAccount,dc=example.com
SYS_LDAP_RDN = cn=Manager,dc=example.com
SYS_LDAP_PASS = secret
SYS_LDAP_HOST = localhost
# ldif attributes
SYS_LDAP_ATTR_USERNAME = mail
SYS_LDAP_ATTR_DOMAIN = virtualDomain
SYS_LDAP_ATTR_PASSWD = userPassword
# sys_ldap_attr_clearpw – attribute to save clear password, useful for
# postmaster withdraw the original passwd if the end user forgot, but
# we highly recommend that you don`t enable it for security reason
# SYS_LDAP_ATTR_CLEARPW = clearPassword
SYS_LDAP_ATTR_QUOTA = mailQuota
SYS_LDAP_ATTR_NDQUOTA = netdiskQuota
SYS_LDAP_ATTR_HOME = homeDirectory
SYS_LDAP_ATTR_MAILDIR = mailMessageStore
# service enable/disable attributes
# comment them out if you don`t want their function
SYS_LDAP_ATTR_DISABLEWEBMAIL = disablewebmail
SYS_LDAP_ATTR_DISABLENETDISK = disablenetdisk
SYS_LDAP_ATTR_ACTIVE = active
 
# if authlib, all relate parameters should prefix as AUTHLIB
SYS_AUTHLIB_SOCKET = /usr/local/authlib/var/spool/authdaemon/socket
 
# Global Abook support
# sys_g_abook_type, global abook type, valid is ldap|file, currently
# only support ldap, file module is under development ?
SYS_G_ABOOK_TYPE = file
 
# if ldap, all relate parameters should prefix as SYS_G_ABOOK_LDAP
SYS_G_ABOOK_LDAP_HOST = localhost
SYS_G_ABOOK_LDAP_BASE = ou=AddressBook,dc=example.com
SYS_G_ABOOK_LDAP_ROOTDN = cn=Manager,dc=example.com
SYS_G_ABOOK_LDAP_ROOTPW = secret
SYS_G_ABOOK_LDAP_FILTER = objectClass=OfficePerson
 
# if file, all relate parameters should prefix as SYS_G_ABOOK_FILE
SYS_G_ABOOK_FILE_PATH = /var/www/extsuite/extmail/globabook.cf
SYS_G_ABOOK_FILE_LOCK = 1
SYS_G_ABOOK_FILE_CONVERT = 0
SYS_G_ABOOK_FILE_CHARSET = utf-8
在檔案/var/www/extsuite/extmail/html/default/index.html 加入下面的標識,可以得到不同
 
<TR>
<TD><%domain%></TD>
<TD><select name=”domain” size=”1″ class=”input_select”></option><option value=”mail.sery.com”>mail.sery.com</option>
<optionvalue=”sery.com”>sery.com</option></select><!–<INPUT TYPE=”text” class=”input_n” NAME=”domain”>–></TD>
</TR> 
郵件域的下拉選單,從而方便使用者的使用。
 
 
圖 9
到這裡,postfix的安裝配置算是完成了。我們來逐個檢查這些服務的正確性,簡單的方法就是啟動每一個服務,根據服務的執行來掌握各個服務是否正常。為了方便所有服務隨開機自動啟動,我把它們都加在了檔案/etc/rc.local裡,這些內容包括:
################ normal services ############################
/usr/local/apache/bin/apachectl start
/usr/local/mysql/bin/mysqld_safe –user=mysql&
/usr/local/authlib/sbin/authdaemond start
 
############## postfix relatively ###########################
postfix start
/usr/local/imap/sbin/imapd start
 
################ antivirus and antispam #####################
/usr/bin/spamd –daemonize –pidfile /var/run/spamd.pid
/usr/local/sbin/amavisd start
/usr/local/clamav/sbin/clamd

病毒庫和垃圾郵件的列表則放在crontab裡:

[root@mailserv2 extmail]# crontab -l
0 0 1 * * root wget -N -P /usr/share/spamassassin [url]www.ccert.edu.cn/spam/sa/Chinese_rules.cf;kill[/url] -HUP `cat /var/run/spamd.pid`
00 00 * * * /usr/local/clamav/bin/freshclam
待所有的服務都正常後,用postfixadmin建立郵件域和使用者。建立完畢,通過檢視postfix日誌/var/log/maillog瞭解操作是否成功;同時通過檢視目錄/var/mailbox裡是否生成與建立的郵件帳戶同名的目錄。
郵件系統的備份
在系統崩潰以後,沒有提前備份將使你無限懊悔。一次沒有成功的線上核心升級引起的系統崩潰(在我沒來得及備份時發生),為恢復崩潰郵件系統,曾讓我精疲力竭。所以做好備份是一個好主意。當然我們不能天天手動去執行這個備份任務,用指令碼吧!下面是我的一個postfix的備份指令碼,供大家參考:
[root@mailserv2 virusalert]# more /usr/local/bin/data_backup.sh
#!/bin/bash
BackupPath=/var/data_bk
Mysql_bk_dir=$BackupPath/mysqlbk
Mail_bk_dir=$BackupPath/mailbk
LogFile=$BackupPath/backuplog
MailBoxDir=/var/mailbox
 
####################################################################
# define mysql variables                                                     #
####################################################################
NewFile=”$Mysql_bk_dir”/postfix$(date +%Y%m%d).tgz
DumpFile=”$Mysql_bk_dir”/postfix$(date +%Y%m%d).sql
OldFile=”$Mysql_bk_dir”/postfix$(date +%Y%m%d –date=`5 days ago`).tgz
DbUser=root
DbPasswd=husb^R
DbName=postfix
####################################################################
#   mysql backup proccess                                                 #
####################################################################
echo “——————————————-” >> $LogFile
echo $(date +”%y-%m-%d %H:%M:%S”) >> $LogFile
echo “————————–” >> $LogFile
#Delete Old File
if [ -f $OldFile ]
then
   rm -f $OldFile >> $LogFile 2>&1
   echo “[$OldFile]Delete Old File Success!” >> $LogFile
else
   echo “[$OldFile]No Old Backup File!” >> $LogFile
fi
 
if [ -f $NewFile ]
then
   echo “[$NewFile]The Backup File is exists,Can`t Backup!” >> $LogFile
else
    cd $Mysql_bk_dir
/usr/local/mysql/bin/mysqldump -u $DbUser -p$DbPasswd –opt $DbName > $DumpFile
    tar czf $NewFile postfix$(date +%Y%m%d).sql >> $LogFile 2>&1
    echo “[$NewFile]Backup Success!” >> $LogFile
    rm -rf $DumpFile
fi
 
######################################################################
#     backup mail`s user directories and files                                    #
######################################################################
MailFileBk=$Mail_bk_dir/mail$(date +%Y%m%d).tgz
OldMailFileBk=$Mail_bk_dir/mail$(date +%Y%m%d –date=`14 days ago`).tgz
 
if [ -f $OldMailFileBk ]
then
   rm -rf $OldMailFileBk
fi
 
if [  -f $MailFileBk ]
   then
   echo “[$MailFileBk]The Backup File is exists,Can`t Backup!” >> $LogFile
   else
   cd /mail
   tar czf $MailFileBk mailbox  >> $LogFile 2>&1
fi
 
echo “——————————————-” >> $LogFile
這個指令碼對postfix資料庫和使用者的郵件做了備份。因為磁碟空間始終是有限的,因此是一邊備份一邊刪除就的備份。如果條件允許,建議進行異地備份。手動執行一下這個指令碼,看它是否按我們的意願工作了,如果一些如願,則把它放入crontab裡讓它每晚自動進行。
[root@mailserv2 ~]# crontab -l
0 0 1 * * root wget -N -P /usr/share/spamassassin [url]www.ccert.edu.cn/spam/sa/Chinese_rules.cf;kill[/url] -HUP `cat /var/run/spamd.pid`
00 01 * * * /usr/local/bin/data_backup.sh
00 00 * * * /usr/local/clamav/bin/freshclam

系統加固及安全

1、核心優化:用指令碼實現
[root@mailserv2 ~]# more /usr/local/bin/kernel_optimize
#!/bin/bash
#kernel optimize optimize ,create by 2007-7-29
 
#enable broadcast echo protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
 
#disble source routed packets
#for f in /proc/sys/net/ipv4/conf/*/accept_source_rout; do
#    echo 0 > $f
#done
 
#enable tcp syn cookie protection
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
 
#disable icmp redirect acceptance
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
    echo 0 > $f
done
 
#don`t send redirect messages
for f in /proc/sys/net/ipv4/conf/*/send_redirects; do
    echo 0 > $f
done
 
#drop spoofed packets
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
    echo 1 > $f
done
 
#log packets with impossible addresses
for f in /proc/sys/net/ipv4/conf/*/log_martians; do
    echo 1 > $f
done
2、防火牆策略:在配置postfix連線mysql資料庫時,使用者名稱postfix,密碼postfix,類似的情形還有好幾處呢。如果某人在別的機器用mysql客戶端連線郵件伺服器的mysql資料庫,不費吹灰之力就可以把郵件帳號全刪了,這肯定會激起使用者的憤怒!趕快把這個漏洞堵上,下面是我的防火牆策略指令碼:
[root@mailserv2 ~]# more /usr/local/bin/firewall
#!/bin/bash
#this is a common firewall created by 2007-7-29
 
#define some variable
IPT=/sbin/iptables
CONNECTION_TRACKING=”1″
INTERNET=”eth0″
CLASS_A=”10.0.0.0/8″
CLASS_B=”172.16.0.0/12″
CLASS_C=”192.168.0.0/16″
CLASS_D_MULTICAST=”224.0.0.0/4″
CLASS_E_RESERVED_NET=”240.0.0.0/5″
BROADCAST_SRC=”0.0.0.0″
BROADCAST_DEST=”255.255.255.255″
IPADDR=220. 94.58.245
LOOPBACK_INTERFACE=”lo”
 
#Remove any existing rules
$IPT -F
$IPT -X
 
#setting default firewall policy
$IPT –policy OUTPUT ACCEPT
$IPT –policy FORWARD DROP
$IPT -P INPUT DROP
 
 
#stop firewall
if [ “$1” = “stop” ]
then
echo “Filewall completely stopped!no firewall running!”
exit 0
fi
 
#setting for loopback interface
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
 
# Stealth Scans and TCP State Flags
# All of the bits are cleared
$IPT -A INPUT -p tcp –tcp-flags ALL NONE -j DROP
# SYN and FIN are both set
$IPT -A INPUT -p tcp –tcp-flags SYN,FIN SYN,FIN -j DROP
# SYN and RST are both set
$IPT -A INPUT -p tcp –tcp-flags SYN,RST SYN,RST -j DROP
# FIN and RST are both set
$IPT -A INPUT -p tcp –tcp-flags FIN,RST FIN,RST -j DROP
# FIN is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp –tcp-flags ACK,FIN FIN -j DROP
# PSH is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp –tcp-flags ACK,PSH PSH -j DROP
# URG is the only bit set, without the expected accompanying ACK
$IPT -A INPUT -p tcp –tcp-flags ACK,URG URG -j DROP
 
# Using Connection State to By-pass Rule Checking
if [ “$CONNECTION_TRACKING” = “1” ]; then
    $IPT -A INPUT  -m state –state ESTABLISHED,RELATED -j ACCEPT
    $IPT -A OUTPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
    $IPT -A INPUT -m state –state INVALID -j DROP
    $IPT -A OUTPUT -m state –state INVALID -j DROP
fi
 
##################################################################
# Source Address Spoofing and Other Bad Addresses
 
# Refuse spoofed packets pretending to be from
# the external interface.s IP address
$IPT -A INPUT  -i $INTERNET -s $IPADDR -j DROP
 
# Refuse packets claiming to be from a Class A private network
$IPT -A INPUT  -i $INTERNET -s $CLASS_A -j DROP
 
# Refuse packets claiming to be from a Class B private network
$IPT -A INPUT  -i $INTERNET -s $CLASS_B -j DROP
 
# Refuse packets claiming to be from a Class C private network
$IPT -A INPUT  -i $INTERNET -s $CLASS_C -j DROP
 
$IPT -A INPUT -i $INTERNET -s 0.0.0.0/8 -j DROP
$IPT -A INPUT -i $INTERNET -s 169.254.0.0/16 -j DROP
$IPT -A INPUT -i $INTERNET -s 192.0.2.0/24 -j DROP
###################################################################
#setting access rules
 
#enable ssh connect
$IPT -A INPUT  -i $INTERNET -p tcp  –dport 22 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p tcp  –dport 25 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p tcp  –dport 80 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p tcp  –dport 110 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p tcp  –dport 143 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p tcp  –dport 783 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p tcp -s 127.0.0.1 –dport 3306 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p tcp  –dport 5666 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p tcp  –dport 10024 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p tcp  –dport 10025 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p udp  –dport 123 -j ACCEPT
$IPT -A INPUT  -i $INTERNET -p icmp -j ACCEPT
“$IPT -A INPUT  -i $INTERNET -p tcp -s 127.0.0.1 –dport 3306 -j ACCEPT”這條規則是阻止外部機器連線mysql資料庫。埠5666是nagios監控所用。把核心優化和防火牆指令碼加在檔案/etc/rc.local中,實現開機即啟。
[root@mailserv2 ~]# more /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don`t
# want to do the full Sys V style init stuff.
 
touch /var/lock/subsys/local
 
################ normal services ############################
/usr/local/apache/bin/apachectl start
/usr/local/mysql/bin/mysqld_safe –user=mysql&
/usr/local/authlib/sbin/authdaemond start
 
############## postfix relatively ###########################
postfix start
/usr/local/imap/sbin/imapd start
 
################ antivirus and antispam #####################
/usr/bin/spamd –daemonize –pidfile /var/run/spamd.pid
/usr/local/sbin/amavisd start
/usr/local/clamav/sbin/clamd
 
############### system optimize #############################
/usr/local/bin/kernel_optimize
/usr/local/bin/firewall
 
################### NRPE nagios remote plugin execute $$$$$$$$$
/usr/local/nrpe/bin/nrpe -c /usr/local/nrpe/etc/nrpe.cfg -d

關於多郵件域和使用者限額

Postfix支援多郵件域,當我們用postfixadmin建立多個郵件域的時候,別忘記在DNS伺服器上做好主機記錄解析和MX解析。多郵件域的情形是多個mx記錄指向同一個主機ip地址。
預設情況下,postfix 資料庫的mailbox表的欄位”quota”值是”0″,它表示使用者的油箱大小是100M,假如我們要把使用者的郵箱大小設定成500M,則只需連線資料庫postfix更改mailbox表”quota”欄位的值為”524288000″。
 
mysql> use postfix;
mysql> update mailbox set quota=`524288000`;
Query OK, 1 row affected (0.03 sec)
Rows matched: 191  Changed: 1  Warnings: 0
 
 
圖 10
所有的工作都做完以後,重啟linux。檢查程式看與postfix相關的守護程式是否在執行,然後在用foxmail來收發郵件,再也 webmail(extmail)方式收發。儘管postfix涉及很多方面的內容,但在大部分情況下,通過日誌檔案/var/log/maillog可以得出一些非常有用的資訊,從排除故障這個角度講,postfix的日誌檔案將會為排除故障提供很好的幫助。
[root@mailserv2 ~]# ps auxww  //部分程式快照
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
vmail     1481  0.0  1.2  12644  6568 ?        S    Oct03   0:00 /usr/local/apache/bin/httpd -k start
postfix   1622  0.0  0.2   4000  1276 ?        S    Oct02   0:08 anvil -l -t unix -u
vmail     1843  0.0  1.2  12644  6568 ?        S    Oct03   0:00 /usr/local/apache/bin/httpd -k start
root      1972  0.0  0.1   1688   620 ?        Ss   Sep20   2:41 syslogd -m 0
root      1975  0.0  0.0   1644   400 ?        Ss   Sep20   0:01 klogd -x
root      1994  0.0  0.1   5424   984 ?        Ss   Sep20   0:22 /usr/sbin/sshd
ntp       2012  0.0  0.9   4672  4672 ?        SLs  Sep20   0:00 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g
root      2027  0.0  0.2   5224  1104 ?        Ss   Sep20   0:00 crond
root      2042  0.0  0.0   2200   424 ?        Ss   Sep20   0:00 /usr/sbin/atd
root      2050  0.0  1.3  12644  7016 ?        Ss   Sep20   0:00 /usr/local/apache/bin/httpd -k start
root      2056  0.0  0.0   1628   400 ?        S    Sep20   0:18 /usr/local/authlib/sbin/courierlogger -pid=/usr/local/authlib/var/spool/authdaemon/pid -start /usr/local/authlib/libexec/courier-authlib/authdaemond
root      2067  0.0  0.1   2732   848 ?        S    Sep20   0:00 /usr/local/authlib/libexec/courier-authlib/authdaemond
root      2075  0.0  0.1   2776  1008 ?        S    Sep20   0:10 /usr/local/authlib/libexec/courier-authlib/authdaemond
root      2076  0.0  0.1   2776  1008 ?        S    Sep20   0:11 /usr/local/authlib/libexec/courier-authlib/authdaemond
root      2077  0.0  0.1   2776  1008 ?        S    Sep20   0:10 /usr/local/authlib/libexec/courier-authlib/authdaemond
root      2078  0.0  0.1   2776  1008 ?        S    Sep20   0:10 /usr/local/authlib/libexec/courier-authlib/authdaemond
root      2079  0.0  0.1   2776  1008 ?        S    Sep20   0:10 /usr/local/authlib/libexec/courier-authlib/authdaemond
root      2143  0.0  0.2   3972  1244 ?        Ss   Sep20   4:57 /usr/libexec/postfix/master
postfix   2146  0.0  0.2   4040  1308 ?        S    Sep20   1:44 qmgr -l -t fifo -u
root      2153  0.0  0.0   1624   404 ?        S    Sep20   0:00 /usr/local/authlib/sbin/courierlogger -pid=/var/run/imapd.pid -start -name=imapd /usr/local/imap/libexec/couriertcpd -address=0 -maxprocs=40 -maxperip=4 -nodnslookup -noidentlookup 143 /usr/local/imap/sbin/imaplogin /usr/local/imap/bin/imapd Maildir
root      2154  0.0  0.1   1728   536 ?        S    Sep20   0:00 /usr/local/imap/libexec/couriertcpd -address=0 -maxprocs=40 -maxperip=4 -nodnslookup -noidentlookup 143 /usr/local/imap/sbin/imaplogin /usr/local/imap/bin/imapd Maildir
root      2159  0.0  0.0   1628   404 ?        S    Sep20   0:03 /usr/local/authlib/sbin/courierlogger -pid=/var/run/pop3d.pid -start -name=pop3d /usr/local/imap/libexec/couriertcpd -address=0 -maxprocs=40 -maxperip=4 -nodnslookup -noidentlookup 110 /usr/local/imap/sbin/pop3login /usr/local/imap/bin/pop3d Maildir
root      2160  0.0  0.1   1728   536 ?        S    Sep20   0:03 /usr/local/imap/libexec/couriertcpd -address=0 -maxprocs=40 -maxperip=4 -nodnslookup -noidentlookup 110 /usr/local/imap/sbin/pop3login /usr/local/imap/bin/pop3d Maildir
amavis    2169  0.0 17.2 113196 89072 ?        Ss   Sep20   7:00 /usr/local/clamav/sbin/clamd
root      2251  0.0  0.0   1624   440 tty1     Ss+  Sep20   0:00 /sbin/mingetty tty1
root      2252  0.0  0.0   1624   436 tty2     Ss+  Sep20   0:00 /sbin/mingetty tty2
root      2253  0.0  0.0   1624   440 tty3     Ss+  Sep20   0:00 /sbin/mingetty tty3
root      2254  0.0  0.0   1624   440 tty4     Ss+  Sep20   0:00 /sbin/mingetty tty4
root      2255  0.0  0.0   1624   440 tty5     Ss+  Sep20   0:00 /sbin/mingetty tty5
root      2256  0.0  0.0   1628   444 tty6     Ss+  Sep20   0:00 /sbin/mingetty tty6
root      3626  0.0  0.2   4440  1104 ?        S    Sep20   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe –user=mysql
mysql     3644  0.0  4.1 133256 21460 ?        Sl   Sep20   8:33 /usr/local/mysql/libexec/mysqld –basedir=/usr/local/mysql –datadir=/usr/local/mysql/var –user=mysql –pid-file=/usr/local/mysql/var/mailserv2.pid –skip-locking
root     12456  0.0  0.4   8272  2504 ?        Ss   20:13   0:00 sshd: root@pts/2
root     12458  0.0  0.2   4624  1456 pts/2    Ss+  20:13   0:00 -bash
amavis   12624  0.0  9.7  59064 50236 ?        Ss   20:21   0:01 amavisd (master)
postfix  14269  0.0  0.2   4132  1460 ?        S    22:07   0:00 trivial-rewrite -n rewrite -t unix -u
amavis   14518  0.0 10.6  63740 54748 ?        S    22:18   0:05 amavisd (ch18-avail)
amavis   14875  0.0 10.4  62724 53768 ?        S    22:43   0:04 amavisd (ch11-avail)
amavis   14883  0.1 10.3  62592 53452 ?        S    22:44   0:04 amavisd (ch14-avail)
root     14890  0.0  0.4   8276  2512 ?        Ss   22:45   0:00 sshd: root@pts/1
root     14892  0.0  0.2   4616  1444 pts/1    Ss   22:45   0:00 -bash
amavis   15160  0.0 10.2  61812 52728 ?        S    22:59   0:02 amavisd (ch5-avail)
amavis   15164  0.1 10.3  62464 53488 ?        S    22:59   0:04 amavisd (ch13-avail)
amavis   15211  0.1 10.3  62020 53060 ?        S    23:03   0:04 amavisd (ch13-avail)
amavis   15292  0.0 10.2  61700 52648 ?        S    23:08   0:02 amavisd (ch7-avail)
amavis   15383  0.1 10.2  62124 52964 ?        S    23:12   0:03 amavisd (ch8-avail)
postfix  15762  0.0  0.4   4520  2300 ?        S    23:40   0:00 smtpd -n smtp -t inet -u
postfix  15865  0.0  0.2   4004  1156 ?        S    23:47   0:00 pickup -l -t fifo -u
root     15941  0.0  0.1   4220   940 pts/1    R+   23:55   0:00 ps auxww
nagios   18752  0.0  0.1   4836   944 ?        Ss   Sep22   0:05 ../bin/nrpe -c nrpe.cfg -d
vmail    24853  0.0  1.2  12644  6664 ?        S    Oct04   0:00 /usr/local/apache/bin/httpd -k start
vmail    24854  0.0  1.2  12644  6596 ?        S    Oct04   0:00 /usr/local/apache/bin/httpd -k start
vmail    24884  0.0  1.2  12644  6568 ?        S    Oct04   0:00 /usr/local/apache/bin/httpd -k start
vmail    24885  0.0  1.3  12780  6696 ?        S    Oct04   0:00 /usr/local/apache/bin/httpd -k start
vmail    24886  0.0  1.2  12644  6568 ?        S    Oct04   0:00 /usr/local/apache/bin/httpd -k start
vmail    24967  0.0  1.2  12644  6596 ?        S    Oct04   0:00 /usr/local/apache/bin/httpd -k start
vmail    24970  0.0  1.2  12644  6552 ?        S    Oct04   0:00 /usr/local/apache/bin/httpd -k start
vmail    28305  0.0  1.3  12788  6724 ?        S    Oct02   0:00 /usr/local/apache/bin/httpd -k start
root     29390  0.0  5.5  33232 28576 ?        Ss   Oct01   0:00 /usr/bin/spamd –daemonize –pidfile /var/run/spamd.pid
root     29392  0.0  5.2  33232 27068 ?        S    Oct01   0:00 spamd child
root     29393  0.0  5.2  33232 26988 ?        S    Oct01   0:00 spamd child

 


相關文章