Postfix operates with two main components: the Mail Submission Agent (MSA) and the Mail Transfer Agent (MTA). The MSA handles outgoing mail submission, while the MTA manages incoming mail delivery. To achieve our goal, we need to configure these components separately.
The main configuration file for Postfix is /etc/postfix/main.cf. We'll need to modify this file to implement our restrictions:
# Basic security settings smtpd_banner = $myhostname ESMTP $mail_name biff = no append_dot_mydomain = no
To limit outgoing mail to localhost only, we need to modify the mynetworks parameter:
# Only allow localhost to send mail mynetworks = 127.0.0.0/8 [::1]/128
For the MTA to receive mail from anywhere, we need to ensure these settings:
# Allow connections from any host smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
Here's a complete configuration that implements our requirements:
# Network restrictions
mynetworks = 127.0.0.0/8 [::1]/128
# Incoming mail settings
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
reject_non_fqdn_sender,
reject_unknown_sender_domain,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
permit
# Outgoing mail restrictions
smtpd_client_restrictions =
permit_mynetworks,
reject_unknown_client_hostname,
reject_rbl_client sbl.spamhaus.org,
reject_rbl_client cbl.abuseat.org,
reject_rbl_client dul.dnsbl.sorbs.net,
permit
# Enable submission port for localhost
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
After making changes, always test your configuration:
# Check configuration syntax postfix check # Reload Postfix systemctl reload postfix # Test local submission echo "Test message" | mail -s "Test" user@example.com # Verify restrictions telnet your.server.ip 25
For enhanced security, consider implementing these measures:
# Enable TLS smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_use_tls=yes # Rate limiting anvil_rate_time_unit = 60s smtpd_client_connection_count_limit = 10 smtpd_client_connection_rate_limit = 30
Postfix operates with multiple components: the Mail Submission Agent (MSA) for outgoing mail and Mail Transfer Agent (MTA) for incoming mail. The key distinction is that MSA handles locally generated mail while MTA processes external connections.
Edit /etc/postfix/main.cf with these critical parameters:
# Restrict outgoing mail to localhost only smtpd_client_restrictions = permit_mynetworks, reject mynetworks = 127.0.0.0/8 inet_interfaces = all
Add these directives to control mail flow precisely:
# Allow submissions only from localhost
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination
# Enable submission port with stricter rules
submission inet n - - - - smtpd
-o syslog_name=postfix/submission
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
After making changes, verify with:
postfix check systemctl reload postfix
Test locally and remotely:
# Local test (should work) telnet localhost 25 EHLO localhost MAIL FROM: test@localhost # Remote test (should be rejected) telnet your.server.ip 25 EHLO remote.host
Check logs for configuration errors:
tail -f /var/log/mail.log grep 'reject' /var/log/mail.log
If encountering permission issues, verify:
postconf -n | grep mynetworks postconf -n | grep smtpd_restrictions
For systems requiring authenticated submissions:
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination