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