Postfix 설정 · 5 min read · Oct 10, 2025

Postfix, Courier 및 MySQL을 사용한 가상 사용자 및 도메인 (CentOS 5.1) - 페이지 2

7 MySQL 데이터베이스 생성하기 (Postfix/Courier)

우리는 mail이라는 데이터베이스를 생성합니다:

mysqladmin -u root -p create mail

다음으로, MySQL 셸로 이동합니다:

mysql -u root -p

MySQL 셸에서, mail 데이터베이스에 대해 SELECT, INSERT, UPDATE, DELETE 권한을 가진 사용자 mail_admin을 생성합니다. 이 사용자는 Postfix와 Courier가 메일 데이터베이스에 연결하는 데 사용됩니다:

GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost' IDENTIFIED BY 'mail_admin_password';  
GRANT SELECT, INSERT, UPDATE, DELETE ON mail.* TO 'mail_admin'@'localhost.localdomain' IDENTIFIED BY 'mail_admin_password';  
FLUSH PRIVILEGES;

여전히 MySQL 셸에서, Postfix와 Courier가 필요로 하는 테이블을 생성합니다:

USE mail;
CREATE TABLE domains (  
domain varchar(50) NOT NULL,  
PRIMARY KEY (domain) )  
TYPE=MyISAM;
CREATE TABLE forwardings (  
source varchar(80) NOT NULL,  
destination TEXT NOT NULL,  
PRIMARY KEY (source) )  
TYPE=MyISAM;
CREATE TABLE users (  
email varchar(80) NOT NULL,  
password varchar(20) NOT NULL,  
quota INT(10) DEFAULT '10485760',  
PRIMARY KEY (email)  
) TYPE=MyISAM;
CREATE TABLE transport (  
domain varchar(128) NOT NULL default '',  
transport varchar(128) NOT NULL default '',  
UNIQUE KEY domain (domain)  
) TYPE=MyISAM;
quit;

여러분이 알아차렸듯이, quit; 명령어로 우리는 MySQL 셸을 나와 리눅스 셸로 돌아왔습니다.

domains 테이블은 Postfix가 이메일을 수신해야 하는 각 가상 도메인을 저장합니다 (예: example.com).

domain
example.com

forwardings 테이블은 하나의 이메일 주소를 다른 주소로 별칭을 붙이는 데 사용됩니다. 예를 들어, [email protected]의 이메일을 [email protected]로 전달합니다.

sourcedestination
[email protected][email protected]

users 테이블은 모든 가상 사용자(즉, 이메일 주소, 이메일 주소와 사용자 이름이 동일하기 때문에)와 비밀번호( 암호화된 형태!) 및 각 메일 박스에 대한 쿼터 값을 저장합니다 (이 예제에서 기본 값은 10485760 바이트로, 이는 10MB를 의미합니다).

emailpasswordquota
[email protected]No9.E4skNvGa. (암호화된 형태의 “비밀“)10485760

transport 테이블은 선택 사항이며, 고급 사용자용입니다. 이는 단일 사용자, 전체 도메인 또는 모든 메일을 다른 서버로 전달할 수 있게 해줍니다. 예를 들어,

domaintransport
example.comsmtp:[1.2.3.4]

example.com의 모든 이메일을 smtp 프로토콜을 통해 IP 주소 1.2.3.4의 서버로 전달합니다 (대괄호 []는 “MX DNS 레코드를 조회하지 않음”을 의미합니다 (IP 주소에 대해 의미가 있습니다…). 완전한 도메인 이름(FQDN)을 대신 사용하면 대괄호를 사용하지 않습니다.).

8 Postfix 구성하기

이제 Postfix에 데이터베이스에서 모든 정보를 찾을 수 있는 위치를 알려줘야 합니다. 따라서 여섯 개의 텍스트 파일을 생성해야 합니다. Postfix에 localhost 대신 IP 주소 127.0.0.1에 연결하도록 지시하는 것을 알 수 있습니다. 이는 Postfix가 chroot 감옥에서 실행되고 MySQL 소켓에 접근할 수 없기 때문입니다. 만약 Postfix에 localhost를 사용하라고 지시하면 MySQL 소켓에 연결하려고 시도합니다. 127.0.0.1을 사용하면 Postfix는 TCP 네트워킹을 사용하여 MySQL에 연결하며, 이는 chroot 감옥에서도 문제가 없습니다 (대안은 MySQL 소켓을 chroot 감옥으로 이동하는 것이며, 이는 다른 문제를 일으킵니다).

이제 여섯 개의 텍스트 파일을 생성해 봅시다.

vi /etc/postfix/mysql-virtual_domains.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_forwardings.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailboxes.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_email2email.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_transports.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |

chmod o= /etc/postfix/mysql-virtual_*.cf  
chgrp postfix /etc/postfix/mysql-virtual_*.cf

이제 우리는 vmail이라는 사용자와 그룹을 생성하고 홈 디렉토리를 /home/vmail로 설정합니다. 여기서 모든 메일 박스가 저장됩니다.

groupadd -g 5000 vmail  
useradd -g vmail -u 5000 vmail -d /home/vmail -m

다음으로 Postfix 구성을 진행합니다. 반드시 server1.example.com을 유효한 FQDN으로 교체해야 합니다. 그렇지 않으면 Postfix가 제대로 작동하지 않을 수 있습니다!

