Bu yazımda Proxmox Mail Gateway kurulum aşamalarını ve beraberindeki tüm ince yapılandırmaları anlatacağım.

Proxmox Mail Gateway Nedir?

Proxmox Mail Gateway (PMG), bir e-posta güvenlik çözümüdür ve Proxmox Virtual Environment (Proxmox VE) geliştiricileri tarafından geliştirilen açık kaynaklı bir üründür. PMG, özellikle küçük ve orta ölçekli işletmeler için tasarlanmıştır ve e-posta trafiğini koruma, filtreleme ve yönetme amacıyla kullanılır.

Proxmox Mail Gateway, aşağıdaki temel işlevleri sunar:

  1. Anti-spam ve Anti-virüs Koruması: PMG, gelen e-postaları anti-spam ve anti-virüs filtreleme teknolojileri kullanarak tarar ve zararlı içeriği tespit ederek engeller.
  2. E-posta Güvenliği: E-posta şifreleme ve kimlik doğrulama özellikleri sunar, böylece hassas bilgilerin güvende olmasını sağlar.
  3. E-posta İzleme ve Raporlama: PMG, e-posta trafiğini izlemek ve raporlamak için kullanıcı dostu bir arayüz sunar. Bu, işletmelerin e-posta trafiğini daha iyi anlamalarına ve potansiyel tehditleri belirlemelerine yardımcı olur.
  4. E-posta Yönetimi: PMG, e-posta trafiğini yönetmek için geniş bir yönetim araçları yelpazesi sunar, böylece e-posta akışını özelleştirebilir ve kurumsal gereksinimlere uygun hale getirebilirsiniz.
  5. Yedekleme ve Kurtarma: E-posta verilerini düzenli olarak yedekler ve gerektiğinde geri yüklemeyi kolaylaştırır.

Proxmox Mail Gateway, açık kaynaklı bir ürün olduğu için özellikle bütçesi sınırlı olan işletmeler için cazip bir seçenektir. Ayrıca Proxmox Virtual Environment ile entegre çalışabilir, bu da sanallaştırma altyapısına sahip işletmeler için kolay bir entegrasyon sağlar.

Proxmox Mail Gateway Kurulumu

Aşağıdaki kurulumu Mx1 ve Mx2 olarak 2 gateway kuracağımızdan, 2 farklı sanala bu işlemi yapıyoruz.

VM Kurulumu ve ISO Boot

En güncel ISO dosyasını bu web adresinden bulabilir ve sanal sunucuyu kuracağınız yere indirebilirsiniz.

Daha sonra sanal sunucunuzu bu sistem gereksinimlerine göre create edip, ilgili iso ile boot edebilirsiniz.

Recommended Hardware

(depending on your email traffic and settings)

  • Multicore CPU: 64bit (Intel EMT64 or AMD64), for use as virtual machine activate Intel VT/AMD-V CPU flag
  • 4 GB RAM
  • Bootable CD-ROM-drive or USB boot support
  • Monitor with a resolution of 1024×768 for the installation
  • 1 Gbps Ethernet network interface card
  • Storage: at least 8 GB free disk space, best setup with redundancy, use hardware RAID controller with battery backed write cache (“BBU”) or ZFS. ZFS is not compatible with a hardware RAID controller. For best performance use Enterprise class SSD with power loss protection.

Minimum Hardware

  • CPU: 64bit (Intel EMT64 or AMD64)
  • 2 GB RAM
  • Bootable CD-ROM-drive or USB boot support
  • Monitor with a resolution of 1024×768 for the installation
  • Hard disk with at least 8 GB of disk space
  • Ethernet network interface card

Proxmox Mail Gateway GUI Kurulumu

Graphical kurulumu seçip ilerleyelim.

DQLJkAAQIECBAgQIAAgbMEJGZnnafdECBAgAABAgQIECCwoYDEbMNDs2QCBAgQIECAAAECBM4S+H8V0lf6WwLoRgAAAABJRU5ErkJggg==

proxmox mail gateway
image 1

Burada yükleyeceğiniz disk partition’ı seçip next ile devam ediyoruz.

image 2

Klavye, ülke ve saat ayarlamalarını yapıp Next butonuna basıyoruz.

image 3

Şifre ve mail adresinizi yazdıktan sonra tekrar next ile ilerliyoruz.

image 4

DNS, Hostname, Sunucu IP adresi ayarlarını yaptıktan sonra Next butonu ile ilerliyoruz.

image 5

Son olarak yazdığımız ayarları kontrol edip eğer sorun yoksa Install butonuna basıyoruz. İşlem bittikten sonra makine reboot olup otomatik olarak Proxmox Mail Gateway boot olarak başlayacaktır.

image 6

Hostname DNS Tanımlaması

Kurduğumuz 2 farklı sanaldaki Mx1 ve Mx2 gatewayler için DNS kaydını giriyoruz.

Benim örneğimde aşağıdaki gibi olacaktır.

mx1.sezer.in - A Record - 192.168.100.2
mx2.sezer.in - A Record - 192.168.100.3

Web UI için SSL Tanımlaması

