Eine Schritt-für-Schritt-Anleitung, wie du auf deinem lokalen Homeserver (Debian 12) mit Mailcow einen Mailserver betreibst, obwohl keine Ports direkt weitergeleitet sind, und diesen über einen günstigen VPS (Debian 12) per FRP und WireGuard öffentlich erreichbar machst.

Hinweis: Passe IP-Adressen, Domains und Passwörter an deine Umgebung an.


Voraussetzungen

  • Lokaler Mailserver
  • VPS: öffentliche IPv4-Adresse
  • Domain: z. B. example.com
  • Root- oder sudo-Zugriff auf beide Server

1. Mailcow auf dem Homeserver installieren

  1. Docker & Compose installieren
sudo apt update
sudo apt install -y \
    ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/debian/gpg \
    | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
    https://download.docker.com/linux/debian $(lsb_release -cs) stable" \
    | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  1. Mailcow herunterladen & konfigurieren
cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized.git mailcow
cd mailcow
sudo ./generate_config.sh
  • MAILCOW_HOSTNAME=mail.example.com
  • HTTP_PORT=80, HTTPS_PORT=443 (falls noch frei)
  • DB-Passwort, Timezone etc.
  1. Mailcow starten
sudo docker-compose pull
sudo docker-compose up -d

2. FRP-Server auf dem VPS einrichten 🔒

  1. FRP herunterladen
wget https://github.com/fatedier/frp/releases/download/v0.63.0/frp_0.63.0_linux_amd64.tar.gz
tar xzf frp_0.63.0_linux_amd64.tar.gz
sudo mv frp_0.63.0_linux_amd64/frps /usr/local/bin/
sudo mkdir -p /etc/frp
sudo touch /etc/frp/frps.toml
rm frp_0.63.0_linux_amd64.tar.gz
sudo rm -r frp_0.63.0_linux_amd64
  1. Token generieren
export FRP_TOKEN=$(openssl rand -hex 16) && echo $FRP_TOKEN
  1. /etc/frp/frps.toml bearbeiten
bindPort = 7000

auth.method = "token"
auth.token = "<FRP TOKEN>"
  1. Systemd-Service /etc/systemd/system/frps.service
[Unit]
Description=FRP Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
Restart=always

[Install]
WantedBy=multi-user.target
  1. aktivieren & starten
sudo systemctl daemon-reload
sudo systemctl start frps
sudo systemctl enable --now frps

3. FRP-Client auf dem Homeserver installieren

  1. FRP herunterladen & installieren
wget https://github.com/fatedier/frp/releases/download/v0.63.0/frp_0.63.0_linux_amd64.tar.gz
tar xzf frp_0.63.0_linux_amd64.tar.gz
sudo mv frp_0.63.0_linux_amd64/frpc /usr/local/bin/
sudo mkdir -p /etc/frp
sudo touch /etc/frp/frpc.toml
rm frp_0.63.0_linux_amd64.tar.gz
sudo rm -r frp_0.63.0_linux_amd64
  1. /etc/frp/frpc.toml bearbeiten
serverAddr = "<VPS PUBLIC IP>"
serverPort = 7000

auth.method = "token"
auth.token = "<VPS FRP TOKEN>"

[[proxies]]
name = "smtp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 25
remotePort = 25

[[proxies]]
name = "smtps"
type = "tcp"
localIP = "127.0.0.1"
localPort = 465
remotePort = 465

[[proxies]]
name = "submission"
type = "tcp"
localIP = "127.0.0.1"
localPort = 587
remotePort = 587

[[proxies]]
name = "imap_ssl"
type = "tcp"
localIP = "127.0.0.1"
localPort = 993
remotePort = 993

[[proxies]]
name = "pop3_ssl"
type = "tcp"
localIP = "127.0.0.1"
localPort = 995
remotePort = 995

Optional auch HTTP und HTTPS tunneln (nicht empfohlen)

[[proxies]]
name = "http"
type = "tcp"
localIP = "127.0.0.1"
localPort = 80
remotePort = 80

[[proxies]]
name = "https"
type = "tcp"
localIP = "127.0.0.1"
localPort = 443
remotePort = 443
  1. Systemd-Service /etc/systemd/system/frpc.service
[Unit]
Description=FRP Client
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.toml
Restart=always

[Install]
WantedBy=multi-user.target
  1. aktivieren & starten
sudo systemctl daemon-reload
sudo systemctl start frpc
sudo systemctl enable --now frpc

4. WireGuard-Tunnel einrichten

Beide Server erhalten eine private VPN-Verbindung im Beispiel-Netz 10.252.1.0/24.

  1. Schlüssel generieren
wg genkey | tee privatekey | wg pubkey > publickey
  1. VPS /etc/wireguard/wg0.conf
[Interface]
Address = 10.252.1.1/24
PrivateKey = <VPS_PRIVATE_KEY>
ListenPort = 51820

[Peer]
PublicKey = <HOME_PUBLIC_KEY>
AllowedIPs = 10.252.1.0/24
  1. Homeserver /etc/wireguard/wg0.conf
[Interface]
Address = 10.252.1.2/24
PrivateKey = <HOME_PRIVATE_KEY>
ListenPort = 51820

[Peer]
PublicKey = <VPS_PUBLIC_KEY>
Endpoint = <VPS_PUBLIC_IP>:51820
AllowedIPs = 10.252.1.0/24
PersistentKeepalive = 25
  1. aktivieren & starten (Auf beiden Servern ausführen)
sudo systemctl enable --now wg-quick@wg0

5. DNS-Einträge konfigurieren

Füge bei deinem DNS-Provider folgende Records hinzu (Beispiel mail.example.com → 203.0.113.10):

Typ Host/Alias Wert
A mail 203.0.113.10
MX @ 10 mail.example.com.
TXT @ v=spf1 ip4:203.0.113.10 mx ~all
TXT mail._domainkey <Mailcow-DKIM-Public-Key>
CNAME autodiscover mail
CNAME autoconfig mail
TXT _dmarc v=DMARC1; p=quarantine; rua=mailto:postmaster@example.com

6. Postfix-Relay auf dem VPS

  1. Postfix installieren
sudo apt install -y postfix
# Site Type: Internet Site
# System mail name: mail.example.com
  1. /etc/postfix/main.cf anpassen
inet_interfaces = all
myhostname = mail.example.com
mynetworks = 127.0.0.0/8, 10.252.1.0/24
relay_domains = $mydestination
  1. /etc/postfix/master.cf anpassen und Port auf 2525 ändern
smtp      inet  n       -       y       -       -       smtpd

Ändern zu

2525      inet  n       -       y       -       -       smtpd
  1. neu laden
sudo systemctl restart postfix

7. Mailcow als Relay konfigurieren

  1. Im Mailcow-Admin-Interface unter System → Configuration → Routing

    • Outgoing Relay Host: 10.252.1.1 (VPS WireGuard-IP)
    • Port: 2525
    • Keine Authentifizierung (Whitelist per WireGuard-Netz)

    image

  2. Im Mailcow-Admin-Interface unter Email → Configuration → Deiner Domain

    Senderabhängige Transport Maps: 10.252.1.1:2525 (VPS Wireguard-IP mit 2525 Port)

    image

  3. Im Mailcow-Admin-Interface Postfix neu starten

    image

Alternativ:

cd /opt/mailcow
sudo docker-compose restart postfix-mailcow

8. Wartung & Tipps

  • Updates: cd /opt/mailcow && git pull && docker-compose pull && docker-compose up -d
  • Monitoring: Dashboard von FRP unter http://<VPS_IP>:7500 einrichten (optional)