Exchange2013下Telnet发送测试邮件失败及解决方案
近期部署开发程序使用Exchange服务发送系统邮件的时候一直无法发送成功的问题做了一些排查,我们都知道程序使用邮件服务发送系统邮件用到的协议是SMTP服务(Port 25),当然发送服务有两种方式,一种是匿名的,一种是身份验证的,但是前者相对比较少,如果使用匿名验证SMTP发送邮件的话这样容易受到攻击,所以一般都会使用后者,通过有效的用户信息验证发送。之前公司环境内一直都是使用的是Domino服务的SMTP服务进行发送邮件的,但是近期突然用到了Exchange服务,所以将程序配置到Exchange的时候一直无法正常发送邮件(Unable to realy),在网上找了很多问题,经过一系列的排查总结了一下,分享给给遇到同样问题的童鞋,具体见下:
当我们部署了Exchange服务的话,我们首先需要对Exchange相关的服务进行测试,当然测试的方法有很多,就拿我们当下的环境来说,我们环境可以使用owa、outlookanywhere正常的发送邮件的,但是我们使用了telnet的方式测试发送一直都是无法发送邮件提示,Unable to realy.对此问题我们解决方法如下:
使用telnet测试exchange服务的步骤如下:
1.在命令提示符处,键入 telnet,然后按 Enter 键。此命令将打开 Telnet 会话。
2.键入 set localecho 并按 Enter 键。此可选命令可使您在键入字符时查看这些字符。某些 SMTP 服务器可能需要此设置。
3.键入 set logfile<文件名>。此可选命令可以将 Telnet 会话记录到指定的日志文件中。如果您仅指定了文件名,则日志文件的位置将是当前工作目录。如果您指定了路径和文件名,该路径必须位于计算机本地。指定的路径和文件名都必须以 Microsoft DOS 8.3 格式输入。您指定的路径必须已存在。如果您指定了一个不存在的日志文件,系统将为您创建一个日志文件。
4.键入 open mail1.fabrikam.com 25 并按 Enter 键。
5.键入 EHLO contoso.com 并按 Enter 键。
6.键入 MAIL FROM:[email protected] 并按 Enter 键。
7.键入 RCPT TO:[email protected]=success,failure 并按 Enter 键。可选的 NOTIFY 命令可定义目标 SMTP 服务器必须向发件人提供的特定传递状态通知 (DSN) 邮件。DSN 邮件是在RFC 1891 中定义的。在本例中,您要查询有关邮件传递成功或失败的 DSN 邮件。
8.键入 DATA 并按 Enter 键。您将收到与以下类似的响应:
354 Start mail input; end with <CLRF>.<CLRF>
9.键入 主题:来自Contoso 的测试,再按 ENTER 键。
10.按 Enter 键。RFC2822 需要在 Subject: 头字段和邮件正文间留一个空行。
11.键入 这是一封测试邮件,再按 ENTER 键。
12.按 Enter 键,键入句点 ( . ),再按 Enter 键。您将收到与以下类似的响应:
250 2.6.0 <GUID> Queued mail for delivery
13.若要与目标 SMTP 服务器断开连接,请键入 QUIT 并按 Enter 键。您将收到与以下类似的响应:
221 2.0.0 Service closing transmission channel
14.若要关闭 Telnet 会话,请键入 quit 并按 Enter 键。
步骤介绍完后,开始还原我们当前的环境介绍:
telnet exchangeserverAddress 25
ehlo
mail from : [email protected]
rcpt to : [email protected]
分析日之后发现,您的默认的receive connector缺少relay的相关权限.这种情况下,我们通常建议新建一个接受连接器(如果IP范围一样,会有冲突;而且IP设置范围太大,会被外部relay使用造成很大的问题)。因此请参考以下步骤新建一个receive connector 并赋予relay权限:
1. 新建一个receive connector
a. 可通过EAC创建,您之前的步骤中,只需要改IP range 需要修改:
注意:我们需要创建一个前端传输的接受连接器
b. 或者通过命令行新建(如果您测试telnet所在的这台机器的IP地址为192.168.1.1),例子如下:
以下格式为创建接收器角色为:集线器传输角色的接受连接器
当然,我们可以使用命令来创建;以下命令中我们需要注意的是;
如果不指定角色类型的话,默认创建角色类型是:集线器传输类型;因为我们要创建前端创建角色类型,所以我们需要指定角色类型;-TransportRole“ FrontendTransport”
New-ReceiveConnector-Name "Anonymous Relay" -Usage Custom -PermissionGroups AnonymousUsers,ExchangeServers, ExchangeLegacyServers -Bindings 0.0.0.0:25-RemoteIpRanges 192.168.6.112 New-ReceiveConnector -Name"Anonymous Relay" -Usage Custom -PermissionGroups AnonymousUsers,ExchangeServers, ExchangeLegacyServers -Bindings 0.0.0.0:25 -ReoteIpRanges 192.168.6.111-192.168.6.112
如果需要创建角色:前端传输的角色接受连接器的话,我们需要使用以下格式:
以下命令我们就添加-TransportRole" FrontendTransport"角色类型就可以创建角色类型为前端传输的接受连接器
New-ReceiveConnector-Name "Anonymous Relay" -TransportRole" FrontendTransport"-Usage Custom -PermissionGroups AnonymousUsers, ExchangeServers,ExchangeLegacyServers -Bindings 0.0.0.0:25 -RemoteIpRanges 192.168.6.112 New-ReceiveConnector -Name"Anonymous Relay" -TransportRole" FrontendTransport"-Usage Custom -PermissionGroups AnonymousUsers, ExchangeServers,ExchangeLegacyServers -Bindings 0.0.0.0:25 -RemoteIpRanges 192.168.6.111-192.168.6.112
2. 成功创建完接受连接器后我们需要 再赋予relay权限,通过命令行:
Get-ReceiveConnector "Anonymous Relay"| Add-ADPermission -User "NT AUTHORITY\ANONYMOUS LOGON"-ExtendedRights "Ms-Exch-SMTP-Accept-Any-Recipient"
赋予Realy权限后,我们就可以看见刚才创建的接受连接器---类型为前端传输
然后我们查看该连接器的属性-记住我们需要勾选匿名
注:再次我们需要注意;在添加远程网络地址的时候建议添加127.0.0.1 添加后在Exchange server本地也可以telnet成功;如果不添加在Exchange本地是无法完成telnet测试发送邮件的。(Unable to realy)
我们再 测试25端口发送邮件是否成功。
我们在内内部测试是通的,但是在外部测试不同,原因是由于ipv6的问题
所以我们需要在接受连接器中添加ipv6的地址空间
192.168.6.11
::ffff:192.168.6.112这个地址仍然是一个IPv6地址,
只是0000:0000:0000:0000:0000:ffff:c0a8:5909的另外一种写法罢了。
我们可以使用windows10 系统自带的计算机进行进制转换
将十进制转换为十六进制
运行
calc打开计算机
选择计算机类型为----程序员
HEX 16进制
DEC 10进制
OCT 8进制
BIN 2进制
我们单击10进制,然后输入192
十六进制及十进制或者二进制都会自动转换
如果禁用了,我们就从注册表中彻底禁用ipv6服务HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters
请先做注册表的备份,然后创建32 bit DWORD键值(没有请添加)DisabledComponents 设置它的值为0xff,之后再重启机器
如何在 Windows 中禁用 IPv6 或它的组件
http://support.microsoft.com/kb/929852/zh-cn
Disabling IPv6 AndExchange �C Going All The Way
http://blogs.technet.com/b/rmilne/archive/2014/10/29/disabling-ipv6-and-exchange-_1320_-going-all-the-way.aspx
如果您在外部测试,请把外部测试的这台机器的IP地址也加到IP地址列表中:
最后我们说说关于Exchange身份验证机制介绍:
我们不管是接受连接器还是发送连接器,里面都会有配置选项;
其实我个人理解;就拿接收连接器来说
身份验证功能模块中;
传输层安全性(TLS)一般建议勾选,该功能主要是为了传输的安装使用证书加密
基本身份验证:需要在登录时进行身份验证
集成windows身份验证:NTLM和Kerberos;windows AD的身份验证模式
外部保护:
权限组:
Exchange服务器:exchange服务器身份验证,当环境内有多台exchange服务器的话之间验证的方式;
旧版exchange服务器:环境内低版本的验证方式
合作伙伴
Exchange用户:仅仅是exchange用户进行验证
匿名:anymouse任何人都可以验证
https://technet.microsoft.com/zh-cn/library/jj657472%28v=exchg.150%29.aspx?f=255&MSPPError=-2147217396
https://technet.microsoft.com/zh-cn/library/bb690954(v=exchg.141).aspx
o 伙伴 伙伴服务帐户
使用命令行管理程序配置接收连接器的属性
您必须先获得权限,然后才能执行此过程。若要查看所需的权限,请参阅传输权限主题中的“接收连接器”条目。
可以使用 Set-ReceiveConnector cmdlet修改现有接收连接器的所有可用设置。 在此示例中,从 Contoso.com 中对接收连接器连接的配置进行了下列更改:
・ 将连接器上允许的最大邮件大小更改为 50 MB。
・ 在接收连接器上启用协议日志记录。
・ 设置缓送间隔。
Set-ReceiveConnector "Connection fromContoso.com" -MaxMessageSize 50MB -ProtocolLoggingLevel Verbose
Set-ReceiveConnector "Connection fromContoso.com" -RemoteIPRanges"10.0.10.0/24","192.168.180.0-192.168.180.255"
$ConnectorConfiguration = Get-ReceiveConnector"Connection from Contoso.com" $ConnectorConfiguration.RemoteIPRanges += "10.0.10.0/24" Set-ReceiveConnector "Connection from Contoso.com" -RemoteIPRanges$ConnectorConfiguration.RemoteIPRanges
Set-ReceiveConnector "Connection fromContoso.com" -TarpitInterval 00:00:06
本文出自 “高文龙” 博客,谢绝转载!