Postfix完全忽略了main.cf中的relayhost设置

我无法发送电子邮件到我的中继主机。 所有的邮件正在直接交付。

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和日志显示邮件试图直接连接到mail.h-email.net而不是我的中继服务器。

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而所有其他具有完全相同configuration的服务器都会正确发送电子邮件,并在其日志中报告为relay=smtp.example.com

这台服务器唯一的区别是我有一个不同的网段,这是我的DMZ之一。

我已经放置了规则,以便服务器本身不能在端口25上进行出站通信。服务器可以通过端口25成功通信到中继主机。

dpkg-reconfigure postfix并将系统设置为卫星系统不会缓解这个问题。 mailutils包提供mail命令。

谁能帮我吗? 我一直在努力找出如何正确解决这个问题。

看来postfix完全忽略了/etc/hosts

如果设置relayhost = FQDN而不是IP地址,它将尝试parsing其IP地址的FQDN,并且不会使用/etc/hosts来查找它。 如果smtp_host_lookup设置为native,它将使用系统configuration的resolv.conf文件。

由于它不能解决我的中继主机,它只是试图将邮件直接传送到以太网。 如果这是正确的行为,我找不到详情。

将relayhost设置为IP地址或者确保relayhost FQDN可以parsing,而不使用/etc/hosts修复此问题。

我直接连接到mail.h-email.net而不是我的中继服务器来解决同样的问题。 在那我的sendmail尝试连接到mail.h-email.net独立于我的邮件目标域。

我的服务器主机名= server.domain.org.ua

指定的继电器不正确,IP = 192.168.2.4

我正在向@ ukr.net发送一封testing信,与mail.h-email.net无关。

我通过指定IP地址而不是hostname_of_relayhost错误地configuration了sendmail中的relayhost。 Sendmail尝试为“IP 192.168.2.4”parsingMX,并意外收到现有名称“4.org.ua”和MX“mail.h-email.net”。 为了它。

==debugging==

 = 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. 

所以我指定“中继主机”为“主机名”并解决问题。

如果您将所有电子邮件转发到给定的/etc/hosts主机(通常是本地IP),并且没有收到任何邮件,请将其添加到/etc/postfix/main.cf

mydestination= # Don't deliver anything locally

smtp_dns_support_level = disabled # native lookup only (/etc/hosts)

relayhost = hostname.mydomain.tld # *

(*您要用作IP的/etc/hosts条目hostname.mydomain.tld – 即mail.mydomain.local)

这将覆盖DNS / MX查找并使用/etc/hosts (如果在其中find给定的主机)。 它永远不会使用DNS查找。

注意:对传入的查找也不执行。 这是一个出站(仅)服务器到在/ etc / hosts中find的名字parsing的中继 – 这在很多情况下是合适的。 (如果您希望服务器只发送根邮件/ cronjob警告/等到实际邮件服务器进行传送,这是有帮助的)但是从不接收邮件本身。

参考: smtp_dns_support_level


smtp_host_lookup = native可以用来代替上面 smtp_dns_support_level

这将使用“本地命名服务”又名“系统”查找。

通常会首先查询/etc/hosts (通过/etc/nsswitch.conf )。 如果没有find,它会查询一个DNS服务器(大多数系统默认*)。 在这方面,/ etc / hosts仍然可以覆盖查找。 如果您的服务器也接收外部邮件,或者需要使用DNS查找来查找/ etc / hosts中找不到的其他内容,则这可能更合适。 还要注意选项lmtp_host_lookup

* nsswitch.conf例子: hosts: files dns – >查询文件(/ etc / hosts)然后DNS。

参考smtp_host_lookup , lmtp_host_lookup