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