bind-address = :: 1 # Namun, netstat menunjukkan 0.0.0.0:3306 MENDENGARKAN

6

Saya menjalankan MySQL 5.6 pada 64-bit Windows 7 dengan IPv6 dan IPv4 diaktifkan.

Di my.ini:

port=3306
bind-address = ::1

Saya berharap untuk menggunakan IPv6 dan membatasi ke adaptor loop-back. Saya menggunakan ::1bukan 127.0.0.1karena win7 dengan IPv6 default ::1untuk localhost.

Dengan konfigurasi ini, netstat melaporkan hal berikut:

C:\>netstat -an |findstr 3306
  TCP    0.0.0.0:3306           0.0.0.0:0              LISTENING
  TCP    [::1]:3306             [::]:0                 LISTENING

Sepertinya koneksi mungkin diblokir pada antarmuka IPv4, tetapi melihat laporan netstat bahwa 0.0.0.0port 3306terbuka membuat saya gelisah.

Dokumentasi MySQL menetapkan:

Jika alamat tersebut adalah alamat IPv4 atau IPv6 “biasa” (seperti 127.0.0.1 atau :: 1), server menerima koneksi TCP / IP hanya untuk alamat IPv4 atau IPv6 tersebut.

TCPView memberi saya info yang sama dengan netstat. Saya tidak dapat mengaktifkan TDIMon di sistem saya.

Bagaimana saya bisa mencegah mysql dari mendengarkan 0.0.0.0?

ebyrob
sumber

Jawaban:

4

Saya melihat dua kemungkinan di sini:

  1. Anda sebenarnya memiliki dua salinan MySQL yang berjalan, salah satunya terikat ke IPv4, dan yang lain terikat ke IPv6. Ini mungkin sangat tidak mungkin, tetapi bagaimanapun juga Anda harus memeriksanya.

  2. Anda telah menemukan bug di port Windows MySQL. Ketika saya mencoba ini di Linux, bind-address = ::1menyebabkan MySQL hanya mengikat ::1dan tidak ke alamat IPv4. Dalam hal ini Anda harus melaporkannya sebagai bug ke MySQL.

Michael Hampton
sumber
Ketika saya, net stop mysqlsaya tidak melihat apa pun mendengarkan :3306. Ketika saya net start mysqldan cepat netstat -ansaya melihat keduanya mendengarkan entri.
ebyrob
@ebyrob Itu mencakup salah satu dari dua kemungkinan yang saya sebutkan.
Michael Hampton
1
Bug MySQL dikirimkan: bugs.mysql.com/bug.php?id=72087
ebyrob
1
@ebyrob Apa yang terjadi dengan laporan bug Anda? Dikatakan "Anda tidak memiliki akses ke bug # 72087."
RandomSeed
@RandomSeed Anda harus memiliki akun pengguna dengan Oracle dan masuk untuk melihatnya. Tampaknya belum melewati triase.
ebyrob
1

