Tuesday, August 19, 2008

Qmail openssl stunnel ssl pop3 995 smtp 465 配置 安装

转载请注明出处,作者:Albert Ding, 白东

服务器在境外,GFW很烦,因此给qmail邮件服务器增加了ssl链接方式。而这方面的中文资料很少,尤其是使用stunnel的,所以升级了后,写了这篇手记。

按之前的qmail vpopmail的方式安装好。我的服务器原来就安装qmail,一切工作正常,仅仅打了smtp验证的补丁。

如果是这样,那就可以直接升级。

需要安装下面两个软件:

1. openssl (http://www.openssl.org)
# cd openssl-0.9.8e
# ./config
# make
# make test
# make install
# openssl version
OpenSSL 0.9.8e 23 Feb 2007
2. stunnel (http://www.stunnel.org)
# ./configure --sysconfdir=/etc --localstatedir=/var --sharedstatedir=/var --sbindir=/sbin
# make
# make install
# stunnel -version
stunnel 4.20 on i686-pc-linux-gnu with OpenSSL 0.9.8e 23 Feb 2007
Threading:PTHREAD SSL:ENGINE Sockets:POLL,IPv4
Global options
debug = 5
pid = /usr/local/var/run/stunnel/stunnel.pid
RNDbytes = 64
RNDfile = /dev/urandom
RNDoverwrite = yes
Service-level options
cert = /etc/stunnel/stunnel.pem
ciphers = ALL:!ADH:+RC4:@STRENGTH
key = /etc/stunnel/stunnel.pem
session = 300 seconds
sslVersion = SSLv3 for client, all for server
TIMEOUTbusy = 300 seconds
TIMEOUTclose = 60 seconds
TIMEOUTconnect = 10 seconds
TIMEOUTidle = 43200 seconds
verify = none

stunnel 配置的时候主意设定一下安装路径 /sbin/stunnel /etc/stunnel 主要的两个。

安装好后,建立两个文件

/etc/stunnel/pop3.conf
# /etc/stunnel/pop3.conf
cert = /var/qmail/control/servercert.pem
exec = /var/qmail/bin/qmail-popup
execargs = qmail-popup your.domain.com /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir

/etc/stunnel/smtp.conf
# /etc/stunnel/smtp.conf
cert = /var/qmail/control/servercert.pem
exec = /var/qmail/bin/qmail-smtpd
execargs = qmail-smtpd /home/vpopmail/bin/vchkpw /bin/true

建立qmail服务器证书(反正是自己签发证书,想多长时间都可以,这里设定10年,呵呵):

# cd /var/qmail/control
# openssl req -new -x509 -nodes -out servercert.pem -days 3650 -keyout servercert.pem

需改服务器证书文件servercert.pem的文件属性:

# ln -s /var/qmail/control/servercert.pem clientcert.pem
# chown -R vpopmail:qmail /var/qmail/control/clientcert.pem /var/qmail/control/servercert.pem
# chmod 600 servercert.pem #这个很重要哦

建立pop3和smtp ssl的run文件

# mkdir -p /var/qmail/supervise/qmail-pop3ds/log /var/qmail/supervise/qmail-smtpds/log /var/log/qmail/pop3ds /var/log/qmail/smtpds

/var/qmail/supervise/qmail-pop3ds/run
#!/bin/sh
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
LOCAL=`head -1 /var/qmail/control/me`
exec /usr/local/bin/softlimit -m 20000000 \
/usr/local/bin/tcpserver -H -R -v -l "$LOCAL" -c "$MAXSMTPD" 0 995 \
/sbin/stunnel /etc/stunnel/pop3.conf 2>&1
/var/qmail/supervise/qmail-pop3ds/log/run
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t \
/var/log/qmail/pop3ds
/var/qmail/supervise/qmail-smtpds/run
#!/bin/sh
QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
MAXSMTPD=`cat /var/qmail/control/concurrencyincoming`
LOCAL=`head -1 /var/qmail/control/me`

if [ -z "$QMAILDUID" -o -z "$NOFILESGID" -o -z "$MAXSMTPD" -o -z "$LOCAL" ]; then
echo QMAILDUID, NOFILESGID, MAXSMTPD, or LOCAL is unset in
echo /var/qmail/supervise/qmail-smtpds/run
exit 1
fi

if [ ! -f /var/qmail/control/rcpthosts ]; then
echo "No /var/qmail/control/rcpthosts!"
echo "Refusing to start SMTP listener because it'll create an open relay"
exit 1
fi

exec /usr/local/bin/softlimit -m 20000000 \
/usr/local/bin/tcpserver -v -R -l "$LOCAL" -x /etc/tcp.smtp.cdb -c "$MAXSMTPD" \
-u 89 -g 89 0 465 \
/sbin/stunnel /etc/stunnel/smtp.conf 2>&1
/var/qmail/supervise/qmail-smtpds/log/run
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail/smtpds

将执行文件链接到/service中:

# chmod 755 /var/qmail/supervise/qmail-pop3ds/run /var/qmail/supervise/qmail-pop3ds/log/run /var/qmail/supervise/qmail-smtpds/run /var/qmail/supervise/qmail-smtpds/log/run
# chown -R qmaill /var/log/qmail/pop3ds/ /var/log/qmail/smtpds/
# cd /service
# ln -s /var/qmail/supervise/qmail-pop3ds/ qmail-pop3ds
# ln -s /var/qmail/supervise/qmail-smtpds/ qmail-smtpds

修改qmailctl文件:

/var/qmail/bin/qmailctl #这个文件编写的有点复杂,我还有个更简单的,我回头贴出来。
#!/bin/sh
# Description: the qmail MTA
PATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin
export PATH
QMAILDUID=`id -u qmaild`
NOFILESGID=`id -g qmaild`
case "$1" in
start)
echo "Starting qmail..."
echo " qmail-send"
if svok /service/qmail-send ; then
svc -u /service/qmail-send /service/qmail-send/log
else
echo " qmail-send supervise not running"
fi
echo " qmail-smtp"
if svok /service/qmail-smtpd ; then
svc -u /service/qmail-smtpd /service/qmail-smtpd/log
else
echo " qmail-smtpd supervise not running"
fi
echo " qmail-smtp ssl"
if svok /service/qmail-smtpds ; then
svc -u /service/qmail-smtpds /service/qmail-smtpds/log
else
echo " qmail-smtpd ssl supervise not running"
fi
echo " qmail-pop3d"
if svok /service/qmail-pop3d ; then
svc -u /service/qmail-pop3d /service/qmail-pop3d/log
else
echo " qmail-pop3d supervise not running"
fi
echo " qmail-pop3d ssl"
if svok /service/qmail-pop3ds ; then
svc -u /service/qmail-pop3ds /service/qmail-pop3ds/log
else
echo " qmail-pop3d ssl service not running"
fi
if [ -d /var/lock/subsys ]; then
touch /var/lock/subsys/qmail
fi
;;
stop)
echo "Stopping qmail..."
echo " qmail-smtpd"
svc -d /service/qmail-smtpd /service/qmail-smtpd/log
echo " qmail-smtpd ssl"
svc -d /service/qmail-smtpds /service/qmail-smtpds/log
echo " qmail-send"
svc -d /service/qmail-send /service/qmail-send/log
echo " qmail-pop3d"
svc -d /service/qmail-pop3d /service/qmail-pop3d/log
echo " qmail-pop3d ssl"
svc -d /service/qmail-pop3ds /service/qmail-pop3ds/log
if [ -f /var/lock/subsys/qmail ]; then
rm /var/lock/subsys/qmail
fi
;;
stat)
svstat /service/qmail-send
svstat /service/qmail-send/log
svstat /service/qmail-smtpd
svstat /service/qmail-smtpd/log
svstat /service/qmail-smtpds
svstat /service/qmail-smtpds/log
svstat /service/qmail-pop3d
svstat /service/qmail-pop3d/log
svstat /service/qmail-pop3ds
svstat /service/qmail-pop3ds/log
qmail-qstat
;;
doqueue|alrm|flush)
echo "Flushing timeout table and sending ALRM signal to qmail-send."
/var/qmail/bin/qmail-tcpok
svc -a /service/qmail-send
;;
queue)
qmail-qstat
qmail-qread
;;
reload|hup)
echo "Sending HUP signal to qmail-send."
svc -h /service/qmail-send
;;
pause)
echo "Pausing"
echo " qmail-send"
svc -p /service/qmail-send
echo " qmail-smtpd"
svc -p /service/qmail-smtpd
echo " qmail-smtpd ssl"
svc -p /service/qmail-smtpds
echo " qmail-pop3d"
svc -p /service/qmail-pop3d
echo " qmail-pop3d ssl"
svc -p /service/qmail-pop3ds
;;
cont)
echo "Continuing"
echo " qmail-send"
svc -c /service/qmail-send
echo " qmail-smtpd"
svc -c /service/qmail-smtpd
echo " qmail-smtpd ssl"
svc -c /service/qmail-smtpds
echo " qmail-pop3d"
svc -c /service/qmail-pop3d
echo " qmail-pop3ds"
svc -c /service/qmail-pop3ds
;;
restart)
echo "Restarting qmail:"
echo "* Stopping qmail-smtpd."
svc -d /service/qmail-smtpd /service/qmail-smtpd/log
echo "* Stopping qmail-smtpd ssl."
svc -d /service/qmail-smtpds /service/qmail-smtpds/log
echo "* Sending qmail-send SIGTERM and restarting."
svc -t /service/qmail-send /service/qmail-send/log
echo "* Restarting qmail-smtpd."
svc -u /service/qmail-smtpd /service/qmail-smtpd/log
echo "* Restarting qmail-smtpd ssl."
svc -u /service/qmail-smtpds /service/qmail-smtpds/log
echo "* Restarting qmail-pop3d."
svc -t /service/qmail-pop3d /service/qmail-pop3d/log
echo "* Restarting qmail-pop3ds."
svc -t /service/qmail-pop3ds /service/qmail-pop3ds/log
;;
cdb)
tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp chmod 644 /etc/tcp.smtp.cdb echo "Reloaded /etc/tcp.smtp." ;; help) cat <<1520.11887344591214@your.domain.com>
user albert
+OK
pass albert
+OK
list
+OK
1 2734
2 31807
3 34957
4 20644
5 27798
6 26584
.
quit
4. # openssl s_client -connect localhost:465
(执行后,会有大段的证书相关的信息,这里省略,只复制来最后一行,然后测试就和telnet localhost 25 一样了)
220 your.domain.com ESMTP
5. openssl s_client -connect localhost:995
(执行后,会有大段的证书相关的信息,这里省略,只复制来最后一行,然后测试就和telnet localhost 110 一样了)
+OK <1872.1188791523434@your.domain.com>
6. 查看主要的日志,包括:
1. /var/log/qmail/current
2. /var/log/qmail/pop3d/current
3. /var/log/qmail/pop3ds/current
4. /var/log/qmail/smtpd/current
5. /var/log/qmail/smtpds/current
6. 另外你也可以在/etc/stunnel/smtp.conf 和 pop3.conf 文件中加入下面两个设置内容,以生成详细的调试日志。
debug = 7
output = /var/log/qmail/stunnel.log

可能遇到的问题:

1. 如果你是用复制,那你需要很小心了,因为有的时候文件的换行在你复制到telnet客户端软件的时候会有可能变了,因为dos格式和unix格式有差别。尤其注意运行文件第一行的声明后的换行。
2. tcpserver: fatal: no IP address for your.domain.com
表示端口已经被其它进程占用,要么你停掉那个进程,要么换个端口。
3. Wrong permissions on /var/qmail/control/servercert.pem
servvercert.pem文件属性设置为600即可
4. /etc/stunnel/smtp.conf文件中最后的" /bin/true"不能忘记,否则客户端会提示验证不通过。
5. ssl证书问题,因为我们是自己签发的证书,所以客户端会提示,两个办法:1、购买权威机构签发的证书(非常贵,国内很多是国内范围的便宜价格,国际范围的就不一样了)。2、将serercert.pem文件重命名为 .crt 或 .cer 格式。然后在IE的Internet Options中导入,要选择自动。
6. 454 oops, unable to write pipe and I can't auth (#4.3.0)
老版本的smtp验证补丁中,你需要加上域名,才可以验证。就是在/etc/stunnel/smtp.conf文件中的qmail-smtpd后面。这样:
execargs = qmail-smtpd your.domain.com /home/vpopmail/bin/vchkpw /bin/true
可以参考这个网页的说明 http://www.fehcom.de/qmail/smtpauth.html

如果你有问题,可以联系我。msn: amtding # msn 。com


下面是那个简单的qmailctl文件。(这里把我的行前缩进给弄没了,你自己加吧。:( )

#!/bin/sh

# chkconfig: 2345 80 30
# description: the qmail MTA

PATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin
export PATH

SERVICES=" /service/qmail-send \
/service/qmail-send/log \
/service/qmail-smtpd \
/service/qmail-smtpd/log \
/service/qmail-smtpds \
/service/qmail-smtpds/log \
/service/qmail-pop3d \
/service/qmail-pop3d/log \
/service/qmail-pop3ds \
/service/qmail-pop3ds/log"

case "$1" in
start)
echo "Starting qmail"
svc -u ${SERVICES}

if [ -d /var/lock/subsys ]; then
touch /var/lock/subsys/qmail
fi
;;
stop)
echo "Stopping qmail..."
svc -d ${SERVICES}
if [ -f /var/lock/subsys/qmail ]; then
rm /var/lock/subsys/qmail
fi
;;
stat)
svstat ${SERVICES}
qmail-qstat
;;
doqueue|alrm|flush)
echo "Flushing timeout table and sending ALRM signal to qmail-send."
/var/qmail/bin/qmail-tcpok
svc -a /service/qmail-send
;;
queue)
qmail-qstat
qmail-qread
;;
reload|hup)
echo "Sending HUP signal to qmail-send."
svc -h /service/qmail-send
;;
pause)
echo "Pausing qmail"
svc -p ${SERVICES}
;;
cont)
echo "Continuing qmail"
svc -c ${SERVICES}
;;
restart)
echo "Restarting qmail"
svc -d ${SERVICES}
svc -u ${SERVICES}
;;
cdb)
/usr/local/bin/tcprules /home/vpopmail/etc/tcp.smtp.cdb /home/vpopmail/etc/tcp.smtp.tmp < /home/vpopmail/etc/tcp.smtp chmod 644 /home/vpopmail/etc/tcp.smtp* echo "Reloaded /home/vpopmail/etc/tcp.smtp." ;; help) cat <
stop -- stops mail service (smtp connections refused, nothing goes out)
start -- starts mail service (smtp connection accepted, mail can go out)
pause -- temporarily stops mail service (connections accepted, nothing leaves)
cont -- continues paused mail service
stat -- displays status of mail service
cdb -- rebuild the tcpserver cdb file for smtp
restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
doqueue -- schedules queued messages for immediate delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
queue -- shows status of queue
alrm -- same as doqueue
flush -- same as doqueue
hup -- same as reload
HELP
;;
*)
echo "Usage: $0 {start|stop|restart|doqueue|flush|reload|stat|paus e|cont|cdb|queue|help}"
exit 1
;;
esac

