开放套接字上允许入站流量吗?

问题描述

ISP倾向于阻止所有入站流量。如果在与远程服务器进行初始握手后使套接字保持活动状态,并且该协议对套接字保持打开状态没有任何限制,该怎么办?服务器可以向我发送流量而无需客户端首先发送请求吗?我在某处读到了推送服务器的工作方式。但是我很困惑这是怎么可能的。套接字不只是两个端点(客户端和服务器)分配的资源吗?我的ISP应该如何了解有关打开的连接的任何信息,而不会在中间丢弃入站流量?

解决方法

ISP倾向于阻止所有入站流量。

通常情况并非如此。但是通常情况下,涉及到NAT(网络地址转换)以将多个内部IP地址映射到单个公共可见IP地址。由于NAT的工作方式,它将隐式阻止入站流量,因为它找不到匹配的NAT状态。

NAT几乎总是在家用路由器上完成,并且可能另外在ISP(CGNAT-运营商级NAT)上完成。

我的ISP应该如何了解有关打开的连接的任何信息,从而不会在中间丢弃入站流量?

ISP(对于CGNAT)和您的家庭路由器具有一个状态表,该表将内部连接(在NAT之前)与重写的内部连接(在NAT之后)相匹配。如果数据是从Internet到达的,它将尝试将它们映射到状态表并将数据包改写回去。如果没有状态,则将数据包丢弃。

如果在与远程服务器进行初次握手之后使套接字保持活动状态,并且该协议对套接字保持打开状态没有任何限制,该怎么办?服务器可以在不需要客户端首先发送请求的情况下向我发送流量吗?

即使端口实际上被阻止进行外部启动的连接,通常也可以从内部启动任意连接。这些已经建立,则可以将任何数据发送回去。这是通过类似于NAT的技术实现的,但是没有实际的地址转换-状态防火墙。

您提到的请求和响应模式实际上更特定于HTTP之类的协议,但是其他协议(如SSH,WebSockets等)仍然不使用这种方法。

使用NAT和有状态防火墙,都必须确保未删除该统计信息。在某个(特定于设备的)不活动超时之后,将删除状态,并且一旦完成,就不会转发入站数据。通过发送实际的应用程序数据或使用TCP保持活动状态(这是没有应用程序数据的心跳信号)来保持状态为打开状态。