Digital Ocean’da Debian işletim sistemi üzerine mail sunucu kurmak

Emre Eroğlu
8 min readDec 25, 2022

Bu yazını 2 bölümden oluşmaktadır birinci bölümün sonunda birden fazla domaini çalıştırabilen bir mail sunucu hazırlamış olacağız. İkinci bölümün sonunda ise güvenlik araçlarını ayarlayacağız.

Önemli: Bu yazı 12 Eylül 2015 tarihinde yazımıştır. İçeriği geçerliliğini korumuyor olabilir.

ÖNEMLİ: Burada anlatılanların uygulamasında bütün sorumluluk kullanıcının kendisine aittir. Her ne kadar basitçe anlatmaya çalışsamda eğer komutlarla ne yaptığınızla ilgili hiç bir fikriniz yoksa, öncelikle temel Linux bilgisi edinmenizi tavsiye ederim.

İşetim sistemi versiyonu: Debian 8.1 x64

Kırmızı yazılar sizin kendi sisteminize göre değiştirebileceğiniz alanları göstermektedir. Bu alanlar genellikle isim ve şifrelerdir.

Mavi yazılar dosyada o anda yapacağımız değişikliği göstermektedir. (Benim sistemime göre değişikliğin yapılmış halini gösterir.)

Turuncu kalın yazılar sistemin komutlara verdiği yanıtları gösterir. (Eğer yanıtlar sizde benzer değilse aldığınız hatayı gösteriyor olabilirler.) Uygulama kurulum çıktıları gibi önemli olmadığını düşündüğüm çıktıları buraya koymayacağım.

Mail Sunucu için kullanılacak araçlar

  1. Postfix : Mail sunucumuzun kendisi.
  2. Dovecot: IMAP ve POP3 protokolleri ile serverımızdaki maillere dışarıdan erişebilmemize olanak sağlayan uygulama.
  3. MySQL: Domain ve User bilgilerimizi tutacağımız veritabanı sistemi.
  4. TLS: Bağlantı şifreleme sistemi.
  5. SpamAssassin: Spam mailleri engellememize yarayacak uygulamalardan birtanesi.
  6. Amavisd-new: İçerik kontrol uygulaması.
  7. Cyrus SASL: Giriş kontrol uygulaması.
  8. PostGrey: Başka bir spam engelleme uygulaması.

Komut ve Değişikliklerin Gösterimi

Türkçe değişken isimleri sizin kendi isteğinize göre değiştirebileceğiniz alanları göstermektedir. (Kullanıcı adı, parola, domain adı vs.)

command kullaniciAdi

Dosyada değişiklikleri aşağıdaki gibi olacaktır. Dosyalarda değişiklik yaptığım yerler dışında heryer aynı kalacağı için aradaki satırları ‘…’ üç nokta ile göstereceğim.

Setting off
...
AnotherSetting on

DNS Ayarları

Temel bir şekilde göstermek istersek DNS ayarlarının aşağıdaki gibi olması gerekiyor.

Droplet Ayarları

Dropletimize ilk bağlandığımızda bir şifre değiştirme işlemi yaptırmakta bunu tamamladıktan sonra kendimize yeni bir kullanıcı oluşturuyoruz. (root kullanıcısı sistem yöneticisi olduğu için sürekli kullanılması pek tavsiye edilmez. Farkında olmadan sisteminize zarar verebilirsiniz.)

Domain Name ve FQDN Ayarları

Bu dosya serverınızın domain adını içermeli.

nano /etc/hostname

Bu komutu çalıştırdığınıda dosyadaki domain adını yanıt olarak almanız gerekiyor.

hostname
posta

Bu dosya bilgisayarınızın FQDN’ini içermeli.

nano /etc/hosts

Dosyayı aşağıdaki gibi düzenleyebilirsiniz.

...
127.0.1.1 posta.sizinadresiniz.com posta
127.0.0.1 localhost.localdomain localhost
...

Bu komutu gönderdiğimizde yanıt olarak FQDN’i alacağız.

hostname -f
posta.sizinadresiniz.com

Kullanıcı Ekleme:

Aşağıdaki komut ile yeni kullanıcı oluşturuyoruz.

useradd deneme

Bölge Ayarları:

Bu işlemi yaparken aşağıdaki gibi bir uyarı ile karşılaşırsanız sisteminizin bölge ayarlarını yapmanız sizi bundan kurtaracaktır.

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_PAPER = "tr_TR.UTF-8",
LC_ADDRESS = "tr_TR.UTF-8",
....

