我成功设置了带有 auth_http 的 nginx imap/pop3 邮件代理,几个月来一直运行良好。最近出现了一个要求,要求在 imap 登录时在 mail.log 中显示客户端的 IP。
由于 Nginx 与 Dovecot 通信,日志中的 IP 地址属于 Nginx 服务器(在本例中为 127.0.0.1 - 因为它们在同一台服务器上)。
到目前为止,我找不到解决方案或解决方法。显然,nginx 邮件块中甚至无法进行日志记录。
最接近的是 Dovecot 中的 HAProxy 支持(https://wiki2.dovecot.org/HAProxy) 但不确定是否有类似于Nginx的。
任何帮助都将受到赞赏。
谢谢
答案1
解决方法
没有找到合适的解决方案,我宁愿在代理脚本中创建一个新的日志文件,为请求提供可接受的解决方案。
以下是摘录:
$fp = fopen('/var/log/mail_logins.log', 'a');
$now = "[" . (new \DateTime())->format('Y-m-d H:i:s') . "]";
fwrite($fp, $now . " HTTP_AUTH_PROTOCOL: " . $_SERVER["HTTP_AUTH_PROTOCOL"] . ", HTTP_AUTH_USER: " . $_SERVER["HTTP_AUTH_USER"] . ", HTTP_CLIENT_IP: " . $_SERVER["HTTP_CLIENT_IP"]. "\n");
fclose($fp);
它可能会对某些人有帮助。
答案2
自 1.19.8 版(2021 年 3 月 9 日发布)以来,nginx 支持所有 POP3/IMAP/SMTP 代理连接的 HAproxy 代理协议 - 您可以通过proxy_protocol on;
相关server
或mail
阻止设置来启用它。链接至 nginx 文档。
请注意,必须在接收端(在 dovecot 中)明确启用代理协议,因为它无法自动检测(在邮件协议中,服务器在建立连接后发送问候消息,如果客户端在服务器之前说话 - 这是协议违规;而在 HAproxy 的代理协议中,客户端(即连接到最终服务器的代理)首先发送有关远程连接的消息)。
还请注意,这个问题是在添加此选项前约 4 年提出的,但对于将来寻找此问题的任何人来说,这些信息可能有用。