大家好,我最近被要求管理几个运行 Web 服务器的 ubuntu 机器。我是一名职业开发人员,所以如果这个问题比较菜鸟,请原谅。
我们在这个机器上运行了大约十几个网站。其中两个网站需要通过 restful api 进行通信。不幸的是,我们通过 wget 连接网站时遇到了问题。当我们尝试从服务器上的命令行手动运行 wget 并指向该服务器上的一个网站时,它会挂起并最终超时。如果我们从服务器外部对服务器上的同一网站执行同样的事情,它就会正常工作。
是否有原因导致同一台服务器上的站点无法相互通信?从服务器 ping 站点时也会发生同样的事情。
答案1
我会检查 /etc/hosts 中是否有错误条目。我还会检查主机解析顺序和 DNS 配置。
例如,如果您的运行wget http://www.example.com/whatever
包含/etc/hosts
一个条目,www.example.com
那么此命令在本地运行时将会失败。
编辑
/etc/hosts
不包含通常意义上的“路线”(参见netstat -nr
),它包含主机名和 IP 地址之间的关联。
您提到“内部 IP 名称”和“外部 IP” - 您指的是“外部 IP 地址”和“内部 IP 地址”,其中外部 IP 地址是路由器外部接口的地址,因此是互联网用户用来访问您的生产网络服务器的地址?
如果是这样,很可能您的 Web 服务器认为这是一个外部的 LAN 外 IP 地址,将流量转发wget
到您的路由器,而路由器的 NAT 和端口映射不允许从其 LAN 端路由到该 IP 地址。
如果是这样,请编辑/etc/hosts
并将外部 IP 地址替换为内部的ip-address 或添加一个额外的test.host.local
条目内部的10.nnn ip 地址并在 中使用该新名称wget http://test.host.local/whatever
。
答案2
我假设你有一个像这样的设置:
Internet--NAT设备/路由器--内部网络-->Web服务器
假设 Web 服务器的名称为 www.example.com,解析为外部 IP 地址 1.2.3.4,NAT 设备 DNAT 1.2.3.4 至 10.4.4.4,这是 Web 服务器的内部 IP。
这对于外部客户端来说很有效,但内部客户端需要额外的配置。原因:假设内部客户端 (10.4.4.5) 想要访问 www.example.com (1.2.3.4)。它将流量发送到默认路由器(假设它是 NAT 设备,尽管更可能使用复杂的路由设置)。NAT 设备将目标 IP 从 1.2.3.4 NAT 到 10.4.4.4,并将流量发送到 10.4.4.4。(此时,哑 NAT 可能会发送(无用的)ICMP 重定向,因为流量从它进入的同一接口流出。)10.4.4.4 获取流量,制定响应,并将其发送回客户端 10.4.4.5。由于 Web 服务器位于同一子网中,因此没有进行路由/NAT。 10.4.4.5 接收来自 10.4.4.4 的流量并显示“WTF?”(即发送 TCP 重置数据包),因为它不是在与 10.4.4.4 通信。它正在与 1.2.3.4 通信,并且不知道 1.2.3.4 实际上是 10.4.4.4。只有 NAT 设备知道这一点。
对此问题有三个解决方案。
SNAT。当 NAT 设备从内部接收到对 NAT 外部 IP 的请求时,它会将源地址 NAT 为其自己的 IP 地址(之一),以便从 Web 服务器获取响应并对其执行 DNAT。
不同的内部/外部 DNS。配置内部名称服务器以返回 www.example.com 的 10.4.4.4。(需要另一个名称服务器来使用外部 IP 地址处理外部查询。)
由于本例中的客户端是 Web 服务器本身,因此您可以添加 www.example.com 作为 127.0.0.1 的别名。(简单但不可扩展。)