서버 구성 · 5 min read · Jan 10, 2026
Postfix, Courier, MySQL 및 SquirrelMail을 이용한 가상 사용자 및 도메인 (Fedora 12 x86_64) - 페이지 2
6 MySQL 비밀번호 설정 및 phpMyAdmin 구성
MySQL 시작:
chkconfig --levels 235 mysqld on
/etc/init.d/mysqld start그런 다음 MySQL 루트 계정의 비밀번호를 설정합니다:
mysqladmin -u root password yourrootsqlpassword
mysqladmin -h server1.example.com -u root password yourrootsqlpassword이제 phpMyAdmin을 구성합니다. phpMyAdmin이 localhost에서만 연결을 허용하도록 Apache 구성을 변경합니다 (
vi /etc/httpd/conf.d/phpMyAdmin.conf| # phpMyAdmin - php로 작성된 웹 기반 MySQL 브라우저 # # 기본적으로 localhost만 허용 # # 그러나 phpMyAdmin을 localhost 이외의 누구에게나 허용하는 것은 # SSL로 적절히 보호되지 않는 한 위험하다고 간주해야 합니다. Alias /phpMyAdmin /usr/share/phpMyAdmin Alias /phpmyadmin /usr/share/phpMyAdmin # |
그런 다음 Apache의 시스템 시작 링크를 생성하고 시작합니다:
chkconfig --levels 235 httpd on
/etc/init.d/httpd start이제 브라우저를 http://server1.example.com/phpMyAdmin/ 또는 http://192.168.0.100/phpMyAdmin/로 이동하여 사용자 이름 root와 새 루트 MySQL 비밀번호로 로그인할 수 있습니다.
7 Postfix/Courier용 MySQL 데이터베이스 생성
mail이라는 데이터베이스를 생성합니다:
mysqladmin -u root -p create mail다음으로 MySQL 셸로 이동합니다:
mysql -u root -pMySQL 셸에서 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 bigint(20) 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 셸을 종료하고 Linux 셸로 돌아왔습니다.
domains 테이블은 Postfix가 이메일을 수신해야 하는 각 가상 도메인을 저장합니다 (예: example.com).
| domain |
| example.com |
forwardings 테이블은 한 이메일 주소를 다른 주소로 별칭하는 데 사용됩니다. 예를 들어 [email protected]의 이메일을 [email protected]로 전달합니다.
| source | destination |
| [email protected] | [email protected] |
users 테이블은 모든 가상 사용자(즉, 이메일 주소, 이메일 주소와 사용자 이름이 동일함)와 비밀번호( 암호화된 형태!) 및 각 메일 박스의 쿼타 값을 저장합니다 (이 예제에서 기본 값은 10485760 바이트로 10MB를 의미합니다).
| password | quota | |
| [email protected] | No9.E4skNvGa. (암호화된 형태의 “비밀“) | 10485760 |
transport 테이블은 선택 사항이며, 고급 사용자용입니다. 단일 사용자, 전체 도메인 또는 모든 메일을 다른 서버로 전달할 수 있습니다. 예를 들어,
| domain | transport |
| example.com | smtp:[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_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 = "연결하려는 사용자가 쿼타를 초과했습니다."'
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자리 코드) [XX]: <– 국가 이름 입력 (예: “DE”).
주 또는 지방 이름 (전체 이름) []: <– 주 또는 지방 이름 입력.
지역 이름 (예: 도시) [기본 도시]: <– 도시 입력.
조직 이름 (예: 회사) [기본 회사]: <– 조직 이름 입력 (예: 회사 이름).
조직 단위 이름 (예: 섹션) []: <– 조직 단위 이름 입력 (예: “IT 부서”).
공통 이름 (예: 이름 또는 서버의 호스트 이름) []: <– 시스템의 완전한 도메인 이름 입력 (예: “server1.example.com”).
이메일 주소 []: <– 이메일 주소 입력.
그런 다음 smtpd.key의 권한을 변경합니다:
chmod o= /etc/postfix/smtpd.key새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.