6

Я использую MySQL 5.6 на 64-битной Windows 7 с включенными IPv6 и IPv4.

В my.ini:

port=3306
bind-address = ::1

Я надеялся использовать IPv6 и ограничиться адаптером обратной связи. Я использовал ::1 вместо 127.0.0.1 потому что win7 с IPv6 по умолчанию ::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), сервер принимает соединения TCP/IP только для этого адреса IPv4 или IPv6.

TCPView дал мне ту же информацию, что и netstat. Я не мог заставить TDIMon работать в моей системе.

Как я могу предотвратить прослушивание mysql на 0.0.0.0?

4 ответа4

4

Я вижу две возможности здесь:

  1. На самом деле у вас работает две копии MySQL, одна из которых связана с IPv4, а другая - с IPv6. Это, вероятно, не очень вероятно, но это то, что вы должны проверить в любом случае.

  2. Вы нашли ошибку в порте Windows MySQL. Когда я попробовал это в Linux, bind-address = ::1 заставил MySQL связываться только с ::1 а не с любыми IPv4-адресами. В этом случае вы должны сообщить об этом как об ошибке в MySQL.

1

Я наконец-то успел покопаться в источнике mysql 5.6. Строка 2405 mysqld.cc, кажется, содержит некоторые ответы.

 /*
   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

кеш Google: 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 они могут быть удивлены. Связывание * вместо :: исправит это.

-1

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 .

-1

Решение в файле 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 должен быть первой записью в этом файле.Этот файл хостов может иметь ::1 для localhost. Чтобы исправить это, добавьте (или раскомментируйте) строку:

   127.0.0.1       localhost

и прокомментируйте эту строку:

   ::1             localhost 

в

   # ::1             localhost

и тогда вы можете подключиться через localhost.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .