제출과 함께 프록시로서의 Dovecot

제출과 함께 프록시로서의 Dovecot

내 인프라에는 인스턴스당 서로 다른 도메인을 제공하는 여러 메일 서버(mailcow)가 있습니다. 나는 서비스당 사용되는 IP 수를 줄이고 고객이 어쨌든 클라이언트 사전 설정에 자신의 도메인 이름을 가질 수 있도록 하기 위해 메일 프록시를 구축하고 싶습니다.

MTA로서의 SMTP는 다르게 처리됩니다. Postfix를 통해 들어오는 메시지는 중앙 서버에서 처리됩니다(MX 레코드가 고객에게 표시되지 않기 때문). 그래서 이것은 내 문제가 아닙니다.

그래서 다음 구성을 사용하여 Debian Buster의 Dovecot 기반 메일 프록시를 구성했습니다.

ssl_cert = </etc/dovecot/ssl/default.pem
ssl_key = </etc/dovecot/ssl/default.key

# just an example for different domains via SNI
local_name mail.domain1.tld {
  ssl_cert = </etc/dovecot/ssl/mail.domain1.tld.pem
  ssl_key = </etc/dovecot/ssl/mail.domain1.tld.key
}

# just an example for different domains via SNI
local_name mail.domain2.tld {
  ssl_cert = </etc/dovecot/ssl/mail.domain2.tld.pem
  ssl_key = </etc/dovecot/ssl/mail.domain2.tld.key
}

auth_cache_size = 4 k
disable_plaintext_auth = no

passdb {
  args = /etc/dovecot/sql.conf
  driver = sql
}
protocols = "imap pop3 submission"
service auth {
  user = root
}
userdb {
  args = static uid=5000 gid=5000 home=/dev/null
  driver = static
}

그리고 sql.conf는

## SQL passdb configuration
driver = mysql

# Database options
connect = host=localhost dbname=dovecot user=dovecot password=dovecot

# Query
password_query = SELECT NULL AS password, NULL AS destuser, host, 'Y' AS nologin, 'Y' AS nodelay, 'Y' AS nopassword, 'Y' AS proxy, 'any-cert' AS `ssl` FROM proxy_domain WHERE domain = '%d'
# eof

데이터베이스에는 다음이 포함됩니다.

CREATE TABLE `proxy_domain` (
  `domain` varchar(255) NOT NULL,
  `host` varchar(255) NOT NULL,
  PRIMARY KEY (`domain`)
);

insert into proxy_domain (domain, host) values ('domain1.tld','mailhost1');
insert into proxy_domain (domain, host) values ('domain2.tld','mailhost2');

이것은 대략 다음의 예입니다.

IMAP 및 POP3 서비스가 시작되었습니다.

openssl s_client -connect ac-hcn0002.acoby.net:993

로그인할 수 있고 SNI도 제대로 작동합니다. 백엔드는 SSL을 통해 연결할 수 있습니다. starttls(110, 143, 587)를 사용하면 첫 번째 인증서만 제공됩니다. 괜찮습니다. 고객에게 권장하지 않기 때문입니다.

하지만 지금은 제출(나중에 체로 걸림)합니다.

질문 1:

Dovecot은 제출을 위해 587을 열 수 있습니다. 이는 STARTTLS를 통해서만 사용할 수 있습니다. 그러나 프록시는 포트 587에서 SSL을 사용하여 직접 백엔드 시스템에서 제출하기 위해 통신을 시도합니다(올바르지 않은 것 같습니다. 일반 시작하고 STARTTLS를 만들어야 합니다). 제 생각에는 passdb가 전역 SSL=any-cert를 반환하기 때문에 이런 일이 발생하는 것 같습니다. 이것은 버그인가요? 587에 대해 해당 동작을 무시할 수 있나요? 그리고 STARTTLS(기본값/첫 번째 대신)를 사용하여 올바른 인증서를 보내는 방법이 있을까요?

질문 #2:

그런 다음 포트 465를 사용합니다. 제 경우에는 인증된 모든 메시지를 백엔드의 465 제출 포트로 전달하기 위해 Dovecot이 제출 포트 465/SSL을 열 수도 있습니다. 그런데 어떻게 구성할 수 있나요? 나는 어떤 예도 찾을 수 없었다.

나는 대해 알고있다Dovecot 프록시를 사용한 메일 인프라그리고 postfix가 있는 솔루션 - 그러나 dovecot-socket에 대한 답변이 이 시나리오에서 작동하는지 그리고 Dovecot이 이를 처리할 수 있을 때 제출용으로만 postfix를 설치하고 싶지 않은지 확실하지 않습니다. 상자.

답변1

'any-cert' AS 'ssl'passdb를 반환하면 doveco가 다운스트림 연결에 TLS를 사용하도록 강제합니다. 불행히도 passdb가 반환하는 것 사이에서 starttls또는 tls이를 기반으로 연결 유형을 변경하는 방법은 없습니다 (https://dovecot.org/pipermail/dovecot/2018-September/112928.html)

내 해결 방법은 STARTTLS 연결을 강제로 다운스트림하고 항상 사용하는 것입니다.

password_query = SELECT NULL as password, 'y' as nopassword, 'y' as proxy, NULL as destuser, 'y' as proxy_nopipelining, host, 'y' as nodelay, 'y' as nologin, 'any-cert' as 'starttls';

"올바른" 쿼리는 다음과 같습니다.

password_query = SELECT NULL as password, 'y' as nopassword, 'y' as proxy, NULL as destuser, 'y' as proxy_nopipelining, host, 'y' as nodelay, 'y' as nologin, IF(%{real_lport}=587, 'any-cert', 'no') as 'starttls', IF(%{real_lport}<>587, 'any-cert', 'no') as 'ssl';

연결이 들어온 포트에 따라 starttls/tls를 전환합니다. 불행히도 현재 dovecot에서는 지원되지 않습니다.

관련 정보