Postfix+Dovecot+Roundcube는 LEMP 스택을 기반으로 메일함 시스템을 구현합니다.


도메인 이름과 서버 보유를 전제로 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 차단을 우회하여 지정된 메일 릴레이 서버를 사용하여 메일을 전달하도록 합니다.



이것으로 튜토리얼을 마칩니다.

오류나 개선사항은 자유롭게 지적해주세요!

Supongo que te gusta

Origin blog.csdn.net/embracestar/article/details/132940254
Recomendado
Clasificación