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