bind-address = ::1 # 但是 netstat 显示 0.0.0.0:3306 LISTENING

bind-address = ::1 # 但是 netstat 显示 0.0.0.0:3306 LISTENING

我在 64 位 Windows 7 上运行 MySQL 5.6,并启用了 IPv6 和 IPv4。

在 my.ini 中:

port=3306
bind-address = ::1

我希望使用 IPv6 并限制到环回适配器。我使用了::1而不是127.0.0.1因为使用 IPv6 的 win7 默认::1localhost

使用此配置,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

我发现有两种可能性:

  1. 您实际上有两个 MySQL 副本正在运行,其中一个绑定到 IPv4,另一个绑定到 IPv6。这可能不太可能,但无论如何您都应该检查一下。

  2. 您发现了 MySQL 的 Windows 端口中的一个错误。当我在 Linux 上尝试此操作时,bind-address = ::1导致 MySQL 仅绑定到::1IPv4 地址,而不绑定到任何 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.1telnet 进行连接。

注释确实让它听起来像这个选项应该只在应用通配符时使用,但似乎即使bind-address指定了该选项也会应用。

这里可能存在相关的讨论:http://serverdown.ttwait.com/que/486038

谷歌缓存:http://webcache.googleusercontent.com/search?q=cache:14aq4-3tRLsJ:serverdown.ttwait.com/que/486038+&cd=4&hl=en&ct=clnk&gl=us

编辑:在错误报告中(仍在分类中),我建议 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

然后您可以通过本地主机连接。

相关内容