Exim4 配置使用多个外部 ip 发送邮件

Exim4 配置使用多个外部 ip 发送邮件

我在 ubuntu 服务器上有 exim4,并且有一个包含 20 个外部 IP 的池。

是否可以配置 exim4 以使用此 ip-s 旋转来发送邮件?


我认为我可以使用 iproute / iptables 负载平衡和“link stick”来实现这一点,但我想知道这是否可以通过 exim4 内部配置来实现。也许我应该创建几个外部 smtp_drivers,它们将使用 20 个 IP 中的一个和一些 random() 函数?

答案1

我发现本文演示如何设置随机的函数从列表中选择一个 IP,然后将其分配为 smtp 驱动程序的输出接口。

本质上,你必须设置一个功能:

sub randinet {
  @inet = ("x.x.x.1", "x.x.x.2", "x.x.x.3", "x.x.x.4");
  return $inet[int rand($#inet+1)];
}

并修改 smtp 驱动程序:

remote_smtp:
driver = smtp
interface = "${perl{randinet}}"

答案2

您也可以在 exim 内部执行此操作,而无需使用 perl:

使用以下代码创建查找文件 /etc/exim/ips.txt

1: xxx.xxx.xxx.1
2: xxx.xxx.xxx.2
3: xxx.xxx.xxx.3
4: xxx.xxx.xxx.4

将传输设置为:

remote_smtp:
  driver = smtp
  interface = "${lookup {${randint:5}} lsearch {/etc/exim/ips.txt}}"

randint 将返回 1-4 之间的一个随机数,然后在文件中查找该数,如果有更多的 ip,则只需将其添加到列表中,并将 randint 值增加为 ips + 1

可供那些没有使用 perl 构建 exim 的人使用,或者只是不想使用 perl 将所有内容保留在 exim 中的用户使用。

答案3

这是一个非常简单的方法

创建/etc/exim.pl以下内容:

use feature qw[state];

sub randomhosts {
  state $current;

  my @inet = (
    "x.x.x.x:hostname1.domain.com",
    "x.x.x.x:hostname2.domain.com",
    "x.x.x.x:hostname3.domain.com"
  );

  if ($_[0] eq 'generate') {
    shift;
    @{$current}{qw[ip host]} = split /:/, $inet[rand @inet];
  }

  return $current->{$_[0]};
}

x.x.x.x用 IP 和主机名(冒号后,将用作 HELO)替换。

现在将其添加到 exim.conf 顶部

perl_startup = do '/etc/exim.pl'

现在,在remote_smtp:本节下附加此内容

  interface = "${perl{randomhosts}{generate}{ip}}"
  helo_data = "${perl{randomhosts}{host}}"

就是这样。现在电子邮件将随机通过您添加到 Perl 脚本的所有 IP,并使用有效的 HELO。

答案4

如果您遵循 topdog 的方法,您将会收到以下错误。

有两种名为“remote_smtp”的传输方式

因为您无法在 exim conf 编辑器中更改 STARTTRANSPORT 部分。

即使您尝试手动更改 exim.conf,它也会在重新启动时被清除并替换为默认设置。

我在网上找到的唯一解决方案是http://forums.cpanel.net/f43/scripts-posteximup-help-205971.html#post845302

我还向 cPanel 发了一张票。让我们看看他们如何回应。一旦收到回复,我会尝试更新它。

相关内容