我的工作笔记本电脑采用“移动办公”设置。这意味着它经常用于我找到的任何 WLAN 和其他网络,但我有一个可用于办公室的 VPN 连接。
公司的邮件服务器通过 VPN 接受传入的邮件并将其转发给我,但我不能仅仅将其用作笔记本电脑上的智能主机:当我在离线模式下发送电子邮件时,只要有任何网络连接建立,Postfix 就会运行队列,并且(除非公共网络阻止端口 25)智能主机会使用 5xx 代码拒绝它,因为邮件来自外部非 VPN IP。
因此,我正在寻找一种解决方案,除非 VPN 已启动,否则将 Postfix 置于仅队列模式。(tun13
例如,可以通过测试是否已启动来轻松检测到这一点。当然,具体使用方法取决于 Postfix 可以执行的任何检查。)
奖励:除非 VPN 已启动或者我已连接到公司 LAN (eth0) 或 WLAN。但这并不紧急。
我使用 ifupdown 周围的 shell 包装器脚本进行连接,因此添加额外的命令并不困难。但是,当未连接到 VPN 时简单地停止 Postfix 并不是解决方案:软件包升级和重新启动往往会启动它,并且[::1]:25
当 VPN 未启动时,发送邮件必须有效(仅队列)。
这是 Debian 的重点,并且使用 OpenVPN(从命令行手动启动/停止),以防万一。
答案1
你的情况类似于拨号用户。
复制/etc/postfix/main.cf
到/etc/postfix/main.cf.nodefer
。
复制/etc/postfix/main.cf
到/etc/postfix/main.cf.defer
并添加defer_transports = smtp
。
在您的 VPN 连接脚本中链接/复制/etc/postfix/main.cf.nodefer
到/etc/postfix/main.cf
并重新启动 postfix。
在您的VPN断开连接脚本中链接/复制/etc/postfix/main.cf.defer
到/etc/postfix/main.cf
并重新启动postfix。
答案2
Postfix 支持使用各种数据库的动态配置http://www.postfix.org/DATABASE_README.html
这可能对您的设置来说太多了。由于您总是想使用中继主机,因此您可以使用 iptables 拒绝非 VPN 接口上端口 25 上的出站流量,如下所示:
iptables -I OUTPUT ! -o tun13 -p tcp --dport 25 -j REJECT
这将拒绝从非 接口到端口 25 的连接tun13
。因此,postfix 将无法中继并失败。您可能必须配置队列重试参数,以便 postfix 不会从队列中删除消息,因为您希望在连接到 VPN 时发送该消息。
请注意,这也会拒绝与本地主机的 25 端口连接,除非您有以下内容:
iptables -I OUTPUT -o lo -j ACCEPT