DEV Community

Dhiraj Chatpar
Dhiraj Chatpar

Posted on

UFW firewall setup

The Open Source MTA Landscape in 2026

KumoMTA: The Modern Standard

KumoMTA (Apache 2.0) is the Rust-based MTA built for 2026 infrastructure. Designed from scratch for modern cloud-native deployment, it handles 150,000-200,000 messages/minute per core with negligible memory overhead. The Lua policy engine enables dynamic routing and traffic shaping that would require external tooling in any other open source MTA.

Best for: High-volume senders (5M+ emails/month), organizations migrating from PowerMTA, teams wanting AI-assisted configuration.

Postfix: The Old Reliable

Postfix (IBM PL/I, now PostfixProject.org) has been the default Linux MTA since the early 2000s. It's exceptionally stable, security-hardened, and ships on every major Linux distribution. For internal mail routing and low-volume outbound, Postfix is excellent. For high-volume marketing or transactional email, Postfix's single-threaded architecture and limited traffic shaping require significant external tooling.

Best for: Internal mail systems, low-volume servers, organizations with existing Postfix expertise.

Exim: The cPanel Default

Exim is the MTA that powers most shared hosting environments because cPanel adopted it as default. Exim is extremely configurable (some would say overly complex) and handles a significant portion of the world's email. The configuration syntax is notoriously difficult to read, and security vulnerabilities have been a recurring issue.

Best for: Shared hosting, cPanel environments, very specific routing requirements that other MTAs can't handle.

Haraka: The Node.js Contender

Haraka is a Node.js MTA built for high throughput and plugin extensibility. The JavaScript plugin system is genuinely elegant, and performance is competitive. The downside: the Node.js event loop creates latency spikes under sustained load, and the plugin ecosystem lacks enterprise-grade observability integrations.

Best for: Developers comfortable with Node.js, high-volume senders who want custom routing logic without learning Lua.


MTA Comparison Table

Feature KumoMTA Postfix Exim Haraka
License Apache 2.0 IPL GPL MIT
Language Rust C C Node.js
Memory Safety Yes (Rust) Manual (C) Manual (C) GC (Node.js)
Architecture Async Prefork Single-process Event loop
Throughput (single node) 150-200K/min 20-30K/min 25-40K/min 60-80K/min
Multi-Tenant Native Lua Limited Complex config Plugin
Traffic Shaping Native Lua External (policyd) ACL-based Plugin
DKIM Signing Built-in Lua OpenDKIM (external) Built-in Plugin
Prometheus Metrics Built-in External External JSON logs
Kubernetes Helm chart native Manual Manual Manual
Learning Curve Low-Medium Medium High Medium
Active Development Active Very active Active Moderate

Architecture: Building a Production Email Stack

Recommended Stack for High-Volume Sending (10M+/month)

                    ┌─────────────────────────────┐
                    │     Load Balancer            │
                    │   (HAproxy / NGINX)          │
                    └─────────────┬───────────────┘
                                  │
         ┌────────────────────────┼────────────────────────┐
         │                        │                        │
┌────────▼────────┐    ┌─────────▼─────────┐   ┌─────────▼────────┐
│    KumoMTA      │    │    KumoMTA       │   │    KumoMTA       │
│    Node 1       │    │    Node 2        │   │    Node 3        │
│  (8 cores/32GB) │    │  (8 cores/32GB) │   │  (8 cores/32GB)  │
└────────┬────────┘    └─────────┬─────────┘   └─────────┬────────┘
         │                       │                        │
         └───────────────────────┼────────────────────────┘
                                 │
                    ┌────────────▼────────────┐
                    │   Redis / PostgreSQL     │
                    │   (Queue coordination)   │
                    └─────────────────────────┘
Enter fullscreen mode Exit fullscreen mode

Single-Server Stack (Under 5M/month)

┌──────────────────────────────────────┐
│           KumoMTA                     │
│  ┌──────────┐  ┌─────────────────┐  │
│  │  SMTP    │  │  HTTP API        │  │
│  │  (25/587)│  │  (8080)          │  │
│  └──────────┘  └─────────────────┘  │
│                                      │
│  ┌──────────────────────────────┐    │
│  │  DKIM signing (Lua)          │    │
│  │  Bounce processing (Lua)     │    │
│  │  Traffic shaping (Lua)       │    │
│  └──────────────────────────────┘    │
│                                      │
│  ┌──────────┐  ┌─────────────────┐   │
│  │Prometheus│  │  Message Spool  │   │
│  │(2000)    │  │  (/spool)      │   │
│  └──────────┘  └─────────────────┘   │
└──────────────────────────────────────┘
Enter fullscreen mode Exit fullscreen mode

Security Hardening

Firewall Configuration

# UFW firewall setup
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp      # SSH (limit to your IP)
sudo ufw allow 25/tcp      # SMTP MX (must be open)
sudo ufw allow 587/tcp     # Submission (authenticated)
sudo ufw allow 465/tcp      # SMTPS
sudo ufw allow 8080/tcp     # HTTP API (internal only)
sudo ufw allow 2000/tcp     # Prometheus (internal only)
sudo ufw enable
Enter fullscreen mode Exit fullscreen mode

SMTP Greeting and HelO Restrictions

-- /etc/kumomta/security.conf
-- Restrict relay to authorized networks only
kumo.start_smtp_listener {
    listen = "[::]:25",
    name = "mx",
    -- Reject connections from known spammers
    max_connections_per_ip = 10,
    greeting_timeout = "30s",
}
Enter fullscreen mode Exit fullscreen mode

