zoukankan      html  css  js  c++  java
  • postfix路由流程

    postfix收到邮件后,先由cleanup程序处理收件地址(把一些不规范的发件和收件地址域名“清理”一下,比如没有的补全,改写等等)。cleanup清理后的邮件被队列管理器交给trivial-rewrite来决定下一步的传输路由。
    postfix下一步的传输前需要获得几个目标地址数据:

    mydestination:本地标识;
    virtual_mailbox_domains:虚拟邮箱域名;
    relay_domains:转发域。
    路由信息包括邮件下一步的传输者(transport)和下一跳收件地址(next-hop destinations)。
    
    传输者是指 local 或 smtp 这样的在master.cf 里定义的记录。
    next-hop destinations 包括 主机或域名等。
    trivial-rewrite 判定的过程如下:
    
    如果收件域出现在mydestination里,或目标收件ip地址与inet_interfaces或inet_interfaces或proxy_interfaces 匹配,邮件由 [local_transport] 投递;
    [local_transport]的缺省设置是 local:myhostname。表示transport是local(master.cf里定义的),next−hop为myhostname。表示transport是local(master.cf里定义的),next−hop为myhostname。
    
    如果收件域出现在virtual_mailbox_domains里,表示为虚拟域的邮件,邮件由 [virtual_transport] 投递;
    [virtual_transport] 缺省的设置是 virtual: ,表示用 virtual 投递,next-hop还是原收件地址。
    virtual 根据 virtual_mailbox_base 来确定邮箱根目录,根据 virtual_mailbox_maps 来确定邮箱的存储路径,根据 virtual_uid_maps 和 virtual_gid_maps 来确定保存邮件使用的uid和gid。
    现在大多数都使用 maildrop 来进行虚拟域的投递,安装好maildrop后先在master.cf里把maildrop配置成一个transport,然后设置 :
    virtual_transport = maildrop:
    

    如果收件域出现在relay_domains里,则直接转发邮件;
    对于postfix来说,如果收下发往非本域的、需要通过网络转发到别的域的邮件,比如发给新浪搜狐的,则发信人得到许可才给转发。(否则就属于开放转发了,会被垃圾邮件发送者利用)。
    最常见就是发信人连接本域SMTP服务时,通过用户名口令确定了本域的身份,就可以给任何域发送邮件;如果发信人IP地址与 inet_interfaces 或 proxy_interfaces 匹配,则不需要smtp身份认证也可以转发邮件。
    有一种特殊情况除外,那就是如果收件域出现在 relay_domains 里,不需要发信人smtp身份认证就可以转发。
    [relay_transport] 的缺省设置是 relay: ,查看master.cf,relay实际上就是通过smtp来转发邮件的。
    如果 relay_transport 设置里next-hop destinations为空,则依次查询 sender_dependent_relayhost_maps, relayhost 来确定,如果都为空则next-hop 为原收件地址不变。

    如果收件域是需要远程投递的其他的域,邮件由 [default_transport] 投递;
    [default_transport] 的缺省设置是 smtp: 。smtp MDA会先查询收件域名的mx记录,查询出ip后连接25端口进行投递。
    如果 default_transport 设置里next-hop destinations为空,则依次查询 default_transport, sender_dependent_relayhost_maps,
    relayhost来确定,如果都为空则next-hop 为原收件地址不变。

    以上是postfix缺省的邮件路由方式,如果我们要自己指定一些路由方式,比如把 abc.com 所有邮件转发到另外一台主机让它来投递,把 root@xyz.com 的邮件拒收等等,我们就需要用到transport_maps查询表。transport_maps比缺省的postfix路由方式优先级要高。

    transport_maps数据项的键名为收件地址,键值为 transport:nexthop
    收件地址可以是一个域名,表示匹配这个域名下所有的收件地址。
    transport必须是master.cf里定义的传输方式。
    如果 transport 传输方式是 inet 类型,则 nexthop 的形式为 host:port。如果 host 是个域名,则先查询mx记录确定ip地址。如果 host 本身就是个ip或是个A记录,则需要用方括号括起来。
    port指定要连接的端口,缺省是25。

    举几个例子:
    
    abc.com    smtp:[192.168.12.34]:20025
    发送给abc.com的邮件使用smtp MDA传送到192.168.12.34的20025端口上。
    
    xyz.com    maildrop
    发送给xyz.com的邮件交给maildrop投递。
    
    root@abc.com   error:No mail accepted for root
    当场拒收给root@abc.com的邮件,并给出错误信息:No mail accepted for root
    
    spam@mydomain.com    spam
    这个是dspam里的设置,表示把发给spam@mydomain.com的邮件交给spam(同样,spam在master.cf里设置)。
    

    postfix增强型路由设计
    原理基于relay_transport,以优先级顺序,选取nexthop目的地址:

    relay_transport
    sender_dependent_relayhost_maps
    relayhost
    收件人域
    1.将目的domain、UD、IP信息插入YYTC_router.conf文件
    2.在配置启用后,将YYTC_router.con文件中路由数据插入transport文件
    3.通过transport_maps控制邮件流程
    4.如果配置复制路由功能,则对应nexthop为一个地址组,包含原地址和复制地址

  • 相关阅读:
    ThreadLocal
    spring概述
    排序
    内存的分配原则
    常用概念比较
    垃圾回收机制
    java的内存模型
    对象的内存布局
    adb connect 和 install 通讯流程
    Android硬件抽象层(HAL)深入剖析(三)
  • 原文地址:https://www.cnblogs.com/enumx/p/12416833.html
Copyright © 2011-2022 走看看