Akses MySQL ditolak kesalahan saat menghubungkan melalui terowongan SSH

12

Selama berbulan-bulan saya telah terhubung ke instance MySQL yang berjalan di server uji lokal kami melalui terowongan SSH tanpa masalah. Namun tiba-tiba, tanpa perubahan yang dapat saya pikirkan, server sudah mulai menolak upaya masuk dari Sequel Pro dengan kesalahan:

Tidak dapat terhubung ke host 127.0.0.1 karena akses ditolak.

Periksa ulang nama pengguna dan kata sandi Anda dan pastikan akses dari lokasi Anda saat ini diizinkan.

MySQL berkata: Akses ditolak untuk pengguna 'root' @ 'localhost' (menggunakan kata sandi: YES)

Saya dapat masuk dari terminal saat terhubung langsung ke server melalui SSH, hanya saja tidak melalui terowongan SSH. Masalahnya tidak spesifik untuk Sequel Pro atau hanya diri saya sendiri, saya mendapatkan kesalahan yang sama ketika menghubungkan melalui MySQL Workbench seperti yang dilakukan orang lain di kantor. Saya telah mengatur ulang kata sandi mysqladminhanya demi kewarasan, itu jelas bukan masalahnya.

Ketika saya mulai melihat lebih dalam, saya perhatikan bahwa kesalahan melaporkan server sebagai "localhost", bukannya "127.0.0.1" yang saya masukkan di Sequel Pro. Seorang teman menyarankan itu mungkin hanya penanganan kesalahan yang buruk, tetapi tampaknya aneh mengingat perbedaan yang signifikan antara localhost dan 127.0.0.1 di MySQL.

Dalam upaya untuk mengatasi masalah tunneling, saya memberikan akses ke root @%, sehingga saya dapat terhubung secara langsung. Ini berfungsi sebagian besar, saya bisa melihat data tabel, membuat database baru, dll. Satu-satunya masalah adalah ketika saya datang untuk membuat pengguna saya mendapatkan kesalahan:

Akses ditolak untuk 'root' @ '%' pengguna (menggunakan kata sandi: YES)

Anehnya pengguna sebenarnya dibuat, saya pikir itu hanya masalah dengan hibah. Sekali lagi, dari terminal saya bisa melakukan apa saja ketika login sebagai root.

Adakah yang bisa membantu menjelaskan mengapa koneksi terowongan dan (mungkin) perintah hibah menerima kesalahan akses ditolak?

Untuk referensi MySQ adalah versi 5.6.16 dengan sebagian besar pengaturan default, diinstal melalui Homebrew pada mesin MAC OS X Server.

Memperbarui

Inilah daftar host tempat root saat ini diberi akses:

mysql> select host,user from mysql.user where user='root';
+----------------+------+
| host           | user |
+----------------+------+
| %              | root |
| 127.0.0.1      | root |
| ::1            | root |
| localhost      | root |
+----------------+------+
4 rows in set (0.00 sec)

Seperti yang saya pahami, baris pertama ("%") harus benar-benar membuat yang lain berlebihan?

Perbarui 2

Memperbaiki masalah hibah; root @% pengguna belum diberi semua hak istimewa dengan ekstra with grant optiondi akhir, sehingga bisa melakukan segalanya kecuali memberikan. Masih ingin tahu mengapa terowongan SSH ditolak.

Adam
sumber
jadi, sebelum Anda membuat akun "%", Anda membuat "127.0.0.1" dan "localhost" dan keduanya tidak berfungsi, apakah itu benar?
Sverre
localhost hanya berfungsi jika Anda benar-benar berada di host yang benar, jadi secara teori hanya 127.0.0.1 (jaringan yang setara dengan localhost) harus bekerja di terowongan ssh. di unix seperti OS setidaknya.
Sverre

Jawaban:

18

Di MySQL, localhostkata kunci dicadangkan untuk koneksi menggunakan soket MySQL dan Anda harus menggunakan alamat ip 127.0.0.1untuk koneksi TCP ke port jaringan MySQL pada 127.0.0.1. Ini berarti bahwa kedua server harus memberikan hak istimewa kepada pengguna secara khusus 127.0.0.1, dan klien harus menggunakan -h 127.0.0.1untuk melewati terowongan alih-alih menyambungkan ke soket lokal.

Untuk memungkinkan Anda mengakses menggunakan penerusan port SSH Anda memerlukan sesuatu seperti:

