İçerik
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:
- 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.
- E-posta Güvenliği: E-posta şifreleme ve kimlik doğrulama özellikleri sunar, böylece hassas bilgilerin güvende olmasını sağlar.
- 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.
- 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.
- 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.
Burada yükleyeceğiniz disk partition’ı seçip next ile devam ediyoruz.
Klavye, ülke ve saat ayarlamalarını yapıp Next butonuna basıyoruz.
Şifre ve mail adresinizi yazdıktan sonra tekrar next ile ilerliyoruz.
DNS, Hostname, Sunucu IP adresi ayarlarını yaptıktan sonra Next butonu ile ilerliyoruz.
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.
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.
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.
Daha sonra Add butonuna basarak diğer cluster’ı buraya join edebilmemiz için gereken bilgileri alıyoruz.
Diğer kurduğumuz Mail gateway’imize gidip Join butonuna basarak aldığımız bilgiler ile beraber cluster’a dahil ediyoruz.
İki makinemizin de birbirine bağlandığını sayfayı yenilediğimizde görebiliyoruz.
Backup Server (Optional)
Mevcutta Proxmox Backup Server kullandığımdan Promox mail gateway’i bu sisteme aşağıdaki adımları takip ederek ekliyorum.
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)
Configuration: Mail Proxy (Ports)
Configuration: Mail Proxy (Options)
Configuration: Mail Proxy (TLS)
Configuration: Spam Detector (Options)
Configuration: Spam Detector (Quarantine)
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.
Configuration: Virus Detector (Options)
Configuration: Virus Detector (ClamAV)
Configuration: Virus Detector (Quarantine)
Domain Ekleme
Gateway’imizi kullanacak olan domainleri arayüzden Relay Domains ve Transports kısmına eklememiz gerekiyor.
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.
Aynı şekilde Whitelist kısmına da eklemekte yarar olacaktır.
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.
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