تبليغات X
آموزش راه اندازی ایمیل سرور لینوکسی

امروزه قدرتمند ترین Email Server های دنیا روی سیستم عامل لینوکس کار می کنند و از ابزار های قدرتمند لینوکسی در این زمینه می توان Postfix و Dovecot را نام برد. همانطور که همه می دانیم راه اندازی و نگهداری یک میل سرور یکی از امور و وظایف مهم هر ادمین و مهندس شبکه ای میباشد. سرویس postfix امکان هندل کردن ارتباطات SMTP و همچنین ارسال ایمیل برای تمامی کاربران ایجاد شده در Mail Server را فراهم می آورد.


سرویس dovecot نرم افزاری است که در Mail Server های لینوکسی به عنوان سرویس IMAP, POP3 مورد استفاده قرار می گیرد و ایمیل های ورودی را به mailbox کاربران را منتقل می کند. هم چنین، وظیفه ی authenticate کردن کاربران را نیز بر عهده دارد.


محیط عملیاتی ما برای پیاده سازی :

  • CentOS 7.1.1503 (fresh install)
  • Kernel 3.10.0-229.4.2.e17.x86_64
  • postfix 2.10.1
  • dovecot 2.2.10
  • amavisd-new 2.10.1
  • spamassasin 3.4.0
  • clamav 0.98.7
  • pigeonhole 0.4.3



Postfix :

روی CentOS 7 به صورت پیش فرض postfix نصب میباشد و نیاز به نصب آن نیست. فقط از نصب آن مطمئن شوید و اجرای آن به هنگام boot را فعال کنید.

کد PHP:
systemctl status postfix grep enabled
   Loaded
