新手:如果两台计算机在防火墙后面,它们如何通信?

网络工程 ipv4 纳特 通讯协议 ipv6
2021-07-06 03:28:05

这是我一直想知道但找不到答案的事情。为这个愚蠢的问题道歉,但它是这样的:

如果两台计算机具有静态 IP,则它们可以轻松地通过 TCP/IP 相互发送数据包。

如果计算机位于防火墙/路由器/其他将其连接到 Internet 的设备后面,则该计算机没有外部 IP 地址。相反,它有一个 LAN 地址,例如 192.168。. . 如果这台计算机要访问网页,它会知道网络服务器的 IP 地址,或者使用 DNS 获取它。它发送一个 TCP/IP 数据包,但是服务器如何知道将答案发送到哪个 IP?

我想象如下:

Request:  A --[send to C, return to A]-> B --[send to C, return to B]-> C
Response: A <-[send to A, return to C]-- B <-[send to B, return to C]-- C

A问题的计算机在哪里B它背后的路由器是什么,C是目标网络服务器。但这似乎并不现实,因为B必须记住将每个路由出去的数据包的回复转发给谁这可能很多。

所以我的问题 1是:如何C回复A

在另一种情况下,计算机A想要向D位于不同 LAN 网络中的计算机发送数据包如果没有中央服务器,这可能E吗?我想象这样的事情:

Request:  A --[s.t. D, r.t. A]-> B --[s.t. D, r.t. B]-> C --[s.t. D, r.t. C]-> D

但是,没有办法A知道 的地址D,因为D实际上没有外部 IP 地址。使用中央服务器的唯一解决方案E是:

A connects to E; has an id in E's system which is id_A
D connects to E; has an id in E's system which is id_D
A sends a message to D indirectly, by sending it to E and saying it is for id_D
E forwards the message to D, as it knows how to communicate with D

即使在这种情况下,如果没有请求,我也不太明白如何E向 发送消息(因为我的 PC <-> 服务器通信模型取决于 PC 请求和服务器响应的假设;见问题 1)。DD

我的问题 2是:如果它们在不同的 LAN 中,是否有可能以及如何仅具有 LAN IP 的两台计算机直接通信。

如果你能给我指出一些初学者的文献,那就足够了。

感谢您的时间。

2个回答

第一:您所描述的是NAT,而不是防火墙。防火墙只是过滤可以通过的内容,NAT 设备更改数据包中的地址。

你几乎自己回答了第一个问题。是的,NAT 设备需要跟踪通过它的每个会话。Internet 上的大多数通信使用 TCP 或 UDP。这两种协议都使用端口号。会话由源地址、源端口号、目的地址和目的端口号定义。NAT设备需要维护内部哪些号码对应外部哪些号码的映射关系。然后它必须将每个数据包与其映射表中的条目进行匹配,并相应地调整数据包。

这也是 NAT 设备不是最佳的原因:普通路由器是无状态的。它不需要跟踪之前发生的事情,也不需要调整数据包中的数字和地址。如果路由器出现故障,另一台路由器可以立即接管。当 NAT 设备出现故障时,接管的设备没有相同的映射表,所有会话都会中断,必须重新建立。

你的第二个问题更复杂。一种选择是在其中一台 NAT 设备中配置端口转发。然后你让 A 向 C 上的转发端口发送一个数据包。 B 将更改源地址和端口为它自己的一个。当数据包到达 C 时,它会调整目标地址和端口,以便将数据包转发到 D。回复数据包在相反的方向上做完全相同的事情。

如果没有端口转发,那么它会变得更加困难。您需要有外部服务器 E 的帮助。A 和 D 都必须启动到 E 的连接。然后 E 必须协调在 A 和 D 之间建立会话。A 和 D 都发送出站数据包以欺骗 B 和 C将条目添加到它们的映射表中。一旦这些映射到位,它们就可以直接通信。

总结一下:事情通常的工作方式是,对于出站数据包,您有一个执行源 NAT 的设备。它将内部设备的源地址和端口更改为它自己的一个。对于入站数据包,您有一个执行目标 NAT 的设备。它将目标地址和端口更改为其映射表中的内容。映射表通过手动配置、允许内部系统请求映射的协议(没有谈论那些,查找 UPNP 和 PCP)或在 NAT 设备为出站数据包创建条目时自动填充。

这是Azure 服务总线中继应该解决的问题之一。它适用于两台计算机都可以访问互联网的情况。它们都连接到 azure,然后由 azure 处理它们之间的通信。