도메인 이름과 서버 보유를 전제로 Postfix + Dovecot + Roundcube + LEMP 스택을 기반으로 이메일 시스템을 구축합니다.
머리말
Postfix: Postfix는 주로 이메일 전송 및 라우팅에 사용되는 메일 전송 에이전트(MTA)입니다. SMTP(Simple Mail Transfer Protocol) 프로토콜을 사용하여 이메일을 수신, 전송 및 라우팅하고 포트 25(SMTP), 465(SMTP 보안) 및 587(SMTP 제출)을 수신합니다. Postfix는 외부 메일 서버는 물론 Dovecot과 같은 로컬 메일 배달 에이전트와 통신하기 위한 인터페이스를 제공합니다.
Dovecot: Dovecot은 사용자의 이메일을 저장하고 전달하는 보안 메일 배달 에이전트(MDA)입니다. 이는 IMAP(Internet Message Access Protocol) 및 POP3(Post Office Protocol 버전 3) 프로토콜을 지원하며 포트 143(IMAP) 및 110(POP3)에서 수신 대기합니다. Dovecot은 이메일 수신을 위한 인터페이스를 제공하여 사용자가 이러한 프로토콜을 통해 받은 편지함에 액세스하고 관리할 수 있도록 합니다.
Roundcube: Roundcube는 이메일 액세스 및 관리를 위한 웹 기반 메일 클라이언트입니다. 사용자가 웹 브라우저를 통해 이메일을 보내고 받고 정리할 수 있는 직관적이고 사용하기 쉬운 인터페이스를 제공합니다. Roundcube는 IMAP 및 SMTP를 포함한 여러 이메일 프로토콜을 지원하며 다양한 이메일 서버와 통합될 수 있습니다. 이메일 검색, 필터링, 정리를 위한 강력한 기능을 갖추고 있으며 다국어 인터페이스와 플러그인 확장을 지원합니다.
LEMP 스택: LEMP 스택(Linux, Nginx, MySQL/MariaDB, PHP)을 결합하면 강력한 웹 애플리케이션 개발 및 호스팅 환경이 됩니다. Nginx는 빠르고 안정적인 웹 서버와 역방향 프록시 기능을 제공하고, MySQL 또는 MariaDB는 안정적인 데이터베이스 스토리지를 제공하며, PHP-FPM은 PHP 스크립트를 처리하여 강력한 웹 애플리케이션을 구축할 수 있도록 해줍니다. 전체 스택은 Linux 운영 체제에서 실행되므로 안정성과 보안이 보장됩니다.
편지를 보내고 받는 일반적인 과정은 다음과 같습니다.
1. 도메인 이름 및 서버
이 문서의 예제 도메인 이름은 a.com을 사용하고 도메인 이름의 A 및 MX 레코드가 구성되었습니다. 예제 서버 OS는 Ubuntu 20.04 LTS x64이고 IP는 1.2.3.4를 사용합니다. 아직 도메인 이름과 서버가 없다면 내 다른 기사를 참조하세요.
Apache+Flask는 클라우드 서버에 개인 웹사이트를 구축합니다.
Vultr에서 제공하는 noVNC 클라이언트를 직접 사용하여 서버에 로그인할 수 있습니다.
업데이트 패키지 목록:
sudo apt update
방화벽을 켜십시오:
sudo ufw enable
sudo ufw allow 25/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
2. LEMP 스택(Nginx, MySQL, PHP) 설치
1. Nginx 설치 및 시작
sudo apt install nginx
sudo systemctl start nginx
2. MySQL 설치 및 구성
sudo apt install mysql-server
sudo systemctl start mysql
sudo mysql_secure_installation
마법사가 완료된 후 MySQL 루트 사용자로 로그인하고 새 사용자를 추가합니다.
# 使用root身份登录数据库
mysql -u root -p
# 创建数据库新用户
CREATE USER 'user'@'localhost' IDENTIFIED BY 'User.555';
# 授予用户权限
GRANT ALL PRIVILEGES ON *.* TO 'user'@'localhost';
# 刷新权限并退出数据库
FLUSH PRIVILEGES;
EXIT
3. PHP 및 일반적으로 사용되는 일부 PHP 확장 설치
sudo apt install php-fpm php-mysql php-common php-gd php-json php-cli php-curl php-mbstring php-xml php-zip php-intl
3. Roundcube(웹메일) 설치 및 구성
1. Roundcube Webmail 1.6.2를 다운로드하고 압축을 푼다.
wget https://github.com/roundcube/roundcubemail/releases/download/1.6.2/roundcubemail-1.6.2-complete.tar.gz
tar -zxvf roundcubemail-1.6.2-complete.tar.gz
2. Roundcube를 웹 서버 루트 디렉터리로 이동합니다.
sudo mv roundcubemail-1.6.2 /var/www/roundcube
3. Roundcube 디렉터리에 www-data 권한을 부여합니다.
sudo chown -R www-data:www-data /var/www/roundcube
4. 사용자 사용자로 로그인하여 Roundcube 데이터베이스를 초기화합니다.
mysql -u user -p
CREATE DATABASE roundcube;
USE roundcube;
source /var/www/roundcube/SQL/mysql.initial.sql
EXIT
5. 라운드큐브 구성
config.inc.php 수정
cp /var/www/roundcube/config/config.inc.php.sample /var/www/roundcube/config/config.inc.php
vim /var/www/roundcube/config/config.inc.php
구성 파일의 내용을 수정하고 데이터베이스를 이전에 설정된 정보로 변경합니다.
$config['db_dsnw'] = 'mysql://user:User.555@localhost/roundcube';
$config['smtp_host'] = 'tls://localhost:587';
defaults.inc.php 수정
cp /var/www/roundcube/config/defaults.inc.php.sample /var/www/roundcube/config/defaults.inc.php
vim /var/www/roundcube/config/defaults.inc.php
다음 내용을 수정하세요
$config['smtp_conn_options'] = [
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
],
];
6. Roundcube 설치 마법사 제거
sudo rm -r /var/www/roundcube/installer/
7. Let’s Encrypt를 통해 TLS 인증서 설치
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d a.com -d www.a.com
인증서는 일반적으로 다음 위치에서 생성됩니다.
/etc/letsencrypt/live/a.com/fullchain.pem
/etc/letsencrypt/ 라이브/a.com/privkey.pem
8. Nginx 구성
- Nginx 구성 파일 roundcube 만들기
vim /etc/nginx/sites-available/roundcube
- 구성 콘텐츠 추가
server { listen 80; server_name a.com; return 301 https://www.$host$request_uri; } server { listen 80; server_name www.a.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name a.com; ssl_protocols TLSv1.2 TLSv1.3; ssl_certificate /etc/letsencrypt/live/a.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/a.com/privkey.pem; ssl_prefer_server_ciphers off; return 301 https://www.$host$request_uri; } server { listen 443 ssl; server_name www.a.com; ssl_protocols TLSv1.2 TLSv1.3; ssl_certificate /etc/letsencrypt/live/a.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/a.com/privkey.pem; ssl_prefer_server_ciphers off; root /var/www/roundcube; index index.php; location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; } }
9. 사용자 정의 구성을 활성화하기 위한 심볼릭 링크 생성
rm -f /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/roundcube /etc/nginx/sites-enabled/
sudo systemctl reload nginx
10. 이제 https://a.com 또는 https://www.a.com을 통해 roundcube 클라이언트의 로그인 인터페이스에 접속할 수 있습니다.
4. Dovecot(IMAP) 설치 및 구성
1.비둘장 설치
sudo apt install dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql
2. Dovecot 구성 파일 추가
mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.bak
vim /etc/dovecot/dovecot.conf
다음을 추가하세요
protocols = imap lmtp
listen = 127.0.0.1
mail_location = maildir:/var/mail/%d/%n
mail_privileged_group = mail
ssl = no
default_login_user = nobody
default_internal_user = vmail
first_valid_uid = 5000
last_valid_uid = 5000
first_valid_gid = 5000
last_valid_gid = 5000
auth_username_format = %Lu
auth_mechanisms = plain
auth_verbose = yes
disable_plaintext_auth = no
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/mail/%d/%n
}
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
!include conf.d/*.conf
3. Dovecot 데이터베이스 구성 파일 수정
cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.bak
vim /etc/dovecot/dovecot-sql.conf.ext
다음 내용은 일관성이 있어야 합니다.
driver = mysql
connect = host=127.0.0.1 dbname=webmail user=user password=User.555
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email AS user, password FROM user_tab WHERE email = '%Lu'
userdb_warning_disable = yes
4. 시스템 사용자 로그인을 취소하고 데이터베이스에 있는 사용자를 사용하여 로그인합니다.
cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.bak
vim /etc/dovecot/conf.d/10-auth.conf
다음 줄을 주석 처리하세요.
#!include auth-system.conf.ext
5. Dovecot의 SASL 구성 활성화
cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.bak
vim /etc/dovecot/conf.d/10-master.conf
Postfix가 SASL 인증을 수행할 수 있도록 다음 내용을 수정하세요.
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0660
user = postfix
group = postfix
}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0660
user = vmail
group = vmail
}
}
6. Dovecot의 인증 소켓 경로 지정
cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.bak
vim /etc/dovecot/conf.d/10-mail.conf
다음 줄의 주석 처리를 해제하세요.
auth_socket_path = /var/run/dovecot/auth-userdb
7. 시스템 사용자 및 그룹 생성
sudo groupadd -g 5000 vmail
sudo useradd -u 5000 -g vmail -s /sbin/nologin -d /var/mail vmail
sudo chown -R vmail:vmail /var/mail
8. 데이터베이스 테이블 생성 및 새 메일함 데이터 생성
mysql -u user -p
CREATE DATABASE webmail;
USE webmail;
CREATE TABLE domain_tab (
id INT AUTO_INCREMENT PRIMARY KEY,
domain VARCHAR(255) NOT NULL UNIQUE
);
INSERT INTO domain_tab (domain) VALUES ('a.com');
CREATE TABLE user_tab (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL
);
INSERT INTO user_tab (email, password)
VALUES ('[email protected]', '$6$rounds=45529$ADZYJ4a7OefGBfVa$Za0hqfIWWkQkg3GPeL3qqX68Q/tTQQdC2f1Uzz9wfUxV5SvG1tAz1gG6/Lyyqyfj2RQtIbimD3lCGzcx/u.Hz.');
EXIT
비밀번호는 SHA512-CRYPT 알고리즘에 의해 생성된 해시 값이며 Python 스크립트 또는 기타 방법을 사용하여 해시 값을 생성할 수 있습니다.
import random
from passlib.handlers.sha2_crypt import sha512_crypt
def get_crypt_password(password=None):
rounds = random.randint(10000, 50000)
crypt_password = sha512_crypt.using(rounds=rounds).hash(password)
return crypt_password
if __name__ == '__main__':
print(get_crypt_password(password="Test.555"))
9. Dovecot 서비스 시작
sudo systemctl start dovecot
10. 이제 이메일 사용자 이름 [email protected] 및 비밀번호 Test.555를 통해 roundcube에 로그인할 수 있습니다.
5. Postfix(SMTP) 설치 및 구성
1.포픽스 설치
sudo apt install postfix postfix-mysql
2. Postfix 구성에서 "인터넷 사이트"를 선택하고 메시지가 나타나면 시스템 이메일 이름 a.com을 입력합니다.
3. Postfix 기본 구성 파일 편집
cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
vim /etc/postfix/main.cf
다음 필드를 추가하거나 수정합니다.
myhostname = mail.a.com
mydomain = a.com
myorigin = $mydomain
mydestination = localhost
mynetworks = 127.0.0.0/8, [::1]/128
inet_protocols = ipv4
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_tls_cert_file = /etc/letsencrypt/live/a.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/a.com/privkey.pem
smtpd_tls_security_level = may
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
4. /etc/postfix/mysql-virtual-mailbox-domains.cf 구성 파일을 생성합니다.
vim /etc/postfix/mysql-virtual-mailbox-domains.cf
다음 필드를 추가하세요.
user = user
password = User.555
hosts = 127.0.0.1
dbname = webmail
query = SELECT 1 FROM domain_tab WHERE domain='%s'
5. /etc/postfix/mysql-virtual-mailbox-maps.cf 구성 파일을 생성합니다.
vim /etc/postfix/mysql-virtual-mailbox-maps.cf
다음 필드를 추가하거나 수정하세요.
user = user
password = User.555
hosts = 127.0.0.1
dbname = webmail
query = SELECT 1 FROM user_tab WHERE email='%s'
6. /etc/postfix/mysql-virtual-alias-maps.cf 구성 파일을 생성합니다.
vim /etc/postfix/mysql-virtual-alias-maps.cf
다음 필드를 추가하거나 수정하세요.
user = user
password = User.555
hosts = 127.0.0.1
dbname = webmail
query = SELECT email FROM user_tab WHERE email='%s'
7. /etc/postfix/master.cf 구성 파일을 편집합니다.
cp /etc/postfix/master.cf /etc/postfix/master.cf.bak
vim /etc/postfix/master.cf
다음 줄의 주석 처리를 해제하고 SMTP 제출 포트 587을 엽니다.
submission inet n - y - - smtpd
8. Postfix 서비스를 다시 시작하세요
sudo systemctl restart postfix
9. 이때 라운드큐브를 통해 정상적으로 이메일을 주고받을 수 있습니다.
6. 주의사항
이메일이 성공적으로 전송되었으나 대상 메일함에서 이메일을 받지 못하는 경우가 발생할 수 있습니다. 이때 server/var/log/mail.log에 Connection timed out 로그가 있을 가능성이 높습니다. 그런 다음 telnet을 사용하십시오. 대상 메일 서버가 연결되어 있는지 테스트하는 명령에 따르면 성공적인 연결과 연결 실패에 대한 두 가지 솔루션이 있습니다.
1. 대상 메일 서버의 포트 25에 성공적으로 연결: DNS 공급자를 통해 SPF(Sender Policy Framework), DKIM(DomainKeys Identified Mail) 및 DMARC(Domain-based Message Authentication, Reporting, and Conformance) 정책을 설정하여 안정성을 향상시킵니다. 이메일의 안정성과 보안, 스팸 및 사기성 이메일의 전달을 줄여 합법적인 이메일에 대한 수신자의 신뢰를 높입니다.
2. 대상 메일 서버의 포트 25에 접속할 수 없습니다: ISP(인터넷 서비스 제공업체)가 포트 25의 트래픽을 차단합니다. 메일을 전달하려면 ISP에서 제공하는 메일 중계 서버를 찾아야 합니다. 항목만 입력하면 됩니다. postfix/main.cf 파일의 /etc/relayhost 필드에 있는 메일 릴레이 서버의 도메인 이름. Postfix가 ISP의 포트 25 차단을 우회하여 지정된 메일 릴레이 서버를 사용하여 메일을 전달하도록 합니다.