Exim:「開始驗證器」部分中是否可以有多個驗證器,每個 smtp 中繼一個?

Exim:「開始驗證器」部分中是否可以有多個驗證器,每個 smtp 中繼一個?

我的 exim 將其所有傳入電子郵件中繼到第三方 smtp 中繼。他們使用 smtp 身份驗證(使用者名稱/密碼)。

看來我只能在begin authenticatorsExim 設定部分定義一個使用者名稱/密碼。我想透過一個中繼路由某些電子郵件(具有自己的用戶名/密碼身份驗證),並透過第二個中繼路由其他電子郵件(其用戶名/密碼身份驗證與第一個中繼不同) 。

這是我的大部分配置。清單begin routers中的域將中繼+local_domainssmtp-relay-1,其餘域將中繼到smtp-relay-2

begin routers

my_domains_relay:
  debug_print = "R: my_domains_relay for $local_part@$domain"
  driver = manualroute
  domains = +local_domains
  transport = remote_smtp_smarthost
  route_list = * "<+ smtp-relay-1.example.com:465"
  host_find_failed = defer
  no_more

smart_host_relay:
  debug_print = "R: smart_host_relay for $local_part@$domain"
  driver = manualroute
  transport = remote_smtp_smarthost
  route_list = * "<+ smtp-relay-2.example.net:465"
  host_find_failed = defer
  no_more

begin transports

remote_smtp_smarthost:
  debug_print = "T: remote_smtp_smarthost for $local_part@$domain"
  driver = smtp
  port = 465
  hosts_require_tls = *
  hosts_require_auth = *
  protocol = smtps

begin authenticators

login:
  driver = plaintext
  public_name = PLAIN
  client_send = ^my-username^top-secret-password

我想要的是在該部分中定義單獨的用戶名/密碼身份驗證begin authenticators,並將每個用戶名/密碼分配給單一路由器/傳輸。目前,使用者名稱/密碼身份驗證是全域的,用於所有中繼。

exim 文件表示它將 public_name 與伺服器公佈的身份驗證相符。因此,如果我的兩個 smtp 中繼都進行廣告,AUTH PLAIN那麼它們都在配置中使用該身份驗證器使用者名稱/密碼。我希望有一個設定允許我將身份驗證器實例與特定的路由器/傳輸鏈接,但我不知道如何鏈接。

答案1

您可以使用client_condition驗證器選項(參見部分 SMTP 驗證手冊)。

對於給定的公共名稱,Exim 最多接受兩個驗證器:作為客戶端和伺服器端驗證器。

然而,您正在尋找的功能已經在 Debian 的預設配置中:下載exim4 配置打包並解壓縮檔案(它是一個ar包含兩個tar存檔的存檔)。

該文件/etc/exim4/conf.d/auth/30_exim4-config_examples包含客戶端身份驗證器:

  1. 從檔案中讀取密碼/etc/exim4/passwd.client,因此密碼不在Exim的配置中。文件的格式是每個伺服器一行<servername>:<username>:<password>,格式如下:
  2. 根據主機選擇密碼,
  3. 經過充分測試,因此您不必測試 Exim 的字串擴充。

Debian 設定歸結為以下客戶端驗證器:

# this returns the matching line from passwd.client and doubles all ^
PASSWDLINE=${sg{\
                ${lookup{$host}nwildlsearch{CONFDIR/passwd.client}{$value}fail}\
                }\
                {\\N[\\^]\\N}\
                {^^}\
            }

plain:
  driver = plaintext
  public_name = PLAIN
.ifndef AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS
  client_send = "<; ${if !eq{$tls_out_cipher}{}\
                    {^${extract{1}{:}{PASSWDLINE}}\
                     ^${sg{PASSWDLINE}{\\N([^:]+:)(.*)\\N}{\\$2}}\
                   }fail}"
.else
  client_send = "<; ^${extract{1}{:}{PASSWDLINE}}\
                    ^${sg{PASSWDLINE}{\\N([^:]+:)(.*)\\N}{\\$2}}"
.endif

答案2

在同一個身份驗證器中,您可以使用 if-condition 來選擇一組使用者名稱:密碼進行身份驗證。但你需要「條件」來選擇先使用哪個繼電器。

例如,對於發送至[電子郵件受保護]將使用透過 my-username:top-secret-password 進行身份驗證的 smtp-relay-1.example.com,並且[電子郵件受保護]將使用由 my-username2:top-secret-password2 驗證的 smtp-relay-2.example.com

路由器和傳輸器將是相同的

begin routers

my_domains_relay:
  debug_print = "R: my_domains_relay for $local_part@$domain"
  driver = manualroute
  domains = +local_domains
  transport = remote_smtp_smarthost
  route_list = * "<+ smtp-relay-1.example.com:465"
  host_find_failed = defer
  no_more

smart_host_relay:
  debug_print = "R: smart_host_relay for $local_part@$domain"
  driver = manualroute
  transport = remote_smtp_smarthost
  route_list = * "<+ smtp-relay-2.example.net:465"
  host_find_failed = defer
  no_more

begin transports

remote_smtp_smarthost:
  debug_print = "T: remote_smtp_smarthost for $local_part@$domain"
  driver = smtp
  port = 465
  hosts_require_tls = *
  hosts_require_auth = *

驗證器需要更改為類似這樣的內容

begin authenticators

login:
  driver = plaintext
  public_name = PLAIN
  client_send = ^${if   eq{$domain}{domain1.com}\
                        {my-username}\
                        {my-username2}}\
                ^${if   eq{$domain}{domain1.com}\
                        {top-secret-password}\
                        {top-secret-password2}}

相關內容