![为什么我无法从我的公共 IP 访问 SSH,但随机黑客机器人可以?](https://linux22.com/image/1553330/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E6%97%A0%E6%B3%95%E4%BB%8E%E6%88%91%E7%9A%84%E5%85%AC%E5%85%B1%20IP%20%E8%AE%BF%E9%97%AE%20SSH%EF%BC%8C%E4%BD%86%E9%9A%8F%E6%9C%BA%E9%BB%91%E5%AE%A2%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%8F%AF%E4%BB%A5%EF%BC%9F.png)
我有一台装有 Raspbian Stretch 的 Raspberry Pi3,位于家用路由器后面。
RPi 中的 /var/log/auth.log 持续显示使用通用用户名(root、operator、webmaster 等)在随机端口(数字较大)上登录失败,大约每 10 秒尝试 3 次,来自中国地址。我知道这并不奇怪。
我不明白的是,当我尝试通过我的公共 IP 联系它时,PuTTY 为什么无法到达同一个服务器?
我在这个领域还是个新手,但以我的知识来看,这完全是一个悖论。
一些额外的技术说明:
iptables 未受影响
使用 nmap 对我的公共 IP 地址进行扫描,结果显示“扫描的所有 1000 个端口均已被过滤”
- 一个功能齐全的 LAMP 服务器托管着一个可以工作的 Owncloud,但只能从 LAN 运行,因为任何联系我的公共 IP 地址的尝试都失败了。
- 我尝试从与 RPi 相同的 LAN 连接到我的公共 IP。
- 端口 22 被重定向到路由器中的 RPi,并且为了进行我目前的测试,路由器的防火墙完全关闭。
- 在路由器中,我的 RPi 被设置为 DMZ。据我所知,关闭此设置后结果相同。
我的数据包被丢到哪里了?为什么?
我可以在哪里搜索可以向我显示的日志?
提前致谢
答案1
这是由于无法执行 Hairpin NAT 而导致的常见问题。大多数廉价家用路由器只需打开端口转发即可解决此问题。然而,高端路由器实际上需要单独的规则来解决这个问题。
常规 NAT 规则仅在网络外部有效。如果您尝试从网络内部进行连接,则存在 NAT 问题。
考虑一下这个...
- 您
Server A
在本地网络上拥有 IP10.10.10.10
。 - 您
Computer A
在本地网络上拥有 IP10.10.10.20
。 - 您拥有
Router A
的 IPLAN
为10.10.10.1
,以及WAN
的 IP 为11.11.11.11
。 - 您
Computer B
的网络外部有 IP12.12.12.12
。 - 您已从
port 22
WAN IP 转发至Server A
。
从你的网络外部来看,流量如下所示:
计算机 B 尝试连接服务器 A:
Source IP: 12.12.12.12 Src Port: 12345
Destination IP: 11.11.11.11 Dest Port: 22
路由器 A 对数据包进行 NAT 并将其发送到服务器 A:
Source IP: 12.12.12.12 Src Port: 12345
Destination IP: 10.10.10.10 Dest Port: 22
服务器A响应计算机B:
Source IP: 10.10.10.10 Src Port: 22
Destination IP: 12.12.12.12 Dest Port: 12345
路由器 A 对数据包进行 NAT 并将其发送到计算机 B:
Source IP: 11.11.11.11 Src Port: 22
Destination IP: 12.12.12.12 Dest Port: 12345
一切按预期运行。现在,考虑同样的场景,但从网络内部来看:
计算机 A 尝试连接服务器 A:
Source IP: 10.10.10.20 Src Port: 12345
Destination IP: 11.11.11.11 Dest Port: 22
路由器 A 对数据包进行 NAT 并将其发送到服务器 A:
Source IP: 10.10.10.20 Src Port: 12345
Destination IP: 10.10.10.10 Dest Port: 22
服务器A响应计算机A:
Source IP: 10.10.10.10 Src Port: 22
Destination IP: 10.10.10.20 Dest Port: 12345
源 IP 与目标 IP 位于同一子网。Server A
不会将数据包发送回路由器,而是直接将其发送到Computer A
。Computer A
丢弃数据包,因为它来自10.10.10.10
,并且它将原始数据包发送到11.11.11.11
。 它期望数据包从 返回11.11.11.11
。
要解决此问题,您必须创建第二条更具体的 NAT 规则来匹配来自网络内部的流量。它将位于原始 NAT 规则之后。您需要执行如下所示的源 NAT:
srcnat src-address=10.10.10.0/24 dst-address=10.10.10.10 dst-port=22 out-interface=LAN action=masquerade
现在,让我们再看一下:
计算机 A 尝试连接服务器 A:
Source IP: 10.10.10.20 Src Port: 12345
Destination IP: 11.11.11.11 Dest Port: 22
路由器 A 对数据包进行 NAT 并将其发送到服务器 A:
Source IP: 10.10.10.1 Src Port: 12345
Destination IP: 10.10.10.10 Dest Port: 22
服务器A响应计算机A:
Source IP: 10.10.10.10 Src Port: 22
Destination IP: 10.10.10.1 Dest Port: 12345
路由器 A 对数据包进行 NAT 并将其发送到计算机 A:
Source IP: 11.11.11.11 Src Port: 22
Destination IP: 10.10.10.20 Dest Port: 12345
一切按预期进行。
如何实施第二条 NAT 规则取决于路由器硬件和软件。您的情况可能会有所不同。