저는 RedHat에서 실행되는 postfix 서버를 물려받았습니다. 문서화되지 않은 빌드이지만 비즈니스 운영에 매우 중요합니다. (우리 모두 이것을 좋아하지 않습니까?)
메일 배달이 지연되고 백로그되는 문제가 발생했습니다. 이 문제는 몇 주 전에 처음 보고되었지만 무한정 이전으로 거슬러 올라갈 수 있습니다.
내 *nix 경험은 녹슬었지만 서버에 백로그가 발생할 때 내 조직의 업스트림 SMTP 릴레이에 대한 연결 시간 초과를 보고한다는 것을 확인할 수 있을 만큼 시스템을 둘러볼 수 있었습니다.
예시 오류:
*3D27412A016
4187 4월 19일 화요일 17:04:26
[이메일 보호됨]
(배송 일시 중단: UpstreamRelayA4.doi.net[10.xx.xx.206]:25에 연결: 연결 시간 초과)
그러나 업스트림 릴레이 소유자는 이 SMTP 서버의 로그에 일치하는 오류가 없다고 보고합니다. 우리 조직에는 4개의 릴레이 서버가 포함된 단일 MX 레코드가 있습니다. 4개 모두 포트 25의 텔넷을 통해 내 SMTP 서버에서 연결할 수 있지만 4개 중 3개는 postfix 로그에서 시간 초과되었습니다.
postfix가 시간 초과라고 생각하는 이유를 추적하는 방법에 대한 팁이 있습니까?
22/4/20 추가 - postconf -n 출력
[USERNAME@mailer ~]$ postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin xxgdb
$daemon_directory/$process_name $process_id & sleep 5
disable_vrfy_command = yes
html_directory = no
inet_interfaces = all
inet_protocols = ipv4
local_recipient_maps =
mail_owner = postfix
mail_spool_directory = /var/mail
mailbox_size_limit = 0
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
maximal_queue_lifetime = 1d
message_size_limit = 30720000
mydestination = $myhostname, localhost.$mydomain, localhost
myhostname = mailer.domain.org.com
mynetworks =
127.0.0.0/8,165.83.0.0/16,10.0.0.0/8,64.241.25.0/24,172.16.0.0/12
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
relayhost = relayLOCATION.parentorg.com
sample_directory = /usr/share/doc/postfix-2.10.1/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtp_tls_note_starttls_offer = yes
smtp_use_tls = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtpd_helo_restrictions =
permit_mynetworks,reject_non_fqdn_helo_hostname,reject_invalid_helo_hostname,permit
smtpd_policy_service_max_idle = 5s
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous
smtpd_sender_restrictions = permit_mynetworks,reject_non_fqdn_sender,permit
smtpd_tls_CAfile = /etc/postfix/ssl/mailer_DOMAIN_ORG_COM.pem
smtpd_tls_auth_only = no
smtpd_tls_cert_file = /etc/postfix/ssl/mailer_DOMAIN_ORG_COM.crt
smtpd_tls_key_file = /etc/postfix/ssl/mailer_DOMAIN_ORG_COM.key
smtpd_tls_loglevel = 1
smtpd_tls_security_level = may
smtpd_use_tls = yes
tls_random_source = dev:/dev/urandom
transport_maps = hash:/etc/postfix/transport
[USERNAME@mailer ~]$
22/4/20 추가 - postconf -M 출력
[USERNAME@mailer ~]$ postconf -M
smtp inet n - n - - smtpd
pickup fifo n - n 60 1 pickup
cleanup unix n - n - 0 cleanup
qmgr fifo n - n 300 1 qmgr
tlsmgr unix - - n 1000? 1 tlsmgr
rewrite unix - - n - - trivial-rewrite
bounce unix - - n - 0 bounce
defer unix - - n - 0 bounce
trace unix - - n - 0 bounce
verify unix - - n - 1 verify
flush unix n - n 1000? 0 flush
proxymap unix - - n - - proxymap
smtp unix - - n - - smtp
relay unix - - n - - smtp -o fallback_relay=
showq unix n - n - - showq
error unix - - n - - error
discard unix - - n - - discard
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
anvil unix - - n - 1 anvil
scache unix - - n - 1 scache
maildrop unix - n n - - pipe flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}
old-cyrus unix - n n - - pipe flags=R user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -m ${extension} ${user}
cyrus unix - n n - - pipe user=cyrus argv=/usr/lib/cyrus-imapd/deliver -e -r ${sender} -m ${extension} ${user}
uucp unix - n n - - pipe flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
ifmail unix - n n - - pipe flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp unix - n n - - pipe flags=Fq. user=foo argv=/usr/local/sbin/bsmtp -f $sender $nexthop $recipient
retry unix - - n - - error
proxywrite unix - - n - 1 proxymap
[USERNAME@mailer ~]$
22/4/20 추가 - 메일 릴레이 간 장치
우리는 릴레이 사이의 네트워크나 보안 장비에 대한 가시성을 갖고 있지 않습니다. Traceroute는 3개의 홉만 표시하며, 모두 네트워크 레이아웃의 IP 주소를 기반으로 하는 표준 라우터일 가능성이 높습니다.
22/4/20 추가됨 - Postfix 버전
Postfix는 버전 2.10.1인 것으로 보이며, 이 버전은 2013년경에 설치될 것입니다. Postfix 릴리스 페이지에 따라
22/4/22 추가 - openssl 연결 테스트
[USERNAME@mailer ~]$ openssl s_client -connect UPSTREAM_RELAY.ORG.net:25 -starttls smtp -crlf
CONNECTED(00000003)
depth=1 DC = net, DC = ORG, CN = CA_Server
verify error:num=20:unable to get local issuer certificate
---
Certificate chain
0 s:/C=US/ST=STATE/L=CITY/O=PARENT_ORG/OU=PARENT_ORG/CN=UPSTREAM_RELAY.ORG.net
i:/DC=net/DC=ORG/CN=CA_Server
1 s:/DC=net/DC=ORG/CN=CA_Server
i:/CN=ORGRootCA2
---
Server certificate
-----BEGIN CERTIFICATE-----
[Cert contents removed]
-----END CERTIFICATE-----
subject=/C=US/ST=STATEA/L=CITY/O=PARENT_ORG/OU=PARENT_ORG/CN=UPSTREAM_RELAY.ORG.net
issuer=/DC=net/DC=ORG/CN=CA_Server
---
No client certificate CA names sent
Peer signing digest: SHA1
Server Temp Key: ECDH, P-384, 384 bits
---
SSL handshake has read 5841 bytes and written 538 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-SHA384
Session-ID: [REMOVED]
Session-ID-ctx:
Master-Key: [REMOVED]
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1650649689
Timeout : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)
---
250 XSHADOWREQUEST
(Functional console after this)
22/4/22 추가됨 - 작동하지 않는 서버에 대한 Maillog grep
[USERNAME@mailer ~]$ sudo mailq | grep UPSTREAM_RELAY_103.ORG.net
(delivery temporarily suspended: conversation with UPSTREAM_RELAY_103.ORG.net[10.x.x.125] timed out while sending end of data -- message may be sent more than once)
(conversation with UPSTREAM_RELAY_103.ORG.net[10.x.x.125] timed out while sending end of data -- message may be sent more than once)
[중복 항목을 제거했습니다. 해당 서버의 모든 항목은 정확히 두 메시지와 동일합니다.]
최종 편집일: 2022년 4월 27일
지난주 문제 해결 과정에서 /etc/resolv.conf에 더 이상 존재하지 않는 네임서버가 있다는 사실을 발견했습니다. 이를 제거하고 postfix를 다시 시작한 후에는 더 이상 로그에서 시간 초과가 발생하지 않는 것으로 나타나고 메일 흐름이 빠르게 진행됩니다.
댓글에서 @anx가 언급했듯이 이는 연결 시간 초과와 관련하여 그다지 의미가 없지만 문제가 해결되고 postfix가 다시 시작되자마자 아웃바운드 전송 속도가 급격히 증가했으며 아무런 문제도 발생하지 않았습니다. 하루에 20,000개가 넘는 아웃바운드 테스트 이메일을 추가했음에도 불구하고 지연 문제가 발생했습니다(일반 메일 양에 비해 약 30% 증가).
답변1
우리가 알아낸 바로는 이 문제는 /etc/resolv.conf 에 잘못된 DNS 항목이 있어서 발생했습니다. 잘못된 항목이 제거되면 로그에 문제가 발생하지 않게 되었고 아웃바운드 지연을 최소화하면서 메일 흐름이 제대로 돌아왔습니다.