SSH 和 PWNAT 用于两个独立 NAT 之间的 SSH 连接

SSH 和 PWNAT 用于两个独立 NAT 之间的 SSH 连接

是否可以使用普纳特和 SSH 在两个独立的防火墙/NAT 后面的两台机器之间建立“点对点” SSH 连接?

如果可能的话,在运行 OpenSSH 服务器的 NAT 内部的 Linux 机器上设置此功能需要采取哪些步骤,以及单独 NAT 后面的客户端如何连接?

另外,如果这是可能的,那么这种设置是否存在重大的安全风险?任何任意 SSH 客户端都可以连接到运行 pwnat 的服务器吗?

答案1

是的。假设你的网络如下所示:

网络图

您想要从 A 到 B 进行 SSH 连接。您在 B 上运行了 sshd;它正在监听 tcp://127.0.0.1:22。

B$ pwnat -s 0.0.0.0 2022 127.0.0.1:22

B 上的 pwnat 目前正在监听 udp://0.0.0.0:2022,并配置为允许连接到 tcp://127.0.0.1:22。它还会定期向 3.3.3.3(硬编码 IP)发送 ICMP 回显请求。

A$ pwnat -c 127.0.0.1 3022 104.16.111.208 2022 127.0.0.1 22

A 上的 pwnat 现在正在监听 tcp://127.0.0.1:3022。

A 上的 pwnat 向 104.16.111.208 发送一个 ICMP 超时数据包,其有效负载与来自 NAT B 的传出 ICMP 回显请求匹配。NAT B 看到有效负载与传出的 ICMP 回显请求匹配,并将 ICMP 超时数据包转发给 B。请注意,ICMP 超时数据包的 IP 标头包含 NAT A 的 IP 151.101.193.69 作为源地址。

B 上的 pwnat 使用源端口 2022 向 udp://151.101.193.69:2022 发送一个 UDP 数据包。NAT B 在其表中添加了一个条目,因此将来它会将从 udp://104.16.111.208:2022 处收到的任何 UDP 数据包转发到 udp://192.168.2.10:2022。请注意,许多 NAT 会在外部接口上分配不同的端口。如果是这种情况,pwnat 不起作用

A 上的 pwnat 使用源端口 2022 向 udp://104.16.111.208:2022 发送一个 UDP 数据包。NAT A 在其表中添加了一个条目,因此将来它会将从 udp://104.16.111.208:2022 接收到的任何 UDP 数据包(udp://151.101.193.69:2022)转发到 udp://192.168.1.10:2022。

NAT A 收到 B 发送的 UDP 数据包,在自己的表中匹配后,转发给 A。NAT B 收到 A 发送的 UDP 数据包,在自己的表中匹配后,转发给 B。现在 A 和 B 就可以通过 UDP 自由通信了。

A$ ssh -p 3022 127.0.0.1

A 上的 pwnat 正在监听 tcp://127.0.0.1:3022,接受来自 ssh 的连接。A 上的 pwnat 向 B 上的 pwnat 发送请求(通过 UDP)以打开到 tcp://127.0.0.1:22 的隧道。由于在 B 上的 pwnat 启动时这被列为允许的主机/端口对,因此它建立了连接。隧道现已完成:

ssh on A --[tcp]--> pwnat on A --[udp]--> pwnat on B --[tcp]--> sshd on B

如果 pwnat 没有漏洞,那么从安全角度来看,这与在没有 NAT 后面的服务器上向外界公开 sshd 没有什么不同。但是,浏览源代码,pwnat 似乎有点被黑客攻击了,我不会指望它是安全的。最糟糕的情况是,以运行 pwnat 的用户身份在 A 和 B 上执行任意代码。

答案2

Pwnat 似乎未经身份验证,我认为这会带来重大安全风险。如果您控制两个 NAT/防火墙中的至少一个,只需设置端口转发/转换即可获得更安全的设置。

相关内容