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

CentOS 8

MailServer With Postfix, Dovecot, MariaDB And Roundcube Install

단순히 [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이 연결이 되는지도 테스트 예정입니다. 한 포스팅에 너무 많은 정보를 담을 경우 가독성이 떨어질 것으로 예상돼 다음 포스팅에 설명을 보충하도록 하겠습니다. 긴 글 읽느라 수고하셨습니다.

이 글을 공유하기

댓글(0)

Designed by JB FACTORY