Dovecot 以代理身分提交

Dovecot 以代理身分提交

在我的基礎設施中,我有幾個郵件伺服器(mailcow)為每個實例提供不同的網域服務。我想在他們面前建立一個郵件代理,以減少每個服務使用的 IP 數量,並允許客戶在其客戶端預設中擁有自己的網域。

SMTP 與 MTA 的處理方式不同。透過 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。但我該如何配置呢?我找不到任何例子。

我知道關於帶有 dovecot 代理的郵件基礎設施以及 postfix 的解決方案 - 但我不太確定,dovecot-socket 的答案是否在這種情況下有效,並且我不想安裝僅用於提交的 postfix,當 Dovecot 可以處理該問題時 -盒子。

答案1

透過返回'any-cert' AS 'ssl'passdb,您可以強制 dovecot 使用 TLS 進行下游連線。不幸的是,據我所知,無法更改 passdb 返回的內容之間starttlstls基於 passdb 返回的內容的連接類型(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。

相關內容