1

背景资料

我正在开发一种旨在与服务器通信的支持网络的嵌入式设备。因为该服务器将运行 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]

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

问题分析

使用wireshark,我可以在执行nc sanity test(主机<-> VM)时看到TCP连接成功。

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

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

问题

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

  • 找出 RST 来源的最佳方法是什么?(是路由器、虚拟机 TCP/IP 堆栈,还是 Python 的某些部分导致了它?)


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

4

1 回答 1

1

操作系统正在发送 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))
于 2014-06-13T20:24:18.370 回答