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