我正在尝试通过 SSH 从家庭网络外部访问我的 Raspberry Pi。我尝试在路由器上设置端口转发,但到目前为止显然没有成功。
我设置了一个随机端口(假设端口 10001)以通向 Pi 上的端口 22。路由器显示端口转发已成功,并列出了用于该端口转发的“互联网上的 IPv4 地址”。我们将路由器提供的这个 IP 地址称为 100.XXX.XX.XX。这与我访问“检查我的 IP”网站时弹出的 IP 地址不同,我们将其称为 79.XXX.XXX.XXX。
我可以通过以下方式访问我的 Pi:
- 从家庭网络,使用 Pi 的内部 IP(192.XXX.XXX.XX)和端口 22
- 从家庭网络,使用 100.XXX.XX.XX(路由器设置中列出的“互联网上的 IPv4 地址”)以及端口“10001”
- 从家庭网络或外部网络,使用 ngrok 隧道服务
我无法从外部网络访问我的 Pi
- 使用 100.XXX.XX.XX 和端口 10001
- 使用 79.XXX.XXX.XXX 和端口 10001 或 22
在外部网络的 Putty 中使用以下组合可产生以下结果:
- 79.XXX.XXX.XXX,端口 10001:网络错误:连接被拒绝
- 79.XXX.XXX.XXX,端口 22:网络错误:连接超时
- 100.XXX.XX.XX,任一端口:网络错误:连接超时
请记住,我的外部 IP 似乎是 79.XXX.XXX.XXX,而我的路由器告诉我使用 100.XXX.XX.XX(当我在家庭网络中时,这个 IP 有效)。我的 Pi 显然正在监听端口 22(我可以从家庭网络访问它),并且端口转发已“成功”,只能从我的家庭网络访问。我想知道 Pi 是否阻止了我的外部网络的 IP,但就像我提到的那样,如果我在 Pi 上设置 ngrok,它就可以工作。(我当然可以坚持使用 ngrok,但基本端口转发失败似乎已成为我的白鲸。)
令我感到困惑的是,路由器告诉我要使用的 IP 与其他网站告诉我的 IP 不同。而且这个 IP 实际上可以在本地网络使用,但不能在外部使用。这让我觉得很奇怪。
有什么建议吗?我是新手。我是不是忘了什么?我不认为 Raspbian OS 会附带任何预配置的防火墙。
答案1
您的 ISP 已将您置于 CGNAT 之后。就像您的家用设备位于路由器的 NAT 之后并且必须共享一个“外部”地址一样,现在您的路由器本身位于第二层 NAT 之后,并且您与其他客户共享“外部”IP 地址。换句话说,您不再拥有自己的 IP 地址,如果没有 IP 地址,就无法成功使用端口转发。
(这就像将两个路由器一个接一个地堆叠在一起,并且必须进行两次端口转发 - 只是在您的情况下无法执行后者。)
我无法使用 100.XXX.XX.XX 和端口 10001 从外部网络访问我的 Pi
是的,因为这实际上是私人的该地址仅在您的 ISP 网络内可访问。
虽然不属于众所周知的 RFC1918 私有范围,但 100.64.0.0/10是实际上是保留供私人使用 - 具体来说,供 ISP 在实施 CGNAT 时使用,而不是家庭或企业网络。
我无法使用 79.XXX.XXX.XXX 和端口 10001 或 22 从外部网络访问我的 Pi
是的,因为这个地址属于 ISP 的 CGNAT 网关,而不是您。由于您无法告诉 ISP 为您设置“CGNAT 端口转发”,因此它不会将任何传入连接中继到您的家庭路由器。
令我感到困惑的是,路由器告诉我要使用的 IP 与其他网站告诉我的 IP 不同。
好吧,路由器正确地显示了分配给路由器本身的 IP 地址。它假设这将是你的“公共”IP 地址,因为在很长一段时间内,大多数情况下确实都是如此(直到 CGNAT 开始成为非常在过去几年中很常见)。
路由器没有被编程为预期 CGNAT,而且它实际上不知道它是否位于任何类型的 NAT 后面。它可能已被编程为识别不应该出现的 RFC1918 私有地址,但它无法识别 100.64 范围。
虽然理论上路由器可以使用在线服务来检查其“真实”的外部 IP 地址,但这实际上根本没用。请记住,CGNAT 的目的是在多个客户之间共享一个地址。因此,即使它做过告诉您正确的地址,无论如何没有人能够连接 - 因为您的 ISP 的 CGNAT 网关不知道哪个客户应该接收该连接。(正如您所看到的,每当您尝试连接到 79.xxx 地址时,都会失败。)
所以实际上,路由器自己的地址是最少错误显示的选项——无论是否可以从互联网访问,它确实是一个至少从直接上游的网络接受待转发连接的地址。
(这与您在 Pi 上运行ip addr
或时相同,它会显示其自己的地址。)netstat -ltn
而且这个 IP 实际上可以在本地网络使用,但在外部却不能。这让我觉得很奇怪。
该地址属于您的路由器。因此它在内部有效,因为您直接连接到路由器 - 因此数据包永远不会离开您的家庭网络。(但它在外部不起作用,因为它是互联网上毫无意义的私有范围。)