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 <CR><LF>. Lines ending in a 589"bare" <LF>, 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> = ${stress?<i>something</i>}${stress:<i>something</i>}" or 912"<i>parametername</i> = ${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