服务器可以通过来自外部的域名访问,但不能通过内部网访问

我有一个Apache Web服务器/邮件服务器(在Ubuntu上运行)设置如下:

  • 带有NAT的Speedport路由器可用于所有需要的端口
  • DynDNS通过使用非静态IP地址来获取域名

我面对的问题是,网站abc.com可以从内部网外部访问,但不能从内部访问。

speedport路由器不允许对域名路由进行任何更改

这是我的主机文件:

127.0.0.1 localhost localhost.localdomain 127.0.0.1 localhost #192.168.2.110 marvin.localhost.com marvin #10.8.0.1 marvin marvin.localhost.com 127.0.0.1 mx.localhost.com.cust.b.hostedemail.com 192.168.2.110 DOMAINNAME.com # 192.168.2.110 marvin.DOMAINNAME.com marvin ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 

这曾经工作好一年,突然停止工作,这让我感到困惑。 看起来像在内联网域名没有正确发布/路由。

这是IPv4使用NAT的一个副作用。 您的Intranet客户端将获得“外部”IP地址,但该地址只能从Intranet外部访问。

有两种解决scheme:第一种是水平分割DNS 。 第二个(也许更好的)解决scheme是部署IPv6,而不会遇到这个问题。

快速的解决方法是在局域网中工作时,通过内部 IP地址而不是互联网URL来访问服务器。

不知道这是否适用于您,但是我与使用非路由IP地址运行的虚拟机有相同的问题,并将外部IP转发给它们。 在我的设置中,我有一个运行KVM的红帽服务器。 虚拟机都是192.168.122.0/24的IP。 所以我有:

 extip=172.1.1.7 (the external VIP address I'm forwarding to one of the VMs) destip=192.168.122.7 (the internal non-routed IP of a VM) 

那么会发生什么情况是,如果另一个内部虚拟机(如192.168.122.5)尝试与172.1.1.7对话,那么这些数据包将被转发到目标虚拟机(192.168.122.7) – 但是,由于源IP地址是192.168.122.5 ,并且在同一个子网上,则目标VM将回复数据包直接发送回该地址,而不通过路由器IP(192.168.122.1)。 现在,这些数据包不会被源虚拟机识别为同一会话的一部分,因此会被丢弃。 解决scheme是添加一个POSTROUTING SNAT规则来重写来自内部VMnetworking的任何数据包的源IP地址 – 强制回复数据包通过网关IP地址返回。 因此,我最终的iptables规则如下所示:

 # Main DNAT routing rule iptables -t nat -I PREROUTING -p tcp -d ${extip}/32 -j DNAT --to-destination ${destip} # SNAT rule to handle internal hosts talking to external IP iptables -t nat -I POSTROUTING -s 192.168.122.0/24 -d ${destip}/32 -p tcp -j SNAT --to-source ${extip} # Final DNAT rule, so the firewall host can also talk to the external IP iptables -t nat -I OUTPUT -d ${extip}/32 -p tcp -j DNAT --to-destination ${destip}