无法从 LAN 内部访问外部服务

无法从 LAN 内部访问外部服务

我遇到了一个奇怪的端口转发问题。我尝试将端口 22 开放给外部网络。只要我不在 LAN 内,我就可以访问它。例如,我可以从我的办公室访问它。但在 LAN 内,我可以使用本地 IP 访问端口,但无法使用外部 IP 访问端口。就好像路由器阻止了环回。我检查了所有路由器设置,关闭了所有与防火墙/过滤相关的设置。有什么想法吗?

答案1

假设 Spiff 是正确的,并且你的路由器无法处理从网络内部到外部 IP 的端口转发,那么可以进行一个小的解决方法(听起来确实如此);

您可以编辑 hosts 文件,该文件在大多数 unix 系统中位于 /etc/hosts,在 Windows 中位于 C:\Windows\system32\drivers\etc\。

如果你添加

192.168.0.15  example.com

在该文件中,每当您尝试访问 example.com 时,您的计算机都会转到指定的 IP。当然,您必须在网络内想要使用的每台计算机上执行此操作。

您可以查看维基百科文章以获取有关在哪里找到它的更多详细信息: https://en.wikipedia.org/wiki/Hosts_file

答案2

鉴于您提到了端口转发,我假设您的家庭网关充当 NAT(或更具体地说是 NAPT)网关。您尝试执行的操作称为“发夹形 NAT”或“NAT 发夹弯”,指的是字面上的发夹弯折回的方式(术语“发夹弯”也使用相同的暗示,指道路折回的急转弯)。

有些 NAT 网关很差劲,不支持发夹式连接。现在可能是时候探索升级选项了。

答案3

这个问题的答案其实很简单。NAT 阻碍了它的发展。

  1. 您的计算机打开与 [ExternalIP] 的连接
  2. 您的路由器将该连接转发到 [SSHInternalIP]。您的 SSH 服务器看到来自 [YourInternalIP] 的连接。
  3. 您的 SSH 服务器将其数据包发送到 [YourInternalIP]。
  4. 您的计算机发现一个来自从未与其通信过的 IP 的奇怪数据包并将其丢弃。
  5. 您与 TCP/22 的连接失败,因为 TCP 三次握手从未完成。

您正在尝试与公共 IP 通信,但回复来自内部 IP。您的计算机无法使两者协同工作。解决方案是,只要您在路由器后面,就使用内部 IP。我在我的笔记本电脑上通过根据我所在的位置使用不同的 ssh 连接字符串来解决此问题。

答案4

据我了解,运行带有 NAT 的 OpenBSD 路由器,Spiff 的回答是正确的:您遇到的问题是由于 NAT 网关不支持您尝试执行的操作而导致的。

您的工作站正在发送数据包,其源 IP 为内部地址(例如 10.0.0.2),但目标地址是您的外部 IP。当数据包到达端口 22 上的(SSH?)服务器时,服务器会直接回复您的工作站,并且不会发生 NAT;现在,当您的工作站收到来自 10.0.0.3 的回复(而它原本期待收到来自您的外部地址的回复)时,它会丢弃数据包。

这看起来像是一个微不足道的问题,但可以通过更新工作站的 HOSTS 文件、添加内部 DNS 服务器(或编辑 DNS 服务器的条目)或创建 NAT 规则来处理内部->外部->内部流量来解决。

相关内容