Aşağıdaki komutu verdikten sonra açılan menüden ssh’a bağlanmak için kullandığınız bilgisayardaki yerel dili seçeneklere ekleyerek devam ediniz. (Türkçe için tr_TR.UTF-8)

Bir sonraki pencerede sistemde kullanılacak yerel dili soracak bunu en_US olarak seçmenizi tavsiye ederim. Her ne kadar güncellemeler çok iyi gelsede, eksik olduğu zaman Türkçe — İngilizce karışımı pek kullanışlı olmuyor.

dpkg-reconfigure locales

Sistem Güncellemesi:

Oluşturduğumuz kullanıcının gerektiğinde yönetici işlemlerini de yerine getirebilmesi için yetkilendirmemiz gerekiyor.

Debian 8 işletim sistemi, normal kullanıcıya yetkili ayrıcalıklarını veren sudo komutunun uygulaması kurulu olmadan geliyor.

Öncelikle sistemimizi güncelleyip sudo uygulamasını kuruyoruz.

apt-get update
apt-get upgrade
apt-get install sudo

Yönetici Yetkileri:

Kullanıcımıza yönetici yetkilerini vermek için yetkili sistemimizdeki ön tanımlı kullanıcılar kullanıcı grubuna eklememiz gerekiyor.

usermod -a -G sudo deneme

Öntanımlı olarak gelen ve şimdiye kadarki işlemleri gerçekleştirdiğimiz root userının ssh bağlantısını engelliyoruz artık.

Eğer PermitRootLogin ayarının bulunduğu satırın başında ‘#’ (Yorum satırı) işareti varsa onu silip ayarı değiştirmeniz gerekiyor.

(nano dosya düzenleme uygulaması sistemde ön yüklü olarak geldiği için düzenlemeleri bununla yapıyor olacağız.)

nano /etc/ssh/sshd_config
PermitRootLogin no

(nano’dan çıkmak için “ctrl + x” tuş kombinasyonunu kullanıyoruz. Ekrana gelen soruya: Değişiklikleri kayıt etmek istiyorsak ‘y’ (Yes, evet) harfi ile, istemiyorsak ’n’ (No, hayır) harfi ile çıkmaktan vazgeçersek ‘c’ (Cancel, iptal) harfi ile yanıt veriyoruz.)

Yaptığımız değişikliklerin geçerli olması için sisteme SSH ayarlarını yeniden okutuyoruz.

systemctl restart ssh

ÖNEMLİ: Şimdiye kadarki işlemleri gerçekleştirdiğiniz komut satırını kapatmadan önce mutlaka oluşturduğunuz kullanıcı ile birkez sisteme bağlanınız. Bu herhangi bir sorun çıktığında ayarları geri almanıza, gerekirse yeni kullanıcı oluşturmanıza imkan verecektir. Aksi taktirde sisteminizi tekrar açamayabilirsiniz.

Eğer yeni kullanıcınız ile sisteme sorunsuz bir şekilde bağlanabildiyseniz sisteminizin bir yedeğiniz alabilirsiniz. Elimizde temel ayarları yapılmış bir işletim sistemimiz var. Her hangi bir sorun yaşarsak buraya geri dönüp buradan devam edebiliriz.

Bölüm 1 — Mail Sunucu Araçlarının Kurulumu

MySQL Kurulumu

Kurulum sırasında yetkili kullanıcı için şifre girmenizi isteyecek, güvenlikli ama unutmayacağınız bir şifre girmeye çalışın.

sudo apt-get install mysql-server

MySQL veritabanını aktifleştiriyoruz.

sudo mysql_install_db

Server da ihtiyacımız olmayan ayarları temizliyoruz.

İşlem sırasında MySQL root kullanıcısının şifresini değiştirmek isteyip istemediğinizi soracak. Az önce kurulumda girdiğiniz şifreyi değiştirmek istemiyorsanız ’n’ giriniz.

Geriye kalan bütün ayarlar için ‘y’ girerek devam edebilirsiniz.

sudo /usr/bin/mysql_secure_installation

Veritabanı Oluşturmak

Bu işlem sırasında MySQL’i kurarken girdiğimiz şifreyi giriyoruz.

mysqladmin -u root -p create veritabaniadi

MySQL kabuğuna giriş yapıyoruz.

mysql -u root -p

MySQL için oluşturduğumuz veritabanında yetkili bir kullanıcı oluşturuyoruz. Posta sunucusu ile yapacağımız işlemler için bu kullanıcıyı kullanıyor olacağız.

