CentOS 8 - 메일서버 구축(Postfix, Dovecot, MariaDB And Roundcube)

    CentOS 8

    MailServer With Postfix, Dovecot, MariaDB And Roundcube Install

    [2022-05-30]

    Rocky 리눅스에서 새로 구축한 메일서버[리뉴얼]

    https://foxydog.tistory.com/104

     

    Rocky Linux - 메일서버 구축(Postfix, Dovecot, MariaDB And Roundcube) [리뉴얼] ※ 스압주의 ※

    CentOS 8 메일서버 구축 건으로 생각보다 많은 분들이 찾아주시고 댓글에 도움을 요청하신 분들도 있으셨습니다. 제가 첫 작성 날이 2020년도인 만큼 시간이 많이 경과되었기 때문에 Rocky Linux에서

    foxydog.tistory.com

     

    단순히 [Postfix/Sendmail]를 이용하여 메일을 전달만 하는 게 아닌 상용 메일 솔루션처럼 웹 인터페이스를 통해 메일을 주고받고 할 수 있는 메일서버를 만들어보도록 하겠습니다. 모든 오픈 소스를 동원해 하나의 메일서버처럼 작동을 해야 하므로 매우 복잡한 세팅 과정을 거쳐야 합니다. 최대한 순차적으로 풀어서 이해할 수 있도록 진행하도록 하겠습니다.

    □ 오픈소스 솔루션 소개

    Postfix [공식 홈페이지] IBM 보안 전문가가 만든 무료 오픈 소스 MTA(메일 전송 에이전트)로 인터넷을 통해 다른 서버로 전자 메일을 라우팅하고 SMTP 프로토콜을 이용해 전달하는 역활을 합니다.
    Dovecot [공식 홈페이지] 보안 위주로 제공하고 있는 Linux/Unix계열 시스템 용 오픈 소스 IMAP/POP3 서비스입니다.
    MariaDB [공식 홈페이지] 이제는 누구나 알고 있는 관계형 데이터베이스(DB) 관리 시스템 오픈 소스 입니다.
    여기서는 RoundCube(웹메일) 및 사용자(로그인 정보)계정을 보관하기 위해 사용됩니다.
    RoundCube [공식 홈페이지] 메일을 읽고 쓰고 발송할 수 있는 인터페이스를 제공하는 오픈 소스용 웹메일 입니다. 상용 메일 솔루션만큼은 아니지만 기본적인 MIME지원, 주소록, 폴더 조작, 메시지 검색 및 맞춤법 검사를 포함한 이메일 클라이언트와 비슷하게 기능을 제공 하고 있습니다.

    만약 실제 메일서버를 운영하기 위해서는 다음과 같은 전제조건이 필요

    ※ 도메인 구입 필요 [예로 제가 사용하는 foxydog.co.kr 도메인 주소를 말합니다]

    ※ 수발신을 위한 A/MX 레코드 등록 필요 [서버를 찾아갈 수 있게 mail.foxydog.co.kr  DNS에 호스트를 등록]

    ■ [설치환경 및 준비물]

    릴리즈 설치 테스트 : 2020-08-24

    ※ YUM/DNF 명령어를 통해 설치 진행

    ※ 저의 경우는 Firewall 방화벽이 아닌 IPtables 방화벽 이용

    서버준비 CentOS 8 리눅스 설치 서버 [포스팅 참고]
    OS Version CentOS Linux release 8.2.2004 (Core)
    커널(Kernel) 4.18.0-193.14.2.el8_2.x86_64
    postfix 3.3.1
    dovecot 2.3.8
    DB MariaDB 10.5
    Web Apache 2.4.X / PHP 7.4.X
    Webmail RoundCube 1.4.8

     

    ■진행 순서

     

    STEP01 → CentOS 8 설치 후 준비 과정

    1-1 전체 패키지 업데이트 하기

    오픈 소스의 경우는 한번 적용하기 시작하면 추후 보안 패치나 수정에 어려움이 많이 발생합니다. 특히나 메일서버의 경우는 스패머들에 의해 타켓 노출이 많이 되므로 보안을 위해 설치 전 모든 이전 패치가 최신 패키지로 시작하는 게 좋습니다.

    [root@localhost ]# dnf update

    1-2 iptables 방화벽 사용

    편한 방화벽을 이용하시면 됩니다.

    CentOS 7 이상 부터는 기본이 firewall 방화벽을 이용하므로 iptables 이용 시는 아래와 같은 순서로 명령어 진행

    [root@localhost ~]# systemctl stop firewalld  (firewalld 중지)
    [root@localhost ~]# systemctl mask firewalld  (firewalld 자동시작 중지)
    [root@localhost ~]# dnf install -y iptables-services  (iptables 서비스 관련 패키지 설치)
    [root@localhost ~]# systemctl enable iptables  (iptables 자동 시작)
    [root@localhost ~]# systemctl start iptables  (iptables 시작)


    [root@localhost ~]# iptables -nL  (적용 확인)
    [root@localhost ~]# /etc/sysconfig/iptables  (설정 기본경로)

    1-3 SELinux 비활성화

    [root@localhost ~]# sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

    [root@localhost ~]# cat /etc/selinux/config | grep disabled  (변경 확인)
    #     disabled - No SELinux policy is loaded.
    SELINUX=disabled

    1-4 호스트 등록

    아래와 같이 eztest.com이라는 가상의 도메인이 있다고 가정하에 등록합니다. 한번 정하면 이후 세팅 시에 전부 동일한 도메인 이름으로 해주시기 바랍니다. 현재는 가상 서버 테스트이므로 임의로 아무거나 해도 상관없습니다.

    [root@localhost ~]# hostnamectl set-hostname mail.eztest.com

    [root@localhost ~]# hostname
    mail.eztest.com  (적용 확인)

    1-5 패키지 업데이트 및 SELinux 적용을 위해 서버 재시작

    [root@localhost ~]# reboot

     

     

    STEP02 → Postfix, Apache 및 PHP 설치하기

    2-1 Postfix, Apache 설치하기

    [root@localhost ]# dnf install httpd postfix postfix-mysql policycoreutils-python-utils epel-release

    2-2 PHP는 7.4.X 버전 설치를 위해 Remi 저장소 이용

    [root@localhost ]# dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm  (Remi 저장소)

    [root@localhost ]# dnf module list php  (PHP 설치 버전 확인)

    [root@localhost ]# dnf module enable php:remi-7.4  (7.4 버전 기본 설정)

    [root@localhost ]# dnf install php  (설치)

    [root@localhost ]# dnf install php-common php-json php-xml php-mbstring php-mysqlnd  (추가 php모듈 설치)

     

     

    STEP03 → MariaDB 설치 및 구성하기

    3-1 MariaDB 10.5 버전 설치

    [root@localhost ~]# vi /etc/yum.repos.d/MariaDB.repo  (아래의 값을 복사 후 저장)

    # MariaDB 10.5 CentOS repository list - created 2020-08-26 07:08 UTC
    # http://downloads.mariadb.org/mariadb/repositories/

    [mariadb]
    name = MariaDB
    baseurl = http://yum.mariadb.org/10.5/centos8-amd64

    module_hotfixes=1
    gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

    gpgcheck=1

    [root@localhost ~]# dnf install MariaDB-server MariaDB-client  (설치)

    [root@localhost ~]# systemctl start mariadb  (DB 구동)

    [root@localhost ~]# systemctl enable mariadb  (부팅 자동 실행)

    [root@localhost ~]# ps -ef | grep mariadbd  (구동 확인)
    mysql      10718       1  0 03:14 ?        00:00:00 /usr/sbin/mariadbd

    [root@localhost ~]# mysql_secure_installation  (초기 세팅)

    Enter current password for root (enter for none): Enter

    Switch to unix_socket authentication [Y/n] Y

    Change the root password? [Y/n] Y

    New password: 패스워드 입력
    Re-enter new password:  패스워드 재입력

    Remove anonymous users? [Y/n] Y

    Disallow root login remotely? [Y/n] Y

    Remove test database and access to it? [Y/n] Y

    Reload privilege tables now? [Y/n] Y

    Thanks for using MariaDB!

    3-2 로그인 계정 및 RoundCube를 사용하기 위한 구성

    ※ Postfix가 IMAP을 이용하여 계정을 인증할 때 크게 3가지 방법이 있습니다.
    1. /etc/passwd 리눅스 계정 리스트의 PAM을 이용한 인증
    2. 직접 사용자 계정 login.list (임의) 파일을 만들어 관리 및 인증
    3. MariaDB 같은 데이터베이스에 저장하여 인증 (해당 방법을 이용)

    [root@localhost ~]# mysql -u root -p  (DB 접속, 순서대로 진행)

    □Postfix 계정을 저장할 데이터베이스 생성

    MariaDB [(none)]> create database postfix_accounts;


    방금 생성한 데이터베이스에 접근할 전체 권한 계정을 생성

    예시) grant all on 데이터베이스 이름.* to '유저 ID'@'localhost' identified by '패스워드';

    MariaDB [(none)]> grant all on postfix_accounts.* to eztest_admin@localhost identified by 'test123';

    MariaDB [(none)]> flush privileges;  (바로 적용)

     

    서버에 도메인을 저장할 테이블 만들기(전체 한 줄)

    MariaDB [(none)]> CREATE TABLE `postfix_accounts`.`domains_table` ( `DomainId` INT NOT NULL AUTO_INCREMENT , `DomainName` VARCHAR(50) NOT NULL , PRIMARY KEY (`DomainId`)) ENGINE = InnoDB;

     

    사용자 계정을 보관할 테이블 만들기(전체 한 줄)

    MariaDB [(none)]> CREATE TABLE `postfix_accounts`.`accounts_table` (
        `AccountId` INT NOT NULL AUTO_INCREMENT,
        `DomainId` INT NOT NULL,
        `password` VARCHAR(300) NOT NULL,
        `Email` VARCHAR(100) NOT NULL,
        PRIMARY KEY (`AccountId`),
        UNIQUE KEY `Email` (`Email`),
        FOREIGN KEY (DomainId) REFERENCES domains_table(DomainId) ON DELETE CASCADE
    ) ENGINE = InnoDB;

     

    별칭 사용자 계정을 보관할 테이블 만들기(전체 한 줄)

    별칭은 일종의 리다이렉션처럼 A계정이 수신을 받으면 B계정으로 받는 기능

    MariaDB [(none)]> CREATE TABLE `postfix_accounts`.`alias_table` (
        `AliasId` INT NOT NULL AUTO_INCREMENT,
        `DomainId` INT NOT NULL,
        `Source` varchar(100) NOT NULL,
        `Destination` varchar(100) NOT NULL,
        PRIMARY KEY (`AliasId`),
        FOREIGN KEY (DomainId) REFERENCES domains_table(DomainId) ON DELETE CASCADE
    ) ENGINE = InnoDB;

    이제 만든 테이블에 사용할 도메인 및 계정 정보 레코드 입력(각 한 줄씩 명령어)

    eztest.com 도메인 등록

    MariaDB [(none)]> INSERT INTO `postfix_accounts`.`domains_table` (DomainName) VALUES ('eztest.com');

     

    test1@eztest.com 계정 생성

    MariaDB [(none)]> INSERT INTO `postfix_accounts`.`accounts_table` (DomainId, password, Email) VALUES (1, ENCRYPT('test123', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'test1@eztest.com');

     

    test2@eztest.com 계정 생성

    MariaDB [(none)]> INSERT INTO `postfix_accounts`.`accounts_table` (DomainId, password, Email) VALUES (1, ENCRYPT('test123', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'test2@eztest.com');

     

    testfc@eztest.com ▷ testsc@eztest.com 별칭 계정 생성

    MariaDB [(none)]> INSERT INTO `postfix_accounts`.`alias_table` (DomainId, Source, Destination) VALUES (1, 'testfc@eztest.com', 'testsc@eztest.com');

     

    또한 정상적으로 등록되었는지도 확인(스크린샷 대처)

    나중에 설치할 RoundCube 데이터베이스 미리 생성하기

    MariaDB [none]> create database roundcube;

     

    동일하게 데이터베이스에 접근할 전체 권한 계정을 생성

    MariaDB [none]> grant all on roundcube.* to roundcube_admin@localhost identified by 'test123';

    MariaDB [none]> flush privileges;  (바로 적용)

     

    MariaDB [none]> quit  (끝)

     

     

    STEP04 → Postfix 구성 세팅 하기

    ※ 구성파일 위치 /etc/postfix/
    4-1 master.cf 파일 설정(수정 또는 추가 후 저장)

    [root@localhost ]#  vim /etc/postfix/master.cf

     

    □다음과 같이 아래 주석(#) 제거하거나 추가(스크린샷 참고)

     17 submission inet n       -       n       -       -       smtpd

     18   -o syslog_name=postfix/submission

     20   -o smtpd_sasl_auth_enable=yes

     22   -o smtpd_reject_unlisted_recipient=no

     27   -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
     28   -o milter_macro_daemon_name=ORIGINATING

     

     41 pickup    unix  n       -       n       60      1       pickup
     42 cleanup   unix  n       -       n       -       0       cleanup
     43 qmgr      unix  n       -       n       300     1       qmgr

     45 tlsmgr    unix  -       -       n       1000?   1       tlsmgr
     46 rewrite   unix  -       -       n       -       -       trivial-rewrite
     47 bounce    unix  -       -       n       -       0       bounce
     48 defer     unix  -       -       n       -       0       bounce
     49 trace     unix  -       -       n       -       0       bounce
     50 verify    unix  -       -       n       -       1       verify
     51 flush     unix  n       -       n       1000?   0       flush
     52 proxymap  unix  -       -       n       -       -       proxymap
     53 proxywrite unix -       -       n       -       1       proxymap
     54 smtp      unix  -       -       n       -       -       smtp
     55 relay     unix  -       -       n       -       -       smtp

     58 showq     unix  n       -       n       -       -       showq
     59 error     unix  -       -       n       -       -       error
     60 retry     unix  -       -       n       -       -       error
     61 discard   unix  -       -       n       -       -       discard
     62 local     unix  -       n       n       -       -       local
     63 virtual   unix  -       n       n       -       -       virtual
     64 lmtp      unix  -       -       n       -       -       lmtp
     65 anvil     unix  -       -       n       -       1       anvil
     66 scache    unix  -       -       n       -       1       scache

     

    맨 하단에 Dovecot 관련 값 미리 추가하기

    134 dovecot   unix  -       n       n       -       -       pipe
    135   flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}

    4-2 main.cf 파일 설정(수정 또는 추가후 저장)

    [root@localhost ]# vim /etc/postfix/main.cf

    다음과 같이 아래 주석(#) 제거하거나 추가(스크린샷 참고)

     96 myhostname = mail.eztest.com

    104 mydomain = eztest.com

    120 myorigin = $mydomain

    137 inet_interfaces = all

    140 inet_protocols = all

    185 mydestination = $myhostname, localhost.$mydomain, localhost

    273 smtpd_recipient_restrictions = permit_mynetworks

    440 home_mailbox = Maildir/

    712 #smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem  (SSL인증서 Cert 파일, 지금은 사용안함으로 주석처리)

    718 #smtpd_tls_key_file = /etc/pki/tls/private/postfix.key  (SSL인증서 Key 파일, 지금은 사용안함으로 주석처리)

    723 smtpd_tls_security_level = may

    739 smtp_tls_security_level = may

     

    맨 하단에는 SSL 보안 관련 옵션으로 당장 사용하지는 않지만 미리 등록

    743 append_dot_mydomain = no
    744 biff = no
    745 config_directory = /etc/postfix
    746 dovecot_destination_recipient_limit = 1
    747 message_size_limit = 4194304
    748 smtpd_use_tls = yes
    749 smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
    750 smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
    751 virtual_transport = dovecot
    752 smtpd_sasl_type = dovecot
    753 smtpd_sasl_path = private/auth

     

    마지막으로 STEP03에서 데이터베이스에 저장 한 계정 대한 Postfix 액세스 권한 부여하는 구성 추가

    755 virtual_mailbox_domains = mysql:/etc/postfix/database-domains.cf

    756 virtual_mailbox_maps = mysql:/etc/postfix/database-users.cf

    757 virtual_alias_maps = mysql:/etc/postfix/database-alias.cf

    4-3 Postfix가 데이터베이스에 각 정보를 엑세스 할 수 있도록 파일 생성(추가 후 저장)

    도메인 엑세스

    [root@localhost ]# vim /etc/postfix/database-domains.cf

    user = eztest_admin
    password = test123
    hosts = 127.0.0.1
    dbname = postfix_accounts
    query = SELECT 1 FROM domains_table WHERE DomainName='%s'

    사용자 계정 엑세스

    [root@localhost ]# vim /etc/postfix/database-users.cf
    user = eztest_admin
    password = test123
    hosts = 127.0.0.1
    dbname = postfix_accounts
    query = SELECT 1 FROM accounts_table WHERE Email='%s'

    별칭 계정 엑세스

    [root@localhost ]# vim /etc/postfix/database-alias.cf

    user = eztest_admin
    password = test123
    hosts = 127.0.0.1
    dbname = postfix_accounts
    query = SELECT Destination FROM alias_table WHERE Source='%s'

    4-4 생성한 파일 권한 설정

    [root@localhost ]# chmod 640 /etc/postfix/database-domains.cf

    [root@localhost ]# chmod 640 /etc/postfix/database-users.cf

    [root@localhost ]# chmod 640 /etc/postfix/database-alias.cf

     

    [root@localhost ]# chown root:postfix /etc/postfix/database-domains.cf

    [root@localhost ]# chown root:postfix /etc/postfix/database-users.cf

    [root@localhost ]# chown root:postfix /etc/postfix/database-alias.cf

     

    [root@localhost postfix]# ls -al /etc/postfix/ | grep database  (적용 확인)
    -rw-r-----    1 root postfix   145  8월 27 02:57 database-alias.cf

    -rw-r-----    1 root postfix   145  8월 27 02:55 database-domains.cf

    -rw-r-----    1 root postfix   137  8월 27 02:56 database-users.cf

     

    [root@localhost ]# systemctl restart postfix  (서비스 재시작)

     

    [root@localhost postfix]# systemctl status postfix | grep active  (Active 되어 있어야 정상 구동)
       Active: active (running) since Thu 2020-08-27 03:00:05 EDT; 42s ago

    4-5 설정 테스트(Postfix가 데이터베이스에 정상 접근하는지)

    ※ 응답 값이 숫자 1이 나오거나 끝에는 별칭(리다이렉트) 계정이 표시되면 정상

    [root@localhost postfix]# postmap -q eztest.com mysql:/etc/postfix/database-domains.cf

    1

    [root@localhost postfix]# postmap -q test1@eztest.com mysql:/etc/postfix/database-users.cf

    1

    [root@localhost postfix]# postmap -q test2@eztest.com mysql:/etc/postfix/database-users.cf

    1

    [root@localhost postfix]# postmap -q testfc@eztest.com mysql:/etc/postfix/database-alias.cf

    testsc@eztest.com

     

     

    STEP05 → Dovecot 설치 및 구성

    5-1 Dovecot 설치하기

    [root@localhost ~]# dnf install dovecot dovecot-mysql

    5-2 설치 후 시스템에서 메일을 처리할 사용자 및 그룹을 추가

    [root@localhost ~]# groupadd -g 6000 vmail

    [root@localhost ~]# useradd -g vmail -u 6000 vmail -d /home/vmail -m

    5-3 dovecot.conf 설정(수정 후 저장)

    [root@localhost ]# vim /etc/dovecot/dovecot.conf

     24 protocols = imap pop3 lmtp

     30 listen = *, ::

     98 !include conf.d/*.conf

    102 !include_try local.conf

    104 log_path = /var/log/dovecot.log

    5-4 10-auth.conf 설정(수정 후 저장)

    [root@localhost ]# vim /etc/dovecot/conf.d/10-auth.conf

     10 disable_plaintext_auth = yes

    100 auth_mechanisms = plain login

    123 !include auth-sql.conf.ext

    5-5 활성화한 auth-sql.conf.ext 파일 구성 (수정 후 저장)

    [root@localhost ~]# vim /etc/dovecot/conf.d/auth-sql.conf.ext

          5 passdb {
          6   driver = sql

          9   args = /etc/dovecot/dovecot-sql.conf.ext

         10 }

     

         27 userdb {
         28   driver = static
         29   args = uid=vmail gid=vmail home=/home/vmail/%d/%n/Maildir
         30 }

    별도로 /home/vmail 경로에 이메일을 저장하기 위해 다음과 같은 변수를 이용

    %u – 사용자 이름
    %n – user@domain의 사용자 부분 , 도메인이 없는 경우 % u와 동일
    %d – user@domain의 도메인 부분 , 도메인이 없으면 비어 있음
    %h – 홈 디렉토리

    5-6 변수에 맞게 해당 경로 도메인 등록

    ※ /home/vmail/domain 디렉터리 (/home/vmail/%d/ )를 생성

    [root@localhost ~]# mkdir /home/vmail/eztest.com

    5-7 위 설정에서 "args"에 포함된 파일에 postfix에 대해 구성한 데이터베이스 세부 정보를 추가

    [root@localhost ~]# vim /etc/dovecot/dovecot-sql.conf.ext  (추가 후 저장)

    driver = mysql
    connect = "host=127.0.0.1 dbname=postfix_accounts user=eztest_admin password=test123"
    default_pass_scheme = SHA512-CRYPT
    password_query = SELECT Email as User, password FROM accounts_table WHERE Email='%u';

    5-8 10-mail.conf 파일 구성

    ※ 메일 사서함(저장 위치) 및 네임스페이스(Namespace) inbox 사용 설정

    [root@localhost ~]# vim /etc/dovecot/conf.d/10-mail.conf  (수정 후 저장)

     30 mail_location = maildir:/home/vmail/%d/%n/Maildir

     42 namespace inbox {

     61   inbox = yes

     80 }

    114 mail_privileged_group = mail

    325 mbox_write_locks = fcntl

    5-9 10-master.conf 파일 구성

    ※ 각 서비스에 대한 포트 지정 생각하면 됩니다.

    [root@localhost ~]# vim /etc/dovecot/conf.d/10-master.conf

     17 service imap-login {
     18   inet_listener imap {
     19     port = 143
     20   }
     21   inet_listener imaps {

     24   }

     36 }

     

     38 service pop3-login {
     39   inet_listener pop3 {
     40     port = 110
     41   }
     42   inet_listener pop3s {

     45   }

     

     54 service lmtp {
     55   unix_listener /var/spool/postfix/private/dovecot-lmtp {
     56     mode = 0666
     57         user = postfix
     58         group = postfix
     59   }

     67 }

     

     88 service auth {

    102   unix_listener /var/spool/postfix/private/auth {
    103     mode = 0666
    104     user = postfix
    105     group = postfix
    106   }
    107   unix_listener auth-userdb {
    108     mode = 0600
    109     user = vmail
    110   }
    111   user = dovecot

    120 }

     

    122 service auth-worker {

    126   user = vmail
    127 }

     

    129 service dict {

    132   unix_listener dict {

    136   }
    137 }

    5-10 10-ssl.conf 파일 구성
    ※ SSL을 선택하여 사용할 수 있으나 현재는 인증서가 없기 때문에 제외(사용 안 함 처리)

    [root@localhost ~]# vim /etc/dovecot/conf.d/10-ssl.conf

    □[사용 안 함]
      8 ssl = no
     14 #ssl_cert = </etc/pki/dovecot/certs/dovecot.pem  (주석 처리)
     15 #ssl_key = </etc/pki/dovecot/private/dovecot.pem  (주석 처리)

     

    □[사용할 경우]
      8 ssl = required
     14 ssl_cert = </etc/pki/dovecot/certs/dovecot.pem  (인증서 CRT 경로)
     15 ssl_key = </etc/pki/dovecot/private/dovecot.pem  (인증서 KEY 경로)

    5-10 vmail 권한 설정

    ※ 메일을 처리할 vmail 계정은 사용자 메일 위치에 액세스를 해야 하므로 아래와 같이 필요한 권한을 부여

    [root@localhost ~]# chown -R vmail:vmail /home/vmail

    [root@localhost ~]# ls -al /home/vmail | grep eztest

     

    [root@localhost ~]# chown -R vmail:dovecot /etc/dovecot

    [root@localhost ~]# chmod -R o-rwx /etc/dovecot

    [root@localhost ~]# ls -al /etc | grep dovecot
    drwxr-x---    3 vmail dovecot   4096  8월 27 21:17 dovecot

    5-11 Dovecot 서비스 실행 테스트

    [root@localhost ~]# systemctl restart dovecot  (서비스 시작)

    [root@localhost ~]# systemctl status dovecot | grep Active  (Active 되어 있어야 정상 구동)
       Active: active (running) since Thu 2020-08-27 22:52:07 EDT; 3min 51s ago

     

     

    STEP06 → RoundCube 설치 및 구성

    ※ 공식 홈페이지에서 최신 파일 다운, [2020-08-28] 기준으로 [1.4.8] 버전 설치

    6-1 RoundCube 다운 및 경로 설정

    [root@localhost ~]# wget https://github.com/roundcube/roundcubemail/

    releases/download/1.4.8/roundcubemail-1.4.8-complete.tar.gz  (한줄 명령어/다운)

     

    [root@localhost ~]# tar xvzf roundcubemail-1.4.8-complete.tar.gz  (압축 해제)

    [root@localhost ~]# mv roundcubemail-1.4.8 roundcube  (이름 변경)

     

    [root@localhost ~]# mv roundcube /var/www/html/  (경로 이동)
    [root@localhost ~]# chown -R apache:apache /var/www/html/  (권한 설정)

    [root@localhost ~]# ls -al /var/www/html/ | grep roundcube  (변경 확인)
    drwxr-xr-x 13 apache apache 4096  8월 10 15:05 roundcube

     

    [root@localhost ~]# systemctl restart httpd  (웹 서버스 시작)

    6-2 진행하기 전 웹브라우저 접속 연결을 위한 방화벽 포트 허용

    [root@localhost ~]# vi /etc/sysconfig/iptables  (추가 후 저장)

    ## WEB ACCEPT ##
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
    ## MAIL ACCEPT ##
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 587 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 465 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 993 -j ACCEPT
    -A INPUT -p tcp -m state --state NEW -m tcp --dport 995 -j ACCEPT

    [root@localhost ~]# systemctl restart iptables  (방화벽 재시작)

     

    6-3 웹 브라우저(크롬/엣지)를 통해 URL 접속

    http://서버IP/roundcube/installer/ 접속

     

    6-4 [CREATE CONFIG] 설정에서 [Database setup] 부분만 세팅 후에 다음 진행

     

    6-5 구성 설정 메시지 성공 확인 후 바로 [CONTINUE] 클릭

     

    6-6 데이터베이스 초기화[Initialize Database][Test config] 설정 마무리 

    6-7 콘솔 접근 후 [config.inc.php] 구성 파일 확인 및 설정

    [root@localhost ~]# ls -al /var/www/html/roundcube/config/ | grep config.inc.php

    -rw-r--r--  1 apache apache  2562  8월 28 01:18 config.inc.php

    ※ SMTP 호스트, 포트 및 로그인 방법을 포함하기 위해 다음과 같이 추가 구성 설정하기

    [root@localhost ~]# vim /var/www/html/roundcube/config/config.inc.php

     

      36 $config['default_host'] = 'localhost';
      40 $config['support_url'] = '';

      52 $config['plugins'] = array('virtuser_query');
      53 $config['virtuser_query'] = "SELECT Email FROM postfix_accounts.accounts_table WHERE Email = '%u'";
      54 $config['defautl_port'] = 143;
      55 $config['smtp_server'] = 'localhost';
      56 $config['smtp_port'] = 587;
      57 $config['smtp_user'] = '%u';
      58 $config['smtp_pass'] = '%p';
      59 $config['smtp_auth_type'] = 'LOGIN';
      60 $config['debug_level'] = 1;
      61 $config['smtp_debug'] = true;

    6-8 /installer 파일 삭제

    [root@mail roundcube]# rm -rf /var/www/html/roundcube/installer/

     

     

    STEP07 → 최종 메일 테스트

    http://서버IP/roundcube/ 접속

     

    □로그인 후 메인화면

    테스트 시 발송은 되었으나 수신이 안되어있어 로그 확인 결과 매우 단순한 이유였습니다.

     

    수발신 로그 경로 중 발췌

    [root@localhost ~]# cat /var/log/maillog

    Aug 28 03:14:24 mail postfix/qmgr[1978]: 0DFD567: from=<test1@eztest.com>, size=662, nrcpt=1 (queue active)

    Aug 28 03:14:25 mail postfix/pipe[3204]: 0DFD567: to=<test2@eztest.com>,

    relay=dovecot, delay=1194, delays=1194/0.02/0/0.42, dsn=4.3.0, status=defeorary failure.

    Command output: lda(test2@eztest.com): Error: net_connect_unix(/var/run/dovecot/stats-writer) failed:

    Permission denied Can't open lar/log/dovecot.log: Permission denied)

    결과값에 대한 로그를 내보낼 때 dovecot.log 파일이 권한 때문에 Postfix가 제대로 처리를 하지 못 했던 문제였습니다.

    [root@mail log]# ls -al /var/log | grep dovecot
    -rw-------   1 root   root     33498  8월 28 03:26 dovecot.log

     

    [root@mail log]# chown vmail:dovecot /var/log/dovecot.log  (권한 수정)

    [root@mail log]# ls -al /var/log | grep dovecot
    -rw-------   1 vmail  dovecot   34208  8월 28 03:28 dovecot.log

     

    재시도

    수발신은 잘되는 것을 확인했습니다만 또 다른 에러 로그 확인

    [root@localhost ~]# cat /var/log/maillog

    (delivered via dovecot service (lda(test2@eztest.com):

    Error: net_connect_unix(/var/run/dovecot/stats-writer) failed: Permission den))

    이것도 역시 권한 문제로 확인됩니다. 다만 통계 데이터를 사용할 일은 없어서 무시해도 됩니다만 어떤 서비스든 사소한 에러 로그라도 없는 게 좋습니다.

     

    □권한 확인

    [root@localhost ~]# ls -al /var/run/dovecot/stats-writer
    srw-rw---- 1 root dovecot 0  8월 27 22:52 /var/run/dovecot/stats-writer

     

    [root@localhost ~]# chown vmail:dovecot /var/run/dovecot/stats-writer  (권한 수정)

    [root@mail log]# ls -al /var/run/dovecot/stats-writer

    srw-rw---- 1 vmail dovecot 0  8월 27 22:52 /var/run/dovecot/stats-writer

    최종 로그 확인(에러 없이 정상 발송)

    [root@localhost ~]# cat /var/log/maillog

    Aug 28 04:07:36 mail postfix/qmgr[1978]: BB07767: from=<test1@eztest.com>, size=828, nrcpt=1 (queue active)

    Aug 28 04:07:36 mail postfix/pipe[3849]: BB07767: to=<test2@eztest.com>,

    relay=dovecot, delay=0.24, delays=0.05/0.01/0/0.18, dsn=2.0.0, status=sent (delivered via dovecot service)

     

     

    마무리

    테스트까지 정상 작동되는 것이 확인되었습니다. 다만 테스트 시 주의해야 할 점은 인터넷이 되기 때문에 외부로 발송 시도는 가능합니다만 가상의 도메인이기 때문에 실제 외부[네이버/다음] 같은 기업끼리의 메일로 발송하게 되면 수신 거부하거나 계속 시도할 경우 스팸으로 인식하여 IP가 차단될 수 있으니 주의하시기 바랍니다. 물론 같은 내부 도메인끼리 주고받을 경우는 전혀 문제없습니다. 제가 직접 구매한 도메인으로 실서버에 세팅 후 외부 수발신이 되는지에 대해서는 따로 검증을 진행하려고 합니다. 메일서버는 이렇게 구성이 된다는 방법만 숙지해주시면 됩니다. 또한 지금은 웹메일에서의 작동만 확인을 했지만 마이크로소프트 아웃룩이나 썬더메일 같은 클라이언트를 이용해 POP/IMAP이 연결이 되는지도 테스트 예정입니다. 한 포스팅에 너무 많은 정보를 담을 경우 가독성이 떨어질 것으로 예상돼 다음 포스팅에 설명을 보충하도록 하겠습니다. 긴 글 읽느라 수고하셨습니다.

    Designed by JB FACTORY