我在 64 位 Windows 7 上运行 MySQL 5.6,并启用了 IPv6 和 IPv4。
在 my.ini 中:
port=3306
bind-address = ::1
我希望使用 IPv6 并限制到环回适配器。我使用了::1
而不是127.0.0.1
因为使用 IPv6 的 win7 默认::1
为localhost
。
使用此配置,netstat 报告以下内容:
C:\>netstat -an |findstr 3306
TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING
TCP [::1]:3306 [::]:0 LISTENING
看起来好像连接可能在 IPv4 接口上被阻止,但是看到 netstat 报告0.0.0.0
端口3306
已打开让我感到不安。
MySQL文档指定:
如果该地址是“常规” IPv4 或 IPv6 地址(例如 127.0.0.1 或 ::1),则服务器仅接受该 IPv4 或 IPv6 地址的 TCP/IP 连接。
TCPView 给出的信息与 netstat 相同。我无法让 TDIMon 在我的系统上运行。
我怎样才能阻止 mysql 监听0.0.0.0
?
答案1
我发现有两种可能性:
您实际上有两个 MySQL 副本正在运行,其中一个绑定到 IPv4,另一个绑定到 IPv6。这可能不太可能,但无论如何您都应该检查一下。
您发现了 MySQL 的 Windows 端口中的一个错误。当我在 Linux 上尝试此操作时,
bind-address = ::1
导致 MySQL 仅绑定到::1
IPv4 地址,而不绑定到任何 IPv4 地址。在这种情况下,您应该将其作为错误报告给 MySQL。
答案2
我终于有时间深入研究 mysql 5.6 源代码。mysqld.cc 的第 2405 行似乎提供了一些答案。
/*
For interoperability with older clients, IPv6 socket should
listen on both IPv6 and IPv4 wildcard addresses.
Turn off IPV6_V6ONLY option.
NOTE: this will work starting from Windows Vista only.
On Windows XP dual stack is not available, so it will not
listen on the corresponding IPv4-address.
*/
if (a->ai_family == AF_INET6)
{
arg= 0;
if (mysql_socket_setsockopt(ip_sock, IPPROTO_IPV6, IPV6_V6ONLY,/* Line: 2405 */
(char *) &arg, sizeof (arg)))
{
sql_print_warning("Failed to reset IPV6_V6ONLY flag (error: %d). "
"The server will listen to IPv6 addresses only.",
(int) socket_errno);
}
}
0.0.0.0:3306
设置此套接字选项会导致在中显示额外的行netstat
。但是,我仍然无法通过指定127.0.0.1
telnet 进行连接。
注释确实让它听起来像这个选项应该只在应用通配符时使用,但似乎即使bind-address
指定了该选项也会应用。
这里可能存在相关的讨论:http://serverdown.ttwait.com/que/486038
编辑:在错误报告中(仍在分类中),我建议 MySQL 仅在绑定到通配符地址时清除 IPV6_V6ONLY *
。这似乎为 my.ini 中的配置提供了最大的灵活性。如果某些管理员绑定::
然后连接到,127.0.0.1
他们可能会感到惊讶。绑定*
而不是::
可以解决这个问题。
答案3
0.0.0.0:3306
表示 MySQL 正在监听所有适配器/地址的 IPv4。我会将以下几行放入 my.cnf 中:
bind-address = 127.0.0.1
bind-address = ::1
这应该会将 IPv4 访问限制为 localhost;无论 Windows 默认使用哪个版本,您仍然可以连接到它。如果这不能解决问题,那么您可能bind-address
在另一个文件中进行了设置。
另外,请确保重新启动 mysql 时它确实已停止;可能只是一个较旧的实例仍在运行并监听0.0.0.0
。
编辑
看MySQL 文档第 4.2.3.3 节使用选项文件bind-address
对于可能指定该参数的其他文件。
答案4
解决方案在conf
文件中。尝试从中删除所有-I
或--interface
选项/etc/default/ntp
,并将以下内容插入到您的中/etc/ntp.conf
:
interface ignore wildcard
interface listen 127.0.0.1
如果没有接口忽略通配符,NTP 也将监听 0.0.0.0
如果没有接口监听,NTP 将只监听 127.0.0.1(当然)
如果你已经有了那行:
0.0.0.0:3306
然后只需评论即可
# 0.0.0.0:3306
** 其次尝试更改以下行my.ini
bind-address = ::1
到
bind-address = 127.0.0.1
编辑:
如果你使用 Windows7 64 位,
你必须转到此处的文件:
C:\WINDOWS\system32\drivers\etc\hosts
Localhost 应为该文件中的第一个条目。该 hosts 文件可能将 localhost 标记为 ::1。要修复此问题,请添加(或取消注释)以下行:
127.0.0.1 localhost
并注释掉这一行:
::1 localhost
到
# ::1 localhost
然后您可以通过本地主机连接。