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

    CentOS 8 메일서버 구축 건으로 생각보다 많은 분들이 찾아주시고 댓글에 도움을 요청하신 분들도 있으셨습니다. 제가 첫 작성 날이 2020년도인 만큼 시간이 많이 경과되었기 때문에 Rocky Linux에서도 동일하게 세팅을 했을 시에 작동을 하는지 확인해보도록 하겠습니다. 이번에는 좀 더 꼼꼼하게 확인하오니 스크린샷 압박에 주의해주시기 바랍니다. 달라진 점이나 업데이트해야 하는 부분은 따로 강조하겠습니다.

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

     

    [2022-06-01]

    진행하시다가 막히는 부분이 있다면 트러블슈팅(troubleshooting) 포스팅을 한번 읽어보시면 도움이 되실 것으로 생각 됩니다 : https://foxydog.tistory.com/105

     

    □ 오픈소스 솔루션 소개

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

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

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

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

    ■ [설치환경 및 준비물]
    릴리즈 설치 테스트 : 2022-05-26

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

    ※ Firewall 방화벽을 그대로 이용

    ※ 실제 운영중인 물리 서버(VMware)에 공인 IP를 할당하여 서버를 구축합니다.

    서버준비 Rocky Linux 설치 서버 [포스팅 참고]
    ※ 포스팅은 8.5지만 최근 8.6이 나왔습니다.
    OS Version Rocky Linux release 8.6 (Green Obsidian)
    커널(Kernel) 4.18.0-372.9.1.el8.x86_64
    postfix 3.5.8
    dovecot 2.3.16
    DB MariaDB 10.6 [포스팅 참고]
    ※ 수명이 가장 긴 10.6 버전을 설치하는게 좋습니다.
    Web Apache 2.4.37 / PHP 7.4.19
    Webmail RoundCube 1.5.2

    ■진행 순서


    STEP01 - Rocky Linux 설치 후 준비 과정

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

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

    [root@localhost ]# dnf update

     

    1-2 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 호스트 등록

    본인이 가지고 있는 도메인을 호스트로 등록합니다. 아래는 제가 실제 구입한 도메인입니다. 추 후 외부에서 메일을 수신받기 위한 서버 이름이라고 생각하시면 됩니다.

    [root@localhost ~]# hostnamectl set-hostname mail.foxydog.co.kr
    [root@localhost ~]# hostname
    mail.foxydog.co.kr  [적용 확인]

     

    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 버전 설치

    CentOS 8 에서는 Remi 저장소를 이용했지만 Rocky Linux AppStream는 자체 저장소에서도 선택을 할 수 있습니다.

    [root@localhost ~]# dnf module list php  [사용 가능한 PHP 버전 확인]

    [root@localhost ~]# dnf module enable php:7.4  [PHP 7.4 모듈을 사용하기 위한 활성화 및 디폴트 설정]

    ※ 모듈 스트림 활성화 메시지가 나오면 [Y/N]: Y  진행하기

    [root@localhost ~]# dnf install php  [PHP 7.4 설치]

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

    ※ RoundCube에서 php-intl 추가로 설치되어야 진행이 가능합니다.


    STEP03 - MariaDB 설치 및 구성하기

    ※버전별 세팅 방법[스크린샷 참고]
    https://downloads.mariadb.org/mariadb/repositories/#mirror=yongbok
    Rocky는 호환되는 CentOS/Redhat 패키지 설치 방법을 따라가면 됩니다.

    ※ 서버를 새로 구축을 한다면 수명이 긴 [10.6] 버전으로 설치하는 게 가장 좋습니다.

     

     

    3-1 MariaDB 10.6 버전 설치

    먼저 YUM 저장소 생성[파일 생성 후 저장]

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

    # MariaDB 10.6 RedHat repository list - created  UTC

    https://mariadb.org/download/

    [mariadb]

    name = MariaDB

    baseurl = https://mirror.yongbok.net/mariadb/yum/10.6/rhel8-amd64

    module_hotfixes=1

    gpgkey=https://mirror.yongbok.net/mariadb/yum/RPM-GPG-KEY-MariaDB

    gpgcheck=1

    [root@localhost ~]# dnf install MariaDB  [설치]

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

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

    [root@localhost ~]# ps -ef | grep mariadbd  [구동 확인]

    mysql       4356       1  2 09:56 ?        00:00:00 /usr/sbin/mariadbd

    [root@localhost ~]# mariadb-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 foxydog@localhost identified by 'test123';

    □ 서버에 도메인을 저장할 테이블 만들기 [전체한 줄]
    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;

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

    □ 구입한 도메인 입력[foxydog.co.kr]
    MariaDB [(none)]> INSERT INTO `postfix_accounts`.`domains_table` (DomainName) VALUES ('foxydog.co.kr');

     

    □ 첫 번째 계정 생성[foxydog@foxydog.co.kr]
    MariaDB [(none)]> INSERT INTO `postfix_accounts`.`accounts_table` (DomainId, password, Email) VALUES (1, ENCRYPT('test123', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'foxydog@foxydog.co.kr');

     

    □ 두 번째 계정 생성[foxydog2@foxydog.co.kr]
    MariaDB [(none)]> INSERT INTO `postfix_accounts`.`accounts_table` (DomainId, password, Email) VALUES (1, ENCRYPT('test123', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'foxydog2@foxydog.co.kr');

     

    □ 별칭 계정 생성 [foxydogsub@eztest.com ▷ foxydog@foxydog.co.kr]
    MariaDB [(none)]> INSERT INTO `postfix_accounts`.`alias_table` (DomainId, Source, Destination) VALUES (1, 'foxydogsub@foxydog.co.kr', 'foxydog@foxydog.co.kr');

    ※ 데이터가 제대로 입력되었는지 확인[스크린샷 대체]

    □ 나중에 설치할 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    [#주석 제거]

     

       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.foxydog.co.kr    [추가]

    104 mydomain = foxydog.co.kr    [추가]

    120 myorigin = $mydomain    [#주석 제거]

    134 inet_interfaces = all    [#주석 제거, 또는 변경]

    140 inet_protocols = all    [기본 설정]

    186 mydestination = localhost    [변경]

    441 home_mailbox = Maildir/    [#주석 제거]

    712 #smtpd_tls_cert_file = /etc/pki/tls/certs/postfix.pem    [#주석 처리]

    718 #smtpd_tls_key_file = /etc/pki/tls/private/postfix.key    [#주석 처리]

    723 smtpd_tls_security_level = may    [기본 설정]

    739 smtp_tls_security_level = may    [기본 설정]


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

    743 smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination

    744 message_size_limit = 4194304

    745 append_dot_mydomain = no

    746 biff = no

    748 smtpd_use_tls = yes

    749 smtpd_tls_cert_file = /etc/pki/dovecot/certs/dovecot.pem

    750 smtpd_tls_key_file = /etc/pki/dovecot/private/dovecot.pem

    751 smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

    752 smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

    753 smtpd_sasl_path = private/auth

    754 smtpd_sasl_type = dovecot

    756 config_directory = /etc/postfix

    757 virtual_transport = dovecot

     

    □ 마지막으로 STEP03 데이터베이스에 저장한 정보를 Postfix 액세스 권한 부여하는 구성 [추가]

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

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

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

     

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

    □ 도메인 엑세스

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

    user = foxydog
    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 = foxydog
    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 = foxydog
    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*
    [root@localhost ~]# chown root:postfix /etc/postfix/database*

    [root@localhost ~]# ls -al /etc/postfix/ | grep database  [적용 확인]
    -rw-r-----    1 root postfix   144  5월 26 22:54 database-alias.cf
    -rw-r-----    1 root postfix   140  5월 26 22:54 database-domains.cf
    -rw-r-----    1 root postfix   136  5월 26 22:54 database-users.cf

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

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

    [root@localhost ~]# ps -ef |grep postfix  [프로세스 구동 확인]
    root        6676       1  0  5월26 ?      00:00:00 /usr/libexec/postfix/master -w
    postfix     6678    6676  0  5월26 ?      00:00:00 qmgr -l -t unix -u
    postfix     6754    6676  0 00:36 ?        00:00:00 pickup -l -t unix -u

     

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

     

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

    [root@localhost postfix]# postmap -q foxydog.co.kr mysql:/etc/postfix/database-domains.cf
    1

     

    [root@localhost postfix]# postmap -q foxydog@foxydog.co.kr mysql:/etc/postfix/database-users.cf
    1

     

    [root@localhost postfix]# postmap -q foxydog2@foxydog.co.kr mysql:/etc/postfix/database-users.cf
    1

     

    [root@localhost postfix]# postmap -q foxydogsub@foxydog.co.kr mysql:/etc/postfix/database-alias.cf
    foxydog@foxydog.co.kr


    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 = *, ::    [#주석 제거]

     97 !include conf.d/*.conf    [기본 설정]

    101 !include_try local.conf    [기본 설정]

    103 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 = no    [#주석 제거 후 변경]

    100 auth_mechanisms = plain login    [추가]

    122 #i!include auth-system.conf.ext    [#주석 처리]

    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/foxydog.co.kr

     

    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=foxydog 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 {

     22     #port = 993

     23     #ssl = yes

     24   }

     36 }

     

     38 service pop3-login {

     39   inet_listener pop3 {

     40     port = 110    [#주석 제거]

     41   }

     42   inet_listener pop3s {

     43     #port = 995

     44     #ssl = yes

     45   }

     46 }

     

    □ submission은 Postfix에서 이미 사용 중으로 포트 충돌을 막기 위해 주석[#] 처리

     48 #service submission-login {

     49 #  inet_listener submission {

     50     #port = 587

     51 #  }

     52 #}

     

     54 service lmtp {

     55   unix_listener lmtp {

     56     mode = 0666    [#주석 제거]

     57       user = postfix    [추가]

     58       group = postfix    [추가]

     59   }

     

     88 service auth {

    102   unix_listener auth-userdb {

    103     mode = 0666    [#주석 제거]

    104     user = vmail    [#주석 제거 후 추가]

    106   }

     

    109   unix_listener /var/spool/postfix/private/auth {    [#주석 제거]

    110     mode = 0666    [#주석 제거]

    111       user = postfix    [추가]

    112       group = postfix    [추가]

    113   }

    114   user = dovecot    [추가]

    117 }

     

    119 service auth-worker {

    123   user = vmail    [#주석 제거 후 변경]

    124 }

     

    126 service dict {

    129   unix_listener dict {

    133   }

    134 }

     

    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-11 vmail 권한 설정

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

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

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

    drwxr-xr-x  2 vmail vmail 4096  5월 27 04:00 foxydog.co.kr 

     

    [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  5월 27 04:18 dovecot

     

    [root@localhost ~]# chown vmail:dovecot /var/log/dovecot.log

    [root@localhost ~]# ls -al /var/log | grep dovecot

    -rw-------   1 vmail  dovecot     114  5월 27 09:08 dovecot.log

     

    [root@localhost ~]# chown vmail:dovecot /var/run/dovecot/stats-writer

    [root@localhost ~]# ls -al /var/run/dovecot/stats-writer

    srw-rw---- 1 vmail dovecot 0  5월 27 09:08 /var/run/dovecot/stats-writer

     

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

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

    [root@localhost ~]# systemctl status dovecot | grep Active  [Active 정상 구동]

       Active: active (running) since Fri 2022-05-27 09:08:05 EDT; 3s ago

     

    [root@mail ~]# ps -ef | grep dovecot  [프로세스 구동 확인]

    root        7890       1  0 09:08 ?        00:00:00 /usr/sbin/dovecot -F

    dovecot     7891    7890  0 09:08 ?        00:00:00 dovecot/anvil

    root        7892    7890  0 09:08 ?        00:00:00 dovecot/log

    root        7893    7890  0 09:08 ?        00:00:00 dovecot/config


    STEP06 - RoundCube 설치 및 구성

    공식 사이트 : https://roundcube.net/

    ※ 공식 홈페이지에서 최신 파일 다운, [2022-05-26] 기준으로 [1.5.2] 버전 설치

     

    6-1 RoundCube 다운 및 경로 설정[버전이 올라가면 숫자만 변경]

    [root@localhost ~]# wget https://github.com/roundcube/roundcubemail/releases/download/1.5.2/roundcubemail-1.5.2-complete.tar.gz  [한 줄 명령어/다운]

    2022-05-27 09:23:30 (22.4 MB/s) - ‘roundcubemail-1.5.2-complete.tar.gz’ saved [7852981/7852981]

     

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

    [root@localhost ~]# mv roundcubemail-1.5.2 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 12월 29 17:31 roundcube

    [root@localhost ~]# systemctl restart httpd  [웹 서버스 재시작]
    [root@localhost ~]# ps -ef |grep httpd  [프로세스 구동 확인]
    root        7947       1  1 09:25 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
    apache      7954    7947  0 09:25 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
    apache      7955    7947  0 09:25 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
    apache      7956    7947  0 09:25 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
    apache      7962    7947  0 09:25 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND

     

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

    [root@localhost ~]# firewall-cmd --permanent --add-port=80/tcp --add-port=25/tcp --add-port=587/tcp --add-port=110/tcp --add-port=143/tcp  [전체 한 줄]

    success

     

    [root@localhost ~]# firewall-cmd --reload  [실시간 적용]

    success

     

    [root@localhost ~]# firewall-cmd --list-all | grep ports  [적용 확인]

      ports: 80/tcp 25/tcp 587/tcp 110/tcp 143/tcp

     

    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  2596  5월 27 10:10 config.inc.php

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

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

     65 $config['default_host'] = 'localhost';    [기본 설정]

     71 $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@localhost ~]# rm -rf /var/www/html/roundcube/installer/

     

    6-9 ◆네임서버 설정 [중요]

    ※ 서버 네임을 IP로 세팅하여도 발송은 가능합니다. 하지만 수신의 경우는 같은 내부 도메인끼리는 주고받을 수 있지만 완전 외부에서 메일을 수신받기 위해서는 도메인 네임서버에 MX값 수신을 받을 수 있는 레코드를 등록을 필수로 해야 합니다. 아래는 등록 예시 입니다.


    STEP07 - 최종 메일 테스트

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

    □ RoundCube 로그인 로그[dovecot.log]

    [root@localhost ~]# tail -f /var/log/dovecot.log

    May 27 19:19:20 imap-login: Info: Login: user=<foxydog@foxydog.co.kr>, method=PLAIN  [로그인 성공]

     

    May 27 19:21:09 imap-login: Info: Disconnected: Connection closed (auth failed, 1 attempts in 2 secs): user=<foxydog@foxydog.co.kr>, method=PLAIN    [로그인 실패]

     

    ■ 송신 테스트

     

    ■ 수신 테스트

     

    ■ 수신[별칭 계정] 테스트

    foxydogsub@foxydog.co.kr 계정은 별칭 계정으로 메일 박스가 있는 계정이 아닙니다. 하지만 해당 계정으로 수신 받을 시 메일 박스가 있는 foxydog@foxydog.co.kr 라는 계정으로 전달을 합니다.

    [root@localhost ~]# tail -f /var/log/maillog

     

    발송 로그

    May 28 05:26:32 foxydog-server postfix/qmgr[6678]: CE707809C8: from=<foxydog@foxydog.co.kr>, size=670, nrcpt=1 (queue active)

     

    May 28 05:26:33 foxydog-server postfix/smtp[10651]: CE707809C8: to=<네이버ID@naver.com>, relay=mx3.naver.com[125.209.222.14]:25, delay=0.56, delays=0.08/0.07/0.06/0.35, dsn=2.0.0, status=sent (250 2.0.0 OK 00S0-lrhQHOWV9+oov47Ig - nsmtp)    상태=발송 : 250 2.0.0 OK 발송이 성공되었다는 메시지

    수신 로그

    May 28 05:32:00 foxydog-server postfix/qmgr[6678]: 36CA780D97: from=<네이버ID@naver.com>, size=3486, nrcpt=1 (queue active)

     

    May 28 05:32:00 foxydog-server postfix/pipe[10699]: 36CA780D97: to=<foxydog@foxydog.co.kr>, relay=dovecot, delay=0.15, delays=0.06/0.02/0/0.07, dsn=2.0.0, status=sent (delivered via dovecot service)      상태=발송(Dovecot) : 250 2.0.0 OK 수신이 성공되었다는 메시지

     

    수신(별칭 계정) 로그

    May 28 05:36:00 foxydog-server postfix/qmgr[6678]: 9B01D80D97: from=<네이버ID@naver.com>, size=2474, nrcpt=1 (queue active)

     

    May 28 05:36:00 foxydog-server postfix/pipe[10720]: 9B01D80D97: to=<foxydog@foxydog.co.kr>, orig_to=<foxydogsub@foxydog.co.kr>, relay=dovecot, delay=0.14, delays=0.05/0.02/0/0.06, dsn=2.0.0, status=sent (delivered via dovecot service)    상태=발송(Dovecot) : 250 2.0.0 OK 수신이 성공되었다는 메시지(별칭 계정은 orig_to 메시지로 찍히네요)


    [추가내용 : 2022-05-31] - 메일 클라이언트 세팅 확인

    프로그램은 개인적으로 구독하고 있는 오피스 365 [마이크로소프트 아웃룩]을 이용 하도록 하겠습니다.

    ◇ POP3[110] / SMTP[587] 연결

    [root@mail ~]# tail -f /var/log/dovecot.log

    May 30 21:33:25 pop3-login: Info: Login: user=<foxydog@foxydog.co.kr>, method=PLAIN, rip=접속IP, lip=서버IP, mpid=19356, session=<세션ID>  [POP3 로그인 성공]

     

    May 30 21:36:22 pop3-login: Info: Disconnected: Connection closed (auth failed, 1 attempts in 2 secs): user=<foxydog@foxydog.co.kr>, method=PLAIN, rip=접속IP, lip=서버IP, session=<세션ID>  [POP3 로그인 실패]

     

    ◇ IMAP[143] / SMTP[587] 연결

    [root@mail ~]# tail -f /var/log/dovecot.log

    May 30 22:10:33 imap-login: Info: Login: user=<foxydog@foxydog.co.kr>, method=PLAIN, rip=접속IP, lip=서버IP, mpid=19455, session=<세션ID>  [IMAP 로그인 성공]

     

    May 30 22:26:07 imap-login: Info: Disconnected: Connection closed (auth failed, 1 attempts in 2 secs):ser=<foxydog@foxydog.co.kr>, method=PLAIN, rip=접속IP, lip=서버IP, session=<세션ID>  [IMAP 로그인 실패]

     

    ※ 추가로 외부로 메일 발송하기 위해서는 아웃룩에서 꼭 [보내는 메일 서버(SMTP) 인증 필요] 체크가 되어 있어야 합니다. 필수!

    Dovecot / Postfix를 통해 POP3 / IMAP 연결도 잘 되네요.


    마치며

    오랜만에 메일서버를 재 구축을 해보았네요. 이전 내용을 비교해가면서 작성을 했는데 그 당시에는 처음이라 오타나 잘못된 이미지가 조금 있었습니다. 그래서 이번에 STEP별로 VMware 스냅샷 기능을 이용해 일일이 테스트하여 최대한 오류 없게 진행하였습니다. 그대로 따라만 해도 문제없을 것으로 생각됩니다. 상황별로 실수 할 수 있는 부분은 트러블슈팅(troubleshooting) 포스팅을 참고해 주시기 바랍니다.

    Designed by JB FACTORY