2010年11月17日 星期三

OpenBSD 4.6 + Postfix + Mysql + Dovecot + Amavisd + ClamAV + Spamassassin + Roundcubemail (一)

0. 前言

OpenBSD 可以說是目前公認最安全的作業系統,而且它的結構非常的簡捷有力,不會拖泥帶水,所以變成是我最喜歡的作業系統。很多專注在防火牆的工程師都很愛用它,不過因為網路上的文章比較少,導致讓很多對它有興趣的人望之卻步。希望藉由我的一些經驗分享,讓大家都能夠對這個系統有更深的了解。

Mail Server 是目前我認為最複雜的網路服務的一種,因為它必需要結合多種軟體,來達到我們所要提供的功能。在這裡,我要特別介紹一個網站,http://www.kernel-panic.it/,作者很顯然的也是OpenBSD的愛好者。本篇教學最主要的來源就是根據此網站上的Mail Server 而來的,你可以說是這篇就是它的中文版本。不過原文章用的是Courier-IMAP 和 SquirrelMail ,我把它改為用 Dovecot 和 Roundcubemail。

在這篇教學中,我們不會去討論如何安裝OpenBSD ,也許之後我會再發一篇有關OpenBSD 的安裝教學,不過在這裡先預設你已經安裝好OpenBSD了。所有的軟體都是用Ports安裝,因為我覺得BSD 的Ports 還蠻酷的,而且有的時候Package 並沒有你要的功能,必須用 Ports 才能把你要的功能安裝上去。

1. Postfix

Postfix 由 Wietse Venema 所開發,目的是為了取代安全性低、效能不佳且設定檔非常難懂的 Sendmail。所以它也提供了一個叫作 Sendmail程式,來處理原本 Sendmail應該要處理的事情。

在正式進入安裝之前,要特別說明的是:Mail Server 跟 DNS關係很重要,DNS沒設定好的話,Mail Server 也就無法運作了。在這裡,我們預設的網域是 skycat.no-ip.org,主機名稱是 mail.skycat.no-ip.org,記得網址的MX記錄要設定好,不然就收不到信了

1.1 安裝和設定

我們要設定 Postfix 使用 SMTP驗證和要支援Mysql。在預設的Package 裡並沒有同時支援兩個的套件,所以我們要用Ports來安裝。用Mysql 來處理我們的帳號資料和實現多網域,而且之後用 Dovecot透過Mysql 來驗證登入。

# cd /usr/ports/mail/postfix/snapshot
# env FLAVOR="mysql sasl2" make install

安裝完後,設定檔會儲存在 /etc/postfix 之下。主要的設定檔是 main.cf ,設定參數共有幾百個可以設定,不過我們只要看主要幾個設定就好。

/etc/postfix/main.cf
# Directory containing all the post* commands
command_directory = /usr/local/sbin
# Directory containing all the Postfix daemon programs
daemon_directory = /usr/local/libexec/postfix


# Full pathnames of various Postfix commands
sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/local/sbin/newaliases
mailq_path = /usr/local/sbin/mailq


# Directories containing documentation
html_directory = /usr/local/share/doc/postfix/html
manpage_directory = /usr/local/man
readme_directory = /usr/local/share/doc/postfix/readme


# The owner of the Postfix queue and of most Postfix daemon processes
mail_owner = _postfix
# The group for mail submission and queue management commands
setgid_group = _postdrop


# The myhostname parameter specifies the internet hostname of this mail system. It is used as default for many other configuration parameters (default = system's FQDN)
myhostname = mail.skycat.no-ip.org


# The internet domain name of this mail system. Used as default for many other configuration parameters (default = $myhostname minus the first component)
mydomain = skycat.no-ip.org


# The domain name that locally-posted mail appears to come from, and that locally posted mail is delivered to. As you can see, a parameter value may refer to other parameters
myorigin = $mydomain


# Network interface addresses that this mail system receives mail on
inet_interfaces = all


# List of domains that this machine considers itself the final destination for. Virtual domains must not be specified here
mydestination = $myhostname, localhost.$mydomain, localhost


# List of "trusted" SMTP clients allowed to relay mail through Postfix.
mynetworks = 127.0.0.0/8


# What destination (sub)domains this system will relay mail to
relay_domains = $mydestination


# List of alias databases used by the local delivery agent
alias_maps = hash:/etc/postfix/aliases


# Alias database(s) built with "newaliases" or "sendmail -bi". This is a separate configuration parameter, because alias_maps may specify tables that are not necessarily all under control by Postfix
alias_database = hash:/etc/postfix/aliases


# SMTP greeting banner
smtpd_banner = $myhostname ESMTP $mail_name


# Postfix is final destination for the specified list of "virtual" domains
virtual_mailbox_domains = skycat.no-ip.org


# Virtual mailboxes base directory
virtual_mailbox_base = /var/vmail


# Optional lookup tables with all valid addresses in the domains that match
# $virtual_mailbox_domains.
virtual_mailbox_maps = hash:/etc/postfix/vmailbox


# The minimum user ID value accepted by the virtual(8) delivery agent
virtual_minimum_uid = 2000


# User ID that the virtual(8) delivery agent uses while writing to the recipient's mailbox
virtual_uid_maps = static:2000


# Group ID that the virtual(8) delivery agent uses while writing to the recipient's mailbox
virtual_gid_maps = static:2000


# Optional lookup tables that alias specific mail addresses or domains to other local or remote address
virtual_alias_maps = hash:/etc/postfix/virtual

我們將會使用虛擬用戶(非系統用戶),所以我們要建立一個帳號來供存取虛擬用戶的信箱。我們預設的路徑是 /var/vmail ,指定的 uid 和 gid 是2000 ,並且在 main.cf 中的 virtual_uid_maps 和 virtual_gid_maps 參數中設定它。

# useradd -d /var/vmail -g =uid -u 2000 -s /sbin/nologin \
> -c "Virutal Mailboxes Owner" -m vmail

我們希望所有的信箱都能集中在同一個目錄中,也就是 /var/vmail 。我們在 main.cf 中設定 virtual_mailbox_base 的參數為 /var/vmail 。
在我們設定的 virtual_mailbox_maps 參數中,指向 /etc/postfix/vmailbox 檔。在這個檔中設定我們的虛擬用戶資料,每行一筆資料,資料格式是:帳號 信箱路徑。

/etc/postfix/vmailbox
syfeng@skycat.no-ip.org         skycat.no-ip.org/syfeng/
[...]

virtual_alias_maps 參數中可以讓我們建立帳號的別名,也就是寄到別名的信箱,會同步的寄到所指向的信箱中,你可以想做是信箱的群組。這裡我們建立兩個別名,也就是預設應該要 有的帳號 postmaster 和 abuse。

/etc/postfix/virtual
postmaster@skycat.no-ip.org     syfeng@skycat.no-ip.org
abuse@skycat.no-ip.org          syfeng@skycat.no-ip.org
[...]

修改 /etc/postfix/aliases :在這個檔裡已經預先幫我們建立了一些預設的帳號,在這個檔裡是給本機帳號用的別名,我們只要修改 root: 那一行就可以了。這裡指的是,只要寄到本機帳號 root 的信,都會傳給 syfeng@skycat.no-ip.org 。

/etc/postfix/aliases
root:                           syfeng@skycat.no-ip.org
[...]

最後,我們要建立索引檔供 Postfix 使用:

# /usr/local/sbin/postmap /etc/postfix/vmailbox
# /usr/local/sbin/postmap /etc/postfix/virtual
# /usr/local/sbin/newaliases

啟用 Postfix:

# /usr/local/sbin/postfix-enable

將原先的 Sendmail 排程註解掉

# crontab -e

# sendmail clientmqueue runner
#*/30 * * * * /usr/sbin/sendmail -L sm-msp-queue -Ac -q

接著編輯 /etc/rc.conf.local 啟動 Postfix

/etc/rc.conf.local
# Specify a location where syslogd(8) should place an additional log socket for Postfix
syslogd_flags="-a /var/spool/postfix/dev/log"

# Make Postfix start in background and process queued messages every 30 min
sendmail_flags="-bd"



現在,我們可以重開機了。

沒有留言: