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