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

来自主机的nc->;VM工作(端口9050),但VM(运行用Python编写的服务器)从主机重置连接[TCP RST]->;同一端口上的虚拟机(9050),python,ubuntu,tcp,vmware,dd-wrt,Python,Ubuntu,Tcp,Vmware,Dd Wrt,背景信息 我正在开发一种支持网络的嵌入式设备,用于与服务器通信。由于该服务器将运行linux(但我需要Windows工具进行开发),因此出于开发目的,我正在使用Ubuntu服务器14.04运行一个VM 对于这个问题,嵌入式方面并不重要,因为我将回到最简单的测试设置(让主机连接到VM上的服务器,以查看TCP连接是否建立)进行故障排除 网络设置 运行DD-WRT[v24-sp2(03/25/13)std(SVN修订版21061)]的D-Link DIR-615,通过MAC过滤器分配给主机和VM的静

背景信息

我正在开发一种支持网络的嵌入式设备,用于与服务器通信。由于该服务器将运行linux(但我需要Windows工具进行开发),因此出于开发目的,我正在使用Ubuntu服务器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虚拟机(192.168.5.118,VM.test.lan)-使用桥接连接(NAT不工作,因为客户端将启动到虚拟机的连接)

  • 路由器未连接到任何类型的广域网,仅有线连接,Wi-fi已禁用

执行的健全性检查

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

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

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

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

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

问题分析

使用wireshark,我能够在执行nc健全性测试(主机VM)时看到TCP连接成功工作

当我在VM上运行服务器(用python编写,使用asyncio)并尝试从主机通过nc连接时,服务器看不到任何连接(但我们知道从nc连接到服务器是有效的,因为这在VM中已成功测试)

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

问题

  • 桥接连接是用于VM的适当设置吗

  • 找出RST来源的最佳方法是什么?(是路由器、VMs TCP/IP堆栈,还是Python的某个部分造成的?)


更新:
在虚拟机中尝试了
nc192.168.5.118 9050
,观察到了与我从主机尝试过的相同的拒绝连接行为。根据亚当所说的,看起来我们越来越近了。也将尝试Adam的建议并发布更新。

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

在Python服务器进程中,您到底是如何绑定到端口的?您是否绑定到正确的网络接口?如果您意外地仅绑定到环回设备(
localhost
127.0.0.1
),那么您将完全看到您所描述的内容:从机器到自身的本地连接将成功,但从外部主机的连接将失败

在Python中,通常使用
'
'0.0.0'
作为地址部分,以指示要绑定到所有网络接口;这相当于INADR\u ANY中的C常数:

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

“在VM中,可以通过nc连接到VM上运行的服务器应用程序,”--在这种情况下,您用来调用
nc
的命令行是什么?如果是
nc localhost 9050
,请尝试
nc 192.168.5.118 9050
。那告诉我们发生了什么,太棒了。非常感谢,亚当。看起来问题在于我只遵循了为说明localhost上的基本原则而编写的指南。今天我学到了一些东西:)