Saya akhirnya punya waktu untuk menggali sumber mysql 5.6. Baris 2405 dari mysqld.cc tampaknya menyimpan beberapa jawaban.

 /*
   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);
  }
}

Pengaturan opsi soket ini menyebabkan garis tambahan 0.0.0.0:3306muncul di netstat. Namun, saya masih tidak dapat terhubung dengan menentukan 127.0.0.1ke telnet.

Komentar memang membuatnya terdengar seperti opsi ini hanya boleh digunakan ketika wildcard diterapkan, tetapi tampaknya opsi diterapkan bahkan ketika bind-addressditentukan.

Kemungkinan diskusi terkait di sini: http://serverdown.ttwait.com/que/486038

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

EDIT: Dalam laporan bug (yang masih dalam triase), saya telah mengusulkan MySQL hanya menghapus IPV6_V6ONLY saat mengikat ke alamat wildcard *. Ini sepertinya memberikan fleksibilitas konfigurasi paling besar di my.ini. Jika beberapa admin mengikat ::dan kemudian terhubung ke 127.0.0.1mereka bisa terkejut. Mengikat *bukannya ::akan memperbaikinya.

ebyrob
sumber
Oh, jadi mereka bermaksud melakukan ini. Itu berarti itu bukan bug, ini cacat desain ...
Michael Hampton
@MichaelHampton Sepertinya saya bermaksud opsi ini untuk memperbaiki bug ini: bugs.mysql.com/bug.php?id=67119 Tapi tidak menyadari apa yang akan terjadi pada win7 jika mereka juga mengaktifkan IPV6_V6ONLY untuk alamat selain wildcard.
ebyrob
-1

0.0.0.0:3306berarti MySQL mendengarkan semua adaptor / alamat untuk IPv4. Saya akan meletakkan baris berikut di my.cnf:

bind-address = 127.0.0.1
bind-address = ::1

Itu harus membatasi akses IPv4 ke localhost; tidak masalah versi Windows mana yang menjadi default, Anda masih dapat terhubung dengannya. Jika itu tidak menyelesaikannya, maka Anda kemungkinan telah bind-addressmengatur file lain di suatu tempat.

Juga, pastikan bahwa mysql benar-benar dihentikan ketika Anda me-restart itu; mungkin saja contoh yang lebih lama masih berjalan dan mendengarkan 0.0.0.0.

EDIT

Lihat Dokumentasi MySQL bagian 4.2.3.3 Menggunakan File Pilihan untuk file lain yang bind-addressparameternya mungkin ditentukan.

klugerama
sumber
Sekali lagi, saya ingin mengikat ::1kecuali saya berencana untuk menonaktifkan IPv6 (Microsoft merekomendasikan untuk menonaktifkan IPv6). Saya dapat terhubung 127.0.0.1dengan menetapkannya secara eksplisit, tetapi kemudian alat atau pengguna yang dipilih localhosttidak akan berfungsi. (Saya benar-benar memperhatikan masalah ketika saya memiliki masalah kinerja yang mengikat 127.0.0.1dan terhubung ke localhostpada windows 7, itu sekitar 30 detik per koneksi)
ebyrob
Maaf, saya seharusnya lebih spesifik; letakkan keduanya :bind-address = 127.0.0.1 bind-address = ::1
klugerama
Sepertinya jika saya memasukkan banyak bind-addressentri, hanya nilai terbawah yang digunakan. Saya mendengarkan 127.0.0.1:3306atau ::1:3306dan 0.0.0.0:3306.
ebyrob
Hmm, kamu benar. Saya memilikinya di salah satu instalasi saya dan tidak pernah memeriksa alamat pertama. Sudahkah Anda memeriksa hostsfile Anda ? Lihat victor-ratajczyk.com/post/2012/02/25/... Selain itu, mungkin membantu untuk memposting file log mysql Anda segera setelah dimulai.
klugerama
Saya dapat mengubah file host saya tetapi saya tidak ingin memecah beberapa proses windows lain yang mungkin berharap localhostuntuk menyelesaikan ke default baru ::1. Mempertimbangkan setiap instalasi MySQL 5.6 pada win7 Saya telah melihat pameran perilaku yang sama, saya tidak berpikir posting file log khusus saya akan berguna di sini.
ebyrob
-1

Solusinya ada di conffile .Coba untuk Hapus semua -Iatau --interfaceopsi dari /etc/default/ntpdan masukkan yang berikut ke Anda /etc/ntp.conf:

interface ignore wildcard
interface listen 127.0.0.1
  • Tanpa antarmuka, abaikan wildcard NTP juga akan mendengarkan pada 0.0.0.0

  • Tanpa antarmuka, dengarkan NTP hanya akan mendengarkan pada 127.0.0.1 (tentu saja)

Jika Anda sudah memiliki baris itu:

0.0.0.0:3306

maka cukup beri komentar

# 0.0.0.0:3306

** Kedua, coba ganti baris berikut dalam my.ini

 bind-address = ::1

untuk

 bind-address = 127.0.0.1

EDIT:

jika Anda menggunakan windows7 64-bit,

Anda harus membuka file itu di sini:

 C:\WINDOWS\system32\drivers\etc\hosts

Localhost harus menjadi entri pertama dalam file tersebut. File host tersebut mungkin memiliki :: 1 untuk localhost. Untuk memperbaikinya, tambahkan (atau batalkan komentar) baris:

   127.0.0.1       localhost

dan komentari kalimat itu:

   ::1             localhost 

untuk

   # ::1             localhost

dan kemudian Anda dapat terhubung melalui localhost.

echo_Me
sumber
pada 64-bit Windows 7 - Saya tidak memiliki Unix NTP, /etcatau /dalam hal ini. Mengikat ke 127.0.0.1 berfungsi, jika saya tidak menggunakan localhoststring koneksi saya dan jika saya yakin saya tidak pernah ingin menggunakan IPv6 untuk terhubung secara lokal. (Saya punya localhostsemua file konfigurasi dan skrip sisi klien saya untuk beberapa alasan, dan pengembang lain cenderung mengetiknya jika mereka checkout / membangun dan menggunakan klien mereka sendiri.) PS - Untuk saat ini, solusi kami adalah "hapus bind -menambahkan spesifikasi dan mendengarkan pada 0.0.0.0:3306 dengan memadamkan api ". Ini bekerja, tapi ini agak seperti mengemudi di atas pelat logam.
ebyrob
periksa edit saya sekarang.
echo_Me
Network Time sepertinya masih tidak relevan. Apakah Anda menyarankan saya menulis skrip build untuk memodifikasi file host pengembang lain dengan konfigurasi file host yang sudah usang?
ebyrob