내 exim은 들어오는 모든 이메일을 타사 smtp 릴레이로 릴레이합니다. 그들은 smtp 인증(사용자 이름/비밀번호)을 사용합니다.
begin authenticators
Exim 구성 섹션 에서는 하나의 사용자 이름/비밀번호만 정의할 수 있는 것 같습니다 . 특정 이메일을 하나의 릴레이(자체 사용자 이름/비밀번호 인증 포함)를 통해 라우팅하고 다른 이메일은 두 번째 릴레이(사용자 이름/비밀번호 인증이 첫 번째 릴레이와 다름)를 통해 라우팅하고 싶습니다.
내 구성의 대부분은 다음과 같습니다. 목록 begin routers
에 있는 도메인은 에 릴레이 되고 +local_domains
나머지 smtp-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은 주어진 공개 이름에 대해 최대 2개의 인증자를 클라이언트측 인증자와 서버측 인증자로 허용합니다.
그러나 당신이 찾고 있는 기능은 이미 데비안의 기본 구성에 있습니다:exim4-config파일을 패키지하고 추출합니다( ar
두 개의 아카이브가 포함된 아카이브 tar
).
파일에는 /etc/exim4/conf.d/auth/30_exim4-config_examples
다음과 같은 클라이언트 인증자가 포함되어 있습니다.
- 파일 에서 비밀번호를 읽으면
/etc/exim4/passwd.client
비밀번호가 Exim의 구성에 포함되지 않습니다. 파일 형식은 서버당 한 줄씩<servername>:<username>:<password>
, - 호스트에 따라 비밀번호를 선택하고,
- 잘 테스트되었으므로 Exim의 문자열 확장을 테스트할 필요가 없습니다.
데비안 구성은 다음 클라이언트 인증자로 요약됩니다:
# 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}}