我在两台机器 A 和 B 上以相同的方式配置sshd_config
,以便可以使用密码在本地网络中连接:
Match address 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
PasswordAuthentication yes
两台机器都只有私有 IPv4,位于不同的 LAN 中,并位于具有不同公共 IPv4 的不同路由器后面,并且可以与其路由器的公共 IP 连接(将端口从外部转发到 LAN 私有 IP)。
当然,如果我使用本地 (IPv4) 地址将一台机器连接到自己或同一 LAN 中的另一台机器,ssh 会要求输入密码,这是预期的。现在看看通过路由器的公共 IPv4 连接机器时会发生什么。当
- 使用 A 的公网 IP 从 A 到 A 进行 ssh 连接:需要输入密码
使用 B 的公共 IP 从 B 到 B 进行 ssh :
permission denied (publickey)
从 B 到 A 或从 B 到 A 进行 ssh :
permission denied (publickey)
显然,在第一种情况下(在 LAN A 内),尽管 sshd 是通过公网 IP 进行 ssh 操作,但它匹配的是客户端的本地网络地址,而在第二种情况下(在 LAN B 内),它不匹配。造成这种差异的原因是什么?
注意:使用Match host localhost
而不是前一个,会导致在第一种情况下权限被拒绝(当然其他情况也是如此),因为从 A 本身来看,通过路由器公共 IP 进行 ssh 到自身的 A 被视为具有私有 LAN IP,而不是本地主机或公共 IP。
答案1
您描述的从内部系统 A 到 NAT 路由器 A 的 WAN IP 地址(发生端口转发)的流量称为发夹型NAT. (例如参见此问答以获得有关交通流量和危险的更详细描述。)
根据你的 NAT 路由器中发夹式 NAT 的实现方式,你可能会看到SSH 流量的源地址有以下任一情况:
- 到过更改为 WAN IP 地址 您的 NAT 路由器(发夹式 NAT 工作正常,但由于您的匹配规则没有看到内部 IP 地址,因此密码验证被拒绝。)
- 到过更改为 LAN IP 地址 NAT 路由器的内部网关地址(发夹式 NAT 正常工作,并且匹配规则有效,因为它检测到来自 LAN 网络范围的源 IP 地址)
- 没有改变并保留系统的内部 IP 地址(并且发夹式 NAT 被有效破坏,除非在特殊情况下,流量来自与端口防护规则的目标相同的系统。但您的匹配规则有效,因为它检测到服务器的 LAN IP 地址。)
您需要检查(您的日志)并查看哪个 IP 地址作为 SSH 连接的来源出现,以找出适合您的测试场景的内容。
我认为,对于您的场景 1 和 2,发夹式 NAT 在不同的 NAT 路由器 A 和 B 中的实现方式不同,从而导致不同的行为。