wget 适用于网络上的所有网站,但不适用于该服务器上托管的网站

wget 适用于网络上的所有网站,但不适用于该服务器上托管的网站

我目前有 2 台负载均衡的 Ubuntu 12.04 服务器。如果我从 shell 转到其中任何一台服务器并输入:

wget stackoverflow.com

页面被提取到index.html。但是,假设托管在这些服务器上的站点名为mysite.com,则调用

wget mysite.com

我得到:

Resolving mysite.com (mysite.com)... 50.XXX.YY.ZZZ
Connecting to mysite.com (mysite.com)|50.XXX.YY.ZZZ|:80... failed: Connection refused.

50.XXX.YY.ZZZ的公网 IP 在哪里mysite.com?您知道这些服务器出了什么问题吗?

答案1

基本问题是这样的:

  1. 该服务器有一个私有的内部 IP 地址。(为简单起见,我将其称为 192.168.0.2。)

  2. 它打开从其私有内部 IP 地址到其公共地址的连接。(从 192.168.0.2 到 59.XXX.YY.ZZ)

  3. 这将按照服务器的默认路由到达路由器。(因为机器不知道公共地址与自身相关联。)

  4. 路由器端口将请求转发到公网 IP 地址,然后转发给机器。请求的来源仍是 192.168.0.2,但现在目的地是 192.168.0.2。

  5. 该计算机接收从 192.168.0.2 到 192.168.0.2 的连接,接受该连接,并向自己发送响应。(因为它知道 192.168.0.2 是本地的。)

  6. 该机器很困惑地收到来自 192.168.0.2 的响应,因为它期望收到来自 59.XXX.YY.ZZ 的响应,并且连接尝试失败。

为了发夹型NAT要正常工作,路由器不仅要将请求转发到正确的内部机器并重写目的地,还必须重写源以确保回复数据包通过路由器返回,这样它们也可以进行 NAT。许多路由器无法做到这一点,许多路由器需要特定配置才能做到这一点。

答案2

127.0.0.1 localhost mysite.com

在你的 /etc/hosts 中

我假设它使用公共 IP 将数据包路由到你的机器之外,但不知何故它们却无法返回。

相关内容