Truy cập MySQL bị từ chối lỗi khi kết nối qua đường hầm SSH


12

Trong nhiều tháng, tôi đã kết nối với phiên bản MySQL đang chạy trên máy chủ thử nghiệm cục bộ của chúng tôi thông qua một đường hầm SSH mà không gặp sự cố nào. Mặc dù vậy, đột nhiên, không có thay đổi nào tôi có thể nghĩ ra, máy chủ đã bắt đầu từ chối nỗ lực đăng nhập từ Sequel Pro với lỗi:

Không thể kết nối với máy chủ 127.0.0.1 vì quyền truy cập bị từ chối.

Kiểm tra kỹ tên người dùng và mật khẩu của bạn và đảm bảo rằng quyền truy cập từ vị trí hiện tại của bạn được cho phép.

MySQL cho biết: Truy cập bị từ chối đối với người dùng 'root' @ 'localhost' (sử dụng mật khẩu: CÓ)

Tôi có thể đăng nhập từ thiết bị đầu cuối khi được kết nối trực tiếp với máy chủ thông qua SSH, không phải thông qua một đường hầm SSH. Vấn đề không phải là cụ thể đối với Sequel Pro hoặc chỉ bản thân tôi, tôi cũng gặp lỗi tương tự khi kết nối qua MySQL Workbench như những người khác trong văn phòng. Tôi đã đặt lại mật khẩu vớimysqladmin chỉ vì mục đích của sự tỉnh táo, đó chắc chắn không phải là vấn đề.

Khi tôi bắt đầu tìm hiểu thêm, tôi nhận thấy rằng lỗi đã báo cáo máy chủ là "localhost", thay vì "127.0.0.1" mà tôi đã nhập trong Sequel Pro. Một người bạn cho rằng có lẽ đó chỉ là xử lý lỗi xấu, nhưng có vẻ lạ khi có sự khác biệt đáng kể giữa localhost và 127.0.0.1 trong MySQL.

Trong nỗ lực khắc phục sự cố đường hầm, tôi đã cấp quyền truy cập vào root @%, để tôi có thể kết nối trực tiếp. Điều này hoạt động với hầu hết các phần, tôi có thể xem dữ liệu bảng, tạo cơ sở dữ liệu mới, v.v. Vấn đề duy nhất là khi tôi đến để tạo người dùng, tôi gặp lỗi:

Truy cập bị từ chối cho người dùng 'root' @ '%' (sử dụng mật khẩu: CÓ)

Điều kỳ lạ là người dùng thực sự được tạo ra, tôi nghĩ đó chỉ là một vấn đề với sự cho phép. Một lần nữa, từ thiết bị đầu cuối, tôi có thể làm bất cứ điều gì khi đăng nhập bằng root.

Bất cứ ai cũng có thể giúp làm sáng tỏ lý do tại sao các kết nối đường hầm và (có thể) các lệnh cấp đang nhận được lỗi từ chối truy cập?

Để tham khảo MySQ là phiên bản 5.6.16 với hầu hết các cài đặt mặc định, được cài đặt qua Homebrew trên máy MAC OS X Server.

Cập nhật

Đây là danh sách các máy chủ mà root hiện đang được cấp quyền truy cập vào:

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)

Theo tôi hiểu, hàng đầu tiên ("%") có thực sự khiến những người khác trở nên dư thừa?

Cập nhật 2

Đã sửa lỗi cấp; người dùng root @% chưa được cấp tất cả các đặc quyền với phần bổ sung with grant optionở cuối, vì vậy nó có thể làm mọi thứ trừ cấp. Mặc dù vậy, vẫn muốn biết lý do tại sao các đường hầm SSH bị từ chối.


vì vậy, trước khi bạn tạo tài khoản "%", bạn đã tạo "127.0.0.1" và "localhost" và cả hai đều không hoạt động, điều đó có đúng không?
Sverre

localhost chỉ hoạt động nếu bạn thực sự ở đúng máy chủ, vì vậy về lý thuyết chỉ có 127.0.0.1 (mạng tương đương với localhost) nên hoạt động trên một đường hầm ssh. trong unix như hệ điều hành ít nhất.
Sverre

Câu trả lời:


18

Trong MySQL, localhosttừ khóa được dành riêng cho kết nối bằng cách sử dụng ổ cắm MySQL và bạn nên sử dụng địa chỉ IP 127.0.0.1cho các kết nối TCP đến cổng mạng MySQL trên 127.0.0.1. Điều này có nghĩa rằng cả hai máy chủ phải cấp quyền cho người dùng từ đặc biệt 127.0.0.1, khách hàng phải sử dụng-h 127.0.0.1 để đi qua đường hầm thay vì kết nối với một ổ cắm địa phương.

