اطلاعیه

بستن
No announcement yet.

آموزش راه اندازی ایمیل سرور لینوکسی با Postfix و Dovecot

بستن
X
 
  • فیلتر کردن
  • زمان
  • نمایش
Clear All
پست های جدید

    آموزش راه اندازی ایمیل سرور لینوکسی با Postfix و Dovecot

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

    نحوه راه اندازی سرویس بایند در لینوکس




    همچنین توصیه میشود مطالعه کنید.

    نحوه امنیت بخشیدن به ایمیل ها با استفاده از راه اندازی TLS و SSL در Postfix و Dovecot

    آموزش نصب Amavisd، Spamassassin و آنتی ویروس Clamav

    نحوه نصب و راه اندازی Bind DNS Server در لینوکس

    نحوه تعریف رکورد DKIM در سرور Bind

    معرفی انواع رکوردهای DNS (مانند A - MX - PTR - SOA - SPF - NS - TXT - DKIM - CNAME)

    خرید یک هاست و دامین از هاستینگ منطقه لینوکسی ها


    سرویس 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 = </etc/ssl/certs/dovecot.pem
    # ssl_key = </etc/ssl/private/dovecot.pem 

    اگر فایل 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 کپی و پیست کنید. در اینجا من یوزر habili@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)
    آخرین ویرایش توسط Habili; در تاریخ/ساعت 11-03-2019, 05:12 AM.

    #2
    سلام خیلی ممنون از مطلب مفیدتون من الان راه اندازی کردم این سیستم رو ولی نمیتونم ایمیل ارسال کنم اشکال کار از کجا هستش ؟

    کامنت


      #3
      نوشته شده توسط peyman_6000 مشاهده پست
      سلام خیلی ممنون از مطلب مفیدتون من الان راه اندازی کردم این سیستم رو ولی نمیتونم ایمیل ارسال کنم اشکال کار از کجا هستش ؟
      سلام. خواهش میکنم. لاگ های ایمیل رو بررسی کنید ببینید چه error ی میده؟ خطایی که میده رو بذارید اینجا بررسی کنیم.

      کامنت

      درباره انجمن منطقه لینوکسی ها

      انجمن منطقه لینوکسی ها با هدف ارتقاء سطح علمی کاربران در سطح جهانی و همچنین کمک به بالا بردن سطح علمی عمومی در زمینه های تخصصی فوق پایه گذاری شده است. انجمن منطقه لینوکسی ها از طریق کارشناسان و متخصصان پاسخگوی سوالات گوناگون کاربران مبتدی یا پیشرفته میباشد تا حد امکان تلاش شده که محیطی متنوع و کاربر پسند و به دور از هرگونه حاشیه جهت فعالیت کاربران در این انجمن ایجاد شود. لذا ما به صورت مستمر برای پیشرفت کمی و کیفی محتوی و اطلاعات انجمنمان میکوشیم که این برای ما ارزشمند و حائز اهمیت است. کلیه حقوق،اطلاعات و مقالات در این انجمن متعلق به سایت منطقه لینوکسی ها میباشد، و هرگونه نسخه برداری بدون ذکر منبع مورد پیگرد قانونی خواهد شد.

      شبکه های اجتماعی

      ایمیل مدیریت

      Habili@linux-zone.org

      در حال انجام ...
      X