背景资讯
我正在开发一个支持网络的嵌入式设备,用于与服务器通信。因为这台服务器将运行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名称)
nc VM(可以从任何一方收听/连接)[侦听端口9050]
,可以通过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
并观察到相同的拒绝连接行为,就像我从主机尝试过一样。根据亚当的说法,看起来我们越来越近了。也会尝试亚当的建议并发布更新。
答案 0 :(得分:2)
操作系统正在发送RST数据包以指示端口已关闭 - 没有进程绑定到它并正在侦听。因此,尝试连接的客户端将很快失败ECONNREFUSED
(连接被拒绝)。这是完全正常的行为。
您在Python服务器进程中如何绑定到端口?你绑定到正确的网络接口?如果您不小心只绑定了环回设备(localhost
或127.0.0.1
),那么您将看到您正在描述的内容:从机器到本身的本地连接将成功,但来自外部主机将失败。
在Python中,您通常使用''
或'0.0.0.0'
作为地址部分来指示您要绑定到所有网络接口;这相当于C常量INADDR_ANY
:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', port))