Yazi biraz uzun, dolayisiyla gezegeni web’den takip edenlerden ozur diliyorum.
Bir gorsel kimi zaman bin kelimeden daha etkili olabildigi icin bir gorselle anlatima baslamak sistemin nasil calistigini aktarabilmek icin faydali olacaktir diye dusunuyorum. Gorsel icin .dia dosyasini yazinin sonundaki adresten indirebilir, indirdiginiz dosyayi istediginiz gibi duzenleyebilir ve dagitabilirsiniz. Kaynak gosterseniz hos olur ama zorunda degilsiniz.
Bu gorselde bulunan sayilara karsilik gelen istek ve yanitlar ise su sekilde;
Gelen Posta
1) Gonderici, posta gondermek istedigi adres icin MX kayitlarini ister
2) DNS sunucu MX kayitlarini gondericiye iletir
3) Gonderici MX kaydinin gosterdigi sunucuya posta gondermek istedigini soyler
4) Postayi alan sunucudaki MTA(postfix), MySQL’e alicinin tanimli olup olmadigini sorar
5) MySQL ustteki sorguya evet ya da hayir cevabini verir.
6) Evet cevabini alan Postfix, Dovecot’a postayi kendisi icin saklamasini soyler
7) Dovecot(MDA) gelen postayi kullaniciya ait dizine depolar
Posta Kontrolu
8) Alici Dovecot’a postalarini kontrol etmek istedigini soyler
9) Dovecot aliciya iletisim icin bu sertifikayi kullan diyerek cevap verir
10) Alici, gelen sertifika ile hesap bilgilerini sifreler ve tekrar yollar
11) Dovecot MySQL’e hesap bilgilerinin dogru olup olmadigini sorar
12) MySQL bu sorguyu yanitlar.
13) Dovecot depolama yaptigi dizinden kullanici icin tuttugu postalari ister
14) Bilgi Dovecot’a gonderilir
15) Gondermesi gereken her seye sahip olan Dovecot kullaniciya postalarini iletir
Giden Posta
16) Alici, Postfix’e posta gondermek istedigini soyler
17) Postfix sertifikasini gonderir ve kimlik dogrulamasi yapmasini ister alicidan
18) Alici gelen sertifika ile kimlik bilgilerini sifreler ve geri yollar
19) Postfix, Dovecot’tan gelen bilgileri kendisi icin kontrol etmesini ister
20) Dovecot, MySQL’e kullanici bilgilerinin dogru olup olmadigini sorar
21) MySQL, Dovecot’a yanit verir
22) Dovecot, Postfix’e kimlik dogrulamasinin sonucunu bildirir
23) Postfix kullaniciya kimliginin dogru oldugunu postayi gonderebilecegini soyler
24) Alici, postayi Postfix’e iletir.
25) Postfix, karsi tarafin MTA’sina postayi iletir (karsi tarafin MX kaydina sahip oldugu varsayilmistir)
Artik sistemin nasil calistigini anladigimiza gore neye ihtiyacimiz oldugunu listelemeye gecebiliriz. Oncelikle posta gondermek isteyen birinin bizi bulabilmesi icin MX kayitlarimiza erisebilmesi gerekiyor. Dolayisiyla bu kayitlari yapilandiracagiz. Ardindan Postfix, Dovecot ve MySQL kurulumunu yapacagiz. MySQL bizim icin alan adlarini, kullanicilarin kimlik bilgilerini ve takma adlarini saklayacak. Dovecot, IMAP ve POP3 sunucu olarak calismasinin yani sira SASL(Simple Authentication and Security Layer) implementasyonu sayesinde Postfix icin kimlik dogrulamasi yapacak. Postfix ise gelen ve giden postalari ilgili yerlere iletme gorevini ustlenecek. Postfix ve Dovecot ile iletisimin duz metin olarak yapilmamasi icin SSL sertifikalari kullanacagiz. Anlatimi Ubuntu 12.04 LTS uzerinde yaptigimi da hatirlatayim.
Host adinin ayarlanmasi
Ben bu rehberde Venus’un bir ayi olarak dusunulen fakat daha sonradan olmadigi anlasilan neith adini kullanacagim. Posta alip gonderecegimiz adres ise .tk’den ucretsiz olarak kayit ettigim konusmalar.tk adresi olacak. Islemleri root olarak gerceklestiriyorum. Ardindan sudo kullanabilen bir kullanici olusturup SSH uzerinden root girisini kapatacagim fakat o baska bir anlatimin konusu.
nano /etc/hosts<br></br>
127.0.0.1 localhost konusmalar.tk<br></br>
198.199.112.50 konusmalar.tk neith<br></br>
echo neith > /etc/hostname<br></br>
hostname -F /etc/hostname```
Bu asamada hostname ve hostname -f ciktilari sirayla su sekilde donmeli.
hostname
neith
hostname -f
konusmalar.tk```
DNS kayitlarinin eklenmesi
MX kayitlari iki alandan olusuyor. Priority (oncelik) ve host adi. Ben VPS saglayicinin DNS hizmetini kullandigimdan kontrol paneline gidip oncelige 10, host adina da konusmalar.tk diyecegim bir kayit yaratacagim. Bu anlatimda tek bir posta sunucu yapilandiracagimizdan onceligin ne ise yaradiginin aslinda bir onemi yok ama kisaca aciklamak gerekirse birden fazla posta sunucu kurdugumuzda hangisinin tercih edilmesi gerektigini soylemek icin kullaniyoruz. Ornegin 10 konusmalar.tk ve 20 alt.konusmalar.tk MX kayitlarimiz var. alt ve @ farkli IP adresleri donduren A kayitlarina sahipler. Bize e-posta gondermek isteyen biri MX sorgusu yapiyor ve bu iki kaydi da aliyor. Ilk olarak onceligi yuksek olan (sayi degeri dusuk olan, bu durumda 10) sunucu ile iletisime gecmek istiyor. Eger bu sunucudan bir nedenden oturu cevap alamazsa ikinci siradaki sunucu ile iletisime gecmeye calisiyor. Basitce oncelik alaninin yaptigi is bu. Fakat dedigim gibi tek bir sunucu yapilandiracagimizdan 100 de verilse 1 de verilse bir onemi olmayacaktir. DNS konusundaki ikinci ve son onemli nokta ise MX kaydini tutan hostun bir A kaydina sahip olmasi gerektigi. Bu ornekte ben sunucunun FQDN’i icin (hostname -f ciktisi) konusmalar.tk kullandim karisikliga neden olmamak icin fakat posta.konusmalar.tk ya da oncelik ayarinda anlattigim gibi alt.konusmalar.tk gibi bir FQDN de kullanabilirdim. Eger boyle bir isim kullansaydim konusmalar.tk DNS alaninin (zone) alt ya da posta isimleri icin bir A kaydina (bu adresin IP’si nedir kaydi A kaydi oluyor) cevap vermesi gerekecekti. Eger sunucu adinizi bu sekilde yapilandirdiysaniz ve posta alamiyorsaniz DNS kaydinizi kontrol etmenizde yarar var.
Gerekli paketlerin kurulmasi
sudo apt-get install mysql-server postfix-mysql dovecot-mysql dovecot-lmptd dovecot-imapd dovecot-pop3d
Bu paketler zaten gerekli olan birkac diger paketi de kuracagindan kurulmasi gereken tum paketleri apt-get’e vermemize gerek yok. POP3 destegi vermek istemiyorsak dovecot-pop3d paketini kurmamiza gerek yok. Ayni sey IMAP icin de gecerli. Geri kalanlar anlatimin takip edilmesi icin mutlaka kurulmasi gereken paketleri iceriyor. Belki dovecot-lmptd biraz yabanci gelebilir. LMTP local mail transfer protocol anlamina geliyor. Kavrami aciklamadan once mail queue ne ise yarar ona bakalim. Diyelim postfix’e su iki posta adresine bizim icin bu postayi ilet dedik. Postfix ilk posta adresine gonderimizi iletti fakat ikincisine ilk denemesinde ulasamadi. Iste bu durumda postfix bizim icin daha sonra denemek uzere gonderimizi kuyruga aliyor ve bir sure sonra tekrar iletmeye calisiyor. Yerelde ise bu isi yapmak cekirdek citlemek icin cekic kullanmaya benziyor. Bu yuzden posta iletilebiliyorsa ileten, iletemiyorsa reddeden bir protokol gereksinimi ortaya cikiyor ve adina da LMTP deniyor. Postfix, Dovecot ile LMTP sayesinde iletisim kuruyor.
Kurulum asamasinda MySQL icin root sifresi istenecek. Sonrasinda gelen postfix yapilandirma ekraninda Internet Site secimi yapip, System mail name sordugu yere konusmalar.tk adresini girecegim. Eger alt.konusmalar.tk ya da posta.konusmalar.tk olarak yapilandirsaydim DNS kayitlarimi buraya o degerlerden biri gelecekti.
MySQL yapilandirmasi
Yazinin baslarinda MySQL’in bizim icin kullanici ve alan adi bilgilerini tutacagini soylemistik. Bunun icin bir veritabani ve bu veritabaninda uc adet tablo olusturacagiz. Veritabanina sanalposta, olusturacagimiz uc tabloya ise sirayla, sanalalanadlari, sanalkullanicilar ve sanal_takmaadlar isimlerini verecegim. Bu veritabanini kontrol eden kullanici sanalpostayoneticisi olacak ve sifresi anlatim kolayligi acisindan 12345 olacak. Umarim kendi sunucunuzda boyle bir sifre kullanmiyorsunuzdur.
mysql -u root -p<br></br>
>> CREATE DATABASE sanalposta;<br></br>
>> GRANT SELECT ON sanalposta.* TO 'sanalpostayoneticisi'@'127.0.0.1' IDENTIFIED BY '12345';<br></br>
>> FLUSH PRIVILEGES;```
Ilk satirda veritabanimizi olusturduk. Ardindan gelen iki satirda ise localhost’tan erisim yapacak ve 12345 sifresiyle kimlik dogrulayacak kullaniciya, sanalposta veritabaninda olusturacagimiz tum tablolarda SELECT islemi yapabilmesi icin izin verdik. Sira geldi sanal_alanadlari tablosunu olusturmaya.
CREATE TABLE
sanal_alanadlari
(
id
int(5) UNSIGNED ZEROFILL NOT NULL auto_increment,
name
varchar(64) NOT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;```
En son RFC’yi kontrol ettigimde bir alan adi nokta dahil maksimum 64 karakter olabiliyordu. Dolayisiyla name sutununu 64 karaktere sinirladik. int(5) ise sadece gorsellik acisindan onemli oldugundan uzerinde durmaya pek gerek yok. sanal_kullanicilar tablomuzu ise su sekilde olusturuyoruz.
>> CREATE TABLE `sanal_kullanicilar` (<br></br>
`id` int(5) UNSIGNED ZEROFILL NOT NULL auto_increment,<br></br>
`domain_id` int(5) UNSIGNED ZEROFILL NOT NULL,<br></br>
`password` varchar(106) NOT NULL,<br></br>
`email` varchar(100) NOT NULL,<br></br>
PRIMARY KEY (`id`),<br></br>
UNIQUE KEY `email` (`email`),<br></br>
FOREIGN KEY (domain_id) REFERENCES sanal_alanadlari(id) ON DELETE CASCADE<br></br>
) ENGINE=InnoDB DEFAULT CHARSET=utf8;```
Kullanici tablomuzda bir kullanici id’si, bu tabloyu alan adlari tablosuna baglayan domain_id, kullanici sifresi ve e-posta sutunlarini olusturduk. @alanadi.com su asamada maksimum 65 karakter tutabileceginden kullanici adina 35 karakter yer kaliyor. Eger daha uzun kullanici adlari tanimlayacaksaniz email kismindaki varchar degerini degistirebilirsiniz. Son olarak sanal_takmaadlar tablomuzu olusturalim.
CREATE TABLE
sanal_takmaadlar
(
id
int(5) UNSIGNED ZEROFILL NOT NULL autoincrement,
domain_id
int(5) UNSIGNED ZEROFILL NOT NULL,
source
varchar(100) NOT NULL,
destination
varchar(100) NOT NULL,
PRIMARY KEY (id
),
FOREIGN KEY (domainid) REFERENCES sanal_alanadlari(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;```
Bir onceki asamada email alani icin varchar degerini degistirdiyseniz buradaki source ve destination alanlarinda da ayni degisikligi yapmak isteyeceksiniz. Gelelim olusturdugumuz bu tablolara veri eklemeye.
>> INSERT INTO `sanalposta`.`sanal_alanadlari`<br></br>
(`id` ,`name`)<br></br>
VALUES<br></br>
('1', 'konusmalar.tk');```
>> INSERT INTO `sanalposta`.`sanal_kullanicilar`
(`id`, `domain_id`, `password` , `email`)
VALUES
(‘1′, ‘1’, ENCRYPT(‘sifre1′, CONCAT(‘$6$’, SUBSTRING(SHA(RAND()), -16))), ‘kullanici1@konusmalar.tk’),
(‘2′, ‘1’, ENCRYPT(‘sifre2′, CONCAT(‘$6$’, SUBSTRING(SHA(RAND()), -16))), ‘kullanici2@konusmalar.tk’);
Yukaridaki istekte rand() ile 0-1 arasinda bir rastgele sayi urettik. Ardindan sha() ile bunu hashledik ve substring(hash, -16) ile bu hash degerinin son 16 hanesini aldik. concat(‘$6$’, hash’in son 16 hanesi) ile elimizdeki degerin basina $6$ ekledik ki bu da crypt icin SHA512 anlamina gelir. Ardindan ENCRYPT ile sifremizi ve az once olusturdugumuz tuzumuzu birlestirip sifre alanimiza bu degeri verdik. /etc/shadow dosyanizdaki root girdisine bakarsaniz benzer bir yapi goreceksiniz.
INSERT INTO
sanalposta
.sanal_takmaadlar
(id
,domain_id
,source
,destination
)
VALUES
('1', '1', 'root@konusmalar.tk', 'kullanici1@konusmalar.tk');```
root posta hesabi icin de bir yonlendirme belirlemis olduk boylece takmaadlar tablomuzda. Simdi bu degerleri kontrol edebiliriz.
>> USE sanalposta;<br></br>
>> SHOW TABLES;```
+——————–+
| Tables_in_anlatim |
+——————–+
| sanal_alanadlari |
| sanal_kullanicilar |
| sanal_takmaadlar |
+——————–+
3 rows in set (0.00 sec)
>> SELECT * FROM sanal_alanadlari;
+——-+—————+
| id | name |
+——-+—————+
| 00001 | konusmalar.tk |
+——-+—————+
1 row in set (0.00 sec)
>> SELECT * FROM sanal_kullanicilar;
+——-+———–+———————————————————–+
| id | domain_id | password | email |
+——-+———–+——————-+—————————————+
| 00001 | 00001 | $6$bf198693267470de$YukkyGzAs/ | kullanici1@konusmalar.tk |
| 00002 | 00001 | $6$da2ea5ba6e70ac34$pRLBLvIRtJ | kullanici2@konusmalar.tk |
+——-+———–+———————————————————–+
2 rows in set (0.00 sec)
password alani burada gosterdigimden cok daha uzun olacak, duzgun gozukmesi icin bir kismini kestim. $ isaretlerine dikkat ederseniz concat ve encrypt islemlerinin sonucunu gorebilirsiniz.
`>> SELECT * FROM sanal_takmaadlar;`
+——-+———–+——————–+————————–+
| id | domain_id | source | destination |
+——-+———–+——————–+————————–+
| 00001 | 00001 | root@konusmalar.tk | kullanici1@konusmalar.tk |
+——-+———–+——————–+————————–+
1 row in set (0.00 sec)
Yukaridakilere benzer ciktilar goruyorsaniz her sey yolunda demektir.
**Postfix Yapilandirmasi**
/etc/postfix/main.cf dosyasinin yorumlardan arindirilmis nihai hali su sekilde olacak. Bu ayarlari dosyayi gosterdikten sonra aciklayacagim.
smtpdbanner = $myhostname ESMTP $mailname (Ubuntu)
biff = no
appenddotmydomain = no
readmedirectory = no
smtpdtlscertfile=/etc/ssl/certs/dovecot.pem
smtpdtlskeyfile=/etc/ssl/private/dovecot.pem
smtpdtlssecuritylevel=may
smtpdtlsauthonly=yes
smtpdsasltype = dovecot
smtpdsaslpath = private/auth
smtpdsaslauthenable = yes
smtpdrecipientrestrictions = permitsaslauthenticated, permitmynetworks, rejectunauthdestination
myhostname = konusmalar.tk
aliasmaps = hash:/etc/aliases
aliasdatabase = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 198.199.112.50
mailboxsizelimit = 0
recipientdelimiter = +
inetinterfaces = all
virtualtransport = lmtp:unix:private/dovecot-lmtp
virtualmailboxdomains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtualmailboxmaps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtualaliasmaps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf```
Postfix, bence, belgelendirmesi en iyi olan ozgur yazilim projelerinden biri. main.cf altindaki her ayarin aciklamasini da http://www.postfix.org/postconf.5.html adresinden bulabilirsiniz. Ustte paylastigim 25-30 tanesinin kisa aciklamalari soyle.
smtpdbanner = $myhostname ESMTP $mailname (Ubuntu)
Herhangi bir bilgisayardan asagidaki komutu verirseniz
telnet konusmalar.tk 587
size suna benzer bir cikti donecektir.
Trying 198.199.112.50...<br></br>
Connected to konusmalar.tk.<br></br>
Escape character is '^]'.<br></br>
220 konusmalar.tk ESMTP Postfix (Ubuntu)```
iste buradaki 220 konusmalar.tk ESMTP Postfix (Ubuntu) satirini smtpd_banner ayari ile kontrol ediyoruz. smtpd_banner’in $myhostname ile baslamasi zorunlu, fakat bunun disinda istediginiz degisikligi yapabilirsiniz. Yani soyle bir goruntu elde etmek mumkun. Fakat bu kisimda belki Ubuntu’yu silmek disinda bir degisiklik yapmanizi pek onermem. Zannetmiyorum ama bu bilgileri e-posta gondermek icin kullanmaya calisan enteresan(!) uygulamalar olabilir.
Trying 198.199.112.50...
Connected to konusmalar.tk.
Escape character is '^]'.
220 konusmalar.tk Linux cok guzel, gelsenize!```
Eger 1980’de yasamiyorsaniz biff ayarini no yapmanizda bir sakinca yok. Kullanicilar posta kontrol etmek icin lokal hesaplariyla sisteme giris yapmayacaklarindan -hatta bir lokal hesaplari olmayacagindan- biff kullanmak istemiyoruz.
appenddotmydomain ayari lokal posta icin gitmesi gereken adresin sonuna alanadinin koyulup koyulmayacagini soyluyor. yani root a gitsin bu posta dediginizde sonuna @konusmalar.tk koymak isteyip istemediginiz soyluyorsunuz. Hayir diye devam ediyorum.
readme_directory derleme, calistirma islemlerini anlatan dosyalarin nerede tutulacagini soyluyor ki hic ihtiyacimiz yok.
smtpdtlscertfile=/etc/ssl/certs/dovecot.pem
smtpdtlskeyfile=/etc/ssl/private/dovecot.pem
smtpdtlssecuritylevel=may
smtpdtlsauthonly=yes
Onemli kisimlardan bir tanesi burasi. Iletisimin duz metin olarak yapilmamasi icin sertifika kullanacagimizi soylemistik. Postfix icin sertifika ayarini burada yapiyoruz. Dovecot kurulurken bizim icin sertifika olusturuyor. Dolayisiyla eger bir CA tarafindan imzalanmis sertifika kullanmiyorsak Dovecot’in bizim icin urettiklerini kullanabiliriz. smtpdtlscertfile ve smtpdtlskeyfile sertifikanin ve ozel anahtarin nerede tutuldugunu belirtiyor. smtpdtlssecuritylevel ile iletisimin mumkunse sertifika ile sifrelenmesini istiyoruz. Burada encrypt ile zorunlu tutabilirdik fakat SquirrelMail kurulumu yaptigimizda encrypt biraz basimizi agritabilir. Eger securitylevel icin may dersek smtpdtlsauth_only ile giris yapilmasi icin sertifika kullanilmasini zorunlu hale getirebiliriz ki istedigimiz de zaten buydu.
Bir sonraki onemli kisim SASL ayarlarini yaptigimiz kisim. Yazinin basinda Postfix’in kimlik dogrulamasi yaparken Dovecot’a benim icin su kullaniciyi dogrular misin diyecegini ve bu islemi SASL ile yapacagini soylemistik.
smtpdsaslauthenable = yes
smtpdsasltype = dovecot
smtpdsasl_path = private/auth
authenable ile Postfix’e SASL kullanacagimizi soyledik. SASL icin konusacagi daemon’i da smtpdsasl_type’a dovecot degerini vererek gosterdik. Dovecot ile konusurken kullanacagi soketin yerini path degiskeniyle verdik. Buraya Dovecot’i yapilandirirken bir daha deginecegiz.
smtpdrecipientrestrictions = permitsaslauthenticated, permitmynetworks, rejectunauth_destination
Yukaridaki ayar hangi kullanicilarin posta gonderebilecegini yapilandirmak icin gereken bir ayar. Icinde reject ya da defer tipinden en az bir tane deger olmasi gerekiyor. permitsaslauthenticated eger bir kullanici SASL kullarak giris yapmissa posta gondermesine izin verilecegi anlamina geliyor. permitmynetworks mynetworks’te belirtilen agdaki istemcilere posta gonderme izini verildigini soyluyor. rejectunauth_destination ile eger posta Postfix’in bildigi bir alana gelmiyor ise reddetmesi gerektigini anlatiyoruz.
myhostname = konusmalar.tk
aliasmaps = hash:/etc/aliases
aliasdatabase = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 198.199.112.50
mailboxsizelimit = 0
recipientdelimiter = +
inetinterfaces = all
Yukaridaki bolumde myhostname, mydestination ve mynetworks parametreleri ilgi alanimiza giriyor. myhostname’i MX kaydindaki gibi ayarliyoruz. mydestination’da sadece localhost’u birakiyoruz. mynetworks’e ise kendi IP adresimizi ekliyoruz.
Gelelim Postfix’in MySQL ile nasil konusacagina.
virtualtransport = lmtp:unix:private/dovecot-lmtp
virtualmailboxdomains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtualmailboxmaps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtualalias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
virtual_transport degeri bize Postfix’in postalari MDA(Dovecot) ile nasil degis tokus edecegini anlatiyor. Bunun icin daha once de bahsettigimiz gibi LMTP protokolunu kullanacagiz.
virtualmailboxdomains kisminda Postfix’in kontrol edecegi alan adlarini MySQL’den nasil alacagini anlatan dosyayi, virtualmailboxmaps’te ise eslesen alanadlari icin kullanicilari nasil bulacagini gosteren dosyayi belirtiyoruz. virtualaliasmaps ise MySQL’de son olarak ekledigimiz sanal_takmaadlar tablosundaki sorgularin nasil yapilacagini anlatiyor. Boylelikle Postfix yapilandirmasinda son asamaya girmis oluyoruz. O da az once verdigimiz dosya yollarindaki dosyalari olusturmak.
/etc/postfix/mysql-virtual-mailbox-domains.cf dosyasi
user = sanalpostayoneticisi<br></br>
password = 12345<br></br>
hosts = 127.0.0.1<br></br>
dbname = sanalposta<br></br>
query = SELECT 1 FROM sanal_alanadlari WHERE name='%s'```
/etc/postfix/mysql-virtual-mailbox-maps.cf dosyasi
user = sanalpostayoneticisi
password = 12345
hosts = 127.0.0.1
dbname = sanalposta
query = SELECT 1 FROM sanal_kullanicilar WHERE email='%s'```
/etc/postfix/mysql-virtual-alias-maps.cf dosyasi
user = sanalpostayoneticisi<br></br>
password = 12345<br></br>
hosts = 127.0.0.1<br></br>
dbname = sanalposta<br></br>
query = SELECT destination FROM sanal_takmaadlar WHERE source='%s'```
Simdi Postfix’i yeniden baslatalim ve bakalim MySQL ile konusabiliyor mu test edelim.
service postfix restart
postmap -q konusmalar.tk mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
postmap -q kullanici1@konusmalar.tk mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
postmap -q root@konusmalar.tk mysql:/etc/postfix/mysql-virtual-alias-maps.cf```
Ilk iki sorgu icin 1 ciktisini, son sorgu icin ise hangi posta hesabina yonlendirdiysek onun ciktisini gormeliyiz. Ciktilar dedigim sekildeyse bir sorun yok demektir.
Dovecot yapilandirmasi
Dovecot 2.x surumlerine kadar tek bir yapilandirma dosyasina sahipti fakat yapilandirmanin daha kolay(!) olacagi dusunulerek 2.x surumleri itibariyle bu tek yapilandirma dosyasi birden cok dosyaya dagitildi. Bana sorarsaniz birden cok dosya ile yapilandirmasi daha zor. Fakat gelecege yatirim acisindan bu halini ogrenmek amaciyla birden cok dosya ile yapilandirma yapacagiz. Islem bittiginde doveconf -n ile aslinda bunca isin tek bir dosya ile ne kadar kolay yapilabilecegini gorecegiz.
Dovecot’un bizim icin yapacagi isler sunlardi. MySQL ile konusup kullanicilarin kimliklerini kontrol edecek Postfix icin. Postfix ile LMTP uzerinden konusup kullanicilarin postalarini dosya sisteminde ilgili dizine gonderecek. IMAP ya da POP3 sunucu olarak gorev yapip SSL destegi sunacak.
Ise /etc/dovecot/dovecot.conf ile baslayacagiz. Dosya ayni squid yapilandirma dosyasi gibi inanilmaz sayida yorum iceriyor. Yorumlari kaldirdiktan sonra elimizde kalanlar ise sunlar.
!include_try /usr/share/dovecot/protocols.d/*.protocol<br></br>
protocols = imap lmtp<br></br>
dict {<br></br>
#quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext<br></br>
#expire = sqlite:/etc/dovecot/dovecot-dict-sql.conf.ext<br></br>
}<br></br>
!include conf.d/*.conf<br></br>
!include_try local.conf```
Bu dosyaya bizim ekledigimiz aslinda su satirlar.
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap pop3 lmtp
POP3 ya da IMAP istemiyorsak buradan kaldirabiliriz. Siradaki dosya /etc/dovecot/conf.d/10-mail.conf dosyasi. Yine yorumlardan sonra icerigi su sekilde.
maillocation = maildir:/var/mail/vhosts/%d/%n
mailprivileged_group = mail```
mail_location’da postalarin tutulmasini istedigimiz dizini veriyoruz. %d alanadini %n ise kullanici adini ifade ediyor. Bu dosyayla da isimiz bitti.
Simdi gerekli dizini yaratalim.
mkdir -p /var/mail/vohsts/konusmalar.tk
Simdi de Dovecot’un dosya sisteminde posta saklamak icin kullanacagi kullanici hesabini olusturalim.
groupadd -g 2000 vmail<br></br>
useradd -g vmail -u 2000 vmail -d /var/mail<br></br>
chown -R vmail:vmail /var/mail```
/etc/dovecot/conf.d/10-auth.conf dosyasina gelip kimlik kanitlama ayarlarini yapalim. Yorumlanmis satirlardan sonra kalan satirlar soyle. !include auth-system.conf.ext satirinin basina # koyalim. Sisteme giris yapmis kullanici diye bir sey olmayacagindan ayarina da gerek yok.
disableplaintextauth = yes
auth_mechanisms = plain login
!include auth-sql.conf.ex```
t
auth-sql.conf.ext dosyasi ile MySQL ile nasil konusacagini anlatacagiz.
/etc/dovecot/conf.d/auth-sql.conf.ext
passdb {<br></br>
driver = sql<br></br>
args = /etc/dovecot/dovecot-sql.conf.ext<br></br>
}<br></br>
userdb {<br></br>
driver = static<br></br>
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n<br></br>
}```
Yukaridaki dosyada belirttigimiz dovecot-sql.conf.ext dosyasinin icerigi ise soyle olacak yorumlardan sonra.
driver = mysql
connect = host=127.0.0.1 dbname=sanalposta user=sanalpostayoneticisi password=12345
defaultpassscheme = SHA512-CRYPT
passwordquery = SELECT email as user, password FROM sanalkullanicilar WHERE email='%u';```
Dizin sahipligini duzeltelim.
chown -R vmail:dovecot /etc/dovecot<br></br>
chmod 750 /etc/dovecot```
/etc/dovecot/conf.d/10-master.conf dosyasinda soket ayari su sekilde yapiliyor. SSL kullanmasini istedigim icin imap-login ve pop-login’in port degerini 0 ile degistirdim. service-lmtp ve smtp-auth icin postfix’e gosterdigim ayarlari yaptim. Dosyadaki kimi yorumlari eklemelerin nereye yapilacagini gostermek icin birakiyorum.
service imap-login {
inetlistener imap {
port = 0
}
inetlistener imaps {
port = 993
ssl = yes
}```
Number of connections to handle before starting a new process. Typically
# the only useful values are 0 (unlimited) or 1. 1 is more secure, but 0
# is faster.
#service_count = 1
Number of processes to always keep waiting for more connections.
#processminavail = 0
If you set service_count=0, you probably need to grow this.
#vsz_limit = 64M
}
service pop3-login {
inetlistener pop3 {
port = 0
}
inetlistener pop3s {
#port = 995
#ssl = yes
}
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
Create inet listener only if you can’t use the above UNIX socket
#inet_listener lmtp {
# Avoid making LMTP visible for the entire internet
#address =
#port =
#}
}
service imap {
# Most of the memory goes to mmap()ing files. You may need to increase this
# limit if you have huge mailboxes.
#vsz_limit = 256M
Max. number of IMAP processes (connections)
#process_limit = 1024
}
service pop3 {
# Max. number of POP3 processes (connections)
#process_limit = 1024
}
service auth {
# authsocketpath points to this userdb socket by default. It’s typically
# used by dovecot-lda, doveadm, possibly imap process, etc. Its default
# permissions make it readable only by root, but you may need to relax these
# permissions. Users that have access to this socket are able to get a list
# of all usernames and get results of everyone’s userdb lookups.
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = vmail
#group = vmail
}
Postfix smtp-auth
#unix_listener /var/spool/postfix/private/auth {
# mode = 0666
#}
Auth process is run as this user.
user = dovecot
}
service auth-worker {
# Auth worker process is run as root by default, so that it can access
# /etc/shadow. If this isn’t necessary, the user should be changed to
# $defaultinternaluser.
user = vmail
}
service dict {
# If dict proxy is used, mail processes should have access to its socket.
# For example: mode=0660, group=vmail and global mailaccessgroups=vmail
unix_listener dict {
#mode = 0600
#user =
#group =
}
}
Siradaki dosya /etc/dovecot/conf.d/10-ssl.conf dosyasi. Yorumlardan sonra kalan satirlar su sekilde. Ayarlar zaten kendini aciklar nitelikte.
ssl = required<br></br>
ssl_cert = ssl_key = ```
Bu asama ile posta sunucu yapilandirmamizi tamamladik. Dovecot ve Postfix servislerini yeniden baslatalim.
service postfix restart
start dovecot```
Thunderbird ile ornek olarak olusturdugumuz kullanicilardan birini yapilandirabilirsiniz. Yeni kullanicilar ya da alanadlari eklemek icin MySQL komut satirina dusup ornek kullanicilari ekledigimiz sekilde sorgulari ya da istekleri tekrar calistirmaniz gerekiyor. Tabii bu arada hangi alanadinin hangi id ile tutuldugu gibi detaylar gozden kacirilmamali. Catchall diye tabir edilen ve bir kullanici adiyla eslesmeyen tum postalari yakalamak icin sanal_takmaadlari tablosuna source icin @alanadi.com adresini verebilirsiniz.
Squirrelmail kurulumu ile rehberi tamamlamadan once yapmak isteyebileceginiz bir iki sey uzerinde durayim. Submission portunu(587) acmak icin /etc/postfix/master.cf dosyasini duzenlemelisiniz. Benim yapilandirmamda ilgili bolum soyle gorunuyor. Farkettiginiz uzere bu dosyada da main.cf dosyasinda oldugu gibi smtpdsaslauthenable ve smptdclient_restrictions gibi secenekleri kullanabiliyoruz.
submission inet n - - - - smtpd<br></br>
-o syslog_name=postfix/submission<br></br>
-o smtpd_sasl_auth_enable=yes<br></br>
-o smtpd_client_restrictions=permit_sasl_authenticated,permit_mynetworks,reject```
Servislerin calisip calismadigi, calisiyorlarsa hangi portlari dinlediklerini gormek icin ise benim kullandigim komut su. IPv6 henuz ilginizi cekmiyorsa buyuk hata yapiyorsunuz fakat t’nin yanina 4 ekleyebilirsiniz sadece IPv4 icin. Ilk uc kolonu almazsak cikti suna benzeyecektir. Ben sadece IMAPs sundugum icin 993, SMTP icin ise 25 ve 587 calistiriyorum. Siz bu ciktida SSH ve calistiriyorsaniz diger daemon’lari da goreceksiniz.
`netstat -plnt4`
Active Internet connections (only servers)
Local Address Foreign Address State PID/Program name
127.0.0.1:3306 0.0.0.0:* LISTEN 22790/mysqld
0.0.0.0:587 0.0.0.0:* LISTEN 24543/master
0.0.0.0:25 0.0.0.0:* LISTEN 24543/master
0.0.0.0:993 0.0.0.0:* LISTEN 22920/dovecot
**Squirrelmail yapilandirmasi**
Ilk olarak gerekli paketi kuruyoruz.
`apt-get install squirrelmail`
Squirrelmail bir suru bagimliligiyla birlikte kurulacaktir. Ardindan su komutu veriyoruz.
`squirrelmail-configure`
SquirrelMail Configuration : Read: config.php (1.4.0)
———————————————————
Main Menu —
1. Organization Preferences
2. Server Settings
3. Folder Defaults
4. General Options
5. Themes
6. Address Books
7. Message of the Day (MOTD)
8. Plugins
9. Database
10. Languages
D. Set pre-defined settings for specific IMAP servers
C Turn color on
S Save data
Q Quit
Command >>
gibi bir ekran bizi karsilayacaktir. Onemli bolum 2. Server Settings dedigi bolum. R ile bir onceki menuye donuluyor. S ile yapilan ayarlar kaydediliyor. Q ise ile yapilandirmadan cikiliyor. 2’ye basrak ayarlara gecelim. Bu menude A ve B tuslariyla IMAP ve SMTP ayarlarinizi yapabilirsiniz.
Son islem ise Apache’ye squirrelmail yapilandirmasini tanitmak. Hazir gelen yapilandirmayi kopyalayalim.
`cp /usr/share/squirrelmail/config /etc/apache2/sites-available`
Sites-available altina aldigimiz dosyada istedigimiz degisiklikleri yapabiliriz. Ornegin alias direktifini duzenleyelim.
Alias /posta /usr/share/squirrelmail
Degisikliklerimizi de yaptiktan sonra Apache’yi yeniden yukleyelim.
`service apache2 reload`
Artik kullanicilar hesaplarina http://konusmalar.tk/posta adresine eriserek giris yapabileceklerdir.
[](https://blog.cagriemer.net/wp-content/uploads/2013/05/Screenshot-from-2013-05-20-140959.png)
Ekler:
doveconf -n ile tek bir dosya olsaydi yapilandirmanin nasil olacagini gorecegiz demistim. Su sekilde gozukuyor.
2.0.19: /etc/dovecot/dovecot.conf
OS: Linux 3.2.0-23-virtual x86_64 Ubuntu 12.04.2 LTS ext4
authmechanisms = plain login
maillocation = maildir:/var/mail/vhosts/%d/%n
mailprivilegedgroup = mail
passdb {
args = /etc/dovecot/dovecot-sql.conf.ext
driver = sql
}
protocols = imap lmtp
service auth-worker {
user = vmail
}
service auth {
unixlistener /var/spool/postfix/private/auth {
group = postfix
mode = 0666
user = postfix
}
unixlistener auth-userdb {
mode = 0600
user = vmail
}
user = dovecot
}
service imap-login {
inetlistener imap {
port = 0
}
}
service lmtp {
unixlistener /var/spool/postfix/private/dovecot-lmtp {
group = postfix
mode = 0600
user = postfix
}
}
service pop3-login {
inetlistener pop3 {
port = 0
}
}
ssl = required
sslcert = ssl_key = userdb {
args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
driver = static
}
```
Diyagramin kaynagi ise surada: https://blog.cagriemer.net/wp-content/uploads/2013/05/posta.dia
Cagri Emer 20 Mayıs 2013
Posted In: Dovecot, E-posta, Gezegen, MySQL, Postfix, Sanal E-posta, SquirrelMail, Ubuntu 12.04