如何在Host-Only模式下实现主机与VirtualBox虚拟机的Socket连接?
主机Ubuntu 20.04到CentOS 7.9虚拟机Host-Only模式Socket连接失败排查与解决
主机系统为Ubuntu 20.04,虚拟机系统为CentOS 7.9,虚拟机网络采用Host-Only模式。主机与虚拟机可正常ping通和SSH连接,且确认两端12345端口未被其他进程占用,但主机端Socket客户端连接虚拟机服务端时持续报错,服务端运行正常。

虚拟机服务端Python代码
import socket s = socket.socket() print ("Socket successfully created") port = 12345 s.bind(('192.168.56.103', port)) print ("socket binded to %s" %(port)) s.listen(5) print ("socket is listening") while True: c, addr = s.accept() print ('Got connection from', addr ) c.send('Thank you for connecting'.encode()) c.close() break
主机客户端Python代码
import socket s = socket.socket() port = 12345 s.connect(('192.168.56.103', port)) print (s.recv(1024).decode()) s.close()
客户端报错信息:
OSError: [Errno 113] No route to host
解决方法
开放CentOS防火墙端口
CentOS 7默认启用firewalld,需手动开放服务端使用的12345端口:# 临时开放端口(重启防火墙后失效) sudo firewall-cmd --add-port=12345/tcp # 永久开放端口 sudo firewall-cmd --add-port=12345/tcp --permanent # 重载防火墙规则使设置生效 sudo firewall-cmd --reload若需快速验证,可临时关闭防火墙(仅测试用,生产环境不建议):
sudo systemctl stop firewalld调整服务端绑定地址
将服务端代码中的绑定地址改为0.0.0.0,使其监听虚拟机所有可用网卡,避免因网卡IP匹配问题导致无法接收连接:s.bind(('0.0.0.0', port))确认端口监听状态
在虚拟机执行以下命令,检查服务端是否正确监听12345端口:netstat -tulnp | grep 12345 # 或使用ss命令 ss -tulnp | grep 12345确保输出中监听地址为
192.168.56.103或0.0.0.0,且对应进程为你的Python服务端。
内容的提问来源于stack exchange,提问作者idwwwoqq808
相关产品推荐
相关产品推荐

