Postfix 설정 · 6 min read · Jan 11, 2026

Postfix, Courier, MySQL 및 SquirrelMail을 이용한 가상 사용자 및 도메인 (Mandriva 2010.0 x86_64) - 페이지 2

5 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가 mail 데이터베이스에 연결하는 데 사용됩니다:

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)을 대신 사용하면 대괄호를 사용하지 않습니다.).

6 Postfix 구성하기

이제 Postfix에 데이터베이스에서 모든 정보를 찾을 수 있는 위치를 알려줘야 합니다. 따라서 우리는 여섯 개의 텍스트 파일을 생성해야 합니다. Postfix에 localhost 대신 IP 주소 127.0.0.1에 연결하도록 지시하는 것을 알 수 있습니다. 이는 Postfix가 chroot 감옥에서 실행되고 MySQL 소켓에 접근할 수 없기 때문입니다. 만약 Postfix에 localhost를 사용하라고 지시하면 연결을 시도할 것입니다. 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_sasl_authenticated_header = 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'  
postconf -e 'alias_database = hash:/etc/postfix/aliases'  
postconf -e 'alias_maps = hash:/etc/postfix/aliases'

그 후, 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

7 Saslauthd 구성하기

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

vi /etc/sasl2/smtpd.conf

| # postfix를 위한 SASL 라이브러리 구성 파일 # 모든 매개변수는 다음에 문서화되어 있습니다: # /usr/share/doc/cyrus-sasl/options.html # mech_list 매개변수는 사용할 sasl 메커니즘을 나열합니다, # 기본값은 발견된 모든 메커니즘입니다. #mech_list: plain login # 별도의 saslauthd 데몬을 사용하여 인증하려면 (예: # 시스템 또는 ldap 사용자). /etc/sysconfig/saslauthd도 참조하십시오. #pwcheck_method: saslauthd #saslauthd_path: /var/lib/sasl2/mux # sasldb에 저장된 사용자에 대해 인증합니다. #pwcheck_method: auxprop #auxprop_plugin: sasldb #sasldb_path: /var/lib/sasl2/sasl.db pwcheck_method: authdaemond log_level: 3 mech_list: PLAIN LOGIN authdaemond_path:/var/lib/authdaemon/socket |

그런 다음 Postfix에 대한 시스템 시작 링크를 생성하고 Postfix, saslauthd 및 courier-authdaemon을 시작합니다:

chmod 755 /var/lib/authdaemon  
chkconfig postfix on  
/etc/init.d/courier-authdaemon start  
/etc/init.d/postfix restart  
/etc/init.d/saslauthd start

8 Courier 구성하기

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

vi /etc/courier/authdaemonrc

| [...] authmodulelist="authmysql" #authmodulelist="authpam authpwd authshadow" [...] |

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

cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig  
cat /dev/null > /etc/courier/authmysqlrc  
vi /etc/courier/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를 재시작합니다:

/etc/init.d/courier-authdaemon restart  
/etc/init.d/courier-imapd restart  
/etc/init.d/courier-pop3d 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

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

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