邮件从源系统发送到目标系统时,通常通过SMTP协议进行传输。然而,在某些特殊的网络环境下,目标系统可能无法获取源系统的出口IP地址。这种情况会带来诸多安全风险,例如无法准确溯源,反垃圾邮件功能受限等。本文将重点介绍如何通过SMTP协议中的XCLIENT指令来传递IP信息,以解决这些问题。当然,除了本文提到的方法外,还有其他方法获取源系统IP,其他文章我们会做介绍。
XCLIENT指令语法
注意:这里的描述来自Postfix的官方文档,不同邮件服务器对XCLIENT支持是不同的。
xclient-command = XCLIENT 1*( SP attribute-name"="attribute-value ) attribute-name = ( NAME | ADDR | PORT | PROTO | HELO | LOGIN | DESTADDR | DESTPORT ) attribute-value = xtext
- NAME属性:指定远程SMTP客户端的主机名(而不是SMTP客户端地址),如果由于永久错误导致客户端主机名查找失败,则为[UNAVAILABLE],如果查找错误条件是瞬时的,则为[TEMPUNAVAIL]。
- ADDR属性:指定远程SMTP客户端的数值IPv4网络地址、以IPV6:为前缀的IPv6地址,或者在地址信息不可用时为[UNAVAILABLE]。地址信息不用方括号括起来。
- PORT属性:指定远程SMTP客户端的TCP端口号(十进制数),或者在信息不可用时为[UNAVAILABLE]。
- PROTO属性:指定SMTP或ESMTP。
- DESTADDR属性:指定本地SMTP服务器的数值IPv4网络地址、以IPV6:为前缀的IPv6地址,或者在地址信息不可用时为[UNAVAILABLE]。地址信息不用方括号括起来。
- DESTPORT属性:指定本地SMTP服务器的TCP端口号(十进制数),或者在信息不可用时为[UNAVAILABLE]。
- HELO属性:指定SMTP HELO参数值,或者在信息不可用时为[UNAVAILABLE]。
- LOGIN属性:指定SASL登录名,或者在信息不可用时为[UNAVAILABLE]。
注意:语法上有效的NAME和HELO属性值元素可以长达255个字符。客户端不得发送超过SMTP命令512个字符限制的XCLIENT命令。为避免超出限制,客户端应在多个XCLIENT命令中发送信息;例如,在HELO和PROTO之后最后发送NAME和ADDR。一旦发送ADDR,客户端通常不再被授权发送XCLIENT命令。
参考来源:https://www.postfix.org/XCLIENT_README.html
服务端响应码
返回代码 | 含义 |
---|---|
220 | success |
421 | unable to proceed, disconnecting |
501 | bad command parameter syntax |
503 | mail transaction in progress |
550 | insufficient authorization |
other | connection rejected by connection-level access decision |
XCLIENT指令示例
220 server.example.com ESMTP Postfix EHLO client.example.com 250-server.example.com 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-XCLIENT NAME ADDR PROTO HELO 250 8BITMIME XCLIENT NAME=spike.porcupine.org ADDR=168.100.189.2 220 server.example.com ESMTP Postfix EHLO spike.porcupine.org 250-server.example.com 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-XCLIENT NAME ADDR PROTO HELO 250 8BITMIME MAIL FROM:<wietse@porcupine.org> 250 Ok RCPT TO:<user@example.com> 250 Ok DATA 354 End data with <CR><LF>.<CR><LF> . . .message content. . . . 250 Ok: queued as 763402AAE6 QUIT 221 Bye
示例中 XCLIENT NAME=spike.porcupine.org ADDR=168.100.189.2 这是常用的方法。
支持XCLIENT的邮件系统
支持XCLIENT扩展指令的邮件系统包括Postfix、Exim、Coremail等,在邮件系统端也需要做相关设置。如果需要了解这部分信息,可以关注公众号mailabc获取。