iptables 规则发送电子邮件

iptables 规则发送电子邮件

我必须从 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

为了使外发电子邮件正常工作,您需要做两件事:

  1. 允许传出 SMTP 连接(及其返回数据包)。看来您已经了解了这一点。
  2. 确定将邮件发送到哪个主机的方法。目前这种方法不起作用。

解决第二个问题有两种可能性:

  • 您可以允许您的服务器执行 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

相关内容