这个问题可能已经有答案了,但我就是不知道如何正确地搜索它。
情况:
我们有两个节点的故障转移情况,使用keepalived
,在它们之间传递一个浮动 IP。节点的主要目的是运行haproxy
。每个节点还运行一个本地postfix
,仅用于将来自keepalived
或 来自 的电子邮件传送haproxy
到实际操作员帐户,并通过 SendGrid 中继到外部邮件域。不接受来自任何其他机器的邮件。
这一切都运行良好。太好了;我的邮箱被淹没了。我想抑制来自非活动节点的邮件,当发生故障转移时,让 postfix 突然开始投递邮件。
这就是想法。
- 正常模式:postfix 在端口 25 上接受邮件并通过 Sendgrid 中继。
- 静默模式:postfix 仍在端口 25 上接受邮件,但会将其丢弃,不会将其转发到任何地方,不会向客户端返回失败,也不会发送退回邮件。(是的,这通常对 MTA 来说是糟糕的行为。MTA 不应该谎报接受邮件。但这是一种受限制的情况。)
- 如何判断我应该处于正常模式还是静音模式:一个简单的脚本,可能是这样的
ip addr | grep -q $FLOAT_IP
。
所以...我猜基本问题是“静默模式”是如何发生的。这是一个完全独立的 postfix 配置吗?我必须用正确的配置重新启动 postfix 吗?
设立一个队列后内容过滤器?
还有其他想法吗?
答案1
好的,在 @sebix 提示“使用传输discard
”之后,我有一些似乎有效的东西:
设置交通地图:
# echo >>/etc/postfix/main.cf 'transport_maps = hash:/etc/postfix/transport'
将默认传输图设置为空;还设置一个用于丢弃传输的文件
# cat </dev/null >/etc/postfix/transport
# cat </dev/null >/etc/postfix/transport.normal
# echo >/etc/postfix/transport.discard '* discard:'
keepalived 可以调用一个 bash 脚本/usr/local/bin/keepalived_togglemail.sh
来打开或关闭 postfix:
#!/bin/bash
TYPE=$1
NAME=$2
STATE=$3
case $STATE in
"MASTER") cp /etc/postfix/transport.normal /etc/postfix/transport
postmap /etc/postfix/transport
/etc/init.d/postfix reload
exit 0
;;
"BACKUP") cp /etc/postfix/transport.discard /etc/postfix/transport
postmap /etc/postfix/transport
/etc/init.d/postfix reload
exit 0
;;
"FAULT") echo FAULT
exit 0
;;
*) echo "unknown state"
exit 1
;;
esac
并加入一行/etc/keepalived/keepalived.conf
来实现它。(摘录):
....
vrrp_instance VRRP1 {
state BACKUP
interface ens32
...
notify /usr/local/bin/keepalived_togglemail.sh
}