IPv6とIPv4が有効になっている64ビットWindows 7でMySQL 5.6を実行しています。
My.iniで:
port=3306
bind-address = ::1
IPv6を使用し、ループバックアダプターに制限したいと思っていました。 localhost
のIPv6を使用するwin7のデフォルトは::1
であるため、127.0.0.1
ではなく::1
を使用しました。
この構成では、netstatは次を報告します。
C:\>netstat -an |findstr 3306
TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING
TCP [::1]:3306 [::]:0 LISTENING
IPv4インターフェースで接続がブロックされているようですが、0.0.0.0
ポート3306
が開いているというnetstatのレポートを見ると不安になります。
MySQL documentation は以下を指定します:
アドレスが「通常の」IPv4またはIPv6アドレス(127.0.0.1または:: 1など)である場合、サーバーはそのIPv4またはIPv6アドレスに対してのみTCP/IP接続を受け入れます。
TCPViewはnetstatと同じ情報を私に与えました。 TDIMonをシステムで動作させることができませんでした。
Mysqlが0.0.0.0
をリッスンしないようにするにはどうすればよいですか?
ここには2つの可能性があります。
実際には、MySQLの2つのコピーが実行されています。1つはIPv4にバインドされ、もう1つはIPv6にバインドされています。これはおそらくあまりありませんが、とにかくチェックする必要があります。
MySQLのWindowsポートにバグを発見しました。 Linuxでこれを試したところ、bind-address = ::1
によってMySQLは::1
にのみバインドし、IPv4アドレスにはバインドしなくなりました。この場合、それをバグとしてMySQLに報告する必要があります。
ようやく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
EDIT:バグレポート(トリアージ中)で、ワイルドカードアドレス*
にバインドする場合、MySQLはIPV6_V6ONLYのみをクリアすることを提案しました。これにより、my.iniでの設定の柔軟性が最も高まるようです。一部の管理者が::
をバインドしていて、127.0.0.1
に接続している場合、驚くかもしれません。 *
の代わりに::
をバインドすると修正されます。