我有一个Postfix邮件服务器,运行在具有多个networking适配器的主机上,其中一个是虚拟tun0设备。 我需要这个邮件服务器来接受任何适配器上的连接 – 并且只在虚拟tun设备上发送电子邮件。
我有一个configuration, 符合这个问题的答案 ,它定义了smtp_bind_address = 10.20.30.40 – 其中10.20.30.40是与tun0设备关联的地址。 此服务器服务器不支持IPV6。
多年来,这似乎是完美的工作 – 直到有一天,tun0设备死亡 – 和Postfix发送电子邮件通过默认networking设备,eth0(10.0.0,1)而不是tun0。
这是预期的行为? 是否有设置可以改变,以确保Postfix只通过tun0(10.20.30.40)发送电子邮件 – 如果tun0不可用,则将消息留在队列中?
如果是相关的,这是Ubuntu的16.04.2 LTS与Postfix版本3.1.0-3。 tun0是使用OpenVPN版本2.3.10-1ubuntu2.1实现的
– 编辑添加额外的细节 –
$ route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.0.0.1 0.0.0.0 UG 0 0 0 eth0 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 10.20.30.40 0.0.0.0 255.255.255.255 UH 0 0 0 tun0
这个服务器运行几个服务 – 其中Postfix只有一个。 只有电子邮件需要路由超过10.20.30.40 – 所有其他服务需要通过默认网关路由。
会发生什么,后缀将首先使用configuration的smtp_bind_address 。 在你的情况下,这是一个静态ip绑定到tun0。 它会通过tun0传递出去。 如果tun0closures,则客户端bind将失败,导致postfix回退到不绑定客户端tcp端点的默认行为,因此将使用连接到eth0的默认路由。
这似乎是后缀不提供合适的覆盖smtp_bind_address失败。
因此,答案就是使用IP表规则,简单地阻止接口eth0上端口25的出站电子邮件。 这将导致所有的电子邮件排队一段时间之前失败或直到tun0回来。
像下面的东西应该工作:
iptables -A OUTPUT -i eth0 -p tcp --dport 25 -j DROP
这将阻止所有电子邮件通过eth0从端口25发出,并直接从您的服务器发送(不路由)。 它不会阻止通过tun0发送的电子邮件通信。
从我可以在实验室收集和testing,这似乎是按预期工作。 如果不可用,smtp_bind_address将故障切换到另一个inet_interface。
也许你可以设置另一个Postfix实例,只有一个inet_interface 10.20.30.40 ,和10.20.30.40 /中继传出? 也许那时你可以通过你的多个适配器接收,并强制通过一个IP发送出去。
这是一段时间,因为我不得不搅拌后缀。 但我想你应该使用智能主机中继。
智能主机是一种电子邮件传输代理,它允许简单邮件传输协议(SMTP)服务器将电子邮件路由到中间邮件服务器,而不是直接传送到收件人的服务器。
中继将是与邮件域中的发件人SPFlogging相对应的邮件服务器。 您的ISP应该能够作为您的智能电子邮件中继。
从内存中,它可以像在/etc/postfix/main.cf设置一样简单
例如relayhost = mx1.mydomain.com:587
那么你不需要关心从哪个接口发送邮件。