MySQL连接报错no route to host,同交换机机器通信正常求排查
看起来你遇到了个有点棘手的小问题——两台机器双向ping、sftp都正常,但PHP连MySQL就抛出"No route to host"错误。结合你给出的netstat结果(MySQL 3306端口确实在监听0.0.0.0:*),基础网络连通性肯定没问题,问题大概率出在特定端口的访问限制或者MySQL/PHP的配置细节上。下面是我整理的一步步排查方案:
1. 先查服务器防火墙:大概率是它在拦3306端口
虽然ping、sftp能通,但防火墙很可能单独拦截了MySQL的3306端口。你可以先临时关闭防火墙测试(测试完记得重新开启):
- 用firewalld的服务器:
sudo systemctl stop firewalld - 用iptables的服务器:
sudo iptables -F && sudo iptables -P INPUT ACCEPT && sudo iptables -P OUTPUT ACCEPT
如果关闭后PHP能正常连接,那就是防火墙的锅了,赶紧给3306端口加个允许规则:
- firewalld:
sudo firewall-cmd --add-port=3306/tcp --permanent sudo firewall-cmd --reload - iptables:
sudo iptables -A INPUT -p tcp --dport 3306 -s 192.168.0.7 -j ACCEPT sudo service iptables save
2. 确认MySQL的绑定地址配置没坑
虽然netstat显示监听0.0.0.0,但有时候MySQL配置文件里的设置可能没生效,或者不小心开了skip-networking。打开你的MySQL配置文件(常见路径是/etc/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf),检查这两项:
bind-address = 0.0.0.0 # 确保绑定的是所有地址,不是127.0.0.1 # 注释掉这行,如果有的话 # skip-networking = 1
修改后记得重启MySQL服务:
sudo systemctl restart mysqld
3. 直接测试客户端到3306端口的连通性
用telnet或者nc工具直接测端口,比PHP连接更直观,能快速定位是网络还是代码问题:
在客户端机器上执行:
telnet 192.168.0.10 3306
或者用nc(如果装了的话):
nc -zv 192.168.0.10 3306
如果连接失败,回到第一步查防火墙;如果连接成功,那问题可能出在PHP代码或者MySQL用户权限上。
4. 检查MySQL用户的访问权限
MySQL用户默认可能只能本地登录(比如web@localhost),你得确保web用户允许从客户端IP(192.168.0.7)访问。登录服务器的MySQL控制台,执行:
-- 允许web用户从192.168.0.7访问指定数据库 GRANT ALL PRIVILEGES ON 你的数据库名.* TO 'web'@'192.168.0.7' IDENTIFIED BY '你的密码'; -- 或者允许整个192.168.0.0网段访问(更灵活) -- GRANT ALL PRIVILEGES ON 你的数据库名.* TO 'web'@'192.168.0.%' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;
记得把你的数据库名和你的密码换成实际值。
5. 排查SELinux的限制(如果服务器开了的话)
有些Linux服务器默认开启SELinux,它可能会阻止PHP发起网络连接到MySQL端口。你可以先临时关闭SELinux测试:
sudo setenforce 0
如果能连接了,就给SELinux加个永久规则允许PHP访问数据库:
sudo setsebool -P httpd_can_network_connect_db on
按照上面的步骤一步步排查,应该能快速定位到问题根源。
内容的提问来源于stack exchange,提问作者Dennis Dumont




