我的per user transport配置小howto
在postfix没有release 2.0.0之前这个per user transport的功能只出现在snapshot里,现在好了可以在正式版里使用了。本文所描述的方法适合在:postfix stable > 2.0.0.0或snapshot version > 1.1.11-200205xx 的。1.描述
什么是per user transport?有什么用?简单来说就是可以为每个用户设置单独的transport,类似原来1.1.x里的domain transport一样,只不过现在的key可以是user+[email]extension@domain.tld[/email]了。好处是什么?好处就是可针对不同用户设置特定的transport,例如有些用户使用默认的local transport,而有些则可以使用病毒过滤或maildrop功能,甚至将用户送到nexthop继续进行处理等。可能的应用:病毒过滤、关键字过滤、垃圾邮件过滤、邮件的物理分布或转发等。
自己的感觉:这个功能就类似qmail里的qmqp(中央队列服务器<-->qmtpd/qmqpd机器)或者类似qmail-ldap里的cluster功能。而且要强大得多!!qmail的qmqp/qmtp协议设计得很好,思路也很不错,不过具体的implemenation就不够好。使用postfix可享受最大的灵活性。
心理暗自想:如果postfix能考虑完整的实现一下qmail的qmqp/qmtp等不错的东西,以及吸取qmail的一些优点的话,那么qmail真的就该die了:))西西。。
2.配置思路
[quote]
#
# +-------+
# local | |
# handling | MTA1 |
# layer | |
# +-------+
# ^ foo-lvs.hzqbbc.com
# |
# +--------+ +------+
# +------+ | | | |
# inbound | mail | ----> | switch |-----> | MTA2 | bar-lvs.hzqbbc.com
# email +------+ | | | |
# +--------+ +------+
# 邮件交换 local handling layer
[/quote]
将不同用户的邮件switch到不同的机器,达到分布的目的。配置方法见下文。 3.配置方法:
在mail switch机器上:
postconf -n
[code]
alias_database = hash:/etc/postfix/aliases
alias_maps = hash:/etc/postfix/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/lib/postfix
debug_peer_level = 2
inet_interfaces = all
local_recipient_maps = unix:passwd.byname $alias_maps $virtual_mailbox_maps
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination = $myhostname,$mydomain,$transport_maps
mydomain = LVS.hzqbbc.com
myhostname = LVS.hzqbbc.com
mynetworks = 192.168.0.0/16, 127.0.0.0/8
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /etc/postfix/README_FILES
sample_directory = /etc/postfix/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtpd_banner = $myhostname ESMTP $mail_name Mail-Switch ($mail_version)
smtpd_recipient_restrictions = check_relay_domains,reject
transport_maps = hash:/mnt/disk/vmail/maps/transport
unknown_local_recipient_reject_code = 450
[/code]
在MTA1和MTA2(这里我定义的机器名字是srv1, srv2)上配置完全一样,除了机器名不同,因此只列出一个srv2的example:
postconf -n
[code]
alias_database = hash:/etc/postfix/aliases
alias_maps = hash:/etc/postfix/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/lib/postfix
debug_peer_level = 2
inet_interfaces = all
local_recipient_maps = unix:passwd.byname $alias_maps $virtual_mailbox_maps
local_transport = virtual
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination = $myhostname,$mydomain, $virtual_mailbox_domains
mydomain = LVS.hzqbbc.com
myhostname = SRV2.LVS.hzqbbc.com
mynetworks = 192.168.0.0/16, 127.0.0.0/8
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /etc/postfix/README_FILES
sample_directory = /etc/postfix/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtpd_banner = $myhostname ESMTP $mail_name ($mail_version)
transport_maps = hash:/mnt/disk/vmail/maps/vuser_transport
unknown_local_recipient_reject_code = 450
virtual_gid_maps = static:250
virtual_mailbox_base = /mnt/disk/vmail
virtual_mailbox_domains = lvs.hzqbbc.com
virtual_mailbox_maps = hash:/mnt/disk/vmail/maps/mailbox
virtual_uid_maps = static:250
[/code]
之后就是配置了。
/mnt/disk/vmail/maps下有这些文件:
cat mailbox
这个文件第一行是copy 本论坛里邮件列表老外的,自己忘记加这句了。其实窃想:不加也不怕吧。。。西西。。
[code]
LVS.hzqbbc.com anything
hzq@LVS.hzqbbc.com hzq/Maildir/
ben@LVS.hzqbbc.com ben/Maildir/
foo@LVS.hzqbbc.com foo/Maildir/
bar@LVS.hzqbbc.com bar/Maildir/
[/code]
cat transport
[code]
foo@LVS.hzqbbc.com smtp:[SRV1.LVS.hzqbbc.com]
bar@LVS.hzqbbc.com smtp:[SRV2.LVS.hzqbbc.com]
[/code]
cat vuser_transport
[code]
foo@LVS.hzqbbc.com virtual:
bar@LVS.hzqbbc.com virtual:
[/code] 这样,对外部用户只有一个postfix mail-switch,爽多了。投递给该switch的邮件会转到合适的后端机器(srv1 or srv2)并进行本地投递,整个系统扩容时也特别简单,增加多1-n个switch的机器,并add的mx记录就ok了。负载可以比较平均,而不需要使用LVS设备
后端扩充用户及存储也不难,不断增加srvn(n>2)就可以了。西西。。这样的体系缺点是效率不够高,耗费机器比较多,但TOC相当低,不需要太多的开发,直接利用postfix的功能并进行合理扩充即可:)) intermail# postconf -n
alias_maps = hash:/etc/aliases
command_directory = /usr/local/sbin
config_directory = /usr/local/etc/postfix
daemon_directory = /usr/local/libexec/postfix
debug_peer_level = 2
inet_interfaces = all
mail_owner = postfix
mailq_path = /usr/local/bin/mailq
manpage_directory = /usr/local/man
mydestination = $mydomain,$transport_maps
mydomain = it.techcom.cn
myhostname = intermail.it.techcom.cn
mynetworks = 211.99.46.250/32
mynetworks_style = subnet
myorigin = $mydomain
newaliases_path = /usr/local/bin/newaliases
queue_directory = /var/spool/postfix
readme_directory = no
relay_domains = $mydestination
sample_directory = /usr/local/etc/postfix
sendmail_path = /usr/local/sbin/sendmail
setgid_group = maildrop
smtpd_client_restrictions = permit
smtpd_recipient_restrictions = check_recipient_access hash:/usr/local/etc/postfix/allow,check_sender_access hash:/usr/local/etc/postfix/allow,reject
transport_maps = hash:/usr/local/etc/postfix/transport
我的配置 为什么老是报错 说本地没有此用户给拒绝了使我的配置有什么不妥吗?
[color=red]文字[/color]
但是如我加上我要发的用户,他就能转发!反之不行 [quote]【[b]在 y-masaki 发表的大作中提到:[/b]】
:intermail# postconf -n
:alias_maps = hash:/etc/aliases
:command_directory = /usr/local/sbin
:config_directory = /usr/local/etc/postfix
[/quote]
你的配置中:
mynetworks = 211.99.46.250/32
你就只有一个机器?不过也不是什么大问题吧。。?另,你怎么指定了relay_domains是mydestination??好奇怪也。。。既然是relay的domain就不可能是mydestination。。矛盾的说:)
另外你都没说清楚你用什么用户数据库?passwd?hash?还是ldap?mysql??cdb??
一般来说,local_recipient_maps里没有的user会被postfix reject,你加了这个用户当然可以的。所谓的transport_maps就是一个传输对照表。用来判别某个TO:xxx的目标地址该如何处理。是转发还是本地接受?还是??这样的。 我用的是系统用户 我想实现基于防火墙内外的邮件转发 用postfix做转发器(邮件网关) 内部再有好多邮件服务器 请斑竹赐教 十分感谢!!!
我在线等待! [quote]【[b]在 y-masaki 发表的大作中提到:[/b]】
:我用的是系统用户 我想实现基于防火墙内外的邮件转发 用postfix做转发器(邮件网关) 内部再有好多邮件服务器 请斑竹赐教 十分感谢!!!
:我在线等待!
[/quote]
还是那句话,你所需要的东西,仔细看postfix的docs基本都能解决的。邮件防火墙的实现是postfix的一大特色。虽然其他的mta也可以做得到。
你需要我如何帮你??我不在线哦。可以上qq聊聊。27914407
页:
[1]