首页 > 代码库 > postfix安装

postfix安装

序言

这俩台机器的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

  1. 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

    1. 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






配置基本的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

  1. #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添加 用户地址池
    ad@info.ule.com info.ule.com/ad/
    news@info.ule.com info.ule.com/news/
    promotion@info.ule.com 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:20209@localhost"
    修改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 postfix

    POSTFIX 小操作

    1邮件服务器验证

    以TELNET的方式验证
    telnet 127.0.0.1 2001
    输入
    ehlo localhost
    mail from:ad@info.ule.com #注意域名要对不然无法被进行加密
    rcpt to:xuwenhao@tomstaff.com
    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/ -p


    3 添加虚拟域与域用户

    如果要给Postfix添加域和域用户 需要做以下操作
    1 修改虚拟域文件
    vim /etc/postfix/vhosts (其中直接填入地址即可)
    2 修改vmaps文件
    vi /etc/postfix/vmaps
    ad@info.ule.com 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
    禁止除以上列表外的所有进站请求
    注:

  2. 在修改防火墙的时候要注意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

ad@info.ule.com 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###

本文出自 “zhanghe” 博客,请务必保留此出处http://9206668.blog.51cto.com/9196668/1535920