Docker Mailserver

Deployment via FluxCD

Ports via PROXY Protocol mit Traefik

PROXY Protocol erzeugt die Mail Ports +10000, die man via Traefik Ingress durchreichen kann.

  • Man braucht keinen weiteren LoadBalancer

  • Die original IP des Clients bleibt erhalten

HelmChart values

  • Nichts zu ändern, da es aktuell die default Werte sind

service:
  type: "ClusterIP"
proxyProtocol:
  enabled: true
  trustedNetworks: "10.0.0.0/8 192.168.0.0/16 172.16.0.0/16"

Traefik

  • Entrypoints für jeden Service hinzügen

Traefik Helm values:

  smtp:
    port: 25
    expose:
      default: true
    exposedPort: 25
    protocol: TCP
  submissions:
    port: 465
    expose:
      default: true
    exposedPort: 465
    protocol: TCP
  submission:
    port: 587
    expose:
      default: true
    exposedPort: 587
    protocol: TCP
  imap:
    port: 143
    expose:
      default: true
    exposedPort: 143
    protocol: TCP
  imaps:
    port: 993
    expose:
      default: true
    exposedPort: 993
    protocol: TCP

Im mail-Namespace entsprechende IngressRouteTCP Objekte anlegen

---
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: smtp
spec:
  entryPoints: [ smtp ]
  routes:
    - match: HostSNI(`*`)
      services:
        - name: docker-mailserver
          namespace: mail
          port: smtp-proxy
          proxyProtocol:
            version: 2
---
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: submissions
spec:
  entryPoints: [ submissions ]
  routes:
    - match: HostSNI(`*`)
      services:
        - name: docker-mailserver
          namespace: mail
          port: subs-proxy
          proxyProtocol:
            version: 2
---
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: submission
spec:
  entryPoints: [ submission ]
  routes:
    - match: HostSNI(`*`)
      services:
        - name: docker-mailserver
          namespace: mail
          port: sub-proxy
          proxyProtocol:
            version: 2
---
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: imap
spec:
  entryPoints: [ imap ]
  routes:
    - match: HostSNI(`*`)
      services:
        - name: docker-mailserver
          namespace: mail
          port: imap-proxy
          proxyProtocol:
            version: 2
---
apiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
  name: imaps
spec:
  entryPoints: [ imaps ]
  routes:
    - match: HostSNI(`*`)
      services:
        - name: docker-mailserver
          namespace: mail
          port: imaps-proxy
          proxyProtocol:
            version: 2

Initiale Einrichtung

Nach erstem Deployment muss der erste Benutzer erstellt werden. Der Pod startet sich bis dahin alle 120 Sekunden neu.

kubectl -n mail exec -it deployments/docker-mailserver -- setup email add admin@tamay.cloud

DKIM

DKIM Konfiguration

kubectl -n mail exec -it deployments/docker-mailserver -- setup config dkim keysize 2048 domain 'tamay.cloud'

Bei mehreren Domains:

kubectl -n mail exec -it deployments/docker-mailserver -- setup config dkim keysize 2048 domain 'tamay.cloud,tamay.io,bittlingmaier.family'

Wenn RSPAMD aktiviert ist, muss OpenDKIM deaktiviert sein

ENABLE_RSPAMD=1
ENABLE_OPENDKIM=0

DNS Konfiguration

Ausgabe bei der DKIM Erzeugung im DNS hinzufügen:

mail._domainkey.tamay.cloud. IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoAh3Gmlg20iqdZrvIuD/RMRw4CJlZgYRzNrHnib2gsdwS581n5xx/TCQ4WS69NkcOVLtHbyI6uqMj030jCBCCi52jZSsPlaB/q0fUiZgMbAqV3aHv+NqcXG7cdO3LGePMORqi+jP87CzC9/H31qvFUbMbLKpoHZUObrpbwPRFnUddqm77XUdGoEDxu28BydTRj8n2O/krvtDUd1ks5VkG1xo1V6G+HCRXqZ3kQN3ZLI2JXL92eMBeQQK0HsylylwkCyUWp6uwlsSZ6z+2eAd6p/C7xW8fmFQNqkZxfdSXM1c7fQuFCWqNUzG24FEV5L4xDG1bwprLFe7SLoei/PkUQIDAQAB"

DMARC:

  • Bei mehreren Domains entsprechend setzen

  • Cloudflare Mail ist je Domain unterschiedlich, kann unter Email/DMARC-Management eingerichtet werden

_dmarc.tamay.cloud. IN TXT "v=DMARC1; p=quarantine; sp=quarantine; fo=0; adkim=r; aspf=r; pct=100; rf=afrf; ri=86400; rua=mailto:5b5d373275684ca6a9e1576571091766@dmarc-reports.cloudflare.net,mailto:dmarc.report@tamay.cloud; ruf=mailto:dmarc.report@tamay.cloud"

SPF:

tamay.cloud. IN TXT "v=spf1 mx ip4:92.60.36.251 ~all"
Set ENABLE_POLICYD_SPF=0 to opt-out of the default SPF service. Advised when Rspamd is configured to handle SPF instead.

Catch-all Adresse hinzufügen

kubectl -n mail exec -it deployments/docker-mailserver -- sh -c 'echo @tamay.cloud admin@tamay.cloud > /tmp/docker-mailserver/postfix-virtual.cf'

RSPAMD

ENABLE_RSPAMD=1
# ClamAV is compatible with Rspamd. Optionally enable it for anti-virus support:
ENABLE_CLAMAV=1

# Rspamd replaces the functionality of all these anti-spam services, disable them:
ENABLE_OPENDKIM=0
ENABLE_OPENDMARC=0
ENABLE_POLICYD_SPF=0
ENABLE_AMAVIS=0
ENABLE_SPAMASSASSIN=0

# Provided you've set `RSPAMD_GREYLISTING=1`, also disable Postgrey:
ENABLE_POSTGREY=0