Để cho phép bạn truy cập bằng cách sử dụng chuyển tiếp cổng SSH, bạn cần một cái gì đó như:

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

và sau đó chạy

FLUSH PRIVILEGES;

và có thể

FLUSH QUERY CACHE;

Nếu nó vẫn không hoạt động, khởi động lại quá trình máy chủ.

Trong thông báo lỗi 127.0.0.1 sau khi tra cứu DNS ngược được dịch để localhostlàm cho việc gỡ lỗi trở nên khó khăn.

Như hướng dẫn mô tả nó:

Trên Unix, các chương trình MySQL đối xử đặc biệt với tên máy chủ localhost, theo cách có khả năng khác với những gì bạn mong đợi so với các chương trình dựa trên mạng khác. Đối với các kết nối đến localhost, các chương trình MySQL cố gắng kết nối với máy chủ cục bộ bằng cách sử dụng tệp ổ cắm Unix. Điều này xảy ra ngay cả khi một - -porthoặc -Ptùy chọn được đưa ra để chỉ định số cổng. Để đảm bảo rằng máy khách thực hiện kết nối TCP / IP đến máy chủ cục bộ, hãy sử dụng --hosthoặc -hchỉ định giá trị tên máy chủ 127.0.0.1hoặc địa chỉ IP hoặc tên của máy chủ cục bộ. Bạn cũng có thể chỉ định rõ ràng giao thức kết nối, ngay cả đối với localhost, bằng cách sử dụng --protocol=TCPtùy chọn. Ví dụ:

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

Các --protocoltùy chọn cho phép bạn thiết lập một loại hình cụ thể của kết nối ngay cả khi các tùy chọn khác thường mặc định đối với một số giao thức khác.


2
Ah! Điều đó sau đó giải thích tại sao tôi thấy localhost trong thông báo lỗi khi tôi dự kiến ​​sẽ thấy 127.0.0.1. Chưa bao giờ, người dùng root đã được cấp tất cả các đặc quyền @ 127.0.0.1, nhưng tôi vẫn nhận được lỗi từ chối truy cập khi kết nối qua một đường hầm SSH. Tuyên bố chính xác tôi đã chạy là:grant all on *.* to 'root'@'127.0.0.1' with grant option;
Adam

Tôi đang gặp vấn đề này, và rõ ràng đó thực sự là vấn đề máy chủ và ổ cắm. Khi tôi gõ ssh -h 127.0.0.1 -u root -ptừ xa trên máy chủ, kết nối cũng bị từ chối.
fuzzyTew

Tôi đã giải quyết các -h 127.0.0.1kết nối không thành công trên máy chủ bằng cách khởi động lại mysql, nhưng ổ cắm ssh vẫn không hoạt động
fuzzyTew

Chúng ta đi đây. 1. Máy chủ phải cấp cho @ 127.0.0.1. Điều này không mang lại cho tôi cho đến khi tôi khởi động lại máy chủ. 2. Kết nối cục bộ phải là 127.0.0.1 chứ không phải localhost, để đường hầm được sử dụng thay cho ổ cắm cục bộ.
fuzzyTew

1

Tôi đã thấy trong quá khứ với ssh tunels, rằng có một sự khác biệt giữa Grant all cho "localhost" và cấp tất cả cho "127.0.0.1", vì vậy hãy thử cấp cho "127.0.0.1 thay vào đó hoặc thêm vào cấp" localhost "của bạn.


hoặc ngược lại, trong trường hợp của bạn, nó trông giống như
Sverre

Cảm ơn, tôi đã cập nhật câu hỏi để bao gồm danh sách root máy chủ được cấp. Tôi thấy lạ là mặc dù đã nhập "127.0.0.1" với tư cách là máy chủ MySQL trong Sequel Pro, lỗi MySQL đã báo cáo là "localhost". Tôi không nghĩ rằng đây là vấn đề.
Adam

Bạn có mật khẩu trên tất cả những người dùng khác nhau không? Ngoài ra, khi bạn kết nối với mysql qua đường hầm, cú pháp thực tế bạn sử dụng là gì?
Sverre

Có bất kỳ hạn chế nào đối với người dùng Root trong thiết lập mysql của bạn không?
Sverre

Chỉ cần chạy lại các grantcâu lệnh với identified by ..để đảm bảo tất cả mật khẩu gốc đều giống nhau, nhưng không có niềm vui.
Adam

0

Thay vì sử dụng Sequel để tạo đường hầm, bạn tự tạo đường hầm là gì?

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

Sau đó kết nối với Sequel tới 127.0.0.1:3306 Bạn có thể kết nối không? Có bất cứ điều gì xuất hiện trên thiết bị đầu cuối của bạn (hoặc nhật ký khách hàng ssh)?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.