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

时间:2014-06-13 20:06:20

标签: python ubuntu tcp vmware dd-wrt

背景资讯

我正在开发一个支持网络的嵌入式设备,用于与服务器通信。因为这台服务器将运行linux(但我需要使用Windows工具进行开发),我正在运行带有Ubuntu Server 14.04的虚拟机用于开发目的。

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

网络设置

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

  • 开发机器(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名称)

  • 主机&lt; - &gt;之间的
  • nc VM(可以从任何一方收听/连接)[侦听端口9050]

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

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

问题分析

使用wireshark,我能够在执行nc健全性测试(主机&lt; - &gt; 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并观察到相同的拒绝连接行为,就像我从主机尝试过一样。根据亚当的说法,看起来我们越来越近了。也会尝试亚当的建议并发布更新。

1 个答案:

答案 0 :(得分:2)

操作系统正在发送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))