DMARC, SPF, DKIM Enforcement

(Refer to our Email Authentication Guide for full DKIM/SPF/DMARC setup)

Key points for open source infrastructure:

  1. Always DKIM sign — no exceptions for 2026 deliverability
  2. Set DMARC policy to quarantine or reject once you're confident
  3. Monitor DMARC reports (aggregate at rua=mailto:)

Monitoring and Observability

Prometheus Metrics (KumoMTA Native)

# Prometheus scrape config
scrape_configs:
  - job_name: 'kumomta'
    static_configs:
      - targets: ['kumomta1:2000', 'kumomta2:2000', 'kumomta3:2000']
    scrape_interval: 15s
Enter fullscreen mode Exit fullscreen mode

Essential Grafana Dashboards

Build these dashboards for your email infrastructure:

1. Delivery Overview

  • Messages processed/minute
  • Delivery success rate (%)
  • Bounce rate (%)
  • Complaint rate (%)

2. Queue Health

  • Queue depth per domain
  • Messages retrying
  • Dead letter queue size

3. Infrastructure

  • CPU, Memory, Disk I/O
  • Network throughput
  • TLS connection success rate

4. ISP-Specific

  • Gmail delivery rate
  • Outlook delivery rate
  • Yahoo delivery rate

Log Aggregation

# Ship KumoMTA logs to central ELK stack
filebeat.inputs:
- type: log
  paths:
    - /var/log/kumomta/kumomta.log
  json:
    keys_under_root: true
    overwrite_keys: true
Enter fullscreen mode Exit fullscreen mode

Scalability: From 1M to 100M Emails/Month

Horizontal Scaling Architecture

-- KumoMTA: Redis-backed queue for horizontal scaling
kumo.configure_queue {
    backend = "redis",
    redis_url = "redis://shared-redis:6379",
    -- All KumoMTA instances share queue state via Redis
}
Enter fullscreen mode Exit fullscreen mode

Load Balancing with HAProxy

# /etc/haproxy/haproxy.cfg
listen smtp-relay
    bind :2525
    mode tcp
    balance roundrobin
    server kumomta1 10.0.1.10:2525 check inter 5s fall 2 rise 1
    server kumomta2 10.0.1.11:2525 check inter 5s fall 2 rise 1
    server kumomta3 10.0.1.12:2525 check inter 5s fall 2 rise 1
Enter fullscreen mode Exit fullscreen mode

Auto-Scaling with Kubernetes

# KumoMTA HPA (Horizontal Pod Autoscaler)
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: kumomta-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: kumomta
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: kumomta_queue_depth
      target:
        type: AverageValue
        averageValue: 5000
Enter fullscreen mode Exit fullscreen mode

Migration Path: Postfix/Exim to KumoMTA

From Postfix

Postfix configuration is scattered across multiple files (main.cf, master.cf). Migrate systematically:

  1. Extract DKIM configuration from OpenDKIM → KumoMTA Lua
  2. Extract transport maps → KumoMTA Lua routing
  3. Extract relay domains → KumoMTA tenant configuration
  4. Keep Postfix for inbound MX, migrate only outbound to KumoMTA
# Postfix transport map example
# /etc/postfix/transport
support@example.com    smtp:[kumomta-relay]:2525
sales@example.com      smtp:[kumomta-relay]:2525

# KumoMTA equivalent: per-tenant routing in Lua
kumo.on("smtp_message_received", function(domain, meta)
    if domain == "example.com" then
        kumo.route_to("relay-cluster", { priority = "high" })
    end
end)
Enter fullscreen mode Exit fullscreen mode

From Exim

Exim's configuration is a single complex file with ACLs and routers. The migration is the most involved:

  1. Document all Exim routers (routing logic)
  2. Map Exim ACLs to KumoMTA Lua policy
  3. Test with low-volume parallel deployment
  4. Migrate sending over 2-4 weeks

FAQ

Q: Can I run Postfix for inbound and KumoMTA for outbound?
A: Yes — this is the recommended migration approach. Postfix handles MX/inbound well; KumoMTA handles outbound delivery.

Q: Does open source mean no support?
A: No. KumoMTA has active community forums and GitHub issues. PostMTA and other partners provide commercial support for KumoMTA deployments.

Q: Is KumoMTA production-ready for 100M+ emails/month?
A: Yes. Several production senders exceed 100M/month on KumoMTA. The architecture scales horizontally.

Q: What's the cost of self-hosted vs cloud?
A: At 10M emails/month: self-hosted ~$1,500-2,500/month (infra only). Cloud SMTP: ~$1,000-1,500/month (tier-based). At 100M+: self-hosted is significantly cheaper.

Q: How does KumoMTA compare to Postfix for deliverability?
A: At equal infrastructure, deliverability is determined by authentication (SPF/DKIM/DMARC) and sending practices — not the MTA itself. KumoMTA's Lua-based traffic shaping makes it easier to implement proper warmup and rate limiting.


Get Help With Open Source Email Infrastructure

PostMTA provides:

  • Infrastructure architecture design and review
  • KumoMTA / Postfix / Exim deployment and migration
  • Security hardening and authentication setup
  • Monitoring and alerting configuration
  • Ongoing managed infrastructure

👉 Talk to our infrastructure team →

For related guides, see KumoMTA Setup Guide, IP Warmup Strategies, and Email Authentication Guide.

References: KumoMTA GitHub | Postfix Documentation | IETF RFC 5321

Top comments (0)