将Microsoft Exchange服务器移动到专用networking

在其中一个办公室里,我们有一个50台计算机的networking,只有一台服务器:

  • Windows 2003 Server
  • 微软ISA服务器
  • Microsoft Exchange 2003

该服务器作为网关(代理服务器),邮件服务器,文件服务器,防火墙和域控制器。 它有两个networking接口,一个用于WAN(假设为222.222.222.222),一个用于LAN(192.168.1.1)。 我设置了一个Linux机器作为网关(没有代理),所以Linux机器现在有以下接口:222.222.222.222(我们的外部IP,我们从Windows机器上移除它)和192.168.1.100(内部IP) ,但是我们需要保留旧的Windows服务器作为邮件服务器和我们的一些用户的代理,直到我们为此准备另一台Linux机器,所以我需要该机器上的邮件服务器可以从互联网上获得。 我设置了iptables规则来redirect到我们的外部IP的第25和第110端口的所有传入连接192.168.1.1:25和192.168.1.1:110,当我尝试telnet我们的SMTP服务

telnet 222.222.222.222 25 

我得到了我们的Windows服务器(192.168.1.1)SMTP服务的问候,这工作正常。 但是当我telnet POP3服务

  telnet 222.222.222.222 110 

我只能看到空白的黑屏,连接似乎消失,如果我按任何button。 我已经检查了ISA规则 – 对于第110和第25个端口,一切似乎都是一样的。 当我从我们的新网关机器上的Windows服务器的第110个端口telnet像这样:

  telnet 192.168.1.1 110 

我得到它的POP3服务:

 +OK Microsoft Exchange Server 2003 POP3 server version 6.5.7638.1 (...) ready. 

我该怎么办,通过我们的新网关提供POP3服务?

UPD:我的iptablesconfiguration看起来像这样:

 -P INPUT DROP -P FORWARD DROP -P OUTPUT DROP -N bad_packets -N bad_tcp_packets -N icmp_packets -N tcp_inbound -N tcp_outbound -N udp_inbound -N udp_outbound -A INPUT -i lo -j ACCEPT -A INPUT -j bad_packets -A INPUT -d 224.0.0.1/32 -j DROP -A INPUT -s 192.168.1.0/24 -i eth0 -j ACCEPT -A INPUT -d 192.168.1.255/32 -i eth0 -j ACCEPT -A INPUT -i eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -i eth1 -p tcp -j tcp_inbound -A INPUT -i eth1 -p udp -j udp_inbound -A INPUT -i eth1 -p icmp -j icmp_packets -A INPUT -m pkttype --pkt-type broadcast -j DROP -A INPUT -j LOG --log-prefix "fp=INPUT:99 a=DROP " -A FORWARD -j bad_packets -A FORWARD -i eth0 -p tcp -j tcp_outbound -A FORWARD -i eth0 -p udp -j udp_outbound -A FORWARD -i eth0 -j ACCEPT -A FORWARD -i eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -j LOG --log-prefix "fp=FORWARD:99 a=DROP " -A FORWARD -d 192.168.1.1/32 -i eth1 -p udp -m udp --dport 110 -j ACCEPT -A FORWARD -d 192.168.1.1/32 -i eth1 -p udp -m udp --dport 25 -j ACCEPT -A OUTPUT -p icmp -m state --state INVALID -j DROP -A OUTPUT -s 127.0.0.1/32 -j ACCEPT -A OUTPUT -o lo -j ACCEPT -A OUTPUT -s 192.168.1.100/32 -j ACCEPT -A OUTPUT -o eth0 -j ACCEPT -A OUTPUT -o eth1 -j ACCEPT -A OUTPUT -j LOG --log-prefix "fp=OUTPUT:99 a=DROP " -A bad_packets -s 192.168.1.0/24 -i eth1 -j LOG --log-prefix "fp=bad_packets:2 a=DROP " -A bad_packets -s 192.168.1.0/24 -i eth1 -j DROP -A bad_packets -m state --state INVALID -j LOG --log-prefix "fp=bad_packets:1 a=DROP " -A bad_packets -m state --state INVALID -j DROP -A bad_packets -p tcp -j bad_tcp_packets -A bad_packets -j RETURN -A bad_tcp_packets -i eth0 -p tcp -j RETURN -A bad_tcp_packets -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j LOG --log-prefix "fp=bad_tcp_packets:1 a=DROP " -A bad_tcp_packets -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP -A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j LOG --log-prefix "fp=bad_tcp_packets:2 a=DROP " -A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP -A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j LOG --log-prefix "fp=bad_tcp_packets:3 a=DROP " -A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP -A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j LOG --log-prefix "fp=bad_tcp_packets:4 a=DROP " -A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP -A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j LOG --log-prefix "fp=bad_tcp_packets:5 a=DROP " -A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP -A bad_tcp_packets -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix "fp=bad_tcp_packets:6 a=DROP " -A bad_tcp_packets -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP -A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j LOG --log-prefix "fp=bad_tcp_packets:7 a=DROP " -A bad_tcp_packets -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP -A bad_tcp_packets -p tcp -j RETURN -A icmp_packets -p icmp -f -j LOG --log-prefix "fp=icmp_packets:1 a=DROP " -A icmp_packets -p icmp -f -j DROP -A icmp_packets -p icmp -m icmp --icmp-type 8 -j DROP -A icmp_packets -p icmp -m icmp --icmp-type 11 -j ACCEPT -A icmp_packets -p icmp -j RETURN -A tcp_inbound -p tcp -m tcp --dport 113 -j REJECT --reject-with icmp-port-unreachable -A tcp_inbound -p tcp -m tcp --dport 80 -j ACCEPT -A tcp_inbound -p tcp -m tcp --dport 21 -j ACCEPT -A tcp_inbound -p tcp -m tcp --sport 20 -j ACCEPT -A tcp_inbound -p tcp -m tcp --dport 22 -j ACCEPT -A tcp_inbound -p tcp -m tcp --dport 25 -j ACCEPT -A tcp_inbound -p tcp -m tcp --dport 110 -j ACCEPT -A tcp_inbound -p tcp -j RETURN -A tcp_outbound -p tcp -j ACCEPT -A udp_inbound -p udp -m udp --dport 137 -j DROP -A udp_inbound -p udp -m udp --dport 138 -j DROP -A udp_inbound -p udp -m udp --dport 113 -j REJECT --reject-with icmp-port-unreachable -A udp_inbound -p udp -m udp --sport 67 --dport 68 -j ACCEPT -A udp_inbound -p udp -j RETURN -A udp_outbound -p udp -j ACCEPT 

