由于某些原因,不允许来自特定 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 设置为是。
跑步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
是到到off
。
答案1
首先,您是否已更改my.cnf
配置 MySQL 以监听服务器 IP 地址上的连接?您的文件应包含以下行:
bind-address = <public_ip_address_of_your_machine>
其次,在 MySQL 中,您是否已授权从该 IP 地址连接的用户进行连接?
GRANT ALL ON example.* TO someuser@'12.34.56.78' IDENTIFIED BY 'PASSWORD';
如果您收到类似以下错误消息,这将解决问题"Access denied for user: '[email protected]' (Using password: YES)"
最后,确保您的路由器具有端口转发和防火墙规则,允许传入连接到 MySQL 服务器。
答案2
我看到的是--dports而不是--dport,也许22和80有效,因为它们在另一条规则上被允许,而它只是不能应用这一行?