loaded (/usr/lib/systemd/system/postfix.serviceenabled


فایل های کانفیگ postfix در مسیر /etc/postfix قرار دارند. دو فایل اصلی main.cf و master.cf که در ابتدا از هر دوی آنها بک آپ میگیریم.

کد PHP:
cd /etc/postfix
cp main
.cf main.cf.ORIG
cp master
.cf master.cf.ORIG 


اگر چه در centos 7 روی postfix به صورت پیش فرض نام یوزر و گروه postfix برای اجرای سرویس وجود دارد، اما ما به یک user و group مجزا نیاز خواهیم داشت. به صورت تکنیکی ما میتوانیم از یوزر postfix استفاده کنیم اما توصیه نمیشود که از UID کمتر از 500 استفاده کنید. بنابراین یک یوزر و گروه جدید ایجاد میکنیم.

کد PHP:
groupadd vpostfix && useradd vpostfix -g vpostfix -/sbin/nologin -"Virtual postfix user" -/var/empty 


خطای home directory exist را نادیده بگیرید. UID و GID را به خاطر بسپارید زیرا در تنظیمات بعدی به این دو عدد نیاز خواهیم داشت. در این خروجی UID=1001 و GID=1001 میباشد.

کد PHP:
grep vpostfix /etc/passwd && grep vpostfix /etc/group
vpostfix
:x:1001:1001:Virtual postfix user:/var/empty:/sbin/nologin
vpostfix
:x:1001


اکنون فایل main.cf را باز کرده و مقادیر زیر را تغییر دهید.

کد PHP:
myhostname www.example.com
mydomain 
example.com
myorigin 
$mydomain
inet_interfaces 
all
home_mailbox 
Maildir


مقدار www.example.com را با domain سرور خود جایگزین کنید. دقت کنید که به صورت پیش فرض مقدار inet_interface برابر با localhost میباشد و شما باید این خط را در فایل کامنت کنید یا اینکه برابر با all بگذارید.همچنین ما به جای mbox از فرمت Maildir استفاده میکنیم زیرا بهتر است. همچنین خط های زیر را در پایان فایل main.cf اضافه کنید. از قرار دادن UID و GID درست (با توجه به آنچه که در بالا مشاهده کردیم) مطمئن شوید.

کد PHP:
# Virtual domain config
virtual_mailbox_domains = /etc/postfix/virtual_domains
virtual_mailbox_base 
= /var/mail/vhosts
virtual_mailbox_maps 
hash:/etc/postfix/vmailbox
# Make sure you replace these UID:GID numbers
virtual_minimum_uid 1001
virtual_uid_maps 
= static:1001
virtual_gid_maps 
= static:1001
virtual_alias_maps 
hash:/etc/postfix/virtual 


اکنون فایل جدیدی به نام /etc/postfix/virtual_domains ایجاد کنید. این فایلی ایست که تمام دامین های شما در آن لیست خواهد شد. البته شما باید مطمئن شوید که رکوردهای MX دامین تان به ip آدرس ماشین centos اختصاص داده شده باشد.

کد PHP:
cd /etc/postfix/
touch virtual_domains 


فرمت فایل شبیه به زیر میباشد.

کد PHP:
#  Put each domain in a separate line.
domain-1.com
domain
-2.net
domain
-3.org 


دایرکتوری ایمیل و ساب دایرکتوری ها را برای دامین ها ایجاد کنید و پرمیژن های مناسب را به آنها بدهید. این مسیر مکانی است که ایمیل های مربوط به همه virtual domain ها در آن ذخیره خواهند شد.

کد PHP:
mkdir /var/mail/vhosts
chgrp 
-R vpostfix /var/mail
cd 
/var/mail/vhosts
mkdir domain
-1.com
mkdir domain
-2.net
mkdir domain
-3.org
cd 
..
chown -R vpostfix:vpostfix vhosts 


بعد از اینکه موارد بالا را انجام دادید postfix دایرکتوری های Maildir را به صورت اتوماتیک ایجاد خواهد کرد و زمانیکه هر ایمیلی به این مقصد ها ارسال یا دریافت میشوند پرمیژن های مناسب را اختصاص میدهد، در نهایت فایلی به نام /etc/postfix/vmailbox ایجاد کنید و تمام user های میل سرور را به آن اضافه کنید. همانند زیر :

کد PHP:
habili@domain-1.com        domain-1.com/habili/
asal@domain-1.com       domain-1.com/asal/
@
domain-1.com           domain-1.com/catch-all/
mohammad@domain-2.net        domain-2.net/mohammad// 


نکته : مطمئن شوید که هر خط با اسلش "/" تمام شود در غیر اینصورت ایمیل ها ارسال نخواهند شد.

یوزر مجازی (Virtual User) با نام habili@domain-1.com (دقت کنید که برای این کاربر login به سرور میسر نیست و تمام کاربران به صورت ویرچوال ساخته میشوند.) ایمیل هایش به مسیر /var/mail/vhosts/domain-1.com/habili ذخیره میشوند. شما نیاز نیست که به صورت دستی ساب دایرکتوری ها را ایجاد کنید. زمانیکه همه چیز مرتب و postfix در حال اجرا باشد خودش حواسش به ایجاد ساختار maildir (دایرکتورهای cur, new, tmp) هست.

شما میتوانید آدرس catch-all را ایجاد کنید، که در بالا آنرا ایجاد کردیم این خط به postfix میگوید که ایمیل هایی که به کاربران ناموجود در آن دامین (domain-1.com) ارسال میشوند را دریافت کند. که در حقیقت به معنای انبوهی از ایمیل های اسپم میباشد. که البته این مورد توصیه نمیشود.

و اما اگر بخواهید از یوزر واقعی به نام asal در centos خود استفاده کنید چه؟ در اینجا برای اینکه بخواهیم برای این کاربر ایمیل دریافت کنیم باید او را نیز همانند یک یوزر ویرچوال در نظر بگیریم و آنرا به یک ویرچوال دامین اختصاص دهیم. این شیوه آسانتری برای نگه داری از هاست و یوزرهای ویرچوال میباشد که با فایل های کانفیگ مجزا سر و کار دارند.

ممکن است شما بخواهید که همه یایمیل آدرس ها (vmailbox) در فایل کانفیگ یک پیشوند hash: داشته باشند. این مورد برای سرعت بخشیدن به lookup ها مفید است. postfix میتواند برای ذخیره اکانت های ایمیل از hash: (Berkeley-DB), mySQL or PostgreSQL databases استفاده کند.

فایل virtual aliases را ایجاد و همچنین یک فایل alias لوکال بسازید.

کد PHP:
touch /etc/postfix/virtual
cd 
/etc
postalias aliases 


به محض اینکه مورد بالا را انجام دادید موارد زیر را انجام دهید تا یک فایل hash شده (extentions.db) بسازید.

نکته : شما باید دستورات زیر را برای اعمال تغییرات برای هر یک از این فایل ها (virtual_domains و vmailbox) اجرا کنید.

کد PHP:
postmap /etc/postfix/virtual
postmap 
/etc/postfix/vmailbox 


در اینجا شما نیاز دارید سرویس postfix را برای اعمال تغییرات انجام شده restart کنید.

کد PHP:
systemctl restart postfix 


log فایل را بررسی کنید :

کد PHP:
tail /var/log/maillog 


شما باید مشاهده کنید که سرویس start شده باشد. بررسی کنید که postfix در حال اجرا باشد و روی پورت 25 در حال listen باشد.

کد PHP:
ps -eaf grep postfix
root      1627     1  0 Jun01 
?        00:00:00 /usr/libexec/postfix/master -w
postfix   1647  1627  0 Jun01 
?        00:00:00 qmgr --t unix -u
postfix  19407  1627  0 10
:53 ?        00:00:00 pickup --t unix -u
postfix  19853  1627  0 12
:05 ?        00:00:00 smtpd -n smtp -t inet --s 2
postfix  19854  1627  0 12
:05 ?        00:00:00 proxymap -t unix -u
root     19862 19748  0 12
:06 pts/0    00:00:00 grep --color=auto postfix

ss 
-grep smtp
u_str  LISTEN     0      100       
private/smtp 14560                 0
tcp    LISTEN     0      100          127.0.0.1
:smtp                  *:*
tcp    LISTEN     0      100                ::1:smtp 


نکته : شما میتوانید postfix را با استفاده از دستورات systemctl start postfix و systemctl stop postfix استارت و stop کنید و همچنین فایل های کانفیگ را با دستور systemctl reload postfix ریلود کنید.

از دامین دیگری (gmail یا hotmail) به habili@domain-1.com ایمیل ارسال کنید و log فایل ها را مشاهده نمایید.

کد PHP:
tail -/var/log/maillog 


باید چیزی شبیه به زیر مشاهده کنید.

برای دیدن سایز بزرگ روی عکس کلیک کنید  نام: maillog.png مشاهده: 1 حجم: 29.4 کیلو بایت






اگر لاگی مشاهده نکردید و مطمئن هستید که postfix روی پورت 25 در حال گوش دادن است به احتمال زیاد یک مشکل فایروالی دارید. پورت SMTP را باز کنید.

کد PHP:
firewall-cmd --add-service=smtp --permanent
success
firewall
-cmd --reload
success 


اگر شما دایرکتوری /var/mail/vhosts/domain-1/habili/new را بررسی کنید فایلی را مشاهده خواهید کرد. این ایمیل شماست که به habili ارسال کردید.



و اما اینکه چگونه این یوزر ویرچوال قادر به دریافت ایمیل خواهد بود؟ البته که یوزر برای دریافت ایمیل باید اول login کند اما با چه پسوردی؟ که در ادامه به آن خواهیم پرداخت.


Dovecot :

به منظور دریافت ایمیل ها ما dovecot را نصب و راه اندازی میکنیم. dovecot یک کلاینت open source ی برای pop و imap میباشد. ورژن 2 این سرویس دارای فایل کانفیگ های زیادی میباشد. فایل اصلی /etc/dovecot/dovecot.conf میباشد، اما شما بخش های include زیادی را در این فایل میبینید که به دایرکتوری /etc/dovecot/conf.d اشاره کرده است که در این دایرکتوری فایل های کانفیگ زیادی داریم. به صورت پیش فرض dovecot روی centos نصب نیست، پس در ابتدا آنرا با دستور زیر نصب میکنیم.

کد PHP:
yum install dovecot 


از فایل /etc/dovecot/dovecot.conf یک بک آپ میگیریم و سپس خط زیر را از کامنت در میاوریم.

کد PHP:
protocols imap pop3 lmtp 

سپس به دایرکتوری conf.d رفته و خط های زیر را در فایل های زیر تغییر میدهیم.

10-auth.conf

 

کد PHP:
disable_plaintext_auth no
#!include auth-system.conf.ext
!include auth-passwdfile.conf.ext 


10-logging.conf
 

کد PHP:
log_path = /var/log/dovecot.log
auth_verbose 
no
auth_debug 
no
verbose_ssl 
no 


10-mail.conf
 

کد PHP:
mail_home = /var/mail/vhosts/%d/%n
mail_location 
maildir:~
mail_uid 1001    # These are the GID and UID numbers for postfix
mail_gid 1001    # Don't just put random numbers here. Check above.
mail_privileged_group vpostfix 


10-master.conf
 

کد PHP:
unix_listener auth-userdb {
  
mode 0600
  user 
vpostfix
  group 
=  vpostfix
}
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
  
mode 0666
  user 
vpostfix
  group 
vpostfix


10-ssl.conf
 

کد PHP:
ssl no
# ssl_cert =  # ssl_key = 


اگر فایل 10-auth.conf بررسی کنید ما خط #!include auth-system.conf.ext را کامنت کردیم و خط !include auth-passwdfile.conf.ext را از کامنت خارج کردیم. نگاه به این فایل (auth-passwdfile.conf.ext) بیندازید. همانطور که خواهید دید :

کد PHP:
passdb {
  
driver passwd-file
  args 
scheme=CRYPT username_format=%/etc/dovecot/users
}

userdb {
  
driver passwd-file
  args 
username_format=%/etc/dovecot/users


این قسمت به ما میگوید دیتابیس username/password در فایل /etc/dovecot/users میباشد. برای ایجاد کردن یک password با مکانیزم SHA512-CRYPT دستور زیر را اجرا کنید.

کد PHP:
doveadm pw -s SHA512-CRYPT 


از شما خواسته میشود که دوباره پسورد وارد کنید و خروجی شبیه به زیر میباشد.

کد PHP:
# doveadm pw -s SHA512-CRYPT
Enter new password:
Retype new password:
{
SHA512-CRYPT}$6$zrIRwPLVuk54nyVb$F69mK51tsSospb4LK.W3mP4Eye/kWm5A6kEZ1fzXAS66JYO.7nuNeW3v2KaI.lQYGfMWAu1L.DGoqMJopgI7H


اکنون فایل /etc/dovecot/users را ایجاد و یا در صورت وجود داشتن باز کنید و پسوردها را بعد از username کپی و پیست کنید. در اینجا من یوزر admin@domain-1.com با پسوردی که در بالا ایجاد کردم قرار دادم، پس خطی شبیه به زیر خواهم داشت.

کد PHP:
habili@domain-1.com:{SHA512-CRYPT}$6$msw7wKnnk68yYotS$/9TBd1rnJY3WxnST9CWrCh/pHKn1FxwV6mIDacYKiKQCLh7ehEqVOvA71vKKsHU8fNN83cD4hobBT3RbbQ5nm1:::::: 


فراموش نکنید که 4 عدد colon "::::" بعد از پسورد قرار دهید. حتی اگر شما برای کاربران پسورد یکسان استفاده کنید آنها به صورت متفاوت encrypt خواهند شد.

مشکل این سناریو این است که کاربر نهایی قادر نخواهد بود که پسوردش را تغییر دهد. بنابراین شما باید برای آنها پسورد ایجاد و یا تغییر دهید و آنها قادر به reset پسوردشان نیستند. انواعی از اسکریپت های perl برای این داستان موجود است و حتی شما میتوانید یک نمونه اسکریپت برای خودتان بنویسید.

حالا dovecot را start کنید و اجرا شدن اتوماتیک آنرا به هنگام بوت سیستم، نیز فعال کنید و هر گونه error ی را نیز بررسی نمایید. اکنون dovecot ما باید در حال اجرا باشد و برای کانکشن های pop و imap در حال listen کردن باشد.

کد PHP:
systemctl start dovecot
systemctl enable dovecot
tail 
/var/log/dovecot.log
ss 
-grep pop3
ss 
-grep imap 

اکنون، سرور ایمیل مان را چک میکنیم شما باید آنرا از طریق سرور و با استفاده از telnet انجام دهید.

کد PHP:
telnet localhost 110
Trying 127.0.0.1
...
Connected to localhost.
Escape character is '^]'.
+
OK Dovecot ready.
user habili@domain-1.com
+OK
pass topsecret

+OK Logged in.
stat
+OK 2 2037
list
+
OK 2 messages:
1 1027
2 1010

.
quit
+OK Logging out.
Connection closed by foreign host


در مثال بالا من pop3 را تست کردم. برای تست imap همانند زیر telnet بزنید.

 

 

کد PHP:
telnet localhost 143
Trying 127.0.0.1
...
Connected to localhost.
Escape character is '^]'.
OK [CAPABILITY IMAP4rev1 LITERALSASL-IR LOGIN-REFERRALS ID ENABLE IDLE AUTH=PLAINDovecot ready.
login habili@domain-1.com topsecret
OK [CAPABILITY IMAP4rev1 LITERALSASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS SPECIAL-USE BINARY MOVELogged in
? list "" "*"
* LIST (HasNoChildren"." INBOX
OK List completed.
logout
BYE Logging out
OK Logout completed.
Connection closed by foreign host.
 
 
در صورت تمایل شما میتوانید دریافت این ایمیل ها را از یک میل کلاینت همانند outlook, operamail یا هر MUA مورد نظر دیگری تست کنید. اکنون سرور میتواند از دامین های دیگر ایمیل دریافت کند و همچنین شما میتوانید این ایمیل ها را از بیرون با استفاده از pop و imap دریافت کنید. چیزی که نیاز است این است که ما بتوانیم به این ایمیل ها پاسخ دهیم (با استفاده از کلاینت مورد نظرمان). امروزه روی اکثر provider های اصلی پورت 25 بلاک میباشد. (به طور مثال Verizon, Comcast) در نتیجه ما از SASL در postfix استفاده خواهیم کرد و از dovecot برای authenticate (اهراز هویت) کردن کاربران با استفاده از ترکیب username و password استفاده خواهیم کرد، بعلاوه ما از certificate استفاده خواهیم کرد، بنابراین به جای pop3 و imap ما از معادل امن تر آنها pop3s و imaps که به ترتیب روی پورت های 995 و 993 اجرا میشوند استفاده خواهیم کرد. در اینجا شما میتوانید 993 و 995 را باز کنید و پورت های 110 و 143 را روی فایروال ببندید. ما دیگر از این پورت ها استفاده نخواهیم کرد. (pop3 و imap)

 

درباره نویسنده

دانلود مقالات لینوکس,آموزش های لینوکس,خط فرمان های لینوکس

نظرات

آخرین نظرات ثبت شده برای این مطلب را در زیر می بینید:
بخش نظرات برای پاسخ به سوالات و یا اظهار نظرات و حمایت های شما در مورد مطلب جاری است.
شما نیز نظری برای این مطلب ارسال نمایید:
نام شما
ایمیل
وب سایت
کد امنیتی *