
메일 서버에 SPF 및 OpenDMARC/DKIM을 구현하는 작업을 진행 중입니다. 현재 서로 다른 서브넷에 두 개의 메일 서버가 있고 각각 별도의 DNS 서버와 도메인 이름이 있습니다. 그들은 이메일을 성공적으로 교환할 수 있습니다.
pypolicyd-spf로 SPF를 설정하고, OpenDMARC로 DMARC를, OpenDKIM으로 DKIM을 설정했습니다. DKIM은 완벽하게 작동하지만 DMARC 및 SPF에 몇 가지 문제가 있습니다. 아마도 내 지형과 관련이 있을 것입니다(아래 그래프 참조).
각 메일 서버에 사용자를 만들고 Squirrelmail을 통해 그들 사이에 메일을 교환합니다.
SPF와 DMARC를 작동시키는 방법은 무엇입니까? 내 이메일 헤더에 다음이 표시됩니다.
Received-SPF: None (mailfrom) identity=mailfrom; client-ip=192.168.22.132
Authentication-Results: OpenDKIM; dmarc=none (p=none dis=none) header.from=another.com
로그의 해당 로컬 호스트 IP에 문제가 있는 것 같지만 원인이 무엇인지 모르겠습니다.
policyd-spf[2183]: prepend X-Comment: SPF check N/A for local connections - client-ip=127.0.0.1; helo=[192.168.22.128]; [email protected]; receiver=<UNKNOWN>
postfix/smtpd[2177]: D5DA9C0F5F38: client=localhost[127.0.0.1]
내 postconf -n
결과:
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd
$daemon_directory/$process_name $process_id & sleep 5
home_mailbox = Maildir/
html_directory = no
inet_interfaces = all
inet_protocols = ipv4
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
milter_default_action = accept
mydestination = $myhostname, localhost.$mydomain, localhost
mydomain = $myhostname
myhostname = example.com
mynetworks = 127.0.0.0/8, 192.168.22.0/24
myorigin = $myhostname
newaliases_path = /usr/bin/newaliases.postfix
non_smtpd_milters = $smtpd_milters
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
sample_directory = /usr/share/doc/postfix-2.10.1/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtpd_milters = inet:127.0.0.1:8891, inet:127.0.0.1:8893
smtpd_recipient_restrictions = check_policy_service unix:private/policy-spf, permit_mynetworks,
reject_unauth_destination
unknown_local_recipient_reject_code = 550
네트워크 그래프:
필요한 경우 추가 정보를 제공할 수 있습니다.
물론 DNS의 모든 항목이 만들어집니다.
example.com. IN TXT "v=spf1 mx ~all"
default._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=XXXkeyXXX" ) ; ----- DKIM key default for example.com
_dmarc.example.com. IN TXT "v=DMARC1; p=none; pct=100"
policyd-spf 로그:
policyd-spf[2681]: Read line: "request=smtpd_access_policy"
policyd-spf[2681]: Read line: "protocol_state=RCPT"
policyd-spf[2681]: Read line: "protocol_name=ESMTP"
policyd-spf[2681]: Read line: "client_address=192.168.22.132"
policyd-spf[2681]: Read line: "client_name=gateway"
policyd-spf[2681]: Read line: "reverse_client_name=gateway"
policyd-spf[2681]: Read line: "helo_name=example.com"
policyd-spf[2681]: Read line: "[email protected]"
policyd-spf[2681]: Read line: "[email protected]"
policyd-spf[2681]: Read line: "recipient_count=0"
policyd-spf[2681]: Read line: "queue_id="
policyd-spf[2681]: Read line: "instance=a73.5fe8c4e7.510b9.0"
policyd-spf[2681]: Read line: "size=935"
policyd-spf[2681]: Read line: "etrn_domain="
policyd-spf[2681]: Read line: "stress="
policyd-spf[2681]: Read line: "sasl_method="
policyd-spf[2681]: Read line: "sasl_username="
policyd-spf[2681]: Read line: "sasl_sender="
policyd-spf[2681]: Read line: "ccert_subject="
policyd-spf[2681]: Read line: "ccert_issuer="
policyd-spf[2681]: Read line: "ccert_fingerprint="
policyd-spf[2681]: Read line: "ccert_pubkey_fingerprint="
policyd-spf[2681]: Read line: "encryption_protocol="
policyd-spf[2681]: Read line: "encryption_cipher="
policyd-spf[2681]: Read line: "encryption_keysize=0"
policyd-spf[2681]: Read line: ""
policyd-spf[2681]: Found the end of entry
policyd-spf[2681]: Config: {'Whitelist_Lookup_Time': 10, 'skip_addresses': '127.0.0.0/8,::ffff:127.0.0.0/104,::1', 'Reason_Message': 'Message {rejectdefer} due to: {spf}. Please see {url}', 'PermError_reject': 'False', 'Header_Type': 'SPF', 'TestOnly': 0, 'SPF_Enhanced_Status_Codes': 'Yes', 'TempError_Defer': 'False', 'Lookup_Time': 20, 'debugLevel': 4, 'Authserv_Id': 'centos2.another.agh.edu.pl', 'Mail_From_reject': 'Fail', 'Hide_Receiver': 'Yes', 'HELO_reject': 'Fail', 'Void_Limit': 2, 'Mock': False}
Dec 27 12:31:19 centos2 policyd-spf[2681]: Cached data for this instance: []
Dec 27 12:31:19 centos2 policyd-spf[2681]: skip_addresses enabled.
Dec 27 12:31:29 centos2 policyd-spf[2681]: spfcheck: pyspf result: "['None', '', 'helo']"
Dec 27 12:31:29 centos2 policyd-spf[2681]: None; identity=no SPF record; client-ip=192.168.22.132; helo=example.com; [email protected]; receiver=<UNKNOWN>
Dec 27 12:31:29 centos2 policyd-spf[2681]: spfcheck: pyspf result: "['None', '', 'mailfrom']"
Dec 27 12:31:29 centos2 policyd-spf[2681]: None; identity=mailfrom; client-ip=192.168.22.132; helo=example.com; [email protected]; receiver=<UNKNOWN>
Dec 27 12:31:29 centos2 policyd-spf[2681]: not peruser
Dec 27 12:31:29 centos2 policyd-spf[2681]: Action: prepend: Text: Received-SPF: None (mailfrom) identity=mailfrom; client-ip=192.168.22.132; helo=example.com; [email protected]; receiver=<UNKNOWN> Reject action: 550 5.7.23
답변1
pypolicyd-spf를 통해 SPF로 며칠간 고생한 끝에 마침내 무엇이 잘못되었는지 알게 되었습니다.
내 토폴로지에는 2개의 DNS 서버가 포함되어 있었고 메일 서버의 /etc/resolv.conf 파일에는 두 DNS 서버가 모두 있었습니다.
OpenDMARC SPF는 매력적으로 작동하고 두 DNS의 spf 레코드 변경에 응답했지만 pyspf는 그렇지 않았습니다.
대답은 다음과 같습니다. pypolicyd-spf는 resolv.conf에서 두 개의 DNS를 지원하지 않습니다. 간단한 해결 방법은 하나의 DNS 서버에 두 개의 영역을 만드는 것입니다. 그러다가 갑자기 pyspf가 작동하기 시작합니다.