由于某种原因,不允许来自特定 IP 地址的 mysql 连接。这是我的规则(从 中获取iptables-save
):
-A INPUT -s 12.34.56.78/32 -p tcp -m state --state NEW -m multiport --dports 22,80,3306 -j ACCEPT
这里有趣的是 SSH 连接和 HTTP 页面可以完美加载而没有问题。我后来为 MySQL 连接添加了 3306,但它们似乎被忽略了。为什么?
我在 CentOS 上。我已重新启动 iptables 服务并将 IPTABLES_SAVE_ON_STOP/RESTART 设置为 yes。
运行netstat -tunelp
向我展示了这一点:
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 27 8849593 10712/mysqld
这是我的完整规则列表iptables -L
:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
ACCEPT tcp -- 192.168.1.0/24 anywhere state NEW multiport dports ssh,http,mysql
ACCEPT tcp -- some-resolved-hostname-1.com anywhere state NEW multiport dports ssh,http,mysql
ACCEPT tcp -- some-resolved-hostname-2.com anywhere state NEW multiport dports ssh,http,mysql
ACCEPT tcp -- some-resolved-hostname-3.com anywhere state NEW multiport dports ssh,http,mysql
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
注意:服务器端没有日志(包括错误日志)。我尝试连接时遇到的错误是:
D:\>mysql -u username -p -h 12.34.56.78
Enter password:
ERROR 2003 (HY000): Can't connect to MySQL server on '12.34.56.78' (10060)
此外(因为这是来自试图连接的 Windows 机器)我试过这个:
D:\>telnet 12.34.56.78 3306
Connecting To 12.34.56.78...Could not open connection to the host, on port 3306: Connect failed
还要注意的skip_networking
是 to to off
。
首先,您是否已更改
my.cnf
为将 MySQL 配置为侦听服务器 IP 地址上的连接?您的文件应包含以下行:bind-address = <public_ip_address_of_your_machine>
其次,您是否允许从该 IP 地址连接的用户在 MySQL 中进行连接?
GRANT ALL ON example.* TO someuser@'12.34.56.78' IDENTIFIED BY 'PASSWORD';
如果您收到类似于以下的错误消息,这将解决问题
"Access denied for user: '[email protected]' (Using password: YES)"
最后,确保您的路由器具有端口转发和防火墙规则,允许传入连接到 MySQL 服务器。
我看到 --dports 而不是 --dport,也许 22 和 80 有效,因为它们在另一条规则中被允许并且它不能应用这条线?