Home | History | Annotate | Line # | Download | only in html
POSTSCREEN_README.html revision 1.1.1.7
      1      1.1      tron <!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN"
      2      1.1      tron         "http://www.w3.org/TR/html4/loose.dtd">
      3      1.1      tron 
      4      1.1      tron <head>
      5      1.1      tron 
      6      1.1      tron <title>Postfix Postscreen Howto</title>
      7      1.1      tron 
      8  1.1.1.7  christos <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      9      1.1      tron 
     10      1.1      tron </head>
     11      1.1      tron 
     12      1.1      tron <body>
     13      1.1      tron 
     14      1.1      tron <h1><img src="postfix-logo.jpg" width="203" height="98" ALT="">Postfix Postscreen Howto</h1>
     15      1.1      tron 
     16      1.1      tron <hr>
     17      1.1      tron 
     18      1.1      tron <h2> <a name="intro">Introduction</a> </h2>
     19      1.1      tron 
     20  1.1.1.3      tron <p> This document describes features that are available in Postfix
     21  1.1.1.7  christos 3.6 and later. See <a href="POSTSCREEN_3_5_README.html">
     22  1.1.1.7  christos POSTSCREEN_3_5_README.html</a> for Postfix versions 2.8 - 3.5. </p>
     23  1.1.1.3      tron 
     24  1.1.1.3      tron <p> The Postfix <a href="postscreen.8.html">postscreen(8)</a> daemon provides additional protection
     25  1.1.1.3      tron against mail server overload. One <a href="postscreen.8.html">postscreen(8)</a> process handles
     26  1.1.1.3      tron multiple inbound SMTP connections, and decides which clients may
     27  1.1.1.3      tron talk to a Postfix SMTP server process.  By keeping spambots away,
     28  1.1.1.3      tron <a href="postscreen.8.html">postscreen(8)</a> leaves more SMTP server processes available for
     29  1.1.1.3      tron legitimate clients, and delays the onset of <a
     30  1.1.1.3      tron href="STRESS_README.html">server overload</a> conditions. </p>
     31  1.1.1.3      tron 
     32  1.1.1.3      tron <p> <a href="postscreen.8.html">postscreen(8)</a> should not be used on SMTP ports that receive
     33  1.1.1.3      tron mail from end-user clients (MUAs). In a typical deployment,
     34  1.1.1.3      tron <a href="postscreen.8.html">postscreen(8)</a> handles the MX service on TCP port 25, while MUA
     35  1.1.1.3      tron clients submit mail via the submission service on TCP port 587 which
     36  1.1.1.3      tron requires client authentication. Alternatively, a site could set up
     37  1.1.1.3      tron a dedicated, non-postscreen, "port 25" server that provides submission
     38  1.1.1.3      tron service and client authentication, but no MX service.  </p>
     39      1.1      tron 
     40  1.1.1.7  christos <p> <a href="postscreen.8.html">postscreen(8)</a> maintains a temporary allowlist for clients that
     41  1.1.1.7  christos pass its tests; by allowing allowlisted clients to skip tests,
     42  1.1.1.2      tron <a href="postscreen.8.html">postscreen(8)</a> minimizes its impact on legitimate email traffic.
     43  1.1.1.2      tron </p>
     44  1.1.1.2      tron 
     45      1.1      tron <p> <a href="postscreen.8.html">postscreen(8)</a> is part of a multi-layer defense. <p>
     46      1.1      tron 
     47      1.1      tron <ul>
     48      1.1      tron 
     49      1.1      tron <li> <p> As the first layer, <a href="postscreen.8.html">postscreen(8)</a> blocks connections from
     50      1.1      tron zombies and other spambots that are responsible for about 90% of
     51      1.1      tron all spam.  It is implemented as a single process to make this defense
     52  1.1.1.3      tron as inexpensive as possible. </p>
     53      1.1      tron 
     54      1.1      tron <li> <p> The second layer implements more complex SMTP-level access
     55  1.1.1.3      tron checks with <a href="SMTPD_ACCESS_README.html">Postfix SMTP servers</a>, 
     56  1.1.1.3      tron <a href="SMTPD_POLICY_README.html">policy daemons</a>, and 
     57  1.1.1.3      tron <a href="MILTER_README.html">Milter applications</a>. </p>
     58      1.1      tron 
     59      1.1      tron <li> <p> The third layer performs light-weight content inspection
     60      1.1      tron with the Postfix built-in <a href="postconf.5.html#header_checks">header_checks</a> and <a href="postconf.5.html#body_checks">body_checks</a>. This can
     61      1.1      tron block unacceptable attachments such as executable programs, and
     62      1.1      tron worms or viruses with easy-to-recognize signatures. </p>
     63      1.1      tron 
     64      1.1      tron <li> <p> The fourth layer provides heavy-weight content inspection
     65  1.1.1.3      tron with external content filters. Typical examples are <a
     66  1.1.1.3      tron href="http://www.ijs.si/software/amavisd/">Amavisd-new</a>, <a
     67  1.1.1.3      tron href="http://spamassassin.apache.org/">SpamAssassin</a>, and <a
     68  1.1.1.3      tron href="MILTER_README.html">Milter applications</a>. </p>
     69      1.1      tron 
     70      1.1      tron </ul>
     71      1.1      tron 
     72      1.1      tron <p> Each layer reduces the spam volume. The general strategy is to
     73      1.1      tron use the less expensive defenses first, and to use the more expensive
     74  1.1.1.2      tron defenses only for the spam that remains. </p>
     75      1.1      tron 
     76      1.1      tron <p> Topics in this document: </p>
     77      1.1      tron 
     78      1.1      tron <ul>
     79      1.1      tron 
     80      1.1      tron <li> <a href="#intro">Introduction</a>
     81      1.1      tron 
     82      1.1      tron <li> <a href="#basic">The basic idea behind postscreen(8)</a>
     83      1.1      tron 
     84      1.1      tron <li> <a href="#general"> General operation </a>
     85      1.1      tron 
     86      1.1      tron <li> <a href="#quick">Quick tests before everything else</a>
     87      1.1      tron 
     88      1.1      tron <li> <a href="#before_220"> Tests before the 220 SMTP server greeting </a>
     89      1.1      tron 
     90      1.1      tron <li> <a href="#after_220">Tests after the 220 SMTP server greeting</a>
     91      1.1      tron 
     92      1.1      tron <li> <a href="#other_error">Other errors</a>
     93      1.1      tron 
     94      1.1      tron <li> <a href="#victory">When all tests succeed</a>
     95      1.1      tron 
     96      1.1      tron <li> <a href="#config"> Configuring the postscreen(8) service</a>
     97      1.1      tron 
     98      1.1      tron <li> <a href="#historical"> Historical notes and credits </a>
     99      1.1      tron 
    100      1.1      tron </ul>
    101      1.1      tron 
    102      1.1      tron <h2> <a name="basic">The basic idea behind postscreen(8)</a> </h2>
    103      1.1      tron 
    104      1.1      tron <p> Most email is spam, and most spam is sent out by zombies (malware
    105      1.1      tron on compromised end-user computers).  Wietse expects that the zombie
    106      1.1      tron problem will get worse before things improve, if ever. Without a
    107      1.1      tron tool like <a href="postscreen.8.html">postscreen(8)</a> that keeps the zombies away, Postfix would be
    108      1.1      tron spending most of its resources not receiving email. </p>
    109      1.1      tron 
    110  1.1.1.6  christos <p> The main challenge for <a href="postscreen.8.html">postscreen(8)</a> is to make an is-a-zombie
    111      1.1      tron decision based on a single measurement. This is necessary because
    112  1.1.1.2      tron many zombies try to fly under the radar and avoid spamming the same
    113  1.1.1.2      tron site repeatedly.  Once <a href="postscreen.8.html">postscreen(8)</a> decides that a client is
    114  1.1.1.7  christos not-a-zombie, it allowlists the client temporarily to avoid further
    115  1.1.1.2      tron delays for legitimate mail. </p>
    116      1.1      tron 
    117      1.1      tron <p> Zombies have challenges too: they have only a limited amount
    118  1.1.1.7  christos of time to deliver spam before their IP address becomes denylisted.
    119      1.1      tron To speed up spam deliveries, zombies make compromises in their SMTP
    120      1.1      tron protocol implementation.  For example, they speak before their turn,
    121      1.1      tron or they ignore responses from SMTP servers and continue sending
    122      1.1      tron mail even when the server tells them to go away. </p>
    123      1.1      tron 
    124      1.1      tron <p> <a href="postscreen.8.html">postscreen(8)</a> uses a variety of measurements to recognize
    125      1.1      tron zombies.  First, <a href="postscreen.8.html">postscreen(8)</a> determines if the remote SMTP client
    126  1.1.1.7  christos IP address is denylisted.  Second, <a href="postscreen.8.html">postscreen(8)</a> looks for protocol
    127      1.1      tron compromises that are made to speed up delivery.  These are good
    128  1.1.1.6  christos indicators for making is-a-zombie decisions based on single
    129      1.1      tron measurements.  </p>
    130      1.1      tron 
    131      1.1      tron <p> <a href="postscreen.8.html">postscreen(8)</a> does not inspect message content. Message content
    132      1.1      tron can vary from one delivery to the next, especially with clients
    133      1.1      tron that (also) send legitimate email.  Content is not a good indicator
    134  1.1.1.6  christos for making is-a-zombie decisions based on single measurements,
    135      1.1      tron and that is the problem that <a href="postscreen.8.html">postscreen(8)</a> is focused on.  </p>
    136      1.1      tron 
    137      1.1      tron <h2> <a name="general"> General operation </a> </h2>
    138      1.1      tron 
    139  1.1.1.3      tron <p> For each connection from an SMTP client, <a href="postscreen.8.html">postscreen(8)</a> performs
    140  1.1.1.3      tron a number of tests
    141      1.1      tron in the order as described below.  Some tests introduce a delay of
    142  1.1.1.7  christos a few seconds.  <a href="postscreen.8.html">postscreen(8)</a> maintains a temporary allowlist for
    143  1.1.1.7  christos clients that pass its tests; by allowing allowlisted clients to
    144  1.1.1.2      tron skip tests, <a href="postscreen.8.html">postscreen(8)</a> minimizes its impact on legitimate email
    145  1.1.1.2      tron traffic.  </p>
    146  1.1.1.2      tron 
    147  1.1.1.2      tron <p> By default, <a href="postscreen.8.html">postscreen(8)</a> hands off all connections to a Postfix
    148  1.1.1.2      tron SMTP server process after logging its findings. This mode is useful
    149  1.1.1.2      tron for non-destructive testing. </p>
    150      1.1      tron 
    151      1.1      tron <p> In a typical production setting, <a href="postscreen.8.html">postscreen(8)</a> is configured
    152      1.1      tron to reject mail from clients that fail one or more tests, after
    153      1.1      tron logging the helo, sender and recipient information. </p>
    154      1.1      tron 
    155      1.1      tron <p> Note: <a href="postscreen.8.html">postscreen(8)</a> is not an SMTP proxy; this is intentional.
    156      1.1      tron The purpose is to keep zombies away from Postfix, with minimal
    157      1.1      tron overhead for legitimate clients. </p>
    158      1.1      tron 
    159      1.1      tron <h2> <a name="quick">Quick tests before everything else</a> </h2>
    160      1.1      tron 
    161      1.1      tron <p> Before engaging in SMTP-level tests. <a href="postscreen.8.html">postscreen(8)</a> queries a
    162  1.1.1.7  christos number of local deny and allowlists. These tests speed up the
    163      1.1      tron handling of known clients. </p>
    164      1.1      tron 
    165      1.1      tron <ul>
    166      1.1      tron 
    167  1.1.1.7  christos <li> <a href="#perm_allow_deny"> Permanent allow/denylist test </a>
    168      1.1      tron 
    169  1.1.1.7  christos <li> <a href="#temp_allow"> Temporary allowlist test </a>
    170      1.1      tron 
    171  1.1.1.7  christos <li> <a href="#allow_veto"> MX Policy test </a>
    172  1.1.1.2      tron 
    173      1.1      tron </ul>
    174      1.1      tron 
    175  1.1.1.7  christos <h3> <a name="perm_allow_deny"> Permanent allow/denylist test </a> </h3>
    176      1.1      tron 
    177      1.1      tron <p> The <a href="postconf.5.html#postscreen_access_list">postscreen_access_list</a> parameter (default: <a href="postconf.5.html#permit_mynetworks">permit_mynetworks</a>)
    178      1.1      tron specifies a permanent access list for SMTP client IP addresses. Typically
    179  1.1.1.7  christos one would specify something that allowlists local networks, followed
    180  1.1.1.7  christos by a CIDR table for selective allow- and denylisting. </p>
    181      1.1      tron 
    182      1.1      tron <p> Example: </p>
    183      1.1      tron 
    184      1.1      tron <pre>
    185      1.1      tron /etc/postfix/<a href="postconf.5.html">main.cf</a>:
    186      1.1      tron     <a href="postconf.5.html#postscreen_access_list">postscreen_access_list</a> = <a href="postconf.5.html#permit_mynetworks">permit_mynetworks</a>,
    187      1.1      tron         <a href="cidr_table.5.html">cidr</a>:/etc/postfix/postscreen_access.cidr
    188      1.1      tron 
    189      1.1      tron /etc/postfix/postscreen_access.<a href="cidr_table.5.html">cidr</a>:
    190      1.1      tron    # Rules are evaluated in the order as specified.
    191  1.1.1.7  christos    # Denylist 192.168.* except 192.168.0.1.
    192      1.1      tron    192.168.0.1          permit
    193      1.1      tron    192.168.0.0/16       reject
    194      1.1      tron </pre>
    195      1.1      tron 
    196      1.1      tron <p> See the <a href="postconf.5.html#postscreen_access_list">postscreen_access_list</a> manpage documentation for more
    197      1.1      tron details.  </p>
    198      1.1      tron 
    199      1.1      tron <p> When the SMTP client address matches a "permit" action,
    200      1.1      tron <a href="postscreen.8.html">postscreen(8)</a> logs this with the client address and port number as:
    201      1.1      tron </p>
    202      1.1      tron 
    203  1.1.1.7  christos <blockquote> 
    204      1.1      tron <pre>
    205  1.1.1.7  christos <b>ALLOWLISTED</b> <i>[address]:port</i>
    206      1.1      tron </pre>
    207  1.1.1.7  christos </blockquote>
    208  1.1.1.7  christos 
    209  1.1.1.7  christos <blockquote> <p> Use the <a href="postconf.5.html#respectful_logging">respectful_logging</a> configuration parameter to
    210  1.1.1.7  christos select a deprecated form of this logging. </p> </blockquote>
    211      1.1      tron 
    212  1.1.1.7  christos <p> The allowlist action is not configurable: immediately hand off the
    213      1.1      tron connection to a Postfix SMTP server process. </p>
    214      1.1      tron 
    215      1.1      tron <p> When the SMTP client address matches a "reject" action,
    216      1.1      tron <a href="postscreen.8.html">postscreen(8)</a> logs this with the client address and port number as:
    217      1.1      tron </p>
    218      1.1      tron 
    219  1.1.1.7  christos <blockquote> 
    220      1.1      tron <pre>
    221  1.1.1.7  christos <b>DENYLISTED</b> <i>[address]:port</i>
    222      1.1      tron </pre>
    223  1.1.1.7  christos </blockquote>
    224      1.1      tron 
    225  1.1.1.7  christos <blockquote> <p> Use the <a href="postconf.5.html#respectful_logging">respectful_logging</a> configuration parameter to
    226  1.1.1.7  christos select a deprecated form of this logging. </p> </blockquote>
    227  1.1.1.7  christos 
    228  1.1.1.7  christos <p> The <a href="postconf.5.html#postscreen_denylist_action">postscreen_denylist_action</a> parameter specifies the action
    229      1.1      tron that is taken next.  See "<a href="#fail_before_220">When tests
    230      1.1      tron fail before the 220 SMTP server greeting</a>" below. </p>
    231      1.1      tron 
    232  1.1.1.7  christos <h3> <a name="temp_allow"> Temporary allowlist test </a> </h3>
    233      1.1      tron 
    234      1.1      tron <p> The <a href="postscreen.8.html">postscreen(8)</a> daemon maintains a <i>temporary</i>
    235  1.1.1.7  christos allowlist for SMTP client IP addresses that have passed all
    236      1.1      tron the tests described below. The <a href="postconf.5.html#postscreen_cache_map">postscreen_cache_map</a> parameter
    237  1.1.1.7  christos specifies the location of the temporary allowlist.  The
    238  1.1.1.7  christos temporary allowlist is not used for SMTP client addresses
    239  1.1.1.2      tron that appear on the <i>permanent</i> access list. </p>
    240  1.1.1.2      tron 
    241  1.1.1.7  christos <p> By default the temporary allowlist is not shared with other
    242  1.1.1.7  christos <a href="postscreen.8.html">postscreen(8)</a> daemons. See
    243  1.1.1.7  christos <a href="#temp_allow_sharing"> Sharing
    244  1.1.1.7  christos the temporary allowlist </a> below for alternatives. </p>
    245      1.1      tron 
    246      1.1      tron <p> When the SMTP client address appears on the temporary
    247  1.1.1.7  christos allowlist, <a href="postscreen.8.html">postscreen(8)</a> logs this with the client address and port
    248      1.1      tron number as: </p>
    249      1.1      tron 
    250      1.1      tron <pre>
    251      1.1      tron     <b>PASS OLD</b> <i>[address]:port</i>
    252      1.1      tron </pre>
    253      1.1      tron 
    254      1.1      tron <p> The action is not configurable: immediately hand off the
    255      1.1      tron connection to a Postfix SMTP server process.  The client is
    256  1.1.1.7  christos excluded from further tests until its temporary allowlist
    257      1.1      tron entry expires, as controlled with the postscreen_*_ttl
    258      1.1      tron parameters.  Expired entries are silently renewed if possible. </p>
    259      1.1      tron 
    260  1.1.1.7  christos <h3> <a name="allow_veto"> MX Policy test </a> </h3>
    261  1.1.1.2      tron 
    262  1.1.1.2      tron <p> When the remote SMTP client is not on the static access list
    263  1.1.1.7  christos or temporary allowlist, <a href="postscreen.8.html">postscreen(8)</a> can implement a number of
    264  1.1.1.7  christos allowlist tests, before it grants the client a temporary allowlist
    265  1.1.1.2      tron status that allows it to talk to a Postfix SMTP server process. </p>
    266  1.1.1.2      tron 
    267  1.1.1.3      tron <p> When <a href="postscreen.8.html">postscreen(8)</a> is configured to monitor all primary and
    268  1.1.1.7  christos backup MX addresses, it can refuse to allowlist clients that connect
    269  1.1.1.3      tron to a backup MX address only (an old spammer trick to take advantage
    270  1.1.1.3      tron of backup MX hosts with weaker anti-spam policies than primary MX
    271  1.1.1.2      tron hosts). </p>
    272  1.1.1.2      tron 
    273  1.1.1.3      tron <blockquote> <p> NOTE: The following solution is for small sites.
    274  1.1.1.3      tron Larger sites would have to share the <a href="postscreen.8.html">postscreen(8)</a> cache between
    275  1.1.1.3      tron primary and backup MTAs, which would introduce a common point of
    276  1.1.1.3      tron failure.  </p> </blockquote>
    277  1.1.1.3      tron 
    278  1.1.1.2      tron <ul>
    279  1.1.1.2      tron 
    280  1.1.1.2      tron <li> <p> First, configure the host to listen on both primary and
    281  1.1.1.7  christos backup MX addresses. Use the appropriate <tt>ifconfig</tt> or <tt>ip</tt>
    282  1.1.1.7  christos command for the local operating system, or update the appropriate
    283  1.1.1.7  christos configuration files and "refresh" the network protocol stack. </p>
    284  1.1.1.2      tron 
    285  1.1.1.3      tron <p> <p> Second, configure Postfix to listen on the new IP address
    286  1.1.1.3      tron (this step is needed when you have specified <a href="postconf.5.html#inet_interfaces">inet_interfaces</a> in
    287  1.1.1.3      tron <a href="postconf.5.html">main.cf</a>). </p>
    288  1.1.1.3      tron 
    289  1.1.1.7  christos <li> <p> Then, configure <a href="postscreen.8.html">postscreen(8)</a> to deny the temporary allowlist
    290  1.1.1.2      tron status on the backup MX address(es).  An example for Wietse's
    291  1.1.1.2      tron server is: </p>
    292  1.1.1.2      tron 
    293  1.1.1.2      tron <pre>
    294  1.1.1.2      tron /etc/postfix/<a href="postconf.5.html">main.cf</a>:
    295  1.1.1.7  christos     <a href="postconf.5.html#postscreen_allowlist_interfaces">postscreen_allowlist_interfaces</a> = !168.100.189.8 <a href="DATABASE_README.html#types">static</a>:all
    296  1.1.1.2      tron </pre>
    297  1.1.1.2      tron 
    298  1.1.1.7  christos <p> Translation: allow clients to obtain the temporary allowlist
    299  1.1.1.2      tron status on all server IP addresses except 168.100.189.8, which is a
    300  1.1.1.2      tron backup MX address.  </p>
    301  1.1.1.2      tron 
    302  1.1.1.2      tron </ul>
    303  1.1.1.2      tron 
    304  1.1.1.7  christos <p> When a non-allowlisted client connects the backup MX address,
    305  1.1.1.2      tron <a href="postscreen.8.html">postscreen(8)</a> logs this with the client address and port number as:
    306  1.1.1.2      tron </p>
    307  1.1.1.2      tron 
    308  1.1.1.7  christos <blockquote> <pre>
    309  1.1.1.7  christos <b>CONNECT from</b> <i>[address]:port</i> <b>to [168.100.189.8]:25</b>
    310  1.1.1.7  christos <b>ALLOWLIST VETO</b> <i>[address]:port</i>
    311  1.1.1.7  christos </pre> </blockquote>
    312  1.1.1.7  christos 
    313  1.1.1.7  christos <blockquote> <p> Use the <a href="postconf.5.html#respectful_logging">respectful_logging</a> configuration parameter to
    314  1.1.1.7  christos select a deprecated form of this logging. </p> </blockquote>
    315  1.1.1.2      tron 
    316  1.1.1.2      tron <p> Translation: the client at <i>[address]:port</i> connected to
    317  1.1.1.7  christos the backup MX address 168.100.189.8 while it was not allowlisted.
    318  1.1.1.7  christos The client will not be granted the temporary allowlist status, even
    319  1.1.1.7  christos if passes all the allowlist tests described below. </p>
    320  1.1.1.2      tron 
    321      1.1      tron <h2> <a name="before_220"> Tests before the 220 SMTP server greeting </a> </h2>
    322      1.1      tron 
    323      1.1      tron <p> The <a href="postconf.5.html#postscreen_greet_wait">postscreen_greet_wait</a> parameter specifies a short time
    324      1.1      tron interval before the "220 <i>text</i>..." server greeting, where
    325      1.1      tron <a href="postscreen.8.html">postscreen(8)</a> can run a number of tests in parallel. </p>
    326      1.1      tron 
    327      1.1      tron <p> When a good client passes these tests, and no "<a
    328  1.1.1.7  christos href="#after_220">deep protocol tests</a>"
    329  1.1.1.7  christos are configured, <a href="postscreen.8.html">postscreen(8)</a>
    330  1.1.1.7  christos adds the client to the temporary allowlist and hands off the "live"
    331      1.1      tron connection to a Postfix SMTP server process.  The client can then
    332      1.1      tron continue as if <a href="postscreen.8.html">postscreen(8)</a> never even existed (except of course
    333      1.1      tron for the short <a href="postconf.5.html#postscreen_greet_wait">postscreen_greet_wait</a> delay).  </p>
    334      1.1      tron 
    335      1.1      tron <ul>
    336      1.1      tron 
    337      1.1      tron <li> <a href="#pregreet"> Pregreet test </a>
    338      1.1      tron 
    339  1.1.1.7  christos <li> <a href="#dnsbl"> DNS Allow/denylist test </a>
    340      1.1      tron 
    341      1.1      tron <li> <a href="#fail_before_220">When tests fail before the 220 SMTP server greeting</a>
    342      1.1      tron 
    343      1.1      tron </ul>
    344      1.1      tron 
    345      1.1      tron <h3> <a name="pregreet"> Pregreet test </a> </h3>
    346      1.1      tron 
    347      1.1      tron <p> The SMTP protocol is a classic example of a protocol where the
    348      1.1      tron server speaks before the client. <a href="postscreen.8.html">postscreen(8)</a> detects zombies
    349      1.1      tron that are in a hurry and that speak before their turn. This test is
    350      1.1      tron enabled by default. </p>
    351      1.1      tron 
    352      1.1      tron <p> The <a href="postconf.5.html#postscreen_greet_banner">postscreen_greet_banner</a> parameter specifies the <i>text</i>
    353      1.1      tron portion of a "220-<i>text</i>..." teaser banner (default: $<a href="postconf.5.html#smtpd_banner">smtpd_banner</a>).
    354      1.1      tron Note that this becomes the first part of a multi-line server greeting.
    355      1.1      tron The <a href="postscreen.8.html">postscreen(8)</a> daemon sends this before the <a href="postconf.5.html#postscreen_greet_wait">postscreen_greet_wait</a>
    356      1.1      tron timer is started.  The purpose of the teaser banner is to confuse
    357      1.1      tron zombies so that they speak before their turn. It has no effect on
    358      1.1      tron SMTP clients that correctly implement the protocol.  </p>
    359      1.1      tron 
    360      1.1      tron <p> To avoid problems with poorly-implemented SMTP engines in network
    361      1.1      tron appliances or network testing tools, either exclude them from all
    362      1.1      tron tests with the <a href="postconf.5.html#postscreen_access_list">postscreen_access_list</a> feature or else specify
    363      1.1      tron an empty teaser banner: </p>
    364      1.1      tron 
    365      1.1      tron <pre>
    366      1.1      tron /etc/postfix/<a href="postconf.5.html">main.cf</a>:
    367  1.1.1.7  christos     # Exclude broken clients by allowlisting. Clients in <a href="postconf.5.html#mynetworks">mynetworks</a>
    368  1.1.1.7  christos     # should always be allowlisted.
    369      1.1      tron     <a href="postconf.5.html#postscreen_access_list">postscreen_access_list</a> = <a href="postconf.5.html#permit_mynetworks">permit_mynetworks</a>, 
    370      1.1      tron         <a href="cidr_table.5.html">cidr</a>:/etc/postfix/postscreen_access.cidr
    371      1.1      tron 
    372      1.1      tron /etc/postfix/postscreen_access.<a href="cidr_table.5.html">cidr</a>:
    373      1.1      tron     192.168.254.0/24 permit
    374      1.1      tron </pre>
    375      1.1      tron 
    376      1.1      tron <pre>
    377      1.1      tron /etc/postfix/<a href="postconf.5.html">main.cf</a>:
    378  1.1.1.7  christos     # Disable the teaser banner (try allowlisting first if you can).
    379      1.1      tron     <a href="postconf.5.html#postscreen_greet_banner">postscreen_greet_banner</a> =
    380      1.1      tron </pre>
    381      1.1      tron 
    382      1.1      tron <p> When an SMTP client sends a command before the
    383      1.1      tron <a href="postconf.5.html#postscreen_greet_wait">postscreen_greet_wait</a> time has elapsed, <a href="postscreen.8.html">postscreen(8)</a> logs this as:
    384      1.1      tron </p>
    385      1.1      tron 
    386      1.1      tron <pre>
    387      1.1      tron     <b>PREGREET</b> <i>count</i> <b>after</b> <i>time</i> <b>from</b> <i>[address]:port text...</i>
    388      1.1      tron </pre>
    389      1.1      tron 
    390      1.1      tron <p> Translation: the client at <i>[address]:port</i> sent <i>count</i>
    391      1.1      tron bytes before its turn to speak. This happened <i>time</i> seconds
    392      1.1      tron after the <a href="postconf.5.html#postscreen_greet_wait">postscreen_greet_wait</a> timer was started.  The <i>text</i>
    393      1.1      tron is what the client sent (truncated to 100 bytes, and with non-printable
    394      1.1      tron characters replaced with C-style escapes such as \r for carriage-return
    395      1.1      tron and \n for newline). </p>
    396      1.1      tron 
    397      1.1      tron <p> The <a href="postconf.5.html#postscreen_greet_action">postscreen_greet_action</a> parameter specifies the action that
    398      1.1      tron is taken next.  See "<a href="#fail_before_220">When tests fail
    399      1.1      tron before the 220 SMTP server greeting</a>" below. </p>
    400      1.1      tron 
    401  1.1.1.7  christos <h3> <a name="dnsbl"> DNS Allow/denylist test </a> </h3>
    402      1.1      tron 
    403      1.1      tron <p> The <a href="postconf.5.html#postscreen_dnsbl_sites">postscreen_dnsbl_sites</a> parameter (default: empty) specifies
    404      1.1      tron a list of DNS blocklist servers with optional filters and weight
    405  1.1.1.7  christos factors (positive weights for denylisting, negative for allowlisting).
    406      1.1      tron These servers will be queried in parallel with the reverse client
    407      1.1      tron IP address.  This test is disabled by default. </p>
    408      1.1      tron 
    409      1.1      tron <blockquote>
    410      1.1      tron <p>
    411      1.1      tron CAUTION: when postscreen rejects mail, its SMTP reply contains the
    412      1.1      tron DNSBL domain name. Use the <a href="postconf.5.html#postscreen_dnsbl_reply_map">postscreen_dnsbl_reply_map</a> feature to
    413      1.1      tron hide "password" information in DNSBL domain names.
    414      1.1      tron </p>
    415      1.1      tron </blockquote>
    416      1.1      tron 
    417      1.1      tron <p> When the <a href="postconf.5.html#postscreen_greet_wait">postscreen_greet_wait</a> time has elapsed, and the combined
    418      1.1      tron DNSBL score is equal to or greater than the <a href="postconf.5.html#postscreen_dnsbl_threshold">postscreen_dnsbl_threshold</a>
    419      1.1      tron parameter value, <a href="postscreen.8.html">postscreen(8)</a> logs this as: </p>
    420      1.1      tron 
    421      1.1      tron <pre>
    422      1.1      tron     <b>DNSBL rank</b> <i>count</i> <b>for</b> <i>[address]:port</i>
    423      1.1      tron </pre>
    424      1.1      tron 
    425      1.1      tron <p> Translation: the SMTP client at <i>[address]:port</i> has a combined
    426      1.1      tron DNSBL score of <i>count</i>. </p>
    427      1.1      tron 
    428      1.1      tron <p> The <a href="postconf.5.html#postscreen_dnsbl_action">postscreen_dnsbl_action</a> parameter specifies the action that
    429      1.1      tron is taken when the combined DNSBL score is equal to or greater than
    430      1.1      tron the threshold.  See "<a href="#fail_before_220">When tests fail
    431      1.1      tron before the 220 SMTP server greeting</a>" below. </p>
    432      1.1      tron 
    433      1.1      tron <h3> <a name="fail_before_220">When tests fail before the 220 SMTP server greeting</a> </h3>
    434      1.1      tron 
    435  1.1.1.7  christos <p> When the client address matches the permanent denylist, or
    436      1.1      tron when the client fails the pregreet or DNSBL tests, the action is
    437  1.1.1.7  christos specified with <a href="postconf.5.html#postscreen_denylist_action">postscreen_denylist_action</a>, <a href="postconf.5.html#postscreen_greet_action">postscreen_greet_action</a>,
    438      1.1      tron or <a href="postconf.5.html#postscreen_dnsbl_action">postscreen_dnsbl_action</a>, respectively. </p>
    439      1.1      tron 
    440      1.1      tron <dl>
    441      1.1      tron 
    442      1.1      tron <dt> <b>ignore</b> (default) </dt>
    443      1.1      tron 
    444      1.1      tron <dd> Ignore the failure of this test. Allow other tests to complete.
    445      1.1      tron Repeat this test the next time the client connects.  This option
    446      1.1      tron is useful for testing and collecting statistics without blocking
    447      1.1      tron mail. </dd>
    448      1.1      tron 
    449      1.1      tron <dt> <b>enforce</b> </dt>
    450      1.1      tron 
    451      1.1      tron <dd> Allow other tests to complete.  Reject attempts to deliver mail
    452      1.1      tron with a 550 SMTP reply, and log the helo/sender/recipient information.
    453      1.1      tron Repeat this test the next time the client connects. </dd>
    454      1.1      tron 
    455      1.1      tron <dt> <b>drop</b> </dt>
    456      1.1      tron 
    457      1.1      tron <dd> Drop the connection immediately with a 521 SMTP reply.  Repeat
    458      1.1      tron this test the next time the client connects. </dd>
    459      1.1      tron 
    460      1.1      tron </dl>
    461      1.1      tron 
    462      1.1      tron <h2> <a name="after_220">Tests after the 220 SMTP server greeting</a> </h2>
    463      1.1      tron 
    464      1.1      tron <p> In this phase of the protocol, <a href="postscreen.8.html">postscreen(8)</a> implements a
    465      1.1      tron number of "deep protocol" tests. These tests use an SMTP protocol
    466      1.1      tron engine that is built into the <a href="postscreen.8.html">postscreen(8)</a> server. </p>
    467      1.1      tron 
    468  1.1.1.4      tron <p> Important note: these protocol tests are disabled by default.
    469      1.1      tron They are more intrusive than the pregreet and DNSBL tests, and they
    470      1.1      tron have limitations as discussed next. </p>
    471      1.1      tron 
    472      1.1      tron <ul>
    473      1.1      tron 
    474  1.1.1.4      tron <li> <p> The main limitation of "after 220 greeting" tests is that
    475  1.1.1.4      tron a new client must disconnect after passing these tests (reason:
    476  1.1.1.4      tron postscreen is not a proxy).  Then the client must reconnect from
    477  1.1.1.4      tron the same IP address before it can deliver mail.  The following
    478  1.1.1.4      tron measures may help to avoid email delays: </p>
    479      1.1      tron 
    480  1.1.1.4      tron <ul>
    481  1.1.1.4      tron 
    482  1.1.1.4      tron <li> <p> Allow "good" clients to skip tests with the
    483  1.1.1.7  christos <a href="postconf.5.html#postscreen_dnsbl_allowlist_threshold">postscreen_dnsbl_allowlist_threshold</a> feature. This is especially effective
    484  1.1.1.7  christos for large providers that usually don't retry from the same IP
    485  1.1.1.7  christos address. </p>
    486  1.1.1.4      tron 
    487  1.1.1.4      tron <li> <p> Small sites: Configure <a href="postscreen.8.html">postscreen(8)</a> to listen on multiple
    488  1.1.1.4      tron IP addresses, published in DNS as different IP addresses for the
    489  1.1.1.4      tron same MX hostname or for different MX hostnames. This avoids mail
    490  1.1.1.4      tron delivery delays with clients that reconnect immediately from the
    491  1.1.1.4      tron same IP address.  </p>
    492  1.1.1.4      tron 
    493  1.1.1.4      tron <li> <p> Large sites: Share the <a href="postscreen.8.html">postscreen(8)</a> cache between different
    494  1.1.1.4      tron Postfix MTAs with a large-enough <a href="memcache_table.5.html">memcache_table(5)</a>. Again, this
    495  1.1.1.4      tron avoids mail delivery delays with clients that reconnect immediately
    496  1.1.1.4      tron from the same IP address. </p>
    497      1.1      tron 
    498      1.1      tron </ul>
    499      1.1      tron 
    500  1.1.1.4      tron <li> <p> <a href="postscreen.8.html">postscreen(8)</a>'s built-in SMTP engine does not implement the
    501  1.1.1.4      tron AUTH, XCLIENT, and XFORWARD features. If you need to make these
    502  1.1.1.4      tron services available on port 25, then do not enable the tests after
    503  1.1.1.4      tron the 220 server greeting. </p>
    504  1.1.1.4      tron 
    505  1.1.1.4      tron <li> <p> End-user clients should connect directly to the submission
    506      1.1      tron service, so that they never have to deal with <a href="postscreen.8.html">postscreen(8)</a>'s tests.
    507      1.1      tron </p>
    508      1.1      tron 
    509  1.1.1.4      tron </ul>
    510  1.1.1.4      tron 
    511  1.1.1.4      tron <p> The following "after 220 greeting" tests are available: </p>
    512  1.1.1.4      tron 
    513      1.1      tron <ul>
    514      1.1      tron 
    515      1.1      tron <li> <a href="#pipelining">Command pipelining test</a>
    516      1.1      tron 
    517      1.1      tron <li> <a href="#non_smtp">Non-SMTP command test</a>
    518      1.1      tron 
    519      1.1      tron <li> <a href="#barelf">Bare newline test</a>
    520      1.1      tron 
    521      1.1      tron <li> <a href="#fail_after_220">When tests fail after the 220 SMTP server greeting</a>
    522      1.1      tron 
    523      1.1      tron </ul>
    524      1.1      tron 
    525      1.1      tron <h3> <a name="pipelining">Command pipelining test</a> </h3>
    526      1.1      tron 
    527      1.1      tron <p> By default, SMTP is a half-duplex protocol: the sender and
    528      1.1      tron receiver send one command and one response at a time.  Unlike the
    529      1.1      tron Postfix SMTP server, <a href="postscreen.8.html">postscreen(8)</a> does not announce support
    530      1.1      tron for ESMTP command pipelining.  Therefore, clients are not allowed
    531  1.1.1.7  christos to send multiple commands. <a href="postscreen.8.html">postscreen(8)</a>'s
    532  1.1.1.7  christos <a href="#after_220">deep
    533      1.1      tron protocol test</a> for this is disabled by default. </p>
    534      1.1      tron 
    535      1.1      tron <p> With "<a href="postconf.5.html#postscreen_pipelining_enable">postscreen_pipelining_enable</a> = yes", <a href="postscreen.8.html">postscreen(8)</a> detects
    536      1.1      tron zombies that send multiple commands, instead of sending one command
    537      1.1      tron and waiting for the server to reply.  </p>
    538      1.1      tron 
    539      1.1      tron <p> This test is opportunistically enabled when <a href="postscreen.8.html">postscreen(8)</a> has
    540      1.1      tron to use the built-in SMTP engine anyway. This is to make <a href="postscreen.8.html">postscreen(8)</a>
    541      1.1      tron logging more informative. </p>
    542      1.1      tron 
    543      1.1      tron <p> When a client sends multiple commands, <a href="postscreen.8.html">postscreen(8)</a> logs this
    544      1.1      tron as: </p>
    545      1.1      tron 
    546      1.1      tron <pre>
    547  1.1.1.2      tron     <b>COMMAND PIPELINING from</b> <i>[address]:port</i> <b>after</b> <i>command</i>: <i>text</i>
    548      1.1      tron </pre>
    549      1.1      tron 
    550      1.1      tron <p> Translation: the SMTP client at <i>[address]:port</i> sent
    551      1.1      tron multiple SMTP commands, instead of sending one command and then
    552      1.1      tron waiting for the server to reply. This happened after the client
    553  1.1.1.2      tron sent <i>command</i>. The <i>text</i> shows part of the input that
    554  1.1.1.2      tron was sent too early; it is not logged with Postfix 2.8. </p>
    555      1.1      tron 
    556      1.1      tron <p> The <a href="postconf.5.html#postscreen_pipelining_action">postscreen_pipelining_action</a> parameter specifies the action
    557      1.1      tron that is taken next.  See "<a href="#fail_after_220">When tests fail
    558      1.1      tron after the 220 SMTP server greeting</a>" below. </p>
    559      1.1      tron 
    560      1.1      tron <h3> <a name="non_smtp">Non-SMTP command test</a> </h3>
    561      1.1      tron 
    562      1.1      tron <p> Some spambots send their mail through open proxies. A symptom
    563      1.1      tron of this is the usage of commands such as CONNECT and other non-SMTP
    564      1.1      tron commands. Just like the Postfix SMTP server's <a href="postconf.5.html#smtpd_forbidden_commands">smtpd_forbidden_commands</a>
    565      1.1      tron feature, <a href="postscreen.8.html">postscreen(8)</a> has an equivalent <a href="postconf.5.html#postscreen_forbidden_commands">postscreen_forbidden_commands</a>
    566  1.1.1.7  christos feature to block these clients. <a href="postscreen.8.html">postscreen(8)</a>'s
    567  1.1.1.7  christos <a href="#after_220">deep
    568      1.1      tron protocol test</a> for this is disabled by default.  </p>
    569      1.1      tron 
    570      1.1      tron <p> With "<a href="postconf.5.html#postscreen_non_smtp_command_enable">postscreen_non_smtp_command_enable</a> = yes", <a href="postscreen.8.html">postscreen(8)</a>
    571      1.1      tron detects zombies that send commands specified with the
    572      1.1      tron <a href="postconf.5.html#postscreen_forbidden_commands">postscreen_forbidden_commands</a> parameter. This also detects commands
    573      1.1      tron with the syntax of a message header label. The latter is a symptom
    574      1.1      tron that the client is sending message content after ignoring all the
    575      1.1      tron responses from <a href="postscreen.8.html">postscreen(8)</a> that reject mail. </p>
    576      1.1      tron 
    577      1.1      tron <p> This test is opportunistically enabled when <a href="postscreen.8.html">postscreen(8)</a> has
    578      1.1      tron to use the built-in SMTP engine anyway. This is to make <a href="postscreen.8.html">postscreen(8)</a>
    579      1.1      tron logging more informative.  </p>
    580      1.1      tron 
    581      1.1      tron <p> When a client sends non-SMTP commands, <a href="postscreen.8.html">postscreen(8)</a> logs this
    582      1.1      tron as: </p>
    583      1.1      tron 
    584      1.1      tron <pre>
    585  1.1.1.3      tron     <b>NON-SMTP COMMAND from</b> <i>[address]:port</i> <b>after</b> <i>command: text</i>
    586      1.1      tron </pre>
    587      1.1      tron 
    588      1.1      tron <p> Translation: the SMTP client at <i>[address]:port</i> sent a
    589  1.1.1.3      tron command that matches the <a href="postconf.5.html#postscreen_forbidden_commands">postscreen_forbidden_commands</a>
    590  1.1.1.3      tron parameter, or that has the syntax of a message header label (text 
    591  1.1.1.3      tron followed by optional space and ":").
    592  1.1.1.3      tron The "<tt><b>after</b> <i>command</i></tt>" portion is logged with
    593  1.1.1.3      tron Postfix 2.10 and later. </p>
    594      1.1      tron 
    595      1.1      tron <p> The <a href="postconf.5.html#postscreen_non_smtp_command_action">postscreen_non_smtp_command_action</a> parameter specifies
    596      1.1      tron the action that is taken next.  See "<a href="#fail_after_220">When
    597      1.1      tron tests fail after the 220 SMTP server greeting</a>" below. </p>
    598      1.1      tron 
    599      1.1      tron <h3> <a name="barelf">Bare newline test</a> </h3>
    600      1.1      tron 
    601      1.1      tron <p> SMTP is a line-oriented protocol: lines have a limited length,
    602      1.1      tron and are terminated with &lt;CR&gt;&lt;LF&gt;. Lines ending in a
    603      1.1      tron "bare" &lt;LF&gt;, that is newline not preceded by carriage return,
    604  1.1.1.7  christos are not allowed in SMTP.  <a href="postscreen.8.html">postscreen(8)</a>'s
    605  1.1.1.7  christos <a href="#after_220">deep
    606      1.1      tron protocol test</a> for this is disabled by default.  </p>
    607      1.1      tron 
    608      1.1      tron <p> With "<a href="postconf.5.html#postscreen_bare_newline_enable">postscreen_bare_newline_enable</a> = yes", <a href="postscreen.8.html">postscreen(8)</a>
    609      1.1      tron detects clients that send lines ending in bare newline characters.
    610      1.1      tron </p>
    611      1.1      tron 
    612      1.1      tron <p> This test is opportunistically enabled when <a href="postscreen.8.html">postscreen(8)</a> has
    613      1.1      tron to use the built-in SMTP engine anyway. This is to make <a href="postscreen.8.html">postscreen(8)</a>
    614      1.1      tron logging more informative.  </p>
    615      1.1      tron 
    616      1.1      tron <p> When a client sends bare newline characters, <a href="postscreen.8.html">postscreen(8)</a> logs
    617      1.1      tron this as:
    618      1.1      tron </p>
    619      1.1      tron 
    620      1.1      tron <pre>
    621  1.1.1.3      tron     <b>BARE NEWLINE from</b> <i>[address]:port</i> <b>after</b> <i>command</i>
    622      1.1      tron </pre>
    623      1.1      tron 
    624      1.1      tron <p> Translation: the SMTP client at <i>[address]:port</i> sent a bare
    625      1.1      tron newline character, that is newline not preceded by carriage
    626  1.1.1.3      tron return.
    627  1.1.1.3      tron The "<tt><b>after</b> <i>command</i></tt>" portion is logged with
    628  1.1.1.3      tron Postfix 2.10 and later. </p>
    629      1.1      tron 
    630      1.1      tron <p> The <a href="postconf.5.html#postscreen_bare_newline_action">postscreen_bare_newline_action</a> parameter specifies the
    631      1.1      tron action that is taken next.  See "<a href="#fail_after_220">When
    632      1.1      tron tests fail after the 220 SMTP server greeting</a>" below. </p>
    633      1.1      tron 
    634      1.1      tron <h3> <a name="fail_after_220">When tests fail after the 220 SMTP server greeting</a> </h3>
    635      1.1      tron 
    636      1.1      tron <p> When the client fails the pipelining, non-SMTP command or bare
    637      1.1      tron newline tests, the action is specified with <a href="postconf.5.html#postscreen_pipelining_action">postscreen_pipelining_action</a>,
    638      1.1      tron <a href="postconf.5.html#postscreen_non_smtp_command_action">postscreen_non_smtp_command_action</a> or <a href="postconf.5.html#postscreen_bare_newline_action">postscreen_bare_newline_action</a>,
    639      1.1      tron respectively. </p>
    640      1.1      tron 
    641      1.1      tron <dl>
    642      1.1      tron 
    643      1.1      tron <dt> <b>ignore</b> (default for bare newline) </dt>
    644      1.1      tron 
    645      1.1      tron <dd> Ignore the failure of this test. Allow other tests to complete.
    646      1.1      tron Do NOT repeat this test before the result from some other test
    647      1.1      tron expires.
    648      1.1      tron 
    649      1.1      tron This option is useful for testing and collecting statistics without
    650      1.1      tron blocking mail permanently. </dd>
    651      1.1      tron 
    652      1.1      tron <dt> <b>enforce</b> (default for pipelining) </dt>
    653      1.1      tron 
    654      1.1      tron <dd> Allow other tests to complete.  Reject attempts to deliver
    655      1.1      tron mail with a 550 SMTP reply, and log the helo/sender/recipient
    656      1.1      tron information.  Repeat this test the next time the client connects.
    657      1.1      tron </dd>
    658      1.1      tron 
    659      1.1      tron <dt> <b>drop</b> (default for non-SMTP commands) </dt>
    660      1.1      tron 
    661      1.1      tron <dd> Drop the connection immediately with a 521 SMTP reply.  Repeat
    662      1.1      tron this test the next time the client connects.  This action is
    663      1.1      tron compatible with the Postfix SMTP server's <a href="postconf.5.html#smtpd_forbidden_commands">smtpd_forbidden_commands</a>
    664      1.1      tron feature. </dd>
    665      1.1      tron 
    666      1.1      tron </dl>
    667      1.1      tron 
    668      1.1      tron <h2> <a name="other_error">Other errors</a> </h2>
    669      1.1      tron 
    670  1.1.1.2      tron <p> When an SMTP client hangs up unexpectedly, <a href="postscreen.8.html">postscreen(8)</a> logs
    671  1.1.1.2      tron this as: </p>
    672      1.1      tron 
    673      1.1      tron <pre>
    674      1.1      tron     <b>HANGUP after</b> <i>time</i> <b>from</b> <i>[address]:port</i> <b>in</b> <i>test name</i>
    675      1.1      tron </pre>
    676      1.1      tron 
    677      1.1      tron <p> Translation: the SMTP client at <i>[address]:port</i> disconnected
    678      1.1      tron unexpectedly, <i>time</i> seconds after the start of the
    679      1.1      tron test named <i>test name</i>. </p>
    680      1.1      tron 
    681  1.1.1.2      tron <p> There is no punishment for hanging up. A client that hangs up
    682  1.1.1.2      tron without sending the QUIT command can still pass all <a href="postscreen.8.html">postscreen(8)</a>
    683  1.1.1.2      tron tests. </p>
    684  1.1.1.2      tron 
    685      1.1      tron <!--
    686      1.1      tron 
    687      1.1      tron <p> While an unexpired penalty is in effect, an SMTP client is not
    688      1.1      tron allowed to pass any tests, and  <a href="postscreen.8.html">postscreen(8)</a> logs each connection
    689      1.1      tron with the remaining amount of penalty time as: </p>
    690      1.1      tron 
    691      1.1      tron <pre>
    692      1.1      tron     <b>PENALTY</b> <i>time</i> <b>for</b> <i>[address]:port</i>
    693      1.1      tron </pre>
    694      1.1      tron 
    695      1.1      tron <p> During this time, all attempts by the client to deliver mail
    696      1.1      tron will be deferred with a 450 SMTP status.  </p>
    697      1.1      tron 
    698      1.1      tron -->
    699      1.1      tron 
    700      1.1      tron <p> The following errors are reported by the built-in SMTP engine.
    701      1.1      tron This engine never accepts mail, therefore it has per-session limits
    702      1.1      tron on the number of commands and on the session length. </p>
    703      1.1      tron 
    704      1.1      tron <pre>
    705  1.1.1.3      tron     <b>COMMAND TIME LIMIT</b> <b>from</b> <i>[address]:port</i> <b>after</b> <i>command</i>
    706      1.1      tron </pre>
    707      1.1      tron 
    708      1.1      tron <p> Translation: the SMTP client at <i>[address]:port</i> reached the
    709      1.1      tron per-command time limit as specified with the <a href="postconf.5.html#postscreen_command_time_limit">postscreen_command_time_limit</a>
    710  1.1.1.3      tron parameter.  The session is terminated immediately.
    711  1.1.1.3      tron The "<tt><b>after</b> <i>command</i></tt>" portion is logged with
    712  1.1.1.3      tron Postfix 2.10 and later. </p>
    713      1.1      tron 
    714      1.1      tron <pre>
    715  1.1.1.3      tron     <b>COMMAND COUNT LIMIT from</b> <i>[address]:port</i> <b>after</b> <i>command</i>
    716      1.1      tron </pre>
    717      1.1      tron 
    718      1.1      tron <p> Translation: the SMTP client at <i>[address]:port</i> reached the
    719      1.1      tron per-session command count limit as specified with the
    720      1.1      tron <a href="postconf.5.html#postscreen_command_count_limit">postscreen_command_count_limit</a> parameter.  The session is terminated
    721  1.1.1.3      tron immediately.
    722  1.1.1.3      tron The "<tt><b>after</b> <i>command</i></tt>" portion is logged with
    723  1.1.1.3      tron Postfix 2.10 and later. </p>
    724      1.1      tron 
    725      1.1      tron <pre>
    726  1.1.1.3      tron     <b>COMMAND LENGTH LIMIT from</b> <i>[address]:port</i> <b>after</b> <i>command</i>
    727      1.1      tron </pre>
    728      1.1      tron 
    729      1.1      tron <p> Translation: the SMTP client at <i>[address]:port</i> reached the
    730      1.1      tron per-command length limit, as specified with the <a href="postconf.5.html#line_length_limit">line_length_limit</a>
    731  1.1.1.3      tron parameter.  The session is terminated immediately.
    732  1.1.1.3      tron The "<tt><b>after</b> <i>command</i></tt>" portion is logged with
    733  1.1.1.3      tron Postfix 2.10 and later. </p>
    734      1.1      tron 
    735      1.1      tron <p> When an SMTP client makes too many connections at the same time,
    736  1.1.1.6  christos <a href="postscreen.8.html">postscreen(8)</a> rejects the connection with a 421 status code and logs: </p>
    737      1.1      tron 
    738      1.1      tron <pre>
    739      1.1      tron     <b>NOQUEUE: reject: CONNECT from</b> <i>[address]:port</i><b>: too many connections</b>
    740  1.1.1.6  christos </pre>
    741  1.1.1.6  christos 
    742  1.1.1.6  christos <p> The <a href="postconf.5.html#postscreen_client_connection_count_limit">postscreen_client_connection_count_limit</a> parameter controls this limit. </p>
    743  1.1.1.6  christos 
    744  1.1.1.6  christos <p> When an SMTP client connects after <a href="postscreen.8.html">postscreen(8)</a> has reached a
    745  1.1.1.6  christos connection count limit, <a href="postscreen.8.html">postscreen(8)</a> rejects the connection with
    746  1.1.1.6  christos a 421 status code and logs: </p>
    747  1.1.1.6  christos 
    748  1.1.1.6  christos <pre>
    749  1.1.1.6  christos     <b>NOQUEUE: reject: CONNECT from</b> <i>[address]:port</i><b>: all screening ports busy</b>
    750      1.1      tron     <b>NOQUEUE: reject: CONNECT from</b> <i>[address]:port</i><b>: all server ports busy</b>
    751      1.1      tron </pre>
    752      1.1      tron 
    753  1.1.1.6  christos <p> The <a href="postconf.5.html#postscreen_pre_queue_limit">postscreen_pre_queue_limit</a> and <a href="postconf.5.html#postscreen_post_queue_limit">postscreen_post_queue_limit</a>
    754  1.1.1.6  christos parameters control these limits.  </p>
    755      1.1      tron 
    756      1.1      tron <h2> <a name="victory">When all tests succeed</a> </h2>
    757      1.1      tron 
    758  1.1.1.7  christos <p> When a new SMTP client passes all tests (i.e. it is not allowlisted
    759      1.1      tron via some mechanism), <a href="postscreen.8.html">postscreen(8)</a> logs this as: </p>
    760      1.1      tron 
    761      1.1      tron <pre>
    762      1.1      tron     <b>PASS NEW</b> <i>[address]:port</i>
    763      1.1      tron </pre>
    764      1.1      tron 
    765      1.1      tron <p> Where <i>[address]:port</i> are the client IP address and port.
    766      1.1      tron Then, <a href="postscreen.8.html">postscreen(8)</a>
    767  1.1.1.7  christos creates a temporary allowlist entry that excludes the client IP
    768  1.1.1.7  christos address from further tests until the temporary allowlist entry
    769      1.1      tron expires, as controlled with the postscreen_*_ttl parameters. </p>
    770      1.1      tron 
    771      1.1      tron <p> When no "<a href="#after_220">deep protocol tests</a>" are
    772      1.1      tron configured, <a href="postscreen.8.html">postscreen(8)</a> hands off the "live" connection to a Postfix
    773      1.1      tron SMTP server process.  The client can then continue as if <a href="postscreen.8.html">postscreen(8)</a>
    774      1.1      tron never even existed (except for the short <a href="postconf.5.html#postscreen_greet_wait">postscreen_greet_wait</a> delay).
    775      1.1      tron </p>
    776      1.1      tron 
    777      1.1      tron <p> When any "<a href="#after_220">deep protocol tests</a>" are
    778      1.1      tron configured, <a href="postscreen.8.html">postscreen(8)</a> cannot hand off the "live" connection to
    779      1.1      tron a Postfix SMTP server process in the middle of the session.  Instead,
    780      1.1      tron <a href="postscreen.8.html">postscreen(8)</a> defers mail delivery attempts with a 4XX status, logs
    781      1.1      tron the helo/sender/recipient information, and waits for the client to
    782      1.1      tron disconnect.  The next time the client connects it will be allowed
    783      1.1      tron to talk to a Postfix SMTP server process to deliver its mail.
    784      1.1      tron <a href="postscreen.8.html">postscreen(8)</a> mitigates the impact of this limitation by giving
    785      1.1      tron <a href="#after_220">deep protocol tests</a> a long expiration
    786      1.1      tron time. </p>
    787      1.1      tron 
    788      1.1      tron <h2> <a name="config"> Configuring the postscreen(8) service</a>
    789      1.1      tron </h2>
    790      1.1      tron 
    791      1.1      tron <p> <a href="postscreen.8.html">postscreen(8)</a> has been tested on FreeBSD [4-8], Linux 2.[4-6]
    792      1.1      tron and Solaris 9 systems. </p>
    793      1.1      tron 
    794      1.1      tron <ul>
    795      1.1      tron 
    796      1.1      tron <li> <a href="#enable"> Turning on postscreen(8) without blocking
    797      1.1      tron mail</a>
    798      1.1      tron 
    799      1.1      tron <li> <a href="#starttls"> postscreen(8) TLS configuration </a>
    800      1.1      tron 
    801      1.1      tron <li> <a href="#blocking"> Blocking mail with postscreen(8) </a>
    802      1.1      tron 
    803      1.1      tron <li> <a href="#turnoff"> Turning off postscreen(8) </a>
    804      1.1      tron 
    805  1.1.1.7  christos <li> <a href="#temp_allow_sharing"> Sharing the temporary allowlist
    806  1.1.1.4      tron </a>
    807  1.1.1.4      tron 
    808      1.1      tron </ul>
    809      1.1      tron 
    810      1.1      tron <h3> <a name="enable"> Turning on postscreen(8) without blocking mail</a> </h3>
    811      1.1      tron 
    812      1.1      tron <p> To enable the <a href="postscreen.8.html">postscreen(8)</a> service and log client information
    813      1.1      tron without blocking mail: </p>
    814      1.1      tron 
    815      1.1      tron <ol>
    816      1.1      tron 
    817      1.1      tron <li> <p> Make sure that local clients and systems with non-standard
    818      1.1      tron SMTP implementations are excluded from any <a href="postscreen.8.html">postscreen(8)</a> tests. The
    819      1.1      tron default is to exclude all clients in <a href="postconf.5.html#mynetworks">mynetworks</a>. To exclude additional
    820      1.1      tron clients, for example, third-party performance monitoring tools (these
    821      1.1      tron tend to have broken SMTP implementations): </p>
    822      1.1      tron 
    823      1.1      tron <pre>
    824      1.1      tron /etc/postfix/<a href="postconf.5.html">main.cf</a>:
    825  1.1.1.7  christos     # Exclude broken clients by allowlisting. Clients in <a href="postconf.5.html#mynetworks">mynetworks</a>
    826  1.1.1.7  christos     # should always be allowlisted.
    827      1.1      tron     <a href="postconf.5.html#postscreen_access_list">postscreen_access_list</a> = <a href="postconf.5.html#permit_mynetworks">permit_mynetworks</a>, 
    828      1.1      tron         <a href="cidr_table.5.html">cidr</a>:/etc/postfix/postscreen_access.cidr
    829      1.1      tron 
    830      1.1      tron /etc/postfix/postscreen_access.<a href="cidr_table.5.html">cidr</a>:
    831      1.1      tron     192.168.254.0/24 permit
    832      1.1      tron </pre>
    833      1.1      tron 
    834      1.1      tron <li> <p> Comment out the "<tt>smtp  inet ... smtpd</tt>" service
    835      1.1      tron in <a href="master.5.html">master.cf</a>, including any "<tt>-o parameter=value</tt>" entries
    836      1.1      tron that follow.  </p>
    837      1.1      tron 
    838      1.1      tron <pre>
    839      1.1      tron /etc/postfix/<a href="master.5.html">master.cf</a>:
    840      1.1      tron     #smtp      inet  n       -       n       -       -       smtpd
    841      1.1      tron     #    -o parameter=value ...
    842      1.1      tron </pre>
    843      1.1      tron 
    844      1.1      tron <li> <p> Uncomment the new "<tt>smtpd pass ... smtpd</tt>" service
    845      1.1      tron in <a href="master.5.html">master.cf</a>, and duplicate any "<tt>-o parameter=value</tt>" entries
    846      1.1      tron from the smtpd service that was commented out in the previous step.
    847      1.1      tron </p>
    848      1.1      tron 
    849      1.1      tron <pre>
    850      1.1      tron /etc/postfix/<a href="master.5.html">master.cf</a>:
    851      1.1      tron     smtpd     pass  -       -       n       -       -       smtpd
    852      1.1      tron         -o parameter=value ...
    853      1.1      tron </pre>
    854      1.1      tron 
    855      1.1      tron <li> <p> Uncomment the new "<tt>smtp inet ... postscreen</tt>"
    856      1.1      tron service in <a href="master.5.html">master.cf</a>. </p>
    857      1.1      tron 
    858      1.1      tron <pre>
    859      1.1      tron /etc/postfix/<a href="master.5.html">master.cf</a>:
    860      1.1      tron     smtp      inet  n       -       n       -       1       postscreen
    861      1.1      tron </pre>
    862      1.1      tron 
    863      1.1      tron <li> <p> Uncomment the new "<tt>tlsproxy unix ... tlsproxy</tt>"
    864      1.1      tron service in <a href="master.5.html">master.cf</a>.  This service implements STARTTLS support for
    865      1.1      tron <a href="postscreen.8.html">postscreen(8)</a>. </p>
    866      1.1      tron 
    867      1.1      tron <pre>
    868      1.1      tron /etc/postfix/<a href="master.5.html">master.cf</a>:
    869      1.1      tron     tlsproxy  unix  -       -       n       -       0       tlsproxy
    870      1.1      tron </pre>
    871      1.1      tron 
    872      1.1      tron <li> <p> Uncomment the new "<tt>dnsblog  unix ... dnsblog</tt>"
    873      1.1      tron service in <a href="master.5.html">master.cf</a>.  This service does DNSBL lookups for <a href="postscreen.8.html">postscreen(8)</a>
    874      1.1      tron and logs results. </p>
    875      1.1      tron 
    876      1.1      tron <pre>
    877      1.1      tron /etc/postfix/<a href="master.5.html">master.cf</a>:
    878      1.1      tron     dnsblog   unix  -       -       n       -       0       dnsblog
    879      1.1      tron </pre>
    880      1.1      tron 
    881      1.1      tron <li> <p> To enable DNSBL lookups, list some DNS blocklist sites in
    882      1.1      tron <a href="postconf.5.html">main.cf</a>, separated by whitespace. Different sites can have different
    883      1.1      tron weights. For example:
    884      1.1      tron 
    885      1.1      tron <pre>
    886      1.1      tron /etc/postfix/<a href="postconf.5.html">main.cf</a>:
    887      1.1      tron     <a href="postconf.5.html#postscreen_dnsbl_threshold">postscreen_dnsbl_threshold</a> = 2
    888      1.1      tron     <a href="postconf.5.html#postscreen_dnsbl_sites">postscreen_dnsbl_sites</a> = zen.spamhaus.org*2 
    889      1.1      tron         bl.spamcop.net*1 b.barracudacentral.org*1
    890      1.1      tron </pre>
    891      1.1      tron 
    892      1.1      tron <p> Note: if your DNSBL queries have a "secret" in the domain name,
    893      1.1      tron you must censor this information from the <a href="postscreen.8.html">postscreen(8)</a> SMTP replies.
    894      1.1      tron For example: </p>
    895      1.1      tron 
    896      1.1      tron <pre>
    897      1.1      tron /etc/postfix/<a href="postconf.5.html">main.cf</a>:
    898  1.1.1.2      tron     <a href="postconf.5.html#postscreen_dnsbl_reply_map">postscreen_dnsbl_reply_map</a> = <a href="DATABASE_README.html#types">texthash</a>:/etc/postfix/dnsbl_reply
    899      1.1      tron </pre>
    900      1.1      tron 
    901      1.1      tron <pre>
    902      1.1      tron /etc/postfix/dnsbl_reply:
    903  1.1.1.5  christos     # Secret DNSBL name           Name in <a href="postscreen.8.html">postscreen(8)</a> replies
    904  1.1.1.5  christos     secret.zen.dq.spamhaus.net    zen.spamhaus.org
    905      1.1      tron </pre>
    906      1.1      tron 
    907  1.1.1.4      tron <p> The <a href="DATABASE_README.html#types">texthash</a>: format is similar to <a href="DATABASE_README.html#types">hash</a>: except that there is
    908      1.1      tron no need to run <a href="postmap.1.html">postmap(1)</a> before the file can be used, and that it
    909      1.1      tron does not detect changes after the file is read. It is new with
    910      1.1      tron Postfix version 2.8. </p>
    911      1.1      tron 
    912      1.1      tron <li> <p> Read the new configuration with "<tt>postfix reload</tt>".
    913      1.1      tron </p>
    914      1.1      tron 
    915      1.1      tron </ol>
    916      1.1      tron 
    917      1.1      tron <p> Notes: </p>
    918      1.1      tron 
    919      1.1      tron <ul>
    920      1.1      tron 
    921      1.1      tron <li> <p> Some <a href="postscreen.8.html">postscreen(8)</a> configuration parameters implement
    922      1.1      tron stress-dependent behavior. This is supported only when the default
    923  1.1.1.2      tron value is stress-dependent (that is, "postconf -d <i>parametername</i>"
    924  1.1.1.7  christos output shows
    925  1.1.1.7  christos "<i>parametername</i>&nbsp;=&nbsp;${stress?<i>something</i>}${stress:<i>something</i>}" or
    926  1.1.1.7  christos "<i>parametername</i>&nbsp;=&nbsp;${stress?{<i>something</i>}:{<i>something</i>}}").
    927      1.1      tron Other parameters always evaluate as if the stress value is the empty
    928      1.1      tron string. </p>
    929      1.1      tron 
    930      1.1      tron <li> <p> See "<a href="#before_220">Tests before the 220 SMTP server
    931  1.1.1.7  christos greeting</a>" for details about the logging from these
    932  1.1.1.7  christos <a href="postscreen.8.html">postscreen(8)</a> tests. </p>
    933      1.1      tron 
    934      1.1      tron <li> <p> If you run Postfix 2.6 or earlier you must stop and start
    935      1.1      tron the master daemon ("<tt>postfix stop; postfix start</tt>").  This
    936      1.1      tron is needed because the Postfix "pass" master service type did not
    937      1.1      tron work reliably on all systems. </p>
    938      1.1      tron 
    939      1.1      tron </ul>
    940      1.1      tron 
    941      1.1      tron <h3> <a name="starttls"> postscreen(8) TLS configuration </a> </h3>
    942      1.1      tron 
    943      1.1      tron <p> <a href="postscreen.8.html">postscreen(8)</a> TLS support is available for remote SMTP clients
    944  1.1.1.7  christos that aren't allowlisted, including clients that need to renew their
    945  1.1.1.7  christos temporary allowlist status.  When a remote SMTP client requests TLS
    946      1.1      tron service, <a href="postscreen.8.html">postscreen(8)</a> invisibly hands off the connection to a
    947      1.1      tron <a href="tlsproxy.8.html">tlsproxy(8)</a> process. Then, <a href="tlsproxy.8.html">tlsproxy(8)</a> encrypts and decrypts the
    948      1.1      tron traffic between <a href="postscreen.8.html">postscreen(8)</a> and the remote SMTP client. One
    949      1.1      tron <a href="tlsproxy.8.html">tlsproxy(8)</a> process can handle multiple SMTP sessions. The number
    950      1.1      tron of <a href="tlsproxy.8.html">tlsproxy(8)</a> processes slowly increases with server load, but it
    951      1.1      tron should always be much smaller than the number of <a href="postscreen.8.html">postscreen(8)</a> TLS
    952      1.1      tron sessions.  </p>
    953      1.1      tron 
    954      1.1      tron <p> TLS support for <a href="postscreen.8.html">postscreen(8)</a> and <a href="tlsproxy.8.html">tlsproxy(8)</a> uses the same
    955      1.1      tron parameters as with <a href="smtpd.8.html">smtpd(8)</a>. We recommend that you keep the relevant
    956      1.1      tron configuration parameters in <a href="postconf.5.html">main.cf</a>.  If you must specify "-o
    957      1.1      tron smtpd_mumble=value" parameter overrides in <a href="master.5.html">master.cf</a> for a
    958      1.1      tron postscreen-protected <a href="smtpd.8.html">smtpd(8)</a> service, then you should specify those
    959      1.1      tron same parameter overrides for the <a href="postscreen.8.html">postscreen(8)</a> and <a href="tlsproxy.8.html">tlsproxy(8)</a>
    960      1.1      tron services. </p>
    961      1.1      tron 
    962      1.1      tron <h3> <a name="blocking"> Blocking mail with postscreen(8) </a> </h3>
    963      1.1      tron 
    964      1.1      tron <p> For compatibility with <a href="smtpd.8.html">smtpd(8)</a>, <a href="postscreen.8.html">postscreen(8)</a> implements the
    965      1.1      tron <a href="postconf.5.html#soft_bounce">soft_bounce</a> safety feature. This causes Postfix to reject mail with
    966      1.1      tron a "try again" reply code. </p>
    967      1.1      tron 
    968      1.1      tron <ul> 
    969      1.1      tron 
    970      1.1      tron <li> <p> To turn this on for all of Postfix, specify "<tt><a href="postconf.5.html#soft_bounce">soft_bounce</a>
    971      1.1      tron = yes</tt>" in <a href="postconf.5.html">main.cf</a>. </p>
    972      1.1      tron 
    973      1.1      tron <li> <p> To turn this on for <a href="postscreen.8.html">postscreen(8)</a> only, append "<tt>-o
    974      1.1      tron <a href="postconf.5.html#soft_bounce">soft_bounce</a>=yes</tt>" (note: NO SPACES around '=') to the postscreen
    975      1.1      tron entry in <a href="master.5.html">master.cf</a>. <p>
    976      1.1      tron 
    977      1.1      tron </ul>
    978      1.1      tron 
    979      1.1      tron <p> Execute "<tt>postfix reload</tt>" to make the change effective. </p>
    980      1.1      tron 
    981      1.1      tron <p> After testing, do not forget to remove the <a href="postconf.5.html#soft_bounce">soft_bounce</a> feature,
    982      1.1      tron otherwise senders won't receive their non-delivery notification
    983      1.1      tron until many days later.  </p>
    984      1.1      tron 
    985      1.1      tron <p> To use the <a href="postscreen.8.html">postscreen(8)</a> service to block mail, edit <a href="postconf.5.html">main.cf</a> and
    986      1.1      tron specify one or more of: </p>
    987      1.1      tron 
    988      1.1      tron <ul>
    989      1.1      tron 
    990      1.1      tron <li> <p> "<tt><a href="postconf.5.html#postscreen_dnsbl_action">postscreen_dnsbl_action</a> = enforce</tt>", to reject
    991      1.1      tron clients that are on DNS blocklists, and to log the helo/sender/recipient
    992      1.1      tron information. With good DNSBLs this reduces the amount of load on
    993      1.1      tron Postfix SMTP servers dramatically.  </p>
    994      1.1      tron 
    995      1.1      tron <li> <p> "<tt><a href="postconf.5.html#postscreen_greet_action">postscreen_greet_action</a> = enforce</tt>", to reject
    996      1.1      tron clients that talk before their turn, and to log the helo/sender/recipient
    997      1.1      tron information. This stops over half of all known-to-be illegitimate
    998      1.1      tron connections to Wietse's mail server. It is backup protection for
    999  1.1.1.7  christos zombies that haven't yet been denylisted. </p>
   1000      1.1      tron 
   1001      1.1      tron <li> <p> You can also enable "<a href="#after_220">deep protocol
   1002      1.1      tron tests</a>", but these are more intrusive than the pregreet or DNSBL
   1003      1.1      tron tests. </p>
   1004      1.1      tron 
   1005      1.1      tron <p> When a good client passes the "<a href="#after_220">deep
   1006  1.1.1.7  christos protocol tests</a>",
   1007  1.1.1.7  christos <a href="postscreen.8.html">postscreen(8)</a> adds the client to the temporary
   1008  1.1.1.7  christos allowlist but it cannot hand off the "live" connection to a Postfix
   1009      1.1      tron SMTP server process in the middle of the session. Instead, <a href="postscreen.8.html">postscreen(8)</a>
   1010      1.1      tron defers mail delivery attempts with a 4XX status, logs the
   1011      1.1      tron helo/sender/recipient information, and waits for the client to
   1012      1.1      tron disconnect. </p>
   1013      1.1      tron 
   1014      1.1      tron <p> When the good client comes back in a later session, it is allowed
   1015  1.1.1.5  christos to talk directly to a Postfix SMTP server.  See "<a href="#after_220">Tests
   1016  1.1.1.5  christos after the 220 SMTP server greeting</a>" above for limitations with
   1017  1.1.1.5  christos AUTH and other features that clients may need.  </p>
   1018      1.1      tron 
   1019      1.1      tron <p> An unexpected benefit from "<a href="#after_220">deep protocol
   1020      1.1      tron tests</a>" is that some "good" clients don't return after the 4XX
   1021  1.1.1.5  christos reply; these clients were not so good after all. </p>
   1022  1.1.1.5  christos 
   1023  1.1.1.5  christos <p> Unfortunately, some senders will retry requests from different
   1024  1.1.1.7  christos IP addresses, and may never get allowlisted.  For this reason,
   1025  1.1.1.5  christos Wietse stopped using "<a href="#after_220">deep protocol tests</a>"
   1026  1.1.1.5  christos on his own internet-facing mail server.  </p>
   1027      1.1      tron 
   1028  1.1.1.7  christos <li> <p> There is also support for permanent denylisting and
   1029  1.1.1.7  christos allowlisting; see the description of the <a href="postconf.5.html#postscreen_access_list">postscreen_access_list</a>
   1030      1.1      tron parameter for details. </p>
   1031      1.1      tron 
   1032      1.1      tron </ul>
   1033      1.1      tron 
   1034      1.1      tron <h3> <a name="turnoff"> Turning off postscreen(8) </a> </h3>
   1035      1.1      tron 
   1036      1.1      tron <p> To turn off <a href="postscreen.8.html">postscreen(8)</a> and handle mail directly with Postfix
   1037      1.1      tron SMTP server processes: </p>
   1038      1.1      tron 
   1039      1.1      tron <ol>
   1040      1.1      tron 
   1041      1.1      tron <li> <p> Comment out the "<tt>smtp inet ... postscreen</tt>" service
   1042      1.1      tron in <a href="master.5.html">master.cf</a>, including any "<tt>-o parameter=value</tt>" entries
   1043      1.1      tron that follow. </p>
   1044      1.1      tron 
   1045      1.1      tron <pre>
   1046      1.1      tron /etc/postfix/<a href="master.5.html">master.cf</a>:
   1047      1.1      tron     #smtp      inet  n       -       n       -       1       postscreen
   1048      1.1      tron     #    -o parameter=value ...
   1049      1.1      tron </pre>
   1050      1.1      tron 
   1051      1.1      tron <li> <p> Comment out the "<tt>dnsblog  unix ... dnsblog</tt>" service
   1052      1.1      tron in <a href="master.5.html">master.cf</a>.  </p>
   1053      1.1      tron 
   1054      1.1      tron <pre>
   1055      1.1      tron /etc/postfix/<a href="master.5.html">master.cf</a>:
   1056      1.1      tron     #dnsblog   unix  -       -       n       -       0       dnsblog
   1057      1.1      tron </pre>
   1058      1.1      tron 
   1059      1.1      tron <li> <p> Comment out the "<tt>smtpd pass ... smtpd</tt>" service
   1060      1.1      tron in <a href="master.5.html">master.cf</a>, including any "<tt>-o parameter=value</tt>" entries
   1061      1.1      tron that follow. </p>
   1062      1.1      tron 
   1063      1.1      tron <pre>
   1064      1.1      tron /etc/postfix/<a href="master.5.html">master.cf</a>:
   1065      1.1      tron     #smtpd     pass  -       -       n       -       -       smtpd
   1066      1.1      tron     #    -o parameter=value ...
   1067      1.1      tron </pre>
   1068      1.1      tron 
   1069      1.1      tron <li> <p> Comment out the "<tt>tlsproxy unix ... tlsproxy</tt>"
   1070      1.1      tron service in <a href="master.5.html">master.cf</a>, including any "<tt>-o parameter=value</tt>"
   1071      1.1      tron entries that follow. </p>
   1072      1.1      tron 
   1073      1.1      tron <pre>
   1074      1.1      tron /etc/postfix/<a href="master.5.html">master.cf</a>:
   1075      1.1      tron     #tlsproxy  unix  -       -       n       -       0       tlsproxy
   1076      1.1      tron     #    -o parameter=value ...
   1077      1.1      tron </pre>
   1078      1.1      tron 
   1079      1.1      tron <li> <p> Uncomment the "<tt>smtp  inet ... smtpd</tt>" service in
   1080      1.1      tron <a href="master.5.html">master.cf</a>, including any "<tt>-o parameter=value</tt>" entries that
   1081      1.1      tron may follow.  </p>
   1082      1.1      tron 
   1083      1.1      tron <pre>
   1084      1.1      tron /etc/postfix/<a href="master.5.html">master.cf</a>:
   1085      1.1      tron     smtp       inet  n       -       n       -       -       smtpd
   1086      1.1      tron         -o parameter=value ...
   1087      1.1      tron </pre>
   1088      1.1      tron 
   1089      1.1      tron <li> <p> Read the new configuration with "<tt>postfix reload</tt>".
   1090      1.1      tron </p>
   1091      1.1      tron 
   1092      1.1      tron </ol>
   1093      1.1      tron 
   1094  1.1.1.7  christos <h3> <a name="temp_allow_sharing"> Sharing the temporary allowlist </a> </h3>
   1095  1.1.1.4      tron 
   1096  1.1.1.7  christos <p> By default, the temporary allowlist is not shared between
   1097  1.1.1.4      tron multiple <a href="postscreen.8.html">postscreen(8)</a> daemons.  To enable sharing, choose one
   1098  1.1.1.4      tron of the following options: </p>
   1099  1.1.1.4      tron 
   1100  1.1.1.4      tron <ul>
   1101  1.1.1.4      tron 
   1102  1.1.1.7  christos <li> <p> A non-persistent <a href="memcache_table.5.html">memcache</a>: temporary allowlist can be shared
   1103  1.1.1.4      tron     between <a href="postscreen.8.html">postscreen(8)</a> daemons on the same host or different
   1104  1.1.1.4      tron     hosts.  Disable cache cleanup (<a href="postconf.5.html#postscreen_cache_cleanup_interval">postscreen_cache_cleanup_interval</a>
   1105  1.1.1.6  christos     = 0) in all <a href="postscreen.8.html">postscreen(8)</a> daemons because <a href="memcache_table.5.html">memcache</a>: has no
   1106  1.1.1.6  christos     first-next API (but see example 4 below for <a href="memcache_table.5.html">memcache</a>: with
   1107  1.1.1.4      tron     persistent backup). This requires Postfix 2.9 or later. </p>
   1108  1.1.1.4      tron 
   1109  1.1.1.4      tron     <pre>
   1110  1.1.1.7  christos     # Example 1: non-persistent <a href="memcache_table.5.html">memcache</a>: allowlist.
   1111  1.1.1.4      tron     /etc/postfix/<a href="postconf.5.html">main.cf</a>:
   1112  1.1.1.4      tron         <a href="postconf.5.html#postscreen_cache_map">postscreen_cache_map</a> = <a href="memcache_table.5.html">memcache</a>:/etc/postfix/postscreen_cache
   1113  1.1.1.4      tron         <a href="postconf.5.html#postscreen_cache_cleanup_interval">postscreen_cache_cleanup_interval</a> = 0
   1114  1.1.1.4      tron 
   1115  1.1.1.4      tron     /etc/postfix/postscreen_cache:
   1116  1.1.1.4      tron         memcache = inet:127.0.0.1:11211
   1117  1.1.1.4      tron         key_format = postscreen:%s
   1118  1.1.1.4      tron     </pre>
   1119  1.1.1.4      tron 
   1120  1.1.1.4      tron <li> <p>
   1121  1.1.1.7  christos     A persistent <a href="lmdb_table.5.html">lmdb</a>: temporary allowlist can be shared between
   1122  1.1.1.4      tron     <a href="postscreen.8.html">postscreen(8)</a> daemons that run under the same <a href="master.8.html">master(8)</a> daemon,
   1123  1.1.1.4      tron     or under different <a href="master.8.html">master(8)</a> daemons on the same host.  Disable
   1124  1.1.1.4      tron     cache cleanup (<a href="postconf.5.html#postscreen_cache_cleanup_interval">postscreen_cache_cleanup_interval</a> = 0) in all
   1125  1.1.1.4      tron     <a href="postscreen.8.html">postscreen(8)</a> daemons except one that is responsible for cache
   1126  1.1.1.4      tron     cleanup. This requires Postfix 2.11 or later. </p>
   1127  1.1.1.4      tron 
   1128  1.1.1.4      tron     <pre>
   1129  1.1.1.7  christos     # Example 2: persistent <a href="lmdb_table.5.html">lmdb</a>: allowlist.
   1130  1.1.1.4      tron     /etc/postfix/<a href="postconf.5.html">main.cf</a>:
   1131  1.1.1.4      tron         <a href="postconf.5.html#postscreen_cache_map">postscreen_cache_map</a> = <a href="lmdb_table.5.html">lmdb</a>:$<a href="postconf.5.html#data_directory">data_directory</a>/postscreen_cache
   1132  1.1.1.4      tron         # See note 1 below.
   1133  1.1.1.4      tron         # <a href="postconf.5.html#postscreen_cache_cleanup_interval">postscreen_cache_cleanup_interval</a> = 0
   1134  1.1.1.4      tron     </pre>
   1135  1.1.1.4      tron 
   1136  1.1.1.7  christos <li> <p> Other kinds of persistent temporary allowlist can be shared
   1137  1.1.1.4      tron     only between <a href="postscreen.8.html">postscreen(8)</a> daemons that run under the same
   1138  1.1.1.7  christos     <a href="master.8.html">master(8)</a> daemon. In this case, temporary allowlist access must
   1139  1.1.1.4      tron     be shared through the <a href="proxymap.8.html">proxymap(8)</a> daemon. This requires Postfix
   1140  1.1.1.4      tron     2.9 or later. </p>
   1141  1.1.1.4      tron 
   1142  1.1.1.4      tron     <pre> 
   1143  1.1.1.7  christos     # Example 3: proxied <a href="DATABASE_README.html#types">btree</a>: allowlist.
   1144  1.1.1.4      tron     /etc/postfix/<a href="postconf.5.html">main.cf</a>:
   1145  1.1.1.4      tron         <a href="postconf.5.html#postscreen_cache_map">postscreen_cache_map</a> = 
   1146  1.1.1.4      tron             <a href="proxymap.8.html">proxy</a>:<a href="DATABASE_README.html#types">btree</a>:/var/lib/postfix/postscreen_cache
   1147  1.1.1.4      tron         # See note 1 below.
   1148  1.1.1.4      tron         # <a href="postconf.5.html#postscreen_cache_cleanup_interval">postscreen_cache_cleanup_interval</a> = 0
   1149  1.1.1.4      tron 
   1150  1.1.1.7  christos     # Example 4: proxied <a href="DATABASE_README.html#types">btree</a>: allowlist with <a href="memcache_table.5.html">memcache</a>: accelerator.
   1151  1.1.1.4      tron     /etc/postfix/<a href="postconf.5.html">main.cf</a>:
   1152  1.1.1.4      tron         <a href="postconf.5.html#postscreen_cache_map">postscreen_cache_map</a> = <a href="memcache_table.5.html">memcache</a>:/etc/postfix/postscreen_cache
   1153  1.1.1.4      tron         <a href="postconf.5.html#proxy_write_maps">proxy_write_maps</a> = 
   1154  1.1.1.4      tron             <a href="proxymap.8.html">proxy</a>:<a href="DATABASE_README.html#types">btree</a>:/var/lib/postfix/postscreen_cache 
   1155  1.1.1.4      tron             ... other proxied tables ...
   1156  1.1.1.4      tron         # See note 1 below.
   1157  1.1.1.4      tron         # <a href="postconf.5.html#postscreen_cache_cleanup_interval">postscreen_cache_cleanup_interval</a> = 0
   1158  1.1.1.4      tron 
   1159  1.1.1.4      tron     /etc/postfix/postscreen_cache:
   1160  1.1.1.4      tron         # Note: the $<a href="postconf.5.html#data_directory">data_directory</a> macro is not defined in this context.
   1161  1.1.1.4      tron         memcache = inet:127.0.0.1:11211
   1162  1.1.1.4      tron         backup = <a href="proxymap.8.html">proxy</a>:<a href="DATABASE_README.html#types">btree</a>:/var/lib/postfix/postscreen_cache
   1163  1.1.1.4      tron         key_format = postscreen:%s
   1164  1.1.1.4      tron     </pre>
   1165  1.1.1.4      tron 
   1166  1.1.1.4      tron     <p> Note 1: disable cache cleanup (<a href="postconf.5.html#postscreen_cache_cleanup_interval">postscreen_cache_cleanup_interval</a>
   1167  1.1.1.4      tron     = 0) in all <a href="postscreen.8.html">postscreen(8)</a> daemons except one that is responsible
   1168  1.1.1.4      tron     for cache cleanup. </p>
   1169  1.1.1.4      tron 
   1170  1.1.1.4      tron     <p> Note 2: <a href="postscreen.8.html">postscreen(8)</a> cache sharing via <a href="proxymap.8.html">proxymap(8)</a> requires Postfix
   1171  1.1.1.4      tron     2.9 or later; earlier <a href="proxymap.8.html">proxymap(8)</a> implementations don't support
   1172  1.1.1.4      tron     cache cleanup.  </p>
   1173  1.1.1.4      tron 
   1174  1.1.1.4      tron </ul>
   1175  1.1.1.4      tron 
   1176      1.1      tron <h2> <a name="historical"> Historical notes and credits </a> </h2>
   1177      1.1      tron 
   1178      1.1      tron <p> Many ideas in <a href="postscreen.8.html">postscreen(8)</a> were explored in earlier work by
   1179      1.1      tron Michael Tokarev, in OpenBSD spamd, and in MailChannels Traffic
   1180      1.1      tron Control. </p>
   1181      1.1      tron 
   1182      1.1      tron <p> Wietse threw together a crude prototype with pregreet and dnsbl
   1183      1.1      tron support in June 2009, because he needed something new for a Mailserver
   1184      1.1      tron conference presentation in July. Ralf Hildebrandt ran this code on
   1185      1.1      tron several servers to collect real-world statistics. This version used
   1186      1.1      tron the <a href="dnsblog.8.html">dnsblog(8)</a> ad-hoc DNS client program. </p>
   1187      1.1      tron 
   1188      1.1      tron <p> Wietse needed new material for a LISA conference presentation
   1189      1.1      tron in November 2010, so he added support for DNSBL weights and filters
   1190      1.1      tron in August, followed by a major code rewrite, deep protocol tests,
   1191      1.1      tron helo/sender/recipient logging, and stress-adaptive behavior in
   1192      1.1      tron September. Ralf Hildebrandt ran this code on several servers to
   1193      1.1      tron collect real-world statistics. This version still used the embarrassing
   1194      1.1      tron <a href="dnsblog.8.html">dnsblog(8)</a> ad-hoc DNS client program.  </p>
   1195      1.1      tron 
   1196      1.1      tron <p> Wietse added STARTTLS support in December 2010. This makes
   1197      1.1      tron <a href="postscreen.8.html">postscreen(8)</a> usable for sites that require TLS support.  The
   1198      1.1      tron implementation introduces the <a href="tlsproxy.8.html">tlsproxy(8)</a> event-driven TLS proxy
   1199      1.1      tron that decrypts/encrypts the sessions for multiple SMTP clients. </p>
   1200      1.1      tron 
   1201  1.1.1.3      tron <p> The <a href="tlsproxy.8.html">tlsproxy(8)</a> implementation led to the discovery of a "new"
   1202  1.1.1.3      tron class of vulnerability (<a
   1203  1.1.1.3      tron href="http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-0411"
   1204  1.1.1.3      tron >CVE-2011-0411</a>) that affected multiple implementations of SMTP,
   1205  1.1.1.3      tron POP, IMAP, NNTP, and FTP over TLS. </p>
   1206  1.1.1.3      tron 
   1207  1.1.1.3      tron <p> <a href="postscreen.8.html">postscreen(8)</a> was officially released as part of the Postfix
   1208  1.1.1.3      tron 2.8 stable release in January 2011.</p>
   1209  1.1.1.3      tron 
   1210  1.1.1.7  christos <p> Noel Jones helped with the Postfix 3.6 transition towards respectful
   1211  1.1.1.7  christos documentation. </p>
   1212      1.1      tron 
   1213  1.1.1.7  christos </body>
   1214      1.1      tron </html>
   1215