postconf -e 'myhostname = server1.example.com'  
postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'  
postconf -e 'mynetworks = 127.0.0.0/8'  
postconf -e 'virtual_alias_domains ='  
postconf -e ' virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'  
postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'  
postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'  
postconf -e 'virtual_mailbox_base = /home/vmail'  
postconf -e 'virtual_uid_maps = static:5000'  
postconf -e 'virtual_gid_maps = static:5000'  
postconf -e 'smtpd_sasl_auth_enable = yes'  
postconf -e 'broken_sasl_auth_clients = yes'  
postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'  
postconf -e 'smtpd_use_tls = yes'  
postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'  
postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'  
postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'  
postconf -e 'virtual_create_maildirsize = yes'  
postconf -e 'virtual_maildir_extended = yes'  
postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'  
postconf -e 'virtual_mailbox_limit_override = yes'  
postconf -e 'virtual_maildir_limit_message = "The user you are trying to reach is over quota."'  
postconf -e 'virtual_overquota_bounce = yes'  
postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'  
postconf -e 'inet_interfaces = all'

그 후, TLS에 필요한 SSL 인증서를 생성합니다:

cd /etc/postfix  
openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509

국가 이름 (2자리 코드) [GB]: <– 귀하의 국가 이름을 입력하십시오 (예: “DE”).
주 또는 지방 이름 (전체 이름) [Berkshire]: <– 귀하의 주 또는 지방 이름을 입력하십시오.
지역 이름 (예: 도시) [Newbury]: <– 귀하의 도시를 입력하십시오.
조직 이름 (예: 회사) [My Company Ltd]: <– 귀하의 조직 이름을 입력하십시오 (예: 귀하의 회사 이름).
조직 단위 이름 (예: 부서) []: <– 귀하의 조직 단위 이름을 입력하십시오 (예: “IT 부서”).
공통 이름 (예: 귀하의 이름 또는 서버의 호스트 이름) []: <– 시스템의 완전한 도메인 이름을 입력하십시오 (예: “server1.example.com”).
이메일 주소 []: <– 귀하의 이메일 주소를 입력하십시오.

그런 다음 smtpd.key의 권한을 변경합니다:

chmod o= /etc/postfix/smtpd.key

9 Saslauthd 구성하기

/usr/lib/sasl2/smtpd.conf를 편집합니다. 다음과 같아야 합니다:

vi /usr/lib/sasl2/smtpd.conf

| pwcheck_method: authdaemond log_level: 3 mech_list: PLAIN LOGIN authdaemond_path:/var/spool/authdaemon/socket |

그런 다음 Sendmail을 끄고 Postfix, saslauthd 및 courier-authlib를 시작합니다:

chmod 755 /var/spool/authdaemon  
chkconfig --levels 235 courier-authlib on  
/etc/init.d/courier-authlib start
chkconfig --levels 235 sendmail off  
chkconfig --levels 235 postfix on  
chkconfig --levels 235 saslauthd on  
/etc/init.d/sendmail stop  
/etc/init.d/postfix start  
/etc/init.d/saslauthd start

10 Courier 구성하기

이제 Courier에 MySQL 데이터베이스에 대해 인증해야 한다고 알려줘야 합니다. 먼저 /etc/authlib/authdaemonrc를 편집하고 authmodulelist의 값을 다음과 같이 변경합니다:

vi /etc/authlib/authdaemonrc

| [...] authmodulelist="authmysql" #authmodulelist="authuserdb authpam authpgsql authldap authmysql authcustom authpipe" [...] |

그런 다음 /etc/authlib/authmysqlrc를 편집합니다. 다음과 같아야 합니다 (다시 한 번, 올바른 데이터베이스 세부정보를 입력해야 합니다):

cp /etc/authlib/authmysqlrc /etc/authlib/authmysqlrc_orig  
cat /dev/null > /etc/authlib/authmysqlrc  
vi /etc/authlib/authmysqlrc

| MYSQL_SERVER localhost MYSQL_USERNAME mail_admin MYSQL_PASSWORD mail_admin_password MYSQL_PORT 0 MYSQL_DATABASE mail MYSQL_USER_TABLE users MYSQL_CRYPT_PWFIELD password #MYSQL_CLEAR_PWFIELD password MYSQL_UID_FIELD 5000 MYSQL_GID_FIELD 5000 MYSQL_LOGIN_FIELD email MYSQL_HOME_FIELD "/home/vmail" MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') #MYSQL_NAME_FIELD MYSQL_QUOTA_FIELD quota |

그런 다음 Courier를 재시작합니다:

chkconfig --levels 235 courier-imap on  
/etc/init.d/courier-authlib restart  
/etc/init.d/courier-imap restart

다음 명령어를 실행하여

telnet localhost pop3

POP3 서버가 제대로 작동하는지 확인할 수 있습니다. +OK Hello there .를 반환해야 합니다 (리눅스 셸로 돌아가려면 quit를 입력하십시오):

[root@server1 postfix]# telnet localhost pop3  
Trying 127.0.0.1...  
Connected to localhost.localdomain (127.0.0.1).  
Escape character is '^]'.  
+OK Hello there.  
quit  
+OK Better luck next time.  
Connection closed by foreign host.  
[root@server1 postfix]#
Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.