我无法将电子邮件发送到我的中继主机。所有邮件均直接投递。
postconf -n
:
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
inet_interfaces = loopback-only
inet_protocols = all
mailbox_size_limit = 0
mydestination =
myhostname = webserver.example.com
myorigin = /etc/mailname
readme_directory = no
recipient_delimiter = +
relayhost = smtp.example.com
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes
Mailq 和日志显示邮件尝试直接连接到邮箱地址而不是我的中继服务器。
输出mailq
:
root@webserver:/etc/postfix# mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
9F79E60224 382 Thu Jun 25 09:19:49 [email protected]
(connect to mail.h-email.net[107.21.213.75]:25: Connection timed out)
[email protected]
-- 0 Kbytes in 1 Request.
mail.log 的输出
Jun 25 09:20:20 webserver postfix/smtp[6998]: 9F79E60224: to=<[email protected]>, relay=none, delay=31, delays=0.02/0/31/0, dsn=4.4.1, status=deferred (connect to mail.h-email.net[107.21.213.75]:25: Connection timed out)
日志显示relay=none
,我的所有其他具有完全相同配置的服务器都可以正确发送电子邮件并按照relay=smtp.example.com
其日志中的内容进行报告。
该服务器的唯一区别在于,我将它放置在不同的网段中,这是我的 DMZ 之一。
我已经制定了规则,使得服务器本身无法通过端口 25 进行出站通信。服务器可以通过端口 25 成功与中继主机通信。
dpkg-reconfigure postfix
并将系统设置为卫星系统并不能缓解这个问题。
mailutils
包提供了mail
命令。
有人能帮帮我吗?我一直在努力弄清楚如何正确解决这个问题。
答案1
看来 Postfix 完全忽略了/etc/hosts
。
如果设置relayhost = FQDN
不是 IP 地址,它将尝试解析其 IP 地址的 FQDN,而不会使用它来查找它。如果设置为本机,/etc/hosts
它将使用系统配置resolv.conf
文件。smtp_host_lookup
由于它无法解析我的中继主机,因此它只是尝试将邮件直接发送到以太网中。我无法找到有关这是否是正确的行为的详细信息。
将中继主机设置为 IP 地址或确保中继主机 FQDN 可在不使用的情况下解析,从而/etc/hosts
解决此问题。
答案2
第一种选择
如果您想将所有电子邮件转发到给定/etc/hosts
主机并且不接收任何电子邮件,请将其添加到/etc/postfix/main.cf
:
mydestination= # Don't deliver anything locally
smtp_dns_support_level = disabled # native lookup only (/etc/hosts)
relayhost = hostname.mydomain.tld # your relay here. add IP/hostname to /etc/hosts
这将覆盖 DNS/MX 查找并/etc/hosts
仅使用。
它永远不会使用 DNS 查找。
请注意:对传入内容也不执行查找。这是用于出站(仅)服务器到 中找到的中继/etc/hosts
。
当您希望服务器将本地电子邮件(root/cronjobs/etc)发送到实际电子邮件服务器进行传递并且从不接收外部电子邮件时,这是合适的。
第二种选择
smtp_host_lookup = native
可以使用代替 smtp_dns_support_level
多于。
这将使用“仅本地命名服务”,又名“系统”查找。
它会通常情况下第一个查询/etc/hosts
(通过/etc/nsswitch.conf
*)。如果未找到,它将查询 DNS 服务器(大多数系统上的默认服务器*)。在这方面,/etc/hosts
仍然可以覆盖查找。
如果您的服务器还接收外部电子邮件,或者需要使用 DNS 查找未在 中找到的其他内容/etc/hosts
,则此方法适用。请注意,还有一个lmtp_host_lookup
选项。
* nsswitch.conf 典型示例:(
hosts: files dns
查询‘文件’(/etc/hosts
,通常)然后查询系统 DNS。)
答案3
我完全解决了直接连接到的相同问题邮箱地址而不是我的中继服务器。此时,我的 sendmail 尝试连接到 mail.h-email.net,而不依赖于我的邮件目标域。
我的服务器主机名 = server.domain.org.ua
指定的中继 IP 不正确,为 192.168.2.4
我正在发送一封测试信给@ukr.net,与 mail.h-email.net 无关。
我在 sendmail 中错误地配置了中继主机,指定了 IP 地址而不是 hostname_of_relayhost。Sendmail 尝试解析“IP 192.168.2.4”的 MX,但意外地收到了现有名称“4.org.ua”和 MX“mail.h-email.net。”。
== 调试 ==
= top output =
sendmail: ./v3LJRuji049269 mail.h-email.net.: user open (sendmail)
sendmail: ./v3LJhCr0049454 mail.h-email.net.: user open (sendmail)
= # tcpdump -vvv -i wan_if udp =
server.domain.org.ua.9764 > google-public-dns-b.google.com.domain:
MX? 192.168.2.4.org.ua.
google-public-dns-b.google.com.domain > server.domain.org.ua.9764:
q: MX? 192.168.2.4.org.ua. 1/0/1 192.168.2.4.org.ua. [59m59s] MX mail.h-email.net.
server.domain.org.ua.36133 > google-public-dns-a.google.com.domain:
A? mail.h-email.net.
23:28:28.687538 IP (tos 0x0, ttl 45, id 27064, offset 0, flags [none], proto UDP (17), length 329)
google-public-dns-a.google.com.domain > server.domain.org.ua.36133: [udp sum ok] 29530 q: A? mail.h-email.net. 16/0/1 mail.h-email.net. [3m28s] A 198.133.159.124, mail.h-email.net. [3m28s] A 198.133.159.123, mail.h-email.net. [3m28s] A 198.133.159.125, mail.h-email.net. [3m28s] A 198.133.159.133, mail.h-email.net. [3m28s] A 198.133.159.137, mail.h-email.net. [3m28s] A 198.133.159.119, mail.h-email.net. [3m28s] A 198.133.159.121, mail.h-email.net. [3m28s] A 198.133.159.122, mail.h-email.net. [3m28s] A 198.133.159.132, mail.h-email.net. [3m28s] A 198.133.159.126, mail.h-email.net. [3m28s] A 198.133.159.139, mail.h-email.net. [3m28s] A 198.133.159.135, mail.h-email.net. [3m28s] A 198.133.159.136, mail.h-email.net. [3m28s] A 198.133.159.120, mail.h-email.net. [3m28s] A 198.133.159.138, mail.h-email.net. [3m28s] A 198.133.159.134 ar: . OPT UDPsize=512 OK (301)
=check=
$ nslookup -ty=mx 4.org.ua
Non-authoritative answer:
4.org.ua mail exchanger = 5 mail.h-email.net.
因此我将“中继主机”指定为“主机名”并解决问题。
答案4
刚刚发现 postfix 有/可能有自己的主机文件 /var/spool/postfix/etc/hosts。我遇到了与报告相同的问题,在“postfix check”命令的帮助下,我找到了这个问题。已将主机条目更新/添加到 /var/spool/postfix/etc/hosts,现在 postfix 读取主机文件的 FQDN 而不是 DNS