메일 보안 · 4 min read · Sep 22, 2025

Dovecot에서 IP 주소로 메일 계정 접근 제한하여 스팸 남용 방지 개선하기 (예: ISPConfig 3 사용 시)

우리가 할 일

이 방법서는 dovecot과 MySQL을 사용할 때 단일 메일 계정IP 제한을 추가하는 방법을 보여줍니다.

이는 특정 IP 또는 몇 개의 IP에서만 메일 계정에 접근해야 하거나 특정 IP 주소의 접근을 차단하고자 할 때 특히 유용합니다 (예: 스팸 남용으로 인한).

전제 조건

  • MySQL을 통한 가상 사용자로 작동하는 dovecot 설치 (ISPConfig 3 관리가 바람직함)

ISPConfig 3을 사용하지 않는 경우 쿼리에서 데이터베이스 테이블 및/또는 열 이름을 변경해야 할 수 있습니다.

시스템 변경 사항

먼저 메일 서버에 새로운 데이터베이스 테이블을 생성해야 합니다. 이 방법서에서는 ISPConfig 데이터베이스 dbispconfig에 추가할 것입니다.

MySQL 콘솔을 엽니다:
mysql -u root -D dbispconfig -p

로그인한 후, 다음 쿼리로 새로운 IP 제한 테이블을 생성합니다:

CREATE TABLE mail_user_ip_restriction (
    restriction_id INT(11) UNSIGNED NOT NULL auto_increment,
    mailuser_id INT(11) UNSIGNED NOT NULL DEFAULT '0',
    ip VARCHAR(50) NOT NULL DEFAULT '',
    mode ENUM('w','b') NOT NULL DEFAULT 'w',
    service VARCHAR(10) NOT NULL DEFAULT '',
    PRIMARY KEY (`restriction_id`),
    KEY `ident` (`mailuser_id`, `mode`, `service`, `ip`)
) ENGINE=MyISAM;

이제 dovecot SQL 구성을 변경해야 합니다. ISPConfig 3 설치(예: Debian/Ubuntu)에서는 /etc/dovecot/dovecot-sql.conf에 있어야 합니다.

다음 줄을 변경합니다:

password_query = SELECT password FROM mail_user WHERE (login = '%u' OR email = '%u') AND disable%Ls = 'n'

user_query = SELECT email as user, maildir as home, CONCAT('maildir:', maildir, '/Maildir') as mail, uid, gid, CONCAT('*:storage=', quota, 'B') AS quota_rule, CONCAT(maildir, '/.sieve') as sieve FROM mail_user WHERE (login = '%u' OR email = '%u') AND `disable%Ls` = 'n'

(최신 버전의 ISPConfig 3을 사용하지 않는 경우 구성의 줄이 약간 다를 수 있습니다)

다음과 같이 변경합니다:

password_query = SELECT m.password FROM mail_user as m LEFT JOIN mail_user_ip_restriction as r ON (r.mailuser_id = m.mailuser_id AND r.mode = 'w' AND r.service IN ('', '%Ls')) LEFT JOIN mail_user_ip_restriction as rb ON (rb.mailuser_id = m.mailuser_id AND rb.ip = '%r' AND rb.mode = 'b' AND rb.service IN ('', '%Ls')) WHERE (m.login = '%u' OR m.email = '%u') AND m.disable%Ls = 'n' AND (r.ip IS NULL OR r.ip = '%r') AND rb.ip IS NULL

user_query = SELECT m.email as user, m.maildir as home, CONCAT('maildir:', m.maildir, '/Maildir') as mail, m.uid, m.gid, CONCAT('*:storage=', m.quota, 'B') AS quota_rule, CONCAT(m.maildir, '/.sieve') as sieve FROM mail_user as m LEFT JOIN mail_user_ip_restriction as r ON (r.mailuser_id = m.mailuser_id AND r.mode = 'w' AND r.service IN ('', '%Ls')) LEFT JOIN mail_user_ip_restriction as rb ON (rb.mailuser_id = m.mailuser_id AND rb.ip = '%r' AND rb.mode = 'b' AND rb.service IN ('', '%Ls')) WHERE (m.login = '%u' OR m.email = '%u') AND m.disable%Ls = 'n' AND (r.ip IS NULL OR r.ip = '%r') AND rb.ip IS NULL

