我有一个客户端通过 VPN 隧道连接到服务器。连接已建立,我可以 ping 服务器并curl
通过该隧道请求一些其他服务(例如 API 请求)。
客户端上的一个服务无法绑定到服务器上的相应服务。执行 时tcpdump
,我看到服务器向连接到服务端口的客户端的RST
首字母回复 。SYN
谁能发布此信息RST
?是服务器的网络堆栈(由于防火墙、格式错误的数据包,简而言之,任何与纯网络相关的问题),还是服务本身(服务器上应该响应客户端查询的服务)?
该问题的目的是试图区分设备(操作系统、防火墙等)的错误配置和服务本身的错误配置/不兼容。具体来说,我想了解高级服务是否可以(可能间接地)关闭与请求客户端的连接,以便将消息RST
发回给客户端。
答案1
RST 可以由服务器或与流量交互的网络设备(例如防火墙、VPN 集中器)发出。
根据网络设备及其配置,它可以响应 RST 或 ICMP 不可达,或者默默地丢弃。
服务/应用程序正常关闭已建立的连接应该会导致出现 FIN 数据包而不是 RST;如果您尝试连接到未监听的端口,则可能会收到 RST。
最好的选择是在网络的不同点执行数据包嗅探;您可以在服务器的 NIC 上捕获流量,以查看它是否正在生成 RST,然后将监控点移向客户端(VPN 和防火墙通常可以转储数据包捕获或日志)
答案2
RST 标志由服务器的网络堆栈发送,如果端口被过滤,防火墙往往会默默地丢弃数据包。
这里有一篇很好的文章,对此进行了一些扩展:https://blogs.technet.microsoft.com/networking/2009/08/12/where-do-resets-come-from-no-the-stork-does-not-bring-them/
回答您的具体问题,其他进程关闭您的 TCP 连接并非不可能,尽管这通常是通过终止侦听该端口的进程来完成的。如果侦听进程在 RST 之后仍处于打开状态,则其他进程不太可能尝试关闭连接。