序言
这俩台机器的postfix将成为我们公司往外网发送推广邮件的主力邮件服务器。其中每台机器绑定28个IP池。预计至少需要发送每天300万封的邮件数量。
这俩台机器只负责邮件的发送服务。并不包括邮件的接收(MX记录并不指向这个IP)。在发送方面DNS服务器上配置了TXT记录 包含了其中SPF安全域,并且配置了dkim加密以确保发送出去邮件的安全性
环境
机器内网Ip:172.24.142.13,172.24.142.12
外网ip 每台机器有28个外网IP
系统:debian 6.0.2
域名 @info.ule.com
安装前准备
1 修改ulimit
vim /etc/profile
##增加
ulimit -SHn 655350
##
vim /etc/security/limits.conf
###增加
- soft nofile 655350
- hard nofile 655350
- hard nproc unlimited
- soft nproc unlimited
###
vim /etc/pam.d/common-session
###增加
vim /etc/pam.d/common-session
###
#注:debian6 ulimit修改和其他系统不太一样,光更改/etc/profile的话 除了root用户 其他用户连接无法生效.原因是其他用户无权限运行ulimit这个命令 需要修改pam来让其生效
修改后重新登录即可生效
2 修改sysconf 优化内核
vim /etc/sysctl.conf
###
net.ipv4.ip_local_port_range = 8192 65535
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem= 4096 87380 16777216
net.ipv4.tcp_wmem= 4096 65536 16777216
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
vm.swappiness = 15
#####
#修改后使用 sysctl –p 使其生效3安装dnscache
#注dnscache是一个简单的dns server他能再本地缓存dns查询记录 使DNS查询更快
apt-get install dnsmasq
v im /etc/resolv.conf
##
nameserver 127.0.0.1
nameserver 61.135.159.46
###
#安装后将127.0.0.1配成DNS就行4 postfix 编译准备
#清理占用25端口的进程 (像sendmail之类的)
#安装需要用的包
apt-get install build-essential libdb4.8-dev sasl2-bin libsasl2-dev openssl libcurl4-openssl-dev curl
#下载安装包。我放在/usr/local/src目录下
#解包后路径如下
/usr/local/ postfix-2.8.16
##添加postfix运行的用户
groupadd postfix
groupadd postdrop
useradd -d /var/spool/postfix -g postfix -M -s /bin/false postfix安装postfix
###编译postfix
cd /usr/local/postfix-2.8.16
make CCARGS="-DNO_NIS -DUSE_TLS -I/usr/include/openssl/ \
-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl" \
AUXLIBS="-lssl -lcrypto -lsasl2" \
makefiles &&
make
#我这边直接编译好了。有些地方可能会缺少其他包 比如libdb4.8-dev这个包,到时候请安装
#安装POSTFIX
#注:因为需要同时安装28个POSTFIX 我们这边使用脚本postfix_install.sh进行安装
安装好后用脚本/usr/local/postfix_start.sh一并控制
安装的路径为:/data/postmall/postfix$i/ ###postfix_install.sh#
#!/bin/bash
cd /usr/local/src/postfix-2.8.16
- make && install
for i in $(seq 1 28);do echo $i;sh postfix-install -non-interactive \
install_root=/data/postmall/postfix$i \
config_directory=/etc \
daemon_directory=/libexec \
data_directory=/var/lib/postfix \
command_directory=/sbin \
queue_directory=/var/spool \
mail_owner=postfix \
setgid_group=postdrop \
sendmail_path=/sbin/sendmail \
mailq_path=/bin/mailq \
newaliases_path=/bin/newaliases \
sample_directory=/share/sample \
manpage_directory=/share/man \
html_directory=/share/html \
readme_directory=/share/readme;
#chown
chown -R postfix.root /data/postmall/postfix$i/var;
chown root.postdrop /data/postmall/postfix$i/sbin/postqueue
chown root.postdrop /data/postmall/postfix$i/sbin/postdrop
chown postfix.postdrop /data/postmall/postfix$i/var/spool/public
chown postfix.postdrop /data/postmall/postfix$i/var/spool/maildrop
chown root.postfix /data/postmall/postfix$i/var/spool
chown root.postfix /data/postmall/postfix$i/var/spool/pid
chmod ug=rx /data/postmall/postfix$i/sbin/postqueue
chmod g+s /data/postmall/postfix$i/sbin/postqueue
chmod ug=rx /data/postmall/postfix$i/sbin/postdrop
chmod g+s /data/postmall/postfix$i/sbin/postdrop
ln -snf /data/postmall/postfix$i /usr/local/postfix$i
done- create run shell
cat << EOF > /usr/local/postfix_start.sh
#!/bin/bash
###postfix_start.sh
do_service(){
/usr/local/postfix1/sbin/postfix -c /usr/local/postfix1/etc $ACTION
/usr/local/postfix2/sbin/postfix -c /usr/local/postfix2/etc $ACTION
/usr/local/postfix3/sbin/postfix -c /usr/local/postfix3/etc $ACTION
/usr/local/postfix4/sbin/postfix -c /usr/local/postfix4/etc $ACTION
/usr/local/postfix5/sbin/postfix -c /usr/local/postfix5/etc $ACTION
/usr/local/postfix6/sbin/postfix -c /usr/local/postfix6/etc $ACTION
/usr/local/postfix7/sbin/postfix -c /usr/local/postfix7/etc $ACTION
/usr/local/postfix8/sbin/postfix -c /usr/local/postfix8/etc $ACTION
/usr/local/postfix10/sbin/postfix -c /usr/local/postfix10/etc $ACTION
/usr/local/postfix11/sbin/postfix -c /usr/local/postfix11/etc $ACTION
/usr/local/postfix12/sbin/postfix -c /usr/local/postfix12/etc $ACTION
/usr/local/postfix13/sbin/postfix -c /usr/local/postfix13/etc $ACTION
/usr/local/postfix14/sbin/postfix -c /usr/local/postfix14/etc $ACTION
/usr/local/postfix15/sbin/postfix -c /usr/local/postfix15/etc $ACTION
/usr/local/postfix16/sbin/postfix -c /usr/local/postfix16/etc $ACTION
/usr/local/postfix17/sbin/postfix -c /usr/local/postfix17/etc $ACTION
/usr/local/postfix18/sbin/postfix -c /usr/local/postfix18/etc $ACTION
/usr/local/postfix19/sbin/postfix -c /usr/local/postfix19/etc $ACTION
/usr/local/postfix20/sbin/postfix -c /usr/local/postfix20/etc $ACTION
/usr/local/postfix21/sbin/postfix -c /usr/local/postfix21/etc $ACTION
/usr/local/postfix22/sbin/postfix -c /usr/local/postfix22/etc $ACTION
/usr/local/postfix23/sbin/postfix -c /usr/local/postfix23/etc $ACTION
/usr/local/postfix24/sbin/postfix -c /usr/local/postfix24/etc $ACTION
/usr/local/postfix25/sbin/postfix -c /usr/local/postfix25/etc $ACTION
/usr/local/postfix26/sbin/postfix -c /usr/local/postfix26/etc $ACTION
/usr/local/postfix27/sbin/postfix -c /usr/local/postfix27/etc $ACTION
/usr/local/postfix28/sbin/postfix -c /usr/local/postfix28/etc $ACTION
}
#stop, reload, abort, flush, check, status, set-permissions, upgrade-configuration
case "\$1" in
start)
ACTION="start"
do_service
;;
stop)
ACTION="stop"
do_service
;;
reload)
ACTION="reload"
do_service
;;
check)
ACTION="check"
do_service
;;
status)
ACTION="status"
do_service
;;
abort)
ACTION="abort"
do_service
;;
flush)
ACTION="flush"
do_service
;;
upgrade-configuration)
ACTION="upgrade-configuration"
do_service
;;
*)
echo "Usage: $0 {start|stop|reload|check|status|flush|abort|upgrade-configuration}"
exit 1
;;
esac
####end###
EOF
- create run shell
配置基本的postfix服务
1.修改系统邮件日志地址
mkdir –p /data/logs/mail/
#modify /etc/rsyslog.conf redirect mail.log
mail.* -/data/logs/mail/mail.log
#
/etc/init.d/rsyslog restart
#创建日志分割文件
touch /data/logs/mail/bin/daily_log.sh
####
mv /data/logs/mail/mail.log /data/logs/mail/mail.log_`date ‘+%Y%m%d‘ --date=‘1 days ago‘` & \
/usr/sbin/invoke-rc.d rsyslog reload > /dev/null
- #add crontab
2.创建虚拟域以及虚拟用户
#create virtual user
groupadd -g 5000 vmail
useradd -m -u 5000 -g 5000 -s /bin/bash vmail
#创建公共配置文件
mkdir /etc/postfix
vim /etc/postfix/vhosts
###vhosts添加 虚拟域
info.ule.com
###
vim /etc/postfix/vmaps
####vmaps添加 用户地址池
[email protected] info.ule.com/ad/
[email protected] info.ule.com/news/
[email protected] info.ule.com/promotion/
###
#在/etc目录运行生成用户地址池的Db文件,因为公用。只需要生成一次,运行后会生成vmaps.db文件
/usr/local/postfix1/sbin/postmap -c /usr/local/postfix1/etc/ vmaps配置dkim 秘钥认证
1安装dkim-filter
apt-get install dkim-filter
秘钥已经生成好了 直接拷贝到/etc/dkim-keys/下。注意这里的文件是我们的私钥。请务必保持权限为600修改dkim配置文件
vim /etc/dkim-filter.conf
######
Syslog yes
UMask 002
Domain info.ule.com
Selector default
AutoRestart yes
AutoRestartRate 10/1h
Canonicalization relaxed/relaxed
DNSTimeout 8
KeyList /etc/dkim-keys.conf
###end###
vim /etc/dkim-keys.conf
##配置认证key 可以针对域名和用户进行分别配置
*@info.ule.com:info.ule.com:/etc/dkim-keys/info.ule.com/default (mailto:*@info.ule.com:info.ule.com:/etc/dkim-keys/info.ule.com/default)
vim /etc/default/dkim-filter
##配置连接端口
SOCKET="inet:[email protected]"
修改postfix的main.cf使其支持 dkim的配置
vim /etc/postfix/main.cf
####
smtpd_milters = inet:localhost:20209
non_smtpd_milters = inet:localhost:20209
milter_protocol = 2
milter_default_action = accept
9.restart dkim-filter postfixPOSTFIX 小操作
1邮件服务器验证
以TELNET的方式验证
telnet 127.0.0.1 2001
输入
ehlo localhost
mail from:[email protected] #注意域名要对不然无法被进行加密
rcpt to:[email protected]
data
this is a test mail
. #注意 英文字符 .是数据结束字段然后观察接收到的邮件。看是否正常接收 以及是否有加密字段。如果正常 则说明之前配置无异常
2 清空邮件队列
通常使用的时候会造成邮件队列堆积。 除了需要从配置文件里设置过期时间外 往往需要手动清理队列。这个时候我们使用以下命令清空队列
/usr/local/postfix /sbin/postsuper -c /usr/local/postfix /etc/ -d ALL
(注:如果要清楚单独队列使用/usr/local/postfix/sbin/postsuper –c /usr/local/postfix/etc/ -d NAME (name为列名))
因为我们有28台机器,所以使用以下命令进行清空
for i in $(seq 1 28);do echo $i;/data/postmall/postfix$i/sbin/postsuper -c /data/postmall/postfix$i/etc/ -d ALL;done
##查看邮件队列
/usr/local/postfix$i/sbin/postqueue -c /data/postmall/postfix$i/etc/ -p3 添加虚拟域与域用户
如果要给Postfix添加域和域用户 需要做以下操作
1 修改虚拟域文件
vim /etc/postfix/vhosts (其中直接填入地址即可)
2 修改vmaps文件
vi /etc/postfix/vmaps
[email protected] info.ule.com/ad/
ad为用户 info.ule.com为域
info.ule.com/ad/ 为用户信箱路径
3用postmap在公共配置下生成vmaps.db库
/usr/local/postfix1/sbin/postmap -c /usr/local/postfix1/etc/ vmaps
注:这台机器的所有Postfix公用一个vmaps.db库 所以只需要生成一次就行
4dkmi秘钥生成
一个新的域需要这个域对应的秘钥文件。我们同样将生成的秘钥文件放在/etc/dkim-keys/ 下
具体生成办法参考 【dkmi秘钥生成】
5修改 dkim-filter.conf文件
vi /etc/dkim-filter.conf
修改其中Domain 区域 决定dkmi秘钥的加密规则 域名之间以逗号分隔
例如以下
Domain info.ule.com,info.ulechina.com
6 修改 dkim-keys.conf文件
vi /etc/dkim-keys.conf
dkim-keys.conf文件定义加密的具体规则。我们需要在这里定义详细的dkmi加密规则
7重启dkmi服务 ,使改动生效
8重启 postfix服务 使改动生效服务器防火墙设置
因为此机器的IP直接挂在外网 所以需要设置防火墙以防被别人利用。
我们在/etc/iptables.sh创建防火墙脚本 ,并加到/etc/rc.local中让其在开机时生效
iptables –F
#清空filter表的规则
iptables –X
#清空filter表所有规则链
iptables -t nat –F
#清空nat表规则
iptables -t nat –X
#清空nat表规则
iptables -P INPUT ACCEPT
#将filter表INPUT链的默认规则设置为accept
iptables -P OUTPUT ACCEPT#将filter表OUTPUT链的默认规则设置为accept
iptables -P FORWARD ACCEPT
##将filter表FORWARD链的默认规则设置为accept
iptables -A INPUT -s 172.24.0.0/16 -p tcp -m tcp --dport 22 -j ACCEPT
#允许172.24.0.0/16网段访问本机的22端口,(SSH管理端口)
iptables -A INPUT -s 172.24.0.0/16 -p tcp -m tcp --dport 25 -j ACCEPT
#允许172.24.0.0/16网段访问本机的25端口,(邮件发送端口。只需要内网发送)
iptables -A INPUT -s 172.24.0.0/16 -p icmp -m icmp -j ACCEPT
#允许172.24.0.0./16的ping请求 (网络调试用)
iptables -A INPUT -p tcp -m tcp --sport 25 -j ACCEPT
#允许本机访问外网的25端口 (用作邮件服务与外网邮件服务器的通讯)
iptables -A INPUT -p tcp -m tcp --sport 80 -j ACCEPT
#允许本机访问外网的80端口 (用于程序检验)
iptables -A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
#允许本机访问外网的80端口 (用于程序检验)
iptables -A INPUT -p tcp -m tcp --sport 3306 -j ACCEPT
#允许本机访问外网的3306端口 (用于定时程序往网内数据库写入数据)
iptables -A INPUT -p tcp -m tcp --sport 1521 -j ACCEPT
#允许本机访问外网的1521端口 (用于定时程序往网内数据库写入数据)
iptables -A INPUT -p udp --dport 123 -j ACCEPT
#允许外网访问本机upd 123端口 (时间服务)
iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT
#允许访问外网53端口 (DNS服务器)
iptables -A INPUT -p tcp -m tcp --sport 53 -j ACCEPT
#允许访问外网53端口 (DNS服务器,调试用)
iptables -A INPUT -i lo -j ACCEPT
#允许所有LO网口 127.0.0.1的访问
iptables -A INPUT -j DROP
禁止除以上列表外的所有进站请求
注: - 在修改防火墙的时候要注意INPUT 链 ,OUTPUT链, FORWARD链的默认规则,
默认规则显示如下
Chain INPUT (policy ACCEPT)
如果默认规则为 REJEC或者DROP时 在使用Iptables –F进行规则清空时会使防火墙变成拒绝所有请求的状态。所以我们在规则开头会将所有规则默认设置为允许。
2 在设置防火墙的时候我们采取的方式为先设置允许的规则,然后禁止其他所有的规则。
因为设置了禁止所有input请求,所以我们在访问外网的时候对方无法给我们回音。因此在iptables需要配置外网回路的规则 ,如下
iptables s -A INPUT -p tcp -m tcp --sport 25 -j ACCEPT
↑ ↑ ↑ ↑ ↑ ↑
命令 向INPUT链添加 TCP协议 tcp协议描述(可以不加) 源端口25 允许
(可以写1:1000这种写法)
3 在添加防火墙的时候可以在crontab里添加一个定时清除所有规则的脚本。以防加错后无法连接入服务器。
配置文件参考
1 /etc/postfix/vhosts
##
info.ule.com
info.ulechina.com
###
2 /etc/postfix/vmaps
[email protected] info.ule.com/ad/
3 /data/postmall/postfix1/etc/main.cf
#####main.cf###
APPID = 1
smtp_bind_address=61.135.164.133
queue_directory = /data/postmall/postfix1/var/spool
command_directory = /data/postmall/postfix1/sbin
daemon_directory = /data/postmall/postfix1/libexec
data_directory = /data/postmall/postfix1/var/lib/postfix
sendmail_path = /data/postmall/postfix1/sbin/sendmail
newaliases_path = /data/postmall/postfix1/bin/newaliases
mailq_path = /data/postmall/postfix1/bin/mailq
html_directory = /data/postmall/postfix1/share/html
manpage_directory = /data/postmall/postfix1/share/man
sample_directory = no
readme_directory = no
mail_owner = postfix
setgid_group = postdrop
myhostname = info.ule.com
mydomain = info.ule.com
smtpd_banner = $myhostname ESMTP Postfix_$APPID
virtual_mailbox_domains = /etc/postfix/vhosts
virtual_mailbox_base = /data/vmailbox
virtual_mailbox_maps = hash:/etc/postfix/vmaps
virtual_minimum_uid = 1000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
mailbox_size_limit = 0
home_mailbox = Maildir/
inet_interfaces = all
mynetworks_style = host
delay_warning_time = 1h
unknown_local_recipient_reject_code = 450
default_process_limit = 36
default_destination_concurrency_limit = 2
maximal_queue_lifetime = 2h
bounce_queue_lifetime = 1h
minimal_backoff_time = 1000s
maximal_backoff_time = 8000s
smtp_helo_timeout = 30s
smtp_connect_timeout = 60s
myorigin = $mydomain
mydestination = localhost.localdomain, localhost
local_recipient_maps =
relayhost =
mynetworks = 172.24.142.0/24, 172.24.154.0/24,172.24.138.0/24,172.24.139.0/24,172.24.137.0/24,127.0.0.0/8,101.230.0.99
smtpd_client_connection_count_limit = 1024
smtpd_milters = inet:localhost:20209
non_smtpd_milters = inet:localhost:20209
milter_protocol = 2
milter_default_action = accept
unknown_local_recipient_reject_code = 550
debug_peer_level = 1
smtpd_error_sleep_time = 3
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 10
smtpd_recipient_limit = 100
smtpd_recipient_restrictions = permit_mynetworks,reject_unauth_destination
default_destination_rate_delay = 3
######end####
4 master.cf
#####mast.cf####
2001 inet n - n - - smtpd
pickup fifo n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr fifo n - n 300 1 qmgr
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
proxywrite unix - - n - 1 proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp
-o smtp_fallback_relay=
showq unix n - n - - showq
error unix - - n - - error
retry 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
#####end###
postfix安装