繁体   English   中英

主机上的nc-> VM工作(端口9050),但是VM(用Python编写的运行服务器)从主机-> VM的同一端口上重置连接[TCP RST](9050)

[英]nc from host -> VM works (port 9050), but VM (running server written in Python) resets connection [TCP RST] from host -> VM on same port (9050)

背景资料

我正在开发旨在与服务器通信的支持网络的嵌入式设备。 因为该服务器将运行linux(但是我需要Windows工具进行开发),所以出于开发目的,我正在运行带有Ubuntu Server 14.04的VM。

对于该问题,嵌入式方面并不重要,因为我将返回最简单的测试设置(只需将主机连接到VM上的服务器以查看建立的TCP连接)即可进行故障排除。

网络设置

  • 运行DD-WRT [v24-sp2(03/25/13)std(SVN版本21061)]的D-Link DIR-615,通过MAC过滤器分配给主机和VM的静态IP,启用了DNS功能

  • 开发机(192.168.5.117,dev.test.lan)

  • Ubuntu VM(192.168.5.118,vm.test.lan)-使用桥接连接(NAT不起作用,因为客户端将启动与VM的连接)

  • 路由器未连接到任何种类的WAN,仅有线连接,Wi-fi被禁用

进行完整性检查

  • 从VM ping主机成功(使用IP或dns名称)

  • 从主机ping VM成功(使用IP或dns名称)

  • 主机<-> VM之间的nc(可以从任一侧侦听/连接)[在端口9050上侦听]

  • 在VM中,可以通过nc连接到在VM上运行的服务器应用程序,成功建立了连接[到端口9050]

  • Windows防火墙为端口9050上的传入/传出TCP连接打开

问题分析

使用Wireshark,在执行nc正常性测试(主机<-> VM)时,我可以看到TCP连接成功运行。

当我在VM上运行服务器(使用python,使用asyncio编写),并尝试从主机通过nc连接时,服务器看不到任何连接(但是我们知道从nc连接到服务器可以正常工作,因为在VM内成功测试了该代码)。

从Wireshark中,我看到主机向VM发送SYN,然后VM响应[RST,ACK]。 主机在放弃之前重试传输两次。

问题

  • 桥接连接是否适合用于VM?

  • 找出RST来自何处的最佳方法是什么? (是路由器,VM的TCP / IP堆栈,还是Python的某些部分导致了它?)


更新:在VM中尝试了nc 192.168.5.118 9050 ,并观察到与我从主机尝试过的连接行为相同的拒绝连接行为。 根据亚当所说的话,我们似乎越来越近了。 还将尝试亚当的建议并发布更新。

操作系统正在发送RST数据包,以指示该端口已关闭-没有进程绑定到该端口并正在侦听。 结果,尝试连接的客户端将很快失败,并显示ECONNREFUSED (连接被拒绝)。 这是完全正常的行为。

在Python服务器进程中,您如何精确地绑定到端口? 您是否绑定到正确的网络接口? 如果您不小心绑定了仅环回设备( localhost127.0.0.1 ),那么您将确切地看到您所描述的内容:从计算机到自身的本地连接将成功,但是从外部主机的连接将失败。

在Python中,通常使用'''0.0.0.0'作为地址部分,以指示您要绑定到所有网络接口; 这等效于C常量INADDR_ANY

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', port))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM