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 経由でのみ利用可能です。しかし、プロキシは、送信用にバックエンド システムで直接 SSL を使用してポート 587 で通信しようとします (これは正しくないと思います。プレーンで開始して STARTTLS を作成する必要があります)。これは、passdb がグローバル SSL=any-cert を返すために発生すると思います。これはバグでしょうか。587 のこの動作をオーバーライドできますか。また、正しい証明書を STARTTLS で送信する方法はありますか (デフォルト/最初の証明書ではなく)。

質問2:

次にポート 465 です。私の場合、Dovecot は、認証されたすべてのメッセージをバックエンドの 465 送信ポートに転送するために、送信ポート 465/SSL を開くこともできます。しかし、それをどのように構成すればよいのでしょうか? 例が見つかりませんでした。

私は知っているdovecot プロキシを使用したメール インフラストラクチャそして、postfix を使用した解決策ですが、dovecot-socket を使用した解決策がこのシナリオで機能するかどうかはよくわかりません。また、Dovecot がすぐに処理できる場合、送信のためだけに postfix をインストールしたくありません。

答え1

パスデータベースを返すことで、dovecot はダウンストリーム接続に TLS を使用するようになります。残念ながら、パスデータベースが返すものに基づい'any-cert' AS 'ssl'て接続タイプを変更する方法は私の知る限りありません(starttlstlshttps://dovecot.org/pipermail/dovecot/2018-9月/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 ではサポートされていません。

関連情報