GRANT SELECT ON veritabaniadi.* TO 'mysqlkullaniciadi'@'127.0.0.1' IDENTIFIED BY 'karmasikbirparola';

Oluşturduğumuz kullanıcının yetkilerinin geçerli hale gelmesini sağlıyoruz.

FLUSH PRIVILEGES;

Gerekli tabloları oluşturabilmek için kullanacağımız veritabanını seçiyoruz.

USE veritabaniadi;

Tabloları oluşturuyoruz. Bu tablolarda alan adlarını(domains), kullanıcı bilgilerini(users) ve yönlendirme bilgilerimizi(aliases) saklayacağız.

CREATE TABLE `virtual_domains` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `virtual_users` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`password` VARCHAR(106) NOT NULL,
`email` VARCHAR(120) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `virtual_aliases` (
`id` INT NOT NULL AUTO_INCREMENT,
`domain_id` INT NOT NULL,
`source` varchar(100) NOT NULL,
`destination` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Veritabanımıza ilk bilgilerimizi giriyoruz.

INSERT INTO `veritabaniadi`.`virtual_domains`
(`id` ,`name`)
VALUES
('1', 'sizinadresiniz.com'),
('2', 'posta.sizinadresiniz.com');

INSERT INTO `veritabaniadi`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('1', '1', ENCRYPT('kullanici1sifresi', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'kullanici1@sizinadresiniz.com'),
('2', '1', ENCRYPT('kullanici2sifresi', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'kullanici2@sizinadresiniz.com');

INSERT INTO `veritabaniadi`.`virtual_aliases`
(`id`, `domain_id`, `source`, `destination`)
VALUES
('1', '1', 'admin@sizinadresiniz.com', 'kullanici1@sizinadresiniz.com');

MySQL den çıkıyoruz.

exit;

Postfix Kurulumu

Postfix kurulumu sırasında bazı bilgiler isteyecek bu bilgileri geçebilirsiniz kurulumdan sonra tüm ayarları baştan yapacağız.

sudo apt-get install postfix postfix-mysql

Postfix Ayarları

Bu komutu çalıştırdığımızda bizden bazı seçenekleri seçmemizi ve alanları doldurmamızı isteyecek. Aşağıdaki bilgilere göre doldurabilirsiniz.

sudo dpkg-reconfigure postfix
  1. Mail Sunucu’nun kullanım alanı.
    General type of mail configuration: Internet Site
  2. Domain adınız.
    System mail name: sizinadresiniz.com
  3. Bu alana sisteminizin yöneticisinin adresini girmeniz gerekiyor. root ve postmaster kullanıcılarına gelen mailler bu adrese yönlendirilecekler.
    Root and postmaster mail recipient: postmaster
  4. Mail gönderilebilecek diğer adresler.
    Other destinations to accept mail for (blank for none): sizinadresiniz.com, localhost.localdomain, localhost
  5. Eşzamanlı güncellemelere izin verilsin mi?
    Force synchronous updates on mail queue? No
  6. Yerel ağlar.
    Local networks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
  7. procmail uygulamasını yerel mail servisi olarak kullanmak.
    Use procmail for local delivery? No
  8. Postakutusu boyutu. (0 sınırsız demek.)
    Mailbox size limit (bytes): 0
  9. Yerel adres uzantısı karakteri.
    Local address extension character: +
  10. Kullanılacak internet protokolü.
    Internet protocols to use: all

Temel ayarlarımızı tamamladık. Şimdi dosya düzenlemelerimizi yapıyoruz.

sudo nano /etc/postfix/main.cf
smtpd_tls_auth_only = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
...
myhostname = posta.sizinadresiniz.com
...
#mydestination = sizinadresiniz.com, localhost.localdomain, localhost
...
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
sudo nano  /etc/postfix/master.cf

Bu dosyada yorum satırlarını kaldırıyoruz. (‘#’ işareti)

...
submission inet n - - - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
...
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
smtps inet n - - - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
...
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
...

Bilgilerin veri tabanından sorgulanabilmesi için gerekli dosyaları oluşturuyoruz.

sudo nano /etc/postfix/mysql-virtual-mailbox-domains.cf
user = mysqlkullaniciadi
password = karmasikbirparola
hosts = 127.0.0.1
dbname = veritabaniadi
query = SELECT name FROM virtual_domains WHERE name='%s'
sudo nano /etc/postfix/mysql-virtual-mailbox-maps.cf
user = mysqlkullaniciadi
password = karmasikbirparola
hosts = 127.0.0.1
dbname = veritabaniadi
query = SELECT email FROM virtual_users WHERE email='%s'
sudo nano /etc/postfix/mysql-virtual-alias-maps.cf
user = mysqlkullaniciadi
password = karmasikbirparola
hosts = 127.0.0.1
dbname = veritabaniadi
query = SELECT destination FROM virtual_aliases WHERE source='%s'

Dovecot Kurulumu

Aşağıdaki komutla gerekli paketleri kuruyoruz.

sudo apt-get install dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql

İlgili Dizinlerin ve Grubun oluşturulması

Alan adımıza göre maillerimizin saklanacağı dizini oluşturuyoruz.

sudo mkdir -p /var/mail/vhosts/sizinadresiniz.com

Mail sistemi için kullanacağımız grubu ve kullanıcısını oluşturup ilgili dizinlerin sahipliğini atıyoruz.

sudo groupadd -g 5000 vmail 
sudo useradd -g vmail -u 5000 vmail -d /var/mail
sudo chown -R vmail:vmail /var/mail
sudo chown -R vmail:dovecot /etc/dovecot
sudo chmod -R o-rwx /etc/dovecot

Dovecot Ayarları

Aşağıdaki dosyalarda gerekli düzenlemeleri yapıyoruz.

sudo nano /etc/dovecot/dovecot.conf
...
# Enable installed protocols
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap lmtp
...
sudo nano /etc/dovecot/conf.d/10-mail.conf
...
#mail_location = mbox:~/mail:INBOX=/var/mail/%u
mail_location = maildir:/var/mail/vhosts/%d/%n
...
mail_privileged_group = mail
...
sudo nano /etc/dovecot/conf.d/10-auth.conf
...
disable_plaintext_auth = yes
...
auth_mechanisms = plain login
...
#!include auth-system.conf.ext
!include auth-sql.conf.ext
...
sudo nano /etc/dovecot/conf.d/auth-sql.conf.ext
...
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}
...
sudo nano /etc/dovecot/dovecot-sql.conf.ext
...
# Database driver: mysql, pgsql, sqlite
driver = mysql
...
connect = host=127.0.0.1 dbname=veritabaniadi user=mysqlkullaniciadi password=karmasikbirparola
...
default_pass_scheme = SHA512-CRYPT
...
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
user_query = SELECT email FROM virtual_users WHERE email='%s';
...
sudo nano /etc/dovecot/conf.d/10-master.conf
...
service imap-login {
inet_listener imap {
port = 0
}
inet_listener imaps {
#port = 993
#ssl = yes
}
...
}
...
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
...
service auth {
...
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
#group =
}
user = dovecot
# Auth process is run as this user.
#user = $default_internal_user
}
service auth-worker {
...
user = vmail
}
..
sudo nano /etc/dovecot/conf.d/10-ssl.conf
...
# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
ssl = required
...
ssl_cert = </etc/ssl/certs/ssl-cert-snakeoil.pem
ssl_key = </etc/ssl/private/ssl-cert-snakeoil.key
...

Mail sunucunun genel ayarları bu kadar. Thunderbird ya da Evolution ile servera bağlanabiliyor olmanız gerekir.

Thunderbird için benim kullandığım ayarlar ekran görüntüsündeki gibi.

Birden Fazla Domaini Mail Sunucuya Yönlendirmek

DNS Ayarları

Yukarıda verdiğimiz mail sunucumuzun DNS ayarları:

Eklenen domainin DNS ayarları:

Veritabanı Ayarları

Mysql’e bağlanıp domainlerimize yeni domainimizi ekliyoruz.

mysql -u root -p
use veritabaniadi;
INSERT INTO `veritabaniadi`.`virtual_domains`
(`id` ,`name`)
VALUES
('3', 'sizinadresiniz.net'),
('4', 'posta.sizinadresiniz.net');

Yeni domain için kullanmak istediğimiz posta adresimizi ilgili tabloya ekliyoruz.

INSERT INTO `veritabaniadi`.`virtual_users`
(`id`, `domain_id`, `password` , `email`)
VALUES
('3', '3', ENCRYPT('başkabirgüvenlikliparola', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'baskabirmailadresi@sizinadresiniznet');

Burada dikkat etmemiz gereken nokta eklediğimiz posta adresimizi doğru domain id’si ile eklemek.

Eklediğiniz posta adresine yukarıda verdiğim ayarlar ile bağlanabiliyor olmanız gerekir.

Mail Sunucu kurulumunun birinci bölümünün sonuna geldik.

Sorularınız ve hata — eksik bildirimi için iletişim bölümündeki posta adresimi kullanabilirsiniz.

Teşekkürler.

--

--