我必须从 Linux 服务器(SUSE Linux Enterprise Server 11)发送电子邮件(并且只能发送,不能接收),并且我认为我应该在 iptables 中添加以下规则:
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
但我不太确定,因为我的 OUTPUT iptables 规则建议我使用当前规则我应该能够发送电子邮件,但实际上我不能。
这是我的 OUTPUT iptables 规则:
Chain OUTPUT (policy ACCEPT XXM packets, XXM bytes)
pkts bytes target prot opt in out source destination
xxM xxG ACCEPT all -- any lo anywhere anywhere
xxM xxM SST-OUTPUT all -- any any anywhere anywhere
我一直不愿意更改裸 iptables 中的规则,但我认为如果默认策略是“接受”,我应该能够仅使用当前规则发送电子邮件,我错了吗?
我收到的错误是:Name service error for name=xxxxx.xxx type=MX: Host not found, try again
是什么让我认为问题一定出在 /etc/resolv.conf 或其他地方。
INPUT 规则如下:
Chain INPUT (policy DROP)
target prot opt in out source destination
ACCEPT all -- lo any anywhere anywhere
ACCEPT all -- any any anywhere anywhere state ESTABLISHED
ACCEPT icmp -- any any anywhere anywhere state RELATED
ACCEPT tcp -- any any anywhere anywhere state RELATED,ESTABLISHED tcp spt:smtp
LOG all -- any any anywhere anywhere limit: avg 3/min burst 5 LOG level warning tcp-options ip-options prefix `SFW2-IN-ILL-TARGET '
DROP all -- any any anywhere anywhere
注意:我在第4位添加了@Otheus 建议的INPUT规则。
答案1
如果输出策略设置为“接受?”,则无需创建输出规则。相反,您需要一个传入规则来 (1) 接受已建立的连接或 (2) 接受来自端口 25 的非同步数据包。第一种是首选,在 Linux 中可以使用以下方法实现:
iptables -I INPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT
如果您想要更加严格,可以将端口添加到规则中:
iptables -I INPUT 1 -m state --state RELATED,ESTABLISHED -p tcp -m tcp --sport 25 -j ACCEPT
您可以使用 telnet、socat、nc、nmap 之一进行测试。另外请记住,ISP 通常会过滤端口 25 访问(您必须使用他们自己的邮件网关 - 这样做是为了消除垃圾邮件)。而 smtp+ssl 有时使用端口 465,有时使用端口 587。
根据您的错误“名称服务错误”,实际问题是 DNS 解析。上述规则也将处理该问题,但如果您想更加严格,--sport 为 53。
答案2
为了使外发电子邮件正常工作,您需要做两件事:
- 允许传出 SMTP 连接(及其返回数据包)。看来您已经了解了这一点。
- 确定将邮件发送到哪个主机的方法。目前这种方法不起作用。
解决第二个问题有两种可能性:
您可以允许您的服务器执行 DNS 查找,以确定将邮件发送到哪个主机。为此,您需要将以下内容添加到您的 iptables(替换
10.2.3.4
为您自己的 DNS 服务器)iptables 我输出 1 -p udp -d 10.2.3.4 --dport 53 -j 接受
您可以拥有一个中继服务器,它将接受来自此盒子的所有电子邮件并处理 DNS 查找和传送。如果是这样,在此盒子上,您只需要有以下 iptables 规则:
iptables -A 输出 -p tcp --dport 25 -j 接受
您还需要修复您的 postfix 配置以设置中继主机。您可以在
/etc/postfix/main.cf
(将 10.2.3.4 替换为您的中继主机的 IP 地址)中执行此操作中继主机 = [10.2.3.4]
编辑:在这两种情况下,您还需要允许返回数据包。您还没有显示整个 iptables 输出,但如果还没有,您应该添加类似以下内容的内容:
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT