我在 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 发了一张票。让我们看看他们如何回应。一旦收到回复,我会尝试更新它。