https://mx1.sezer.in:8006 portundan Proxmox Mail Gateway arayüzüne bağlanıyorum.

Sol menüden işaretlediğim kısımlara tıklayarak sertifikamı yükleme kısmını açıp, private key, ca cert ve dv cert dosyalarımı yüklüyorum.

image 7
image 8

Bu işlemi her 2 Mail Gateway’im için de ayrı ayrı arayüzden yapıyorum. Artık arayüze girdiğimde sertifika problemi yaşamıyorum.

Cluster Oluşturma

Cluster kısmından create butonuna basarak mx1 makinemizde cluster oluşturuyoruz.

image 9

Daha sonra Add butonuna basarak diğer cluster’ı buraya join edebilmemiz için gereken bilgileri alıyoruz.

image 10

Diğer kurduğumuz Mail gateway’imize gidip Join butonuna basarak aldığımız bilgiler ile beraber cluster’a dahil ediyoruz.

image 11

İki makinemizin de birbirine bağlandığını sayfayı yenilediğimizde görebiliyoruz.

image 12

Backup Server (Optional)

Mevcutta Proxmox Backup Server kullandığımdan Promox mail gateway’i bu sisteme aşağıdaki adımları takip ederek ekliyorum.

image 14

Whitelist ve Blacklist

Daha önce bir mail gateway kullandığımdan oradaki Whitelist ve Blacklistleri aktarmak için tek tek eklemek yerine Proxmox Mail Gateway’in API sini kullanarak bir kod yazdım. Bu kod ile array içerisindeki tüm domainleri blacklist veya whitelist’e ekliyor.

Python ile Blacklist – Whitelist

import requests

class MxApiHandler:
    def __init__(self):
        self.base_url = 'https://mx1.domain.tld:8006/api2/json'
        self.username = 'root@pam'
        self.password = 'password'
        self.ticket = None
        self.token = None
        self.login()

    def login(self):
        url = f"{self.base_url}/access/ticket"
        data = {
            'username': self.username,
            'password': self.password
        }

        response = self.send_request(url, data)
        data = response.json()['data']
        self.ticket = data['ticket']
        self.token = data['CSRFPreventionToken']

    def add_whitelist(self, domain):
        url = f"{self.base_url}/config/ruledb/who/3/domain"  # Whitelist için path
        data = {
            'domain': domain,
        }

        response = self.send_request(url, data, use_ticket=True)

        print(f'Whitelist olarak eklenen domain: {domain}')
        print(f'Sunucu Yanıtı: {response}')

    def add_blacklist(self, domain):
        url = f"{self.base_url}/config/ruledb/who/2/domain"  # Blacklist için path
        data = {
            'domain': domain,
        }

        response = self.send_request(url, data, use_ticket=True)

        print(f'Blacklist olarak eklenen domain: {domain}')
        print(f'Sunucu Yanıtı: {response}')

    def process_domains(self, domains, is_whitelist=True):
        for domain in domains:
            if is_whitelist:
                self.add_whitelist(domain)
            else:
                self.add_blacklist(domain)

    def send_request(self, url, data, use_ticket=False):
        headers = {}

        if use_ticket:
            headers["Cookie"] = f"PMGAuthCookie={self.ticket}"
            headers["CSRFPreventionToken"] = self.token

        response = requests.post(url, data=data, headers=headers, verify=False)

        if response.status_code != 200:
            print(f'Hata kodu: {response.status_code}')
            print(f'Sunucu Hata Mesajı: {response.text}')

        return response

api_handler = MxApiHandler()
domains = ["example1.com", "example2.com", "example3.com"]

# api_handler.process_domains(domains, is_whitelist=True)  # Array'deki tüm domainleri whitelist'e ekle

# veya

# api_handler.process_domains(domains, is_whitelist=False)  # Array'deki tüm domainleri blacklist'e ekle

PHP ile Blacklist – Whitelist

<?php

class MxApiHandler {
    private $baseUrl = 'https://mx1.domain.tld:8006/api2/json';
    private $username = 'root@pam';
    private $password = 'password';
    private $ticket;
    private $token;

    public function __construct() {
        $this->login();
    }

    private function login() {
        $url = $this->baseUrl . '/access/ticket';

        $data = array(
            'username' => $this->username,
            'password' => $this->password
        );

        $response = $this->sendRequest($url, $data);
        $data = json_decode($response)->data;
        $this->ticket = $data->ticket;
        $this->token = $data->CSRFPreventionToken;
    }

    public function addWhitelist($domain) {
        $url = $this->baseUrl . '/config/ruledb/who/3/domain'; // Whitelist için path

        $data = array(
            'domain' => $domain,
        );

        $response = $this->sendRequest($url, $data, true);

        echo 'Whitelist olarak eklenen domain: ' . $domain . '<br>';
        echo 'Sunucu Yanıtı: ' . $response;
    }

    public function addBlacklist($domain) {
        $url = $this->baseUrl . '/config/ruledb/who/2/domain'; // Blacklist için path

        $data = array(
            'domain' => $domain,
        );

        $response = $this->sendRequest($url, $data, true);

        echo 'Blacklist olarak eklenen domain: ' . $domain . '<br>';
        echo 'Sunucu Yanıtı: ' . $response;
    }

