![将 Microsoft Exchange 服务器迁移至专用网络](https://linux22.com/image/511682/%E5%B0%86%20Microsoft%20Exchange%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%81%E7%A7%BB%E8%87%B3%E4%B8%93%E7%94%A8%E7%BD%91%E7%BB%9C.png)
在其中一个办公室中,我们有一个包含 50 台计算机的网络,但只有一台服务器:
- Windows 2003 服务器
- 微软 ISA 服务器
- Microsoft Exchange 2003
该服务器用作网关(代理服务器)、邮件服务器、文件服务器、防火墙和域控制器。它有两个网络接口,一个用于 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 机器,因此我需要该机器上的邮件服务器可从 Internet 访问。我设置了 iptables 规则,将我们外部 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 服务的问候,一切正常。但是当我远程登录 POP3 服务时
telnet 222.222.222.222 110
我只看到空白的黑屏,而且如果我按任何按钮,连接似乎就会消失。我检查了 ISA 规则 - 110 号和 25 号端口似乎都一样。当我从我们的新网关机器远程登录到我们的 Windows 服务器的 110 号端口时,如下所示:
telnet 192.168.1.1 110
我获得了其 POP3 服务的访问权限:
+OK Microsoft Exchange Server 2003 POP3 server version 6.5.7638.1
(...) ready.
我应该怎么做才能使 POP3 服务通过我们的新网关提供?
UPD:我的 iptables 配置如下:
-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
答案1
请验证“POP3 虚拟服务器属性”的“访问”选项卡下的连接控制属性是否允许“除以下列表之外的所有”。
答案2
我不建议你让未加密的 POP3 保持可访问状态。你可以在 Linux 机器上使用此 stunnel(请参阅http://www.sysdesign.ca/guides/secure_pop3.html例如)提供 POP3。
这不仅可以防止您的电子邮件访问密码被盗,还可以解决您的问题,因为连接将在本地进行。我建议对 SMTP 也执行相同的操作,但您必须保留端口 25 以用于接收邮件。
答案3
如果你不再使用 ISA 作为防火墙,而只是作为代理,你应该从其配置中删除所有规则,只创建一个“允许从任何地方到任何地方的所有流量”策略;在与 Exchange 和 DC 相同的机器上运行 ISA 可以获得相当凌乱的。
您还应该检查您的 IPTABLES 配置是否真正允许外部连接到内部 POP3 服务,以及 Exchange 的 POP3 服务是否没有配置任何阻止列表。
此外,你应该测试你的服务外部您的网络:当您从 LAN 出发,通过 NAT 出去,然后通过 NAT 的公共 IP 返回到内部服务器时,路由会变得很麻烦。
编辑:
我对您的 IPTABLES 配置感到很困惑。
你写了:
-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 和 POP3TCP协议,而不是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 地址。
答案4
几乎不值得回答,但它可以帮助你更好地解决问题: https://www.testexchangeconnectivity.com/ 使用该页面上的最后 2 个测试以及其他一些测试,您也许能够获得 Microsoft KB 的链接来解决问题。
祝你好运