无法使用 WAN IP 地址连接到 SSH 服务器

Tha*_*tos 5 networking ssh tcp

我在 NAT 路由器后面有一个 SSH 服务器。与 SSH 服务器位于同一 (NAT'd) 网络上的机器只能使用 LAN IP 连接到 SSH 服务器,而不能使用 WAN IP。为什么?

我的网络看起来像这样:

(the Internet, via Comcast)
      |
      | (cable line)
  comcast modem. ? External IP of a.b.c.d,
      |            internal IP of 10.1.10.1 on 10.1.10.0/24
      |
      |
   box running sshd  (10.1.10.201)
Run Code Online (Sandbox Code Playgroud)

我在执行 NAT 的 Comcast 路由器后面运行 SSH 服务。使用上面获得的 IP 地址,我可以ssh me@«that IP»从 Internet 上的任何地方运行,并接收我的 SSH 服务。如果我在路由器内部的 10.1.10.0/24 网络中运行相同的命令,连接将超时。

Comcast 路由器设置为在标准端口上将端口转发到 SSH 机器。

  • comcast 路由器在内部和外部 IP 上应答 ping。
  • 运行的盒子sshd回答 ping

该设备是一块垃圾SMC Networks SMCD3G。

sshd机器上执行wireshark ,同时尝试ssh 10.1.10.201提供正常的流量。尝试ssh a.b.c.d给出以下结果:

Source       Destination  Info
10.1.10.11   10.1.10.201  39946 > ssh [SYN] Seq=0 Win=14600 Len=0 MSS=1460
10.1.10.201  10.1.10.11   ssh > 39946 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0
10.1.10.11   10.1.10.201  39946 > ssh [RST] Seq=1 Win=0 Len=0

10.1.10.11     10.1.10.201  39946 > ssh [SYN] Seq=0 Win=14600 Len=0 MSS=1460
10.1.10.201  10.1.10.11   [TCP Previous segment lost] ssh > 39946 [SYN, ACK] Seq=46941561
10.1.10.11   10.1.10.201  39946 > ssh [RST] Seq=1 Win=0 Len=0

(the last three lines repeat)
Run Code Online (Sandbox Code Playgroud)

数据包似乎到达那里,但连接机器正在发送 RST。为什么?

从客户端(运行 SSH 的机器)来看,稍后的尝试如下所示:

Source       Destination  Info
10.1.10.11   a.b.c.d      40212 > ssh [SYN] Seq=0 Win=14600 Len=0 MSS=1460
10.1.10.201  10.1.10.11   ssh > 40212 [SYN, ACK] Seq=0 Ack=1 Win=5792 Len=0 MSS=1460
10.1.10.11   10.1.10.201  40212 > ssh [RST] Seq=1 Win=0 Len=0

10.1.10.11   a.b.c.d      [TCP Retransmission] 40212 > ssh [SYN] Seq=0 Win=14600 Len=0 MSS=1460
10.1.10.201  10.1.10.11   [TCP Previous segment not captured] ssh > 40212 [SYN, ACK] Seq=15635206
10.1.10.11   10.1.10.201  40212 > ssh [RST] Seq=1 Win=0 Len = 0

(the last three lines repeat)
Run Code Online (Sandbox Code Playgroud)

唯一突出的是我不断收到“未捕获上一个片段”(它不是?似乎就在那里),并且来自客户端的序列号确实是确定性的。(他们不是应该从一个随机点开始,然后从那里增加吗?)

Rik*_*Rik 3

正如我在评论中所说。为了能够在 LAN 内使用您的公共 IP,您需要一些称为NAT LoopbackNAT hairpinning的东西NAT reflection

你可以在这里读到它

据我在互联网上找到的,您的...呃...“SMC Networks SMCD3G”不支持“NAT Loopback”。

您有两个选择:

  1. 10.1.10.201 fake_or_real_hostname您可以在主机文件中添加一行。
    您可以像这样连接ssh me@fake_or_real_hostname

  2. 您可以运行自己的本地 DNS 服务器。是一些解释。

我解决了与您遇到的同样的问题,方法是运行我自己的本地 DNS 服务器,该服务器递归到非本地域的 OpenDNS,并使用本地 DNS A 和 PTR 记录创建区域,将我的外部主机名解析为该主机的 LAN IP。


在这两种情况下,最好使用主机名而不是 IP。如果您的公共 IP 变化很大,您可以使用动态主机名服务来获取主机名(例如 myname.dyndns.org)。它也更容易记住。如果您选择选项 1,您可以将此名称添加到您的主机文件中。

其中一些是:
DynDNS
FreeDNS
ZoneEdit
No-Ip

我的调制解调器可以选择自动向这些服务注册 IP 更改。还有一些桌面实用程序可以在您的公共 IP 更改时更新它。