    public function processDomains($domains, $isWhitelist = true) {
        foreach ($domains as $domain) {
            if ($isWhitelist) {
                $this->addWhitelist($domain);
            } else {
                $this->addBlacklist($domain);
            }
        }
    }

    private function sendRequest($url, $data, $useTicket = false) {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        if ($useTicket) {
            curl_setopt($ch, CURLOPT_COOKIE, "PMGAuthCookie=" . $this->ticket);

            $headers = array(
                "CSRFPreventionToken: " . $this->token
            );
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        }

        $response = curl_exec($ch);

        if (curl_errno($ch)) {
            echo 'cURL Hatası: ' . curl_error($ch);
        }

        curl_close($ch);

        return $response;
    }
}

$apiHandler = new MxApiHandler();
$domains = array("example1.com", "example2.com", "example3.com");

// $apiHandler->processDomains($domains, true); // Array'deki tüm domainleri whitelist'e ekle

// veya

// $apiHandler->processDomains($domains, false); // Array'deki tüm domainleri blacklist'e ekle

?>

Proxmox Mail Gateway İnce Ayarlar

Tüm ayarları açıklamayacağım çünkü çok fazla ayar var. Bunların en optimize kullanımına göre ayarlamalar yaptım ve ekran görüntüleri paylaşacağım.

Configuration: Mail Proxy (Relaying)

image 15

Configuration: Mail Proxy (Ports)

image 16

Configuration: Mail Proxy (Options)

image 17

Configuration: Mail Proxy (TLS)

image 18

Configuration: Spam Detector (Options)

image 19

Configuration: Spam Detector (Quarantine)

image 20

Configuration: Spam Detector (Custom Scores)

Buradaki name kısmındaki rule adları aslında spamassasins tarafından alınmadır. Sizde custom rules girmek isterseniz bu adresten listeye ulaşabilirsiniz.

image 21

Configuration: Virus Detector (Options)

image 22

Configuration: Virus Detector (ClamAV)

image 23

Configuration: Virus Detector (Quarantine)

image 24

Domain Ekleme

Gateway’imizi kullanacak olan domainleri arayüzden Relay Domains ve Transports kısmına eklememiz gerekiyor.

image 25
image 26

Mail Server İçin Trusted Network Ekleme

Proxmox Mail Gateway üzerinden mailler gideceğinden ve bu mailler mail sunucumuz üzerinden geleceğinden ilgili sunucu ip adreslerimizi Trusted network kısmına eklememiz gerekir. Aksi durumda engellemeler yaşanabilir.

image 27

Aynı şekilde Whitelist kısmına da eklemekte yarar olacaktır.

image 28

Mail Çıkış IP Adreslerini Birden Fazla IP İle Değiştirmek

Mail Gateway üzerinde mailleriniz bildiğiniz gibi alıcılara default ip adresinizden çıkar fakat birden fazla ip adresi ekleyip maillerinizin bu ip adreslerinden random olarak çıkmasını sağlayabilir böylelikle engellemeleri minimuma indirebilirsiniz.

Bunun için aşağıdaki konfigürasyon adımlarını takip etmeniz yeterli olacaktır.

NOT: Eğer ip adreslerini bölüştürmek istiyorsanız ki mantıklı olan o, yani 100 ip adresiniz varsa bunun 50 tanesini bir tane gateway’e diğer 50 tanesini diğer gateway’e ekleyip aşağıdaki ayarları her ikisi içinde ayrı ayrı yapmalısınız.

Öncelikle Proxmox Mail Gateway arayüzünden 2. veya diğer sayıdaki ip adreslerinizi ekleyebilirsiniz.

image 29

Templates klasörümüzü oluşturup mevcut yapılandırma dosyalarımızı bu klasöre kopyalıyoruz. Buradaki yapılandırmalar her zaman ana configleri ezecektir.

mkdir -p /etc/pmg/templates
cp /var/lib/pmg/templates/main.cf.in /etc/pmg/templates
cp /var/lib/pmg/templates/master.cf.in /etc/pmg/templates

Daha sonra master.cf.in dosyamızın en altına aşağıdaki gibi ip sayımız kadar relay’ler ekliyoruz.

nano /etc/pmg/templates/master.cf.in
relay1     unix  -       -       n       -       -       smtp
  -o smtp_bind_address=my_current_ip4_address
  -o smtp_helo_name=mailgateway.myDomain.tld
  -o syslog_name=relay1
relay2     unix  -       -       n       -       -       smtp
  -o smtp_bind_address=my_new_ip4_address
  -o smtp_helo_name=mailgateway2.myDomain.tld
  -o syslog_name=relay2

Son olarak main.cf.in dosyamızın en altına bu eklediğimiz relayleri yazıyoruz.

nano /etc/pmg/templates/main.cf.in
sender_dependent_default_transport_maps = randmap:{relay1,relay2}
smtp_connection_cache_on_demand=no

Config’i sync edip restartlıyoruz.

pmgconfig sync --restart 1