GRANT SELECT ON *.* TO user@`127.0.0.1`

dan kemudian jalankan

FLUSH PRIVILEGES;

dan mungkin

FLUSH QUERY CACHE;

Jika masih tidak berhasil, mulai ulang proses server.

Dalam pesan kesalahan 127.0.0.1 setelah lookup DNS terbalik diterjemahkan localhostmembuat kesulitan debugging.

Seperti yang dijelaskan dalam manual :

Di Unix, program MySQL memperlakukan nama host localhost secara khusus, dengan cara yang mungkin berbeda dari apa yang Anda harapkan dibandingkan dengan program berbasis jaringan lainnya. Untuk koneksi ke localhost, program MySQL mencoba untuk terhubung ke server lokal dengan menggunakan file soket Unix. Ini terjadi bahkan jika opsi - -portatau -Pdiberikan untuk menentukan nomor port. Untuk memastikan bahwa klien membuat koneksi TCP / IP ke server lokal, gunakan --hostatau -huntuk menentukan nilai nama host 127.0.0.1, atau alamat IP atau nama server lokal. Anda juga dapat menentukan protokol koneksi secara eksplisit, bahkan untuk localhost, dengan menggunakan --protocol=TCPopsi. Sebagai contoh:

shell> mysql --host=127.0.0.1
shell> mysql --protocol=TCP

The --protocolpilihan memungkinkan Anda untuk membentuk suatu jenis koneksi bahkan ketika pilihan lain biasanya akan default ke beberapa protokol lainnya.

HBruijn
sumber
2
Ah! Itu kemudian menjelaskan mengapa saya melihat localhost di pesan kesalahan ketika saya berharap untuk melihat 127.0.0.1. Namun demikian, pengguna root telah diberikan semua hak istimewa @ 127.0.0.1, tapi saya masih mendapatkan kesalahan akses ditolak saat menghubungkan melalui terowongan SSH. Pernyataan persis yang saya jalankan adalah:grant all on *.* to 'root'@'127.0.0.1' with grant option;
Adam
Saya mengalami masalah ini, dan jelas bahwa memang masalah host vs socket. Ketika saya mengetik ssh -h 127.0.0.1 -u root -pdari jarak jauh di server, koneksi juga ditolak.
fuzzyTew
Saya menyelesaikan -h 127.0.0.1koneksi yang gagal pada server dengan me-reboot mysql, tetapi ssh socket masih tidak berfungsi
fuzzyTew
Kita mulai. 1. Server harus memberikan @ 127.0.0.1. Ini tidak berlaku untuk saya sampai saya reboot server. 2. Koneksi lokal harus ke 127.0.0.1 bukan localhost, sehingga terowongan digunakan sebagai pengganti soket lokal.
fuzzyTew
1

Saya telah melihat di masa lalu dengan ssh tunels, bahwa ada perbedaan antara Grant all to "localhost" dan grant all to "127.0.0.1" jadi coba berikan "127.0.0.1" sebagai gantinya atau sebagai tambahan dari hibah "localhost" Anda.

Sverre
sumber
atau sebaliknya, dalam kasus Anda sepertinya
Sverre
Terima kasih, saya telah memperbarui pertanyaan untuk menyertakan daftar host root. Saya memang merasa aneh bahwa meskipun memasukkan "127.0.0.1" sebagai server MySQL di Sequel Pro, kesalahan MySQL melaporkannya sebagai "localhost". Saya pikir ini bukan masalahnya.
Adam
apakah Anda memiliki kata sandi pada semua pengguna yang berbeda? juga ketika Anda terhubung ke mysql di atas terowongan, apa sintaks yang sebenarnya Anda gunakan?
Sverre
apakah ada batasan pada pengguna Root di pengaturan mysql Anda?
Sverre
Jalankan kembali grantpernyataan dengan identified by ..untuk memastikan semua kata sandi root sama, tetapi tidak ada sukacita.
Adam
0

Alih-alih menggunakan Sequel untuk membuat terowongan, apa yang Anda buat sendiri?

ssh -Cc blowfish -Nf -vv -L3306: localhost: 3306 sshuser @ domain

Kemudian terhubung dengan Sequel ke 127.0.0.1:3306 Bisakah Anda terhubung? Apakah ada yang muncul di terminal Anda (atau log klien ssh)?

Florian Bidabe
sumber