Postfix Configuration - UCE Controls
Up one level | Basic
Configuration | UCE Controls | Rate
Controls | Resource Controls | Address Manipulation
Introduction
Postfix offers a variety of parameters that limit the delivery of
unsolicited commercial email (UCE).
By default, the Postfix SMTP server will
accept mail only from or to the local network or domain, or to
domains that are hosted by Postfix, so that your system can't be
used as a mail relay to forward bulk mail from random strangers.
The text in this document describes how you can set up more detailed
anti-UCE policies that prevent delivery of unwanted email altogether,
for example with sendmail-style access lists or with RBL
(real-time blackhole list) name servers.
Unless indicated otherwise, all parameters described here are
in the main.cf file. If you change parameters of a running
Postfix system, don't forget to issue a postfix reload
command.
Header filtering
The header_checks parameter restricts what is allowed in
message headers. Patterns are applied to entire logical message
headers, even when a header spans multiple lines of text.
By default, the same header_checks patterns are used for
primary message headers, for MIME headers (including headers at
the start of multipart body parts), and for the headers at the
beginning of attached email messages.
- Default:
- Allow anything in message headers.
- Syntax:
- Specify a list of zero or more lookup tables with pattern +
action rules.
A complete discussion of header_checks table format, including
actions, can be found in the
header_checks(5) manual page.
- Examples (main.cf):
- header_checks = regexp:/usr/local/etc/postfix/header_checks
- header_checks = pcre:/usr/local/etc/postfix/header_checks
- Example (header_checks):
- /^to: *friend@public\.com$/ REJECT
Body filtering
The body_checks parameter restricts what text is
is allowed in message body lines.
Note: the message body is matched one line at a time.
There is no multi-line concept as with message headers.
- Default:
- Allow anything in message body lines.
- Syntax:
- Specify a list of zero or more lookup tables with pattern +
action rules.
A complete discussion of body_checks table format can be found in
the body_checks(5) manual page.
- Examples (main.cf):
- body_checks = regexp:/usr/local/etc/postfix/body_checks
- body_checks = pcre:/usr/local/etc/postfix/body_checks
Client hostname/address
restrictions
The smtpd_client_restrictions parameter restricts what
clients this system accepts SMTP connections from.
By default, this restriction is applied when the client sends the
RCPT TO command. In order to have the restriction take effect
as soon as possible, specify smtpd_delay_reject = no in
the Postfix main.cf configuration file. Doing so may cause
unexpected results with poorly implemented client software.
- Default:
- smtpd_client_restrictions =
- Allow SMTP connections from any client.
- Syntax:
- Specify a list of zero or more restrictions, separated by
whitespace or commas. Restrictions are applied in the order as
specified; the first restriction that matches wins.
In addition to restrictions that are specific to the client hostname
or IP address, you may list here any restrictions based on the
information passed with the
HELO/EHLO command, on the
sender address or on the
recipient address. The HELO/EHLO, sender or recipient restrictions
take effect only if smtpd_delay_reject = yes so that all
restrictions are evaluated after the RCPT TO command.
- Examples:
- smtpd_client_restrictions = hash:/usr/local/etc/postfix/access,
reject_rbl_client relays.mail-abuse.org (paid service)
- smtpd_client_restrictions = hash:/usr/local/etc/postfix/access,
reject_rbl_client relays.ordb.org (free service)
- smtpd_sender_restrictions = hash:/usr/local/etc/postfix/access,
reject_rhsbl_sender dsn.rfc-ignorant.org (free service)
- smtpd_client_restrictions = permit_mynetworks,
reject_unknown_client
- Restrictions:
- reject_unknown_client
- Reject the request when the client IP address has no PTR
(address to name) record in the DNS, or when the PTR record does
not have a matching A (name to address) record. The
unknown_client_reject_code parameter specifies the response
code to rejected requests (default: 450).
- permit_mynetworks
- Permit the request when the client IP address matches any
network listed in $mynetworks.
- reject_rbl_client
domain.tld=127.0.0.2
- reject_rbl_client domain.tld
- Reject the
request when the reversed client network address is listed with an
A record under domain.tld.
Append the address to the RBL server's domain name to select a
specific address from a multi-valued result.
The maps_rbl_reject_code parameter specifies the response
code for rejected requests (default: 554), the default_rbl_reply parameter
specifies the default server reply, and the
rbl_reply_maps parameter specifies tables with server replies
indexed by RBL domain.
- reject_rhsbl_client
domain.tld=127.0.0.2
- reject_rhsbl_client domain.tld
- Reject the
request when the client hostname is listed with an A record under
domain.tld. See above for additional RBL related configuration
parameters.
Append the address to the RBL server's domain name to select a
specific address from a multi-valued result.
- check_client_access
maptype:mapname
- maptype:mapname
- Search the named access database for the client hostname, parent
domains, client IP address, or networks obtained by stripping least
significant octets.
- permit
- defer
- reject
- warn_if_reject
- reject_unauth_pipelining
- check_policy_service
- See generic restrictions.
Require HELO (EHLO) command
The smtpd_helo_required parameter determines if clients must
send a HELO (or EHLO) command at the beginning of an
SMTP session. Requiring this will stop some UCE software.
- Default:
- smtpd_helo_required = no
- By default, the Postfix SMTP server
does not require the use of HELO (EHLO).
- Syntax:
- Specify yes or no.
- Example:
- smtpd_helo_required = yes
HELO (EHLO) hostname
restrictions
The smtpd_helo_restrictions parameter restricts what hostnames
clients may send with the HELO (EHLO) command. Some
UCE software can be stopped by being strict here.
By default, this restriction is applied when the client sends the
RCPT TO command. In order to have the restriction take effect
as soon as possible, specify smtpd_delay_reject = no in
the Postfix main.cf configuration file. Doing so may cause
unexpected results with poorly implemented client software.
- Default:
- smtpd_helo_restrictions =
- By default, the Postfix SMTP server
accepts any garbage in the HELO (EHLO) command. There
is a lot of broken or misconfigured software on the Internet.
- Syntax:
- Specify a list of zero or more restrictions, separated by
whitespace or commas. Restrictions are applied in the order as
specified; the first restriction that matches wins.
In addition to restrictions that are specific to HELO (EHLO) command
parameters, you may list here any restrictions on the client hostname , client address , sender address or recipient address. The
sender or recipient restrictions take effect only if smtpd_delay_reject
= yes so that all restrictions are evaluated after the RCPT TO
command.
- Example:
- smtpd_helo_restrictions = permit_mynetworks,
reject_invalid_hostname
- Restrictions:
- reject_invalid_hostname
- Reject the request when the client HELO or EHLO parameter
has a bad hostname syntax. The invalid_hostname_reject_code
specifies the response code to rejected requests (default: 501).
- reject_unknown_hostname
- Reject the request when the hostname in the client HELO
(EHLO) command has no DNS A or MX record. The
unknown_hostname_reject_code specifies the response code to
rejected requests (default: 450).
- reject_non_fqdn_hostname
- Reject the request when the hostname in the client HELO
(EHLO) command is not in fully-qualified domain form, as required
by the RFC. The non_fqdn_reject_code specifies the response
code to rejected requests (default: 504).
- check_helo_access
maptype:mapname
- maptype:mapname
- Search the named access database for the HELO hostname
or parent domains.
- check_helo_ns_access
maptype:mapname
- check_helo_mx_access
maptype:mapname
- Apply the specified access database
to the DNS (or MX) servers for the host or domain name given with
the HELO (or EHLO) command.
- Note: an OK result is not allowed for safety reasons.
- reject_rhsbl_helo
domain.tld=127.0.0.2
- reject_rhsbl_helo domain.tld
- Reject the
request when the HELO (or EHLO) hostname is listed with an A record
under domain.tld. See above for additional RBL related
configuration parameters.
Append the address to the RBL server's domain name to select a
specific address from a multi-valued result.
The maps_rbl_reject_code parameter specifies the response
code for rejected requests (default: 554), the default_rbl_reply parameter
specifies the default server reply, and the
rbl_reply_maps parameter specifies tables with server replies
indexed by RBL domain.
- permit
- defer
- reject
- warn_if_reject
- reject_unauth_pipelining
- check_policy_service
- See generic restrictions.
Require strict RFC 821-style
envelope addresses
The strict_rfc821_envelopes parameter controls how tolerant
Postfix is with respect to addresses given in MAIL FROM or RCPT TO
commands. Unfortunately, the widely-used Sendmail program tolerates
lots of non-standard behavior, so a lot of software expects to get
away with it. Being strict to the RFC not only stops unwanted
mail, it also blocks legitimate mail from poorly-written mail
applications.
- Default:
- strict_rfc821_envelopes = no
- By default, the Postfix SMTP server
accepts any address form that it can make sense of, including
address forms that contain RFC 822-style comments, or addresses
not enclosed in <>. There is a lot of broken or misconfigured
software out there on the Internet.
- Example:
- strict_rfc821_envelopes = yes
Sender address
restrictions
The smtpd_sender_restrictions parameter restricts what sender
addresses this system accepts in MAIL FROM commands.
By default, this restriction is applied when the client sends the
RCPT TO command. In order to have the restriction take effect
as soon as possible, specify smtpd_delay_reject = no in
the Postfix main.cf configuration file. Doing so may cause
unexpected results with poorly implemented client software.
- Default:
- smtpd_sender_restrictions =
- By default, the Postfix SMTP server
accepts any sender address.
- Syntax:
- Specify a list of zero or more restrictions, separated by
whitespace or commas. Restrictions are applied in the order as
specified; the first restriction that matches wins.
In addition to restrictions that are specific to sender mail
addresses, you can also specify restrictions based on the information
passed with the HELO/EHLO
command , on the client
hostname or network
address , or on the
recipient address . The recipient restrictions take effect
only if smtpd_delay_reject = yes so that all restrictions
are evaluated after the RCPT TO command.
- Example:
- smtpd_sender_restrictions = hash:/usr/local/etc/postfix/access,
reject_unknown_sender_domain
- Restrictions:
-
reject_unknown_sender_domain
- Reject the request
when the sender mail address has no DNS A or MX record. The
unknown_address_reject_code parameter specifies the response
code for rejected requests (default: 450). The response
is always 450 in case of a temporary DNS error.
- reject_unverified_sender
- Reject the request when mail to the sender address is
known to bounce, or when the sender address destination is not
reachable. Address verification information is managed by the verify(8) server. The
unverified_sender_reject_code parameter specifies the
response when an address is known to bounce (default: 450, change
into 550 when you are confident that it is safe to do so). Postfix
replies with 450 when an address probe failed due to a temporary
problem.
- reject_rhsbl_sender
domain.tld
- Reject the request when the sender mail
address domain is listed with an A record under domain.tld.
The maps_rbl_reject_code parameter specifies the response
code for rejected requests (default: 554), the default_rbl_reply parameter
specifies the default server reply, and the
rbl_reply_maps parameter specifies tables with server replies
indexed by RBL domain.
- check_sender_access
maptype:mapname
- maptype:mapname
- Search the named access database for the sender mail address,
sender domain and parent domain, or localpart@.
- check_sender_ns_access
maptype:mapname
- check_sender_mx_access
maptype:mapname
- Apply the specified access database
to the DNS (or MX) servers for the host or domain name given with
the MAIL FROM command.
- Note: an OK result is not allowed for safety reasons.
- reject_unlisted_sender
- Reject the request when the sender address matches one
of the domain lists below, but is not listed in one of the
corresponding address lists:
Note 1: a null $local_recipient_maps or $relay_recipient_maps setting
means that no address check is done for the corresponding domains.
Note 2: Postfix applies an implicit reject_unlisted_sender
restriction at the end of all sender restrictions.
- reject_non_fqdn_sender
- Reject the request when the address in the client MAIL
FROM command is not in fully-qualified domain form. The
non_fqdn_reject_code specifies the response code to rejected
requests (default: 504).
-
reject_sender_login_mismatch
- Reject the request when
$smtpd_sender_login_maps specifies an owner for the MAIL FROM
address, but the client is not (SASL) logged in as that MAIL FROM
address owner; or when the client is (SASL) logged in, but the
client login name doesn't own the MAIL FROM address.
-
reject_authenticated_sender_login_mismatch
- Reject the request when the client is (SASL) logged in but
the client login name doesn't own the MAIL FROM address according
to $smtpd_sender_login_maps.
-
reject_unauthenticated_sender_login_mismatch
- Reject the request when
$smtpd_sender_login_maps specifies an owner for the address,
but the client is not (SASL) logged in.
- permit
- defer
- reject
- warn_if_reject
- reject_unauth_pipelining
- check_policy_service
- See generic restrictions.
Recipient address
restrictions
The smtpd_recipient_restrictions parameter restricts what
recipient addresses this system accepts in RCPT TO commands.
- Default:
- smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
- By default, the Postfix SMTP server
relays mail:
- from trusted clients whose IP address matches $mynetworks to any destination,
- from untrusted clients to destinations that match $relay_domains or a subdomain thereof,
except for addresses that contain sender-specified routing
(user@elsewhere@domain).
In addition to the above, the Postfix SMTP
server by default accepts mail for which Postfix is the final
destination:
- Syntax:
- Specify a list of zero or more restrictions, separated by
whitespace or commas. Restrictions are applied in the order as
specified; the first restriction that matches wins.
In addition to restrictions that are specific to recipient mail
addresses, you can also specify restrictions based on the sender mail address, on the
information passed with the
HELO/EHLO command , and on the
client hostname or
network address .
- Example:
- smtpd_recipient_restrictions = permit_mynetworks,
reject_unauth_destination
- Note: you must specify at least one of the following
restrictions: reject, defer, defer_if_permit,
or reject_unauth_destination. Postfix will refuse
to receive mail otherwise.
- Restrictions:
- permit_auth_destination
- Permit the request when one of the following is true:
- reject_unauth_destination
- Reject the request unless one of the following is true:
The relay_domains_reject_code parameter specifies the response
code for rejected requests (default: 554).
- permit_mx_backup
-
Permit the request when the local mail system is MX host for the
resolved destination. This includes the case that the local mail
system is the final destination. However, the SMTP server will
not forward mail with addresses that have sender-specified routing
information (example: user@elsewhere@domain),
Use the optional
permit_mx_backup_networks parameter to also require that the
primary MX hosts match a list of network blocks.
Relevant configuration parameters: permit_mx_backup_networks,
$mydestination, $inet_interfaces, $proxy_interfaces.
- check_recipient_access maptype:mapname
- maptype:mapname
- Search the named access database for the resolved destination
address, recipient domain or parent domain, or localpart@.
- check_recipient_ns_access
maptype:mapname
- check_recipient_mx_access
maptype:mapname
- Apply the specified access database
to the DNS servers (or MX hosts) for the host or domain name given
with the RCPT TO command.
- Note: an OK result is not allowed for safety reasons.
- reject_unlisted_recipient
- Reject the request when the recipient address matches
one of the domain lists below, but is not listed in one of the
corresponding lookup tables:
Note 1: a null $local_recipient_maps or $relay_recipient_maps setting
means that no address check is done for the corresponding domains.
Note 2: Postfix applies an implicit reject_unlisted_recipient
restriction at the end of all recipient restrictions.
Note 3: the check_recipient_maps restriction is a backwards
compatible alias for reject_unlisted_recipient. It will
eventually be removed from Postfix.
-
reject_multi_recipient_bounce
- Reject the request
when the envelope sender is the null address, and the message has
multiple envelope recipients. The multi_recipient_bounce_reject_code
parameter specifies the response code for rejected requests
(default: 550).
-
reject_unknown_recipient_domain
- Reject the request
when the recipient mail address has no DNS A or MX record. The
unknown_address_reject_code parameter specifies the response
code for rejected requests (default: 450). The response
is always 450 in case of a temporary DNS error.
-
reject_unverified_recipient
- Reject the request
when mail to the recipient address is known to bounce, or when the
recipient address destination is not reachable. Address verification
information is managed by the verify(8)
server. The unverified_recipient_reject_code parameter
specifies the response when an address is known to bounce (default:
450, change into 550 when you are confident that it is safe to do
so). Postfix replies with 450 when an address probe failed due to
a temporary problem.
- reject_rhsbl_recipient
domain.tld
- Reject the request when the recipient
mail address domain is listed with an A record under domain.tld.
The maps_rbl_reject_code parameter specifies the response
code for rejected requests (default: 554), the default_rbl_reply parameter
specifies the default server reply, and the
rbl_reply_maps parameter specifies tables with server replies
indexed by RBL domain.
- reject_non_fqdn_recipient
- Reject the request when the address in the client RCPT
TO command is not in fully-qualified domain form. The
non_fqdn_reject_code specifies the response code to rejected
requests (default: 504).
- permit
- defer
- reject
- warn_if_reject
- reject_unauth_pipelining
- check_policy_service
- See generic restrictions.
ETRN command restrictions
Not really an UCE restriction, the smtpd_etrn_restrictions
parameter restricts what domains can be specified in ETRN commands,
and what clients can issue ETRN commands.
- Default:
- smtpd_etrn_restrictions =
- By default, the Postfix SMTP server
accepts any ETRN command from any client.
- Syntax:
- Specify a list of zero or more restrictions, separated by
whitespace or commas. Restrictions are applied in the order as
specified; the first restriction that matches wins.
In addition to restrictions that are specific to ETRN domain names,
you can also specify restrictions based on the information passed
with the HELO/EHLO command
, and on the client
hostname or network
address .
- Example:
- smtpd_etrn_restrictions = permit_mynetworks,
hash:/usr/local/etc/postfix/etrn_access, reject
- Restrictions:
- check_etrn_access
maptype:mapname
- maptype:mapname
- Search the named access database for the domain specified
in the ETRN command, or its parent domains.
- permit
- defer
- reject
- warn_if_reject
- reject_unauth_pipelining
- check_policy_service
- See generic restrictions.
Generic restrictions
The following restrictions can use used for client hostnames or
addresses, for HELO (EHLO) hostnames, for sender mail addresses
and for recipient mail addresses.
Restrictions:
- permit
- Permit the request.
This restriction is useful at the end of a restriction list, to
make the default policy explicit.
- defer
- Defer the request.
The client is told to try again later. This restriction is useful
at the end of a restriction list, to make the default policy
explicit.
- reject
- Reject the request.
This restriction is useful at the end of a restriction list, to
make the default policy explicit. The reject_code configuration
parameter specifies the response code to rejected requests (default:
554).
- warn_if_reject
-
Change the meaning of the next restriction, so that it logs a
warning instead of rejecting a request (look for logfile records
that contain "reject_warning"). This is useful for testing new
restrictions in a "live" environment without risking unnecessary
loss of mail.
- reject_unauth_pipelining
- Reject the request when the client sends SMTP commands
ahead of time without knowing that Postfix actually supports SMTP
command pipelining. This stops mail from bulk mail software that
improperly uses SMTP command pipelining to speed up deliveries.
- check_policy_service
inet:host:port
- check_policy_service unix:pathname
- Query the specified server with a list of attributes that
specify (where available) the mail protocol (SMTP or ESMTP), the
queue file name, the protocol state (CONNECT, HELO, EHLO, MAIL,
RCPT, ETRN), the client network address, the hostname given in the
HELO or EHLO command, the sender email address, the recipient email
address. The server is expected to reply with an action just like
the actions found in a Postfix access
database.
Example:
- check_policy_service inet:localhost:9998
- check_policy_service unix:private/policy
- check_policy_service unix:/some/where
Additional UCE control parameters
- default_rbl_reply
- The default reply template that is used when an SMTP client
request is blocked by a reject_rbl or reject_rhsbl
restriction. The reply template is subjected to exactly one level
of $name macro substitution as described below. The
smtpd_expansion_filter configuration parameter specifies
the set of characters that are allowed in $name macro expansions.
Characters outside the allowed set are replaced by "_".
- Default:
- default_rbl_reply = $rbl_code Service unavailable; $rbl_class [$rbl_what] blocked using $rbl_domain${rbl_reason?; $rbl_reason}
Instead of the form $name you can also specify ${name}
or $(name).
- Macro expansion syntax:
- $client
- The client hostname and IP address, formatted as
name[address].
- $client_name
- The client hostname, or unknown.
- $client_address
- The client IP address.
- $helo_name
- The hostname given in the HELO or EHLO command,
or the empty string when no HELO or EHLO command was given.
- $sender
- The sender address, or <> in case of the null
address.
- $sender_name
- The sender address localpart, or <> in case
of the null address.
- $sender_domain
- The sender address domain, or the empty
string when no domain is available.
- $recipient
- The recipient address, or <> in case of the
null address.
- $recipient_name
- The recipient address localpart, or <>
in case of the null address.
- $recipient_domain
- The recipient address domain, or the
empty string when no domain is available.
- $rbl_what
- The blacklisted entity: an IP address, a
hostname, a domain name, or an email address whose domain is
blacklisted.
- $rbl_domain
- The RBL domain where $rbl_what is blacklisted
with an A record.
- $rbl_reason
- The reason why $rbl_what is blacklisted, or
the empty string when no information is available.
- $rbl_class
- The blacklisted entity type: Client host,
Helo command, Sender address, or Recipient address.
- $rbl_code
- The numerical server reply code, as specified
with the maps_rbl_reject_code configuration parameter
(default: 554).
- All other text
- Copied without change, with the exception
of conditional macro expansion as described below.
Conditional macro expansion syntax:
- ${name?text}
- expands to text if
$name is not empty.
- ${name:text}
- expands to text if
$name is empty.
- permit_mx_backup_networks
- Restrict the use of the
permit_mx_backup relay control feature to destinations whose
primary MX hosts match a list of network blocks.
- Default:
- permit_mx_backup_networks =
That is, all networks are authorized by default.
- Syntax:
- Specify a list of network
blocks in CIDR (network/mask) notation, for example:
- permit_mx_backup_networks = 168.100.0.0/16
You can also specify the absolute pathname of a pattern file instead
of listing the patterns in the main.cf file.
- rbl_reply_maps
- This parameter specifies lookup tables with RBL reply templates
indexed by RBL domain name. If no template is found, the
default_rbl_reply template is
used instead.
- Default:
- rbl_reply_maps =
By default, Postfix always uses the
default_rbl_reply template.
- Syntax:
- Specify zero or more type:name lookup tables,
separated by whitespace and/or commas. For the syntax of the
template reply strings, see the
default_rbl_reply parameter description.
- relay_domains
- This parameter controls the behavior of the reject_unauth_destination
and permit_auth_destination
restrictions that can appear as part of a recipient address
restriction list.
- Default:
- relay_domains =
$mydestination
- By default, the Postfix SMTP server
relays mail:
- from trusted clients whose IP address matches $mynetworks,
- from untrusted clients to destinations that match $relay_domains or a subdomain thereof,
except for addresses that contain sender-specified routing
(user@elsewhere@domain).
- Syntax:
- Specify zero or more domain names, /file/name patterns
and/or type:name lookup tables, separated by whitespace
and/or commas. A /file/name is replaced by its contents;
type:name requests that table lookup is done instead
of string comparison.
A host or destination address matches $relay_domains when
its name or parent domain matches any of the names, files or lookup
tables listed in $relay_domains.
- smtpd_sender_login_maps
- This parameter specifies ownership of MAIL FROM addresses, as
used by the reject_sender_login_mismatch
anti-spoofing restriction and by its component sender address
restrictions:
reject_authenticated_sender_login_mismatch and
reject_unauthenticated_sender_login_mismatch.
- Default:
- smtpd_sender_login_maps =
- Syntax:
- Specify zero or more type:name lookup tables, separated by
whitespace and/or commas. The maps are searched in the
specified order. Regexp tables are allowed.
Each map entry specifies a sender address and a list of login names
(separated by whitespace and/or commas) that owns the address. The
search order is:
- user@domain owner, owner, ...
- This form has the highest precedence.
- user owner, owner, ...
- This matches user@site when site is equal to
$myorigin, when site is
listed in $mydestination,
or when it is listed in
$inet_interfaces or
$proxy_interfaces.
- @domain owner, owner, ...
- This matches every address in the specified domain, and has
the lowest precedence.
Up one level | Basic
Configuration | UCE Controls | Rate
Controls | Resource Controls | Address Manipulation