请validation“POP3虚拟服务器属性”的“访问”选项卡下的连接控制属性是否允许“除下面列表外的所有内容”。

请看截图: http : //www.iainlbc.com/pop3.jpg

我不build议你留下未encryption的POP3访问。 你可以在你的Linux机器上使用这个stunnel(例如见http://www.sysdesign.ca/guides/secure_pop3.html )来提供POP3。

这不仅可以保护您的电子邮件访问被盗密码,而且还解决您的问题,因为连接将在本地进行。 我build议也为SMTP做同样的事情,但是你将不得不离开25端口接收邮件。

如果您不再使用ISA作为防火墙,但只能作为代理,则应从configuration中删除所有规则,并只创build一个“允许所有stream量从任何地方到任意位置”的策略; 在与Exchange和DC相同的盒子上运行ISA可能会变得相当混乱。

您还应该检查您的IPTABLESconfiguration实际上是否允许外部连接到内部POP3服务,并且该Exchange的POP3服务没有configuration任何阻止列表。

另外,您应该从networking外部testing您的服务:从LAN开始,通过NAT出去,然后通过NAT公用IP返回到内部服务器,路由会变得很痛苦。


编辑:

我很困惑你的IPTABLESconfiguration。

你写了:

 -A FORWARD -d 192.168.1.1/32 -i eth1 -p udp -m udp --dport 110 -j ACCEPT -A FORWARD -d 192.168.1.1/32 -i eth1 -p udp -m udp --dport 25 -j ACCEPT 

但是SMTP和POP3是TCP协议,不是UDP协议!

另外,你正在这样做:

 -A INPUT -i eth1 -p tcp -j tcp_inbound [...] -A tcp_inbound -p tcp -m tcp --dport 80 -j ACCEPT -A tcp_inbound -p tcp -m tcp --dport 21 -j ACCEPT -A tcp_inbound -p tcp -m tcp --sport 20 -j ACCEPT -A tcp_inbound -p tcp -m tcp --dport 22 -j ACCEPT -A tcp_inbound -p tcp -m tcp --dport 25 -j ACCEPT -A tcp_inbound -p tcp -m tcp --dport 110 -j ACCEPT 

这些规则当它们被引导到防火墙本身 (INPUT链)时接受到这些端口的连接,但是如何将它们转发到内部服务器? 我没有看到任何端口转发。

我也没有看到在这里做任何NAT …但我的印象是你的Linux防火墙在其外部接口上有一个公共IP地址。

正如其他人指出的那样,您需要让POP3服务在任何界面上进行监听,而不仅仅是以前的外部监听。 我无法帮助,但:使用

 netstat -an | find ":110" 

validation你看到类似的东西

 TCP 0.0.0.0:110 0.0.0.0:0 LISTENING 

并不是

 TCP 222.222.222.222:110 0.0.0.0:0 LISTENING 

后者意味着只有到222-IP的连接尝试才能到达POP3服务。 根据防火墙configuration,您的连接尝试将会停止(端口处于“隐形模式”或“接近时performance为死亡”,静默丢弃)或立即断开(ICMP端口不可达或TCP RST数据包发送)。

您还可以通过使用Windows服务器上的Wireshark等数据包嗅探器来检查连接尝试是否到达POP3服务器。

几乎不值得一个答案,但它可以帮助你更好地解决问题: https : //www.testexchangeconnectivity.com/使用该页面上的最后2个testing,也许还有其他一些testing,你可能能够链接到微软KB来解决问题。

祝你好运

好的,iptablesconfiguration是错误的或不完整的。 对于这样的configuration,你应该使用nat模块和PREROUTING表。

检查iptables -nL -t nat显示出不同的东西。

你要做的是DNAT(目标networking地址转换)。 正确的调用将是:

 iptables -t nat -p tcp -A PREROUTING -d 222.222.222.222/32 --dport 110 -j DNAT --to-destination 192.168.1.1 

祝你好运,
JoãoMiguel Neves