我有一个 apache 网络服务器/邮件服务器(在 Ubuntu 上运行),设置如下:
- Speedport 路由器,所有必需端口均带 NAT
- DynDNS 使用非静态 IP 地址获取域名
我面临的问题是,网站 abc.com 可以从 Intranet 外部访问,但不能从内部访问。
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
一年来,它一直运行良好,但突然停止工作,这让我很困惑。似乎在内部网中,域名没有正确发布/路由。
答案1
这是使用 IPv4 NAT 的副作用。您的内联网客户端会获得“外部”IP 地址,但该地址只能从内联网外部访问。
有两种解决方案:第一种是水平分割 DNS第二个(可能更好的)解决方案是部署 IPv6,它不会受到此问题的困扰。
答案2
快速解决方法是通过其服务器内部的从 LAN 工作时,使用 IP 地址而不是互联网 URL。
答案3
不确定这是否适合您,但我遇到了同样的问题,即运行非路由 IP 地址的虚拟机,并将外部 IP 转发给它们。在我的设置中,我有一台运行 KVM 的 Red Hat 服务器。虚拟机都是 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)
因此,如果另一个内部 VM(例如 192.168.122.5)尝试与 172.1.1.7 通信,则这些数据包确实会被转发到目标 VM(192.168.122.7)——但是,由于源 IP 地址是 192.168.122.5,并且位于同一子网中,因此目标 VM 会将回复数据包直接发送回该地址,而无需通过路由器 IP(192.168.122.1)。现在,这些数据包不会被源 VM 识别为同一会话的一部分,因此它们会被丢弃。解决方案是添加一条 POSTROUTING SNAT 规则来重写来自内部 VM 网络的任何数据包的源 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}