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