이제 dovecot을 재시작합니다:
service dovecot restart (또는 /etc/init.d/dovecot restart, 시스템에 따라 다름)

이제 메일 및/또는 시스템 로그를 주의 깊게 살펴보세요! dovecot에서 오류가 발생하면 뭔가 잘못된 것이므로 변경 사항을 확인하거나 되돌려야 합니다.
모든 것이 이전과 같이 작동하면 준비가 완료된 것입니다.

접근 제한 방법

이제 메일박스에 대한 접근을 제한할 수 있는 다양한 방법이 있습니다. MySQL 콘솔에서 SQL 쿼리를 사용하여 수행하는 방법을 보여드리겠지만, 물론 phpMyAdmin을 사용할 수도 있습니다.

IP 차단

메일 계정에 대한 접근을 차단하려면 모드 ‘b’로 제한 테이블에 추가해야 합니다:

먼저 메일 계정의 mailuser_id가 필요합니다 (예: [email protected]). 이는 간단한 SQL 쿼리입니다:

SELECT mailuser_id FROM mail_user WHERE email = ‘ [email protected] ‘;

이 쿼리는 12345와 같은 숫자(id)를 반환합니다. 이제 이 id에 대한 제한 항목을 추가합니다:

INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘’);

이 항목은 IP 123.234.123.234가 메일 계정 12345의 모든 서비스(POP3, IMAP, SMTP)에 접근하는 것을 차단합니다.

IP가 POP 및 IMAP에 접근할 수 있지만 SMTP(메일 전송)는 사용할 수 없도록 하려면 대신 다음 항목을 추가할 수 있습니다:

INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘b’, ‘smtp’);

이와 같이 여러 서비스를 추가할 수 있으며, 각 서비스에 대해 하나의 항목을 추가할 수 있습니다. 그러나 항목 ‘’는 모든 서비스를 차단한다는 점을 명심하세요.

특정 IP로 제한

차단할 수 있는 것처럼 메일 계정의 사용을 단일 IP로 제한할 수도 있습니다. 이는 지정된 IP 외에는 다른 IP가 계정에 접근할 수 없음을 의미합니다. 모드 ‘b’ 대신 ‘w’로 항목을 생성하면 됩니다:

INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.234’, ‘w’, ‘pop3’);
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘123.234.123.235’, ‘w’, ‘smtp’);

이 항목은 다음과 같은 작업을 수행합니다:

  • 모든 IP가 계정 12345 ([email protected])의 IMAP을 사용할 수 있습니다.
  • 오직 IP 123.234.123.234만 이 계정의 POP3를 사용할 수 있으며, 다른 모든 IP는 사용할 수 없습니다!
  • 오직 IP 123.234.123.235만 이 계정의 SMTP를 사용할 수 있으며, 다른 모든 IP는 사용할 수 없습니다!

물론 모든 기능을 결합하고 다양한 모드 및 서비스에 대해 여러 IP 항목을 생성할 수 있습니다.

사용 사례

좋습니다, 이제 실제 사례입니다. 온라인 상점에서 메일을 보내기 위해 사용하는 메일 주소가 있다고 상상해 보세요. 이 계정으로 메일을 보낼 수 있는 사람은 아무도 없어야 하지만, 상점 이메일에 대한 답장을 확인하고 싶습니다. 이는 다시 IMAP을 통해서만 이루어져야 하며, POP3를 통해서는 안 됩니다.

이 경우 생성할 항목은 다음과 같습니다. 여기서 10.0.0.101은 상점 웹 서버의 IP이고 12345는 메일 계정의 mailuser_id입니다.

INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘10.0.0.101’, ‘w’, ‘smtp’);
INSERT INTO mail_user_ip_restriction VALUES (NULL, 12345, ‘none’, ‘w’, ‘pop3’);

10.0.0.101 외의 다른 IP는 이 특정 메일 계정의 SMTP에 접근할 수 없으며, 아무도 POP3에 접근할 수 없습니다. IMAP은 모든 IP에서 사용할 수 있습니다.

IPv6를 잊지 마세요! 서버나 지정하려는 클라이언트가 IPv4와 IPv6 주소를 모두 가지고 있는 경우 두 개 모두 추가해야 합니다!

Share: X/Twitter LinkedIn

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

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