По умолчанию сервер MySQL прослушивает соединения только от localhost, что означает, что к нему могут обращаться только приложения, работающие на одном хосте.
Однако в некоторых ситуациях необходимо разрешить удаленные подключения. Например, когда вы хотите подключиться к удаленному серверу MySQL из вашей локальной системы, или когда вы используете многосерверное развертывание, когда приложение работает на компьютере, отличном от сервера базы данных.
В этой статье мы рассмотрим шаги, необходимые для разрешения удаленных подключений к серверу MySQL. То же самое относится и к MariaDB.
Первый шаг — настроить сервер MySQL на прослушивание определенного IP-адреса или всех IP-адресов на компьютере.
Если сервер MySQL и клиенты могут взаимодействовать друг с другом через частную сеть, то лучшим вариантом будет настроить сервер MySQL на прослушивание только по частному IP. В противном случае, если вы хотите подключиться к серверу через общедоступную сеть, настройте сервер MySQL на прослушивание всех IP-адресов на компьютере.
Для этого вам нужно отредактировать файл конфигурации MySQL и добавить или изменить значение опции bind-address. Вы можете установить один IP-адрес и IP-диапазоны. Если адрес есть 0.0.0.0, сервер MySQL принимает соединения на всех интерфейсах IPv4 хоста. Если в вашей системе настроен IPv6 0.0.0.0, используйте вместо ::.
Расположение файла конфигурации MySQL зависит от дистрибутива. В Ubuntu и Debian файл находится по адресу /etc/mysql/mysql.conf.d/mysqld.cnf, в то время как в дистрибутивах на основе Red Hat, таких как CentOS, файл находится по адресу /etc/my.cnf.
Откройте файл в текстовом редакторе :
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Найдите строку, которая начинается с bind-address и установите в качестве значения IP-адрес, который должен прослушивать сервер MySQL.
По умолчанию установлено значение 127.0.0.1 (прослушивается только на локальном хосте).
В этом примере мы настроим сервер MySQL на прослушивание всех интерфейсов IPv4, изменив значение на 0.0.0.0
mysqld.cnf
bind-address = 0.0.0.0 # skip-networking
Если есть строка, содержащая skip-networking, удалите ее или закомментируйте, добавив # в начале строки.
В MySQL 8.0 и выше директива bind-address может отсутствовать. В этом случае добавьте ее в разделе [mysqld].
После этого перезапустите службу MySQL, чтобы изменения вступили в силу. Только root или пользователи с привилегиями sudo могут перезапускать сервисы.
Чтобы перезапустить службу MySQL в Debian или Ubuntu, введите:
sudo systemctl restart mysql
В дистрибутивах на основе RedHat, таких как CentOS, для перезапуска службы выполните:
sudo systemctl restart mysqld
Следующим шагом является предоставление доступа к базе данных удаленному пользователю.
Войдите на сервер MySQL от имени пользователя root, введя:
sudo mysql
Если вы используете старый плагин аутентификации MySQL для входа в систему от имени пользователя root, введите команду ниже и введите пароль при появлении запроса:
mysql -uroot -p
Внутри оболочки MySQL используйте GRANTоператор для предоставления доступа удаленному пользователю.
GRANT ALL ON database_name.* TO user_name@'ip_address' IDENTIFIED BY 'user_password';
Где:
Например, чтобы предоставить доступ к базе данных dbname пользователю с именем andreyex с паролем my_passwd с клиентского компьютера с IP 10.8.0.5, вы должны выполнить:
GRANT ALL ON dbname.* TO andreyex@'10.8.0.5' IDENTIFIED BY 'my_passwd';
Последний шаг — настройка брандмауэра для разрешения трафика через порт 3306( порт MySQL по умолчанию) с удаленных компьютеров.
Если вы используете iptables в качестве брандмауэра, команда ниже разрешит доступ с любого IP-адреса в Интернете к порту MySQL. Это очень небезопасно.
sudo iptables -A INPUT -p tcp --destination-port 3306 -j ACCEPT
Разрешить доступ с определенного IP-адреса:
sudo iptables -A INPUT -s 10.8.0.5 -p tcp --destination-port 3306 -j ACCEPT
UFW — это инструмент брандмауэра по умолчанию в Ubuntu. Чтобы разрешить доступ с любого IP-адреса в Интернете (очень небезопасно), выполните:
sudo ufw allow 3306/tcp
Разрешить доступ с определенного IP-адреса:
sudo ufw allow from 10.8.0.5 to any port 3306
FirewallD является инструментом управления брандмауэром по умолчанию в CentOS. Чтобы разрешить доступ с любого IP-адреса в Интернете (очень небезопасно), введите:
sudo firewall-cmd --permanent --zone=public --add-port=3306/tcp sudo firewall-cmd --reload
Чтобы разрешить доступ с определенного IP-адреса на конкретном порту, вы можете создать новую зону FirewallD или использовать расширенное правило. Хорошо создайте новую зону с именем mysqlzone:
sudo firewall-cmd --new-zone=mysqlzone --permanentsudo firewall-cmd --reload sudo firewall-cmd --permanent --zone=mysqlzone --add-source=10.8.0.5/32 sudo firewall-cmd --permanent --zone=mysqlzone --add-port=3306/tcp sudo firewall-cmd --reload
Чтобы убедиться, что удаленный пользователь может подключиться к серверу MySQL, выполните следующую команду:
mysql -u user_name -h mysql_server_ip -p
Где user_name имя пользователя, которому вы предоставили доступ и mysql_server_ip, IP-адрес хоста, на котором работает сервер MySQL.
Если все настроено правильно, вы сможете войти на удаленный сервер MySQL.
Если вы получаете сообщение об ошибке, как показано ниже, либо порт 3306 не открыт, либо сервер MySQL не прослушивает IP-адрес.
ERROR 2003 (HY000): Can't connect to MySQL server on '10.8.0.5' (111)"
Приведенная ниже ошибка указывает на то, что пользователь, которому вы пытаетесь войти, не имеет прав доступа к удаленному серверу MySQL.
"ERROR 1130 (HY000): Host ‘10.8.0.5’ is not allowed to connect to this MySQL server"
MySQL, самый популярный сервер баз данных с открытым исходным кодом по умолчанию, прослушивает входящие соединения только на локальном хосте.
Чтобы разрешить удаленные подключения к серверу MySQL, вам необходимо выполнить следующие шаги:
Если у вас есть вопросы, не стесняйтесь оставлять комментарии ниже.
Спасибо за статью. Помогло и облегчило жизнь!)
Реально полезная статья, часто помогает при настройке VDs, что бы работать не в консоли, а через IDE приложения у себя дома.