Postfix und grommunio Mailserver Konfiguration für ein Hotel
Konfigurationshinweise für eine komplexe Postfix Mailserver Umgebung
grommunio https://grommunio.com/ wurde auf einem Debian Server onPremise als Proxmox VM installiert. Der Server ist mit einer festen IP-Adresse über einen NAT-Router mit dem Internet verbunden.
Anforderungen an das Setup
Generell wurde der Server nach der Installationsanleitung https://docs.grommunio.com/admin/manual_core/ installiert. Die Anforderung im Hotel war aber, daß die E-Mail Adressen und E-Mail Header der ausgehenden E-Mails umgeschrieben werden sollten, so daß die internen Adressen nicht nach außen sichtbar sind. Ebenso sollten eingehende E-Mail Adressen umgeschrieben werden und an das lokale Postfach “dispatcher” gehen. Dieser verteilt dann die E-Mails nach Sichtung an die internen Postfächer. Dieser Dispatcher PC hat ansonsten keine Verbindung zum internen Netzwerk.
E-Mails werden auf Spam mittels integrierten rspamd gescannt. Hier werden die E-Mails ebenfalls mit DKIM signiert. Das Problem hierbei war, daß die E-Mail Header der ausgehenden Mails durch smtp_header_checks sowie die E-Mail Adressen durch smtp_generic_maps nach der DKIM Signierung durch rspamd erfolgten. Deshalb war beim Empfänger der E-Mail die DKIM Signatur ungültig.
Es musste also ein weiterer Postfix Transport default_transport preout implementiert werden, welcher die E-Mail Adressen und Header für E-Mails nach extern vor rspamd umschreiben kann. Erst danach wird die E-Mail im smtpd Transport 127.0.0.1:10025 über das Milter Protokoll an rspamd übergeben.
Gesamtübersicht Mailrouting
┌───────────────────────────────────────────────────────────────┐
│ 1. INBOUND INTERNET │
└───────────────────────────────────────────────────────────────┘
Internet
│
▼
:25 / postscreen
│
▼
smtpd
│
▼
RSPAMD
Inbound Scan
│
▼
Mappings:
recipient_canonical_maps = hash:/etc/postfix/recipient_canonical
│
▼
qmgr
│
▼
LMTP :24
│
▼
GROMOX
┌───────────────────────────────────────────────────────────────┐
│ 2. OUTBOUND GROMOX │
└───────────────────────────────────────────────────────────────┘
Gromox
│
▼
127.0.0.1:25
kein Milter
keine Address-Mappings
│
▼
qmgr
│
▼
preout
Mappings:
smtp_generic_maps=hash:/etc/postfix/generic
smtp_header_checks=regexp:/etc/postfix/smtp_header_checks
│
▼
127.0.0.1:10025
│
▼
RSPAMD
Outbound / DKIM
│
▼
smtp
│
▼
Internet
┌───────────────────────────────────────────────────────────────┐
│ 3. OUTBOUND SUBMISSION │
└───────────────────────────────────────────────────────────────┘
Homepage / Newsletter
│
▼
:587
TLS + SASL
kein Milter
│
▼
qmgr
│
▼
preout
Mappings:
smtp_generic_maps=hash:/etc/postfix/generic
smtp_header_checks=regexp:/etc/postfix/smtp_header_checks
│
▼
127.0.0.1:10025
│
▼
RSPAMD
Outbound / DKIM
│
▼
smtp
│
▼
Internet
Grommunio Konfiguration
outgoing_smtp_url wurde hier explizit gesetzt um die Mails an Postfix nicht via local/sendmail zu übergeben, sondern über den Postfix SMTP Listener.
/etc/gromox/gromox.cfg
lda_listen=127.0.0.1:24
http_listen=0.0.0.0:10080
http_listen_tls=0.0.0.0:10443
imap_listen=
imap_listen_tls=0.0.0.0:993
outgoing_smtp_url = smtp://127.0.0.1:25/
Postfix Konfiguration
/etc/postfix/main.cf
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
biff = no
compatibility_level = 3.9
cyrus_sasl_config_path = /etc/postfix/sasl
default_transport = preout:[127.0.0.1]:10025
inet_interfaces = all
inet_protocols = all
mailbox_command =
mailbox_size_limit = 0
message_size_limit = 51200000
milter_default_action = accept
milter_protocol = 6
mydestination = $myhostname, mail.example.com, localhost.example.com, localhost
myhostname = mail.example.com
mynetworks = 127.0.0.0/8 [::1]/128
mynetworks_style = host
myorigin = /etc/mailname
postscreen_access_list = permit_mynetworks, cidr:/etc/postfix/postscreen_whitelist
postscreen_bare_newline_enable = no
postscreen_dnsbl_action = ignore
postscreen_dnsbl_sites =
postscreen_greet_action = enforce
postscreen_non_smtp_command_enable = no
postscreen_pipelining_enable = no
recipient_bcc_maps = mysql:/etc/postfix/grommunio-bcc-forwards.cf
recipient_canonical_maps = hash:/etc/postfix/recipient_canonical
recipient_delimiter = +
relayhost =
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Debian)
smtpd_milters = inet:127.0.0.1:11332
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = cyrus
smtpd_sender_login_maps = mysql:/etc/postfix/grommunio-virtual-mailbox-maps.cf,mysql:/etc/postfix/grommunio-virtual-mailbox-alias-maps.cf
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_tls_security_level = may
virtual_alias_maps = mysql:/etc/postfix/grommunio-virtual-mailbox-alias-maps.cf,hash:/etc/postfix/external_forwards
virtual_mailbox_domains = mysql:/etc/postfix/grommunio-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/grommunio-virtual-mailbox-maps.cf
virtual_transport = lmtp:[127.0.0.1]:24
/etc/postfix/master.cf
192.168.0.1:25 inet n - y - 1 postscreen
127.0.0.1:25 inet n - n - - smtpd
-o receive_override_options=no_address_mappings
-o smtpd_milters=
preout unix - - y - - smtp
-o syslog_name=postfix/preout
-o smtp_generic_maps=hash:/etc/postfix/generic
-o smtp_header_checks=regexp:/etc/postfix/smtp_header_checks
-o smtp_tls_security_level=none
-o disable_mime_output_conversion=yes
127.0.0.1:10025 inet n - n - - smtpd
-o syslog_name=postfix/outbound-sign
-o mynetworks=127.0.0.0/8
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_relay_restrictions=permit_mynetworks,reject
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o smtpd_sasl_auth_enable=no
-o smtpd_tls_security_level=none
-o receive_override_options=no_address_mappings
-o smtpd_milters=inet:127.0.0.1:11332
-o content_filter=smtp:
smtpd pass - - y - - smtpd
dnsblog unix - - y - 0 dnsblog
tlsproxy unix - - y - 0 tlsproxy
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_milters=
pickup unix n - y 60 1 pickup
cleanup unix n - y - 0 cleanup
qmgr unix n - n 300 1 qmgr
tlsmgr unix - - y 1000? 1 tlsmgr
rewrite unix - - y - - trivial-rewrite
bounce unix - - y - 0 bounce
defer unix - - y - 0 bounce
trace unix - - y - 0 bounce
verify unix - - y - 1 verify
flush unix n - y 1000? 0 flush
proxymap unix - - n - - proxymap
proxywrite unix - - n - 1 proxymap
smtp unix - - y - - smtp
relay unix - - y - - smtp
-o syslog_name=${multi_instance_name?{$multi_instance_name}:{postfix}}/$service_name
showq unix n - y - - showq
error unix - - y - - error
retry unix - - y - - error
discard unix - - y - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - y - - lmtp
anvil unix - - y - 1 anvil
scache unix - - y - 1 scache
postlog unix-dgram n - n - 1 postlogd
/etc/postfix/generic
# Ausgehende Adressen umschreiben
user1@example.com info@example.com
user2@example.com info@example.com
user4@example.com info@example.com
user5@example.com info@example.com
user6@example.com info@example.com
dispatcher@example.com info@example.com
/etc/postfix/smtp_header_checks
/^From:.*user1@example.com.*/ REPLACE From: "Hotel Florian" <info@example.com>
/^From:.*user2@example.com.*/ REPLACE From: "Hotel Florian" <info@example.com>
/^From:.*user4@example.com.*/ REPLACE From: "Hotel Florian" <info@example.com>
/^From:.*user5@example.com.*/ REPLACE From: "Hotel Florian" <info@example.com>
/^From:.*user6@example.com.*/ REPLACE From: "Hotel Florian" <info@example.com>
/^From:.*dispatcher@example.com.*/ REPLACE From: "Hotel Florian" <info@example.com>
/etc/postfix/recipient_canonical
# Eingehende Empfaenger umschreiben
user1@example.com dispatcher@example.com
user2@example.com dispatcher@example.com
user4@example.com dispatcher@example.com
user5@example.com dispatcher@example.com
user6@example.com dispatcher@example.com
info@example.com dispatcher@example.com
