p的废话:这次Exchange项目可谓把我之前没遇到的坎坷和千奇百怪的问题尝了个畅快淋漓...我大呼过瘾。。。于是终于把标题改为《Exchange部署吐血故障连载XX》,以为祭奠。

本文于20070911重新编辑

 
环境描述:
        某集团网络,外网入口连接Cisco3600路由器――PIX(FWSM模块)――Cisco6509核心――Cisco3700分布――架构内Exchange成员服务器。
        Exchange部署完毕,内网测试一切正常。

 
故障现象和排查:
1.在外网使用pop方式连接Exchange服务器,接收邮件正常;发送邮件时报错无法成功发送
Exchange部署吐血故障连载三:被CiscoPIX剥离了的ESMTP导致外部smtp请求无法正确连接服务器
2.在外网telnet相关服务器25端口返回奇怪的星号;内网telnet相同服务器25端口则正常
Exchange部署吐血故障连载三:被CiscoPIX剥离了的ESMTP导致外部smtp请求无法正确连接服务器
3.使用smtpdiag测试,终于发现导致错误的根源
Exchange部署吐血故障连载三:被CiscoPIX剥离了的ESMTP导致外部smtp请求无法正确连接服务器

 
故障原理和相关KB
 
原因描述:(kb/895857)
 
如果域中安装了一个或多个防火墙,就可能出现这些问题。如果存在以下情况一,就可能会出现“症状”部分列出的问题:
• 正在运行 Cisco Systems. Inc. 公司的 PIX 软件的 4.0 版或更高版本。Mailguard 功能仅允许以下 7 条 SMTP 命令通过防火墙:
• Helo
• Mail
• Rcpt
• Data
• Rset
• Noop
• Quit
Mailguard 功能不允许任何其他 SMTP 命令通过防火墙。因此,某些命令未能到达 Exchange 计算机。PIX 软件对拒绝和允许的命令均以“OK”响应。
 
原理描述:(kb/320027)
 
在以下情况中可能会出现这种问题:
• Exchange Server 位于 Cisco PIX 防火墙设备后。
- 并且 -
• PIX 防火墙打开了 Mailguard 功能。
• Auth 和 Auth login 命令(扩展简单邮件传输协议 [ESMTP] 命令)被防火墙剥离,这使得系统认为您正从非本地域中继。
 
妥协的解决方案:no fixup protocol smtp 25
 
要关闭 PIX 防火墙的 Mailguard 功能,请执行以下操作:
1. 建立 Telnet 会话或使用控制台登录到 PIX 防火墙。
2. 键入 enable,然后按 Enter 键。
3. 提示您输入密码时,请键入密码,然后按 Enter 键。
4. 键入 configure terminal,然后按 Enter 键。
5. 键入 no fixup protocol smtp 25,然后按 Enter 键。
6. 键入 write memory,然后按 Enter 键。
7. 重新启动或重新加载 PIX 防火墙。
 
相关KB:
 
《无法在 Exchange Server 中接收或发送 SMTP 邮件》
 
《在 Cisco PIX 防火墙后无法发送或接收电子邮件》
 

 
本人采取的妥协解决方案:
 
对此Exchange邮件服务器,在域名服务商处更改MX记录指向至梭子鱼邮件网关入口,企图绕过pix的smtp过滤器,同时无需更改pix(fwsm)配置。成此文时尚未验证。
 

最终采用的解决方案

在pix(FWSM)的配置模式下执行no fixup protocol smtp 25
 
理由:
1.考虑到很多反垃圾邮件系统会反向查询MX记录和A记录是否一致,如将MX记录另指向梭子鱼的公网地址(不同于mai服务器的A记录),将可能导致被反垃圾邮件系统判断为垃圾邮件源;那么对今后的邮件系统使用造成不必要的麻烦;
2.之前一只认为 fixup protocol smtp 25 就是一条为了定义字符串“smtp” 服务所使用的端口的语法,实际似乎并非如此。请参考以下评论:
 
no fixup protocol skinny 2000
联众用的就是端口2000,如果你不能加上面那一句,pix默认的fixup protocol skinny 2000这样的话他就会认为通过2000端口的数据应该符合skinny的标准,但是实际上联众的数据并不符合skinny.所以端口 2000的数据就不能通过,所以你就不能上联众,除非你加了
no fixup protocol skinny 2000
防火墙和路由器不同,路由器一般就只能检查到tcp 层的数据,(cisco ios 支持 cbac)。但是防火墙就可以到应用层的数据。