exit 0

Monday, August 18, 2008

Awstats 安装配置记录

作者:白东(Albert Ding)

更换新的服务器,于是重新配置了Awstats日志分析工具。

Awstats 是什么?(首先简单介绍一下)

AWStats 是一个专门用来分析 Web 站点日志文件 (log) 的 GPL 授权软件,它同时也支持分析 FTP 站点及邮件服务器的日志文件,此软件的 Web 日志分析部分可以工作和分析 IIS 的 (W3C log format) 日志文件、Apache 的 (NCSA combined/XLF/ELF log format or common/CLF log format) 日志文件,以及其它大部分的 web, proxy, wap, streaming 服务器所产生的日志文件。

Awstats运行环境

1. Linux/Unix/Windows 等 (注:本文讲述的是在Linux下的安装和配置)
2. Perl 版本需要 5.005_03 或更高版本

Awstats 下载和解压

1. 下载
1. 地址: http://awstats.sourceforge.net/#DOWNLOAD
2. 版本:建议下载最新版本
3. wget http://awstats.sourceforge.net/files/awstats-6.5.tgz
2. 解压
1. tar xvfz awstats-6.5.tgz
2. mv awstats-6.5 /usr/local/awstats (/usr/local/awstats 这个为安装的位置,也可以选择别的位置)

Awstats 安装和配置

1. 安装
1. cd /usr/local/awstats/tools
2. perl awstats_configure.pl (运行awstats的安装配置文件)
3. 按提示操作即可
2. 配置
1. 复制 awstats.model.conf 到 /etc/awstats 目录 (cp awstats.model.conf /etc/awstats/);
2. 打开 awstats.model.conf 文件修改各配置项目的值,这样在新建立的文件中只需要填写新添加的内容就可以了,其它的就不用每次设置了。( vi /etc/awstats/awstats.model.conf);
3. 添加统计项目 cp /etc/awstats/awstats.model.conf /etc/awstats/awstats.www.your-domain-name.com.conf
4. vi awstats.www.your-domain-name.com.conf;
LogFile = "/var/log/apache/access.log"
SiteDomain = "www.your-domain-name.com"
HostAliases = "your-domain-name.com"
存盘退出。
3. 在浏览器中测试。