STRESS_README.html revision 1.1.1.1.4.2 1 <!doctype html public "-//W3C//DTD HTML 4.01 Transitional//EN"
2 "http://www.w3.org/TR/html4/loose.dtd">
3
4 <html>
5
6 <head>
7
8 <title>Postfix Stress-Dependent Configuration</title>
9
10 <meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
11
12 </head>
13
14 <body>
15
16 <h1><img src="postfix-logo.jpg" width="203" height="98" ALT="">Postfix
17 Stress-Dependent Configuration</h1>
18
19 <hr>
20
21 <h2>Overview </h2>
22
23 <p> This document describes the symptoms of Postfix SMTP server
24 overload. It presents permanent main.cf changes to avoid overload
25 during normal operation, and temporary main.cf changes to cope with
26 an unexpected burst of mail. This document makes specific suggestions
27 for Postfix 2.5 and later which support stress-adaptive behavior,
28 and for earlier Postfix versions that don't. </p>
29
30 <p> Topics covered in this document: </p>
31
32 <ul>
33
34 <li><a href="#overload"> Symptoms of Postfix SMTP server overload </a>
35
36 <li><a href="#concurrency"> Service more SMTP clients at the same time </a>
37
38 <li><a href="#time"> Spend less time per SMTP client </a>
39
40 <li><a href="#hangup"> Disconnect suspicious SMTP clients </a>
41
42 <li><a href="#legacy"> Temporary measures for older Postfix releases </a>
43
44 <li><a href="#adapt"> Automatic stress-adaptive behavior </a>
45
46 <li><a href="#feature"> Detecting support for stress-adaptive behavior </a>
47
48 <li><a href="#forcing"> Forcing stress-adaptive behavior on or off </a>
49
50 <li><a href="#other"> Other measures to off-load zombies </a>
51
52 <li><a href="#credits"> Credits </a>
53
54 </ul>
55
56 <h2><a name="overload"> Symptoms of Postfix SMTP server overload </a></h2>
57
58 <p> Under normal conditions, the Postfix SMTP server responds
59 immediately when an SMTP client connects to it; the time to deliver
60 mail is noticeable only with large messages. Performance degrades
61 dramatically when the number of SMTP clients exceeds the number of
62 Postfix SMTP server processes. When an SMTP client connects while
63 all Postfix SMTP server processes are busy, the client must wait
64 until a server process becomes available. </p>
65
66 <p> SMTP server overload may be caused by a surge of legitimate
67 mail (example: a DNS registrar opens a new zone for registrations),
68 by mistake (mail explosion caused by a forwarding loop) or by malice
69 (worm outbreak, botnet, or other illegitimate activity). </p>
70
71 <p> Symptoms of Postfix SMTP server overload are: </p>
72
73 <ul>
74
75 <li> <p> Remote SMTP clients experience a long delay before Postfix
76 sends the "220 hostname.example.com ESMTP Postfix" greeting. </p>
77
78 <ul>
79
80 <li> <p> NOTE: Broken DNS configurations can also cause lengthy
81 delays before Postfix sends "220 hostname.example.com ...". These
82 delays also exist when Postfix is NOT overloaded. </p>
83
84 <li> <p> NOTE: To avoid "overload" delays for end-user mail
85 clients, enable the "submission" service entry in master.cf (present
86 since Postfix 2.1), and tell users to connect to this instead of
87 the public SMTP service. </p>
88
89 </ul>
90
91 <li> <p> The Postfix SMTP server logs an increased number of "lost
92 connection after CONNECT" events. This happens because remote SMTP
93 clients disconnect before Postfix answers the connection. </p>
94
95 <ul>
96
97 <li> <p> NOTE: A portscan for open SMTP ports can also result in
98 "lost connection ..." logfile messages. </p>
99
100 </ul>
101
102 <li> <p> Postfix 2.3 and later logs a warning that all server ports
103 are busy: </p>
104
105 <pre>
106 Oct 3 20:39:27 spike postfix/master[28905]: warning: service "smtp"
107 (25) has reached its process limit "30": new clients may experience
108 noticeable delays
109 Oct 3 20:39:27 spike postfix/master[28905]: warning: to avoid this
110 condition, increase the process count in master.cf or reduce the
111 service time per client
112 </pre>
113
114 </ul>
115
116 <p> Legitimate mail that doesn't get through during an episode of
117 Postfix SMTP server overload is not necessarily lost. It should
118 still arrive once the situation returns to normal, as long as the
119 overload condition is temporary. </p>
120
121 <h2><a name="concurrency"> Service more SMTP clients at the same time </a> </h2>
122
123 <p> One measure to avoid the "all server processes busy" condition
124 is to service more SMTP clients simultaneously. For this you need
125 to increase the number of Postfix SMTP server processes. This will
126 improve the
127 responsiveness for remote SMTP clients, as long as the server machine
128 has enough hardware and software resources to run the additional
129 processes, and as long as the file system can keep up with the
130 additional load. </p>
131
132 <ul>
133
134 <li> <p> You increase the number of SMTP server processes either
135 by increasing the default_process_limit in main.cf (line 3 below),
136 or by increasing the SMTP server's "maxproc" field in master.cf
137 (line 10 below). Either way, you need to issue a "postfix reload"
138 command to make the change effective. </p>
139
140 <li> <p> Process limits above 1000 require Postfix version 2.4 or
141 later, and an operating system that supports kernel-based event
142 filters (BSD kqueue(2), Linux epoll(4), or Solaris /dev/poll).
143 </p>
144
145 <li> <p> More processes use more memory. You can reduce the Postfix
146 memory footprint by using cdb:
147 lookup tables instead of Berkeley DB's hash: or btree: tables. </p>
148
149 <pre>
150 1 /etc/postfix/main.cf:
151 2 # Raise the global process limit, 100 since Postfix 2.0.
152 3 default_process_limit = 200
153 4
154 5 /etc/postfix/master.cf:
155 6 # =============================================================
156 7 # service type private unpriv chroot wakeup maxproc command
157 8 # =============================================================
158 9 # Raise the SMTP service process limit only.
159 10 smtp inet n - n - 200 smtpd
160 </pre>
161
162 <li> <p> NOTE: older versions of the SMTPD_POLICY_README document
163 contain a mistake: they configure a fixed number of policy daemon
164 processes. When you raise the SMTP server's "maxproc" field in
165 master.cf, SMTP server processes will report problems when connecting
166 to policy server processes, because there aren't enough of them.
167 Examples of errors are "connection refused" or "operation timed
168 out". </p>
169
170 <p> To fix, edit master.cf and specify a zero "maxproc" field
171 in all policy server entries; see line 6 in the example below.
172 Issue a "postfix reload" command to make the change effective. </p>
173
174 <pre>
175 1 /etc/postfix/master.cf:
176 2 # =============================================================
177 3 # service type private unpriv chroot wakeup maxproc command
178 4 # =============================================================
179 5 # Disable the policy service process limit.
180 6 policy unix - n n - 0 spawn
181 7 user=nobody argv=/some/where/policy-server
182 </pre>
183
184 </ul>
185
186 <h2><a name="time"> Spend less time per SMTP client </a></h2>
187
188 <p> When increasing the number of SMTP server processes is not
189 practical, you can improve Postfix server responsiveness by eliminating
190 delays. When Postfix spends less time per SMTP session, the same
191 number of SMTP server processes can service more clients in a given
192 amount of time. </p>
193
194 <ul>
195
196 <li> <p> Eliminate non-functional RBL lookups (blocklists that are
197 no longer in operation). These lookups can degrade performance.
198 Postfix logs a warning when an RBL server does not respond. </p>
199
200 <li> <p> Eliminate redundant RBL lookups (people often use multiple
201 Spamhaus RBLs that include each other). To find out whether RBLs
202 include other RBLs, look up the websites that document the RBL's
203 policies. </p>
204
205 <li> <p> Eliminate header_checks and body_checks, and keep just a few
206 emergency patterns to block the latest worm explosion or backscatter
207 mail. See BACKSCATTER_README for examples of the latter.
208
209 <li> <p> Group your header_checks and body_checks patterns to avoid
210 unnecessary pattern matching operations:
211
212 <pre>
213 1 /etc/postfix/header_checks:
214 2 if /^Subject:/
215 3 /^Subject: virus found in mail from you/ reject
216 4 /^Subject: ..other../ reject
217 5 endif
218 6
219 7 if /^Received:/
220 8 /^Received: from (postfix\.org) / reject forged client name in received header: $1
221 9 /^Received: from ..other../ reject ....
222 10 endif
223 </pre>
224
225 </ul>
226
227 <h2><a name="hangup"> Disconnect suspicious SMTP clients </a></h2>
228
229 <p> Under conditions of overload you can improve Postfix SMTP server
230 responsiveness by hanging up on suspicious clients, so that other
231 clients get a chance to talk to Postfix. </p>
232
233 <ul>
234
235 <li> <p> Use "521" SMTP reply codes (Postfix 2.6 and later) or "421"
236 (Postfix 2.3-2.5) to hang up on clients that that match botnet-related
237 RBLs (see next bullet) or that match selected non-RBL restrictions
238 such as SMTP access maps. The Postfix SMTP server will reject mail
239 and disconnect without waiting for the remote SMTP client to send
240 a QUIT command. </p>
241
242 <li> <p> To hang up connections from blacklisted zombies, you can
243 set specific Postfix SMTP server reject codes for specific RBLs,
244 and for individual responses from specific RBLs. We'll use
245 zen.spamhaus.org as an example; by the time you read this document,
246 details may have changed. Right now, their documents say that a
247 response of 127.0.0.10 or 127.0.0.11 indicates a dynamic client IP
248 address, which means that the machine is probably running a bot of
249 some kind. To give a 521 response instead of the default 554
250 response, use something like: </p>
251
252 <pre>
253 1 /etc/postfix/main.cf:
254 2 smtpd_client_restrictions =
255 3 permit_mynetworks
256 4 reject_rbl_client zen.spamhaus.org=127.0.0.10
257 5 reject_rbl_client zen.spamhaus.org=127.0.0.11
258 6 reject_rbl_client zen.spamhaus.org
259 7
260 8 rbl_reply_maps = hash:/etc/postfix/rbl_reply_maps
261 9
262 10 /etc/postfix/rbl_reply_maps:
263 11 # With Postfix 2.3-2.5 use "421" to hang up connections.
264 12 zen.spamhaus.org=127.0.0.10 521 4.7.1 Service unavailable;
265 13 $rbl_class [$rbl_what] blocked using
266 14 $rbl_domain${rbl_reason?; $rbl_reason}
267 15
268 16 zen.spamhaus.org=127.0.0.11 521 4.7.1 Service unavailable;
269 17 $rbl_class [$rbl_what] blocked using
270 18 $rbl_domain${rbl_reason?; $rbl_reason}
271 </pre>
272
273 <p> Although the above example shows three RBL lookups (lines 4-6),
274 Postfix will only do a single DNS query, so it does not affect the
275 performance. </p>
276
277 <li> <p> With Postfix 2.3-2.5, use reply code 421 (521 will not
278 cause Postfix to disconnect). The down-side of replying with 421
279 is that it works only for zombies and other malware. If the client
280 is running a real MTA, then it may connect again several times until
281 the mail expires in its queue. When this is a problem, stick with
282 the default 554 reply, and use "smtpd_hard_error_limit = 1" as
283 described below. </p>
284
285 <li> <p> You can automatically turn on the above overload measure
286 with Postfix 2.5 and later, or with earlier releases that contain
287 the stress-adaptive behavior source code patch from the mirrors
288 listed at http://www.postfix.org/download.html. Simply replace line
289 above 8 with: </p>
290
291 <pre>
292 8 rbl_reply_maps = ${stress?hash:/etc/postfix/rbl_reply_maps}
293 </pre>
294
295 </ul>
296
297 <p> More information about automatic stress-adaptive behavior is
298 in section "<a href="#adapt">Automatic stress-adaptive behavior</a>".
299 </p>
300
301 <h2><a name="legacy"> Temporary measures for older Postfix releases </a></h2>
302
303 <p> See the next section, "<a href="#adapt">Automatic stress-adaptive
304 behavior</a>", if you are running Postfix version 2.5 or later, or
305 if you have applied the source code patch for stress-adaptive
306 behavior from the mirrors listed at http://www.postfix.org/download.html.
307 </p>
308
309 <p> The following measures can be applied temporarily during overload.
310 They still allow <b>most</b> legitimate clients to connect and send
311 mail, but may affect some legitimate clients. </p>
312
313 <ul>
314
315 <li> <p> Reduce smtpd_timeout (default: 300s). Experience on the
316 postfix-users list from a variety of sysadmins shows that reducing
317 the "normal" smtpd_timeout to 60s is unlikely to affect legitimate
318 clients. However, it is unlikely to become the Postfix default
319 because it's not RFC compliant. Setting smtpd_timeout to 10s (line
320 2 below) or even 5s under stress will still allow <b>most</b>
321 legitimate clients to connect and send mail, but may delay mail
322 from some clients. No mail should be lost, as long as this measure
323 is used only temporarily. </p>
324
325 <li> <p> Reduce smtpd_hard_error_limit (default: 20). Setting this
326 to 1 under stress (line 3 below) helps by disconnecting clients
327 after a single error, giving other clients a chance to connect.
328 However, this may cause significant delays with legitimate mail,
329 such as a mailing list that contains a few no-longer-active user
330 names that didn't bother to unsubscribe. No mail should be lost,
331 as long as this measure is used only temporarily. </p>
332
333 <li> <p> Use an smtpd_junk_command_limit of 1 instead of the default
334 100. This prevents clients from keeping idle connections open by
335 repeatedly sending NOOP or RSET commands. </p>
336
337 </ul>
338
339 <blockquote>
340 <pre>
341 1 /etc/postfix/main.cf:
342 2 smtpd_timeout = 10
343 3 smtpd_hard_error_limit = 1
344 4 smtpd_junk_command_limit = 1
345 </pre>
346 </blockquote>
347
348 <p> With these measures, no mail should be lost, as long
349 as these measures are used only temporarily. The next section of
350 this document introduces a way to automate this process. </p>
351
352 <h2><a name="adapt"> Automatic stress-adaptive behavior </a></h2>
353
354 <p> Postfix version 2.5 introduces automatic stress-adaptive behavior.
355 This is also available as a source code patch for Postfix versions
356 2.4 and 2.3 from the mirrors listed at
357 http://www.postfix.org/download.html. </p>
358
359 <p> It works as follows. When a "public" network service such as
360 the SMTP server runs into an "all server ports are busy" condition,
361 the Postfix master(8) daemon logs a warning, restarts the service
362 (without interrupting existing network sessions), and runs the
363 service with "-o stress=yes" on the server process command line:
364 </p>
365
366 <blockquote>
367 <pre>
368 80821 ?? S 0:00.24 smtpd -n smtp -t inet -u -c -o stress=yes
369 </pre>
370 </blockquote>
371
372 <p> Normally, the Postfix master(8) daemon runs such a service with
373 "-o stress=" on the command line (i.e. with an empty parameter
374 value): </p>
375
376 <blockquote>
377 <pre>
378 83326 ?? S 0:00.28 smtpd -n smtp -t inet -u -c -o stress=
379 </pre>
380 </blockquote>
381
382 <p> Services that have local access only never have "-o stress"
383 parameters on the command line. This includes services internal to
384 Postfix such as the queue manager, and services that listen on a
385 loopback interface only, such as after-filter SMTP services. </p>
386
387 <p> The "stress" parameter value is the key to making main.cf
388 parameter settings stress adaptive. The following settings are the
389 default with Postfix 2.6 and later. With earlier Postfix versions
390 that have stress-adaptive support, append the lines below to the
391 main.cf file and issue a "postfix reload" command: </p>
392
393 <blockquote>
394 <pre>
395 1 smtpd_timeout = ${stress?10}${stress:300}s
396 2 smtpd_hard_error_limit = ${stress?1}${stress:20}
397 3 smtpd_junk_command_limit = ${stress?1}${stress:100}
398 </pre>
399 </blockquote>
400
401 <p> Translation: <p>
402
403 <ul>
404
405 <li> <p> Line 1: under conditions of stress, use an smtpd_timeout
406 value of 10 seconds instead of the default 300 seconds. Experience
407 on the postfix-users list from a variety of sysadmins shows that
408 reducing the "normal" smtpd_timeout to 60s is unlikely to affect
409 legitimate clients. However, it is unlikely to become the Postfix
410 default because it's not RFC compliant. Setting smtpd_timeout to
411 10s (line 2 below) or even 5s under stress will still allow most
412 legitimate clients to connect and send mail, but may delay mail
413 from some clients. No mail should be lost, as long as this measure
414 is used only temporarily. </p>
415
416 <li> <p> Line 2: under conditions of stress, use an smtpd_hard_error_limit
417 of 1 instead of the default 20. This helps by disconnecting clients
418 after a single error, giving other clients a chance to connect.
419 However, this may cause significant delays with legitimate mail,
420 such as a mailing list that contains a few no-longer-active user
421 names that didn't bother to unsubscribe. No mail should be lost,
422 as long as this measure is used only temporarily. </p>
423
424 <li> <p> Line 3: under conditions of stress, use an
425 smtpd_junk_command_limit of 1 instead of the default 100. This
426 prevents clients from keeping idle connections open by repeatedly
427 sending NOOP or RSET commands. </p>
428
429 </ul>
430
431 <p> The syntax of ${name?value} and ${name:value} is explained at
432 the beginning of the postconf(5) manual page. </p>
433
434 <p> NOTE: Please keep in mind that the stress-adaptive feature is
435 a fairly desperate measure to keep <b>some</b> legitimate mail
436 flowing under overload conditions. If a site is reaching the SMTP
437 server process limit when there isn't an attack or bot flood
438 occurring, then either the process limit needs to be raised or more
439 hardware needs to be added. </p>
440
441 <h2><a name="feature"> Detecting support for stress-adaptive behavior </a></h2>
442
443 <p> To find out if your Postfix installation supports stress-adaptive
444 behavior, use the "ps" command, and look for the smtpd processes.
445 Postfix has stress-adaptive support when you see "-o stress=" or
446 "-o stress=yes" command-line options. Remember that Postfix never
447 enables stress-adaptive behavior on servers that listen on local
448 addresses only. </p>
449
450 <p> The following example is for FreeBSD or Linux. On Solaris, HP-UX
451 and other System-V flavors, use "ps -ef" instead of "ps ax". </p>
452
453 <blockquote>
454 <pre>
455 $ ps ax|grep smtpd
456 83326 ?? S 0:00.28 smtpd -n smtp -t inet -u -c -o stress=
457 84345 ?? Ss 0:00.11 /usr/bin/perl /usr/libexec/postfix/smtpd-policy.pl
458 </pre>
459 </blockquote>
460
461 <p> You can't use postconf(1) to detect stress-adaptive support.
462 The postconf(1) command ignores the existence of the stress parameter
463 in main.cf, because the parameter has no effect there. Command-line
464 "-o parameter" settings always take precedence over main.cf parameter
465 settings. <p>
466
467 <p> If you configure stress-adaptive behavior in main.cf when it
468 isn't supported, nothing bad will happen. The processes will run
469 as if the stress parameter always has an empty value. </p>
470
471 <h2><a name="forcing"> Forcing stress-adaptive behavior on or off </a></h2>
472
473 <p> You can manually force stress-adaptive behavior on, by adding
474 a "-o stress=yes" command-line option in master.cf. This can be
475 useful for testing overrides on the SMTP service. Issue "postfix
476 reload" to make the change effective. </p>
477
478 <p> Note: setting the stress parameter in main.cf has no effect for
479 services that accept remote connections. </p>
480
481 <blockquote>
482 <pre>
483 1 /etc/postfix/master.cf:
484 2 # =============================================================
485 3 # service type private unpriv chroot wakeup maxproc command
486 4 # =============================================================
487 5 #
488 6 smtp inet n - n - - smtpd
489 7 -o stress=yes
490 8 -o . . .
491 </pre>
492 </blockquote>
493
494 <p> To permanently force stress-adaptive behavior off with a specific
495 service, specify "-o stress=" on its master.cf command line. This
496 may be desirable for the "submission" service. Issue "postfix reload"
497 to make the change effective. </p>
498
499 <p> Note: setting the stress parameter in main.cf has no effect for
500 services that accept remote connections. </p>
501
502 <blockquote>
503 <pre>
504 1 /etc/postfix/master.cf:
505 2 # =============================================================
506 3 # service type private unpriv chroot wakeup maxproc command
507 4 # =============================================================
508 5 #
509 6 submission inet n - n - - smtpd
510 7 -o stress=
511 8 -o . . .
512 </pre>
513 </blockquote>
514
515 <h2><a name="other"> Other measures to off-load zombies </a> </h2>
516
517 <p> OpenBSD <a href="http://www.openbsd.org/spamd/">spamd</a>
518 implements a daemon that handles all connections from "new" clients.
519 Only well-behaved mail clients are allowed to talk to the mail
520 server. Other clients are tarpitted, and will never get a chance
521 to affect mail server performance. </p>
522
523 <p> At some point in the future, Postfix may come with a simple
524 front-end daemon that does basic greylisting and pipelining detection
525 to keep zombies and other ratware away from Postfix itself. This
526 would use the "pass" service type which has been available in
527 stable Postfix releases since Postfix 2.5. </p>
528
529 <h2><a name="credits"> Credits </a></h2>
530
531 <ul>
532
533 <li> Thanks to the postfix-users mailing list members for sharing
534 early experiences with the stress-adaptive feature.
535
536 <li> The RBL example and several other paragraphs of text were
537 adapted from postfix-users postings by Noel Jones.
538
539 <li> Wietse implemented stress-adaptive behavior as the smallest
540 possible patch while he should be working on other things.
541
542 </ul>
543
544 </body> </html>
545