- Как разрешить удаленные подключения к серверу базы данных MySQL
- Настройка сервера MySQL
- Предоставление доступа пользователю с удаленного компьютера
- Настройка межсетевого экрана
- Iptables
- UFW
- БрандмауэрD
- Проверка изменений
- Выводы
- How to Allow Remote Access to MySQL Database Server
- Create a New MySQL User
- Enable Remote MySQL Access
- Attempting Remote MySQL Database Access
- Enable Remote MySQL Access in Firewall
- UFW Firewall
- FirewallD
- Iptables
Как разрешить удаленные подключения к серверу базы данных MySQL
По умолчанию сервер MySQL прослушивает соединения только с localhost, что означает, что к нему могут получить доступ только приложения, работающие на том же хосте.
Однако в некоторых ситуациях необходимо получить доступ к серверу MySQL из удаленного места. Например, если вы хотите подключиться к удаленному серверу MySQL из вашей локальной системы, или при использовании многосерверного развертывания, когда приложение выполняется на другом компьютере, чем сервер базы данных. Один из вариантов — получить доступ к серверу MySQL через туннель SSH, а другой — настроить сервер MySQL на прием удаленных подключений.
В этом руководстве мы рассмотрим шаги, необходимые для разрешения удаленных подключений к серверу MySQL. Те же инструкции применимы и для MariaDB.
Настройка сервера MySQL
Первый шаг — настроить сервер 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 (прослушивается только на localhost).
В этом примере мы настроим сервер MySQL для прослушивания всех интерфейсов IPv4, изменив значение на 0.0.0.0
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, набрав:
Если вы используете старый собственный плагин аутентификации MySQL для входа в систему как root, выполните приведенную ниже команду и введите пароль при появлении запроса:
Изнутри оболочки MySQL используйте оператор GRANT чтобы предоставить доступ удаленному пользователю.
GRANT ALL ON database_name.* TO user_name@'ip_address' IDENTIFIED BY 'user_password';
- database_name — это имя базы данных, к которой будет подключаться пользователь.
- user_name — это имя пользователя MySQL.
- ip_address — это IP-адрес, с которого пользователь будет подключаться. Используйте % чтобы разрешить пользователю подключаться с любого IP-адреса.
- user_password — пароль пользователя.
Например, чтобы предоставить доступ к базе данных dbname пользователю с именем foo с паролем my_passwd с клиентского компьютера с IP 10.8.0.5 , вы должны запустить:
GRANT ALL ON dbname.* TO foo@'10.8.0.5' IDENTIFIED BY 'my_passwd';
Настройка межсетевого экрана
Последний шаг — настроить брандмауэр, чтобы разрешить трафик на порт 3306 (порт по умолчанию MySQL) с удаленных машин.
Iptables
Если вы используете 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
UFW — это брандмауэр по умолчанию в Ubuntu. Чтобы разрешить доступ с любого IP-адреса в Интернете (очень небезопасно), запустите:
Разрешить доступ с определенного IP-адреса:
sudo ufw allow from 10.8.0.5 to any port 3306
БрандмауэрD
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 --permanent
sudo 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 вы предоставили доступ, а 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, самый популярный сервер баз данных с открытым исходным кодом по умолчанию, прослушивает входящие соединения только на localhost.
Чтобы разрешить удаленные подключения к серверу MySQL, вам необходимо выполнить следующие шаги:
- Настройте сервер MySQL для прослушивания всего или определенного интерфейса.
- Разрешите доступ удаленному пользователю.
- Откройте порт MySQL в вашем брандмауэре.
Если у вас есть вопросы, не стесняйтесь оставлять комментарии ниже.
How to Allow Remote Access to MySQL Database Server
The software ecosystem is not new to the notion of distributed systems. You do not need to be physically present in order to interact with your remotely hosted software.
Therefore your MySQL does not need to reside on a local machine for you to fully benefit from its functional features. You can now have the MySQL running on a remote dedicated server and still be guaranteed the same database security and performance as the case with a MySQL running on a local/desktop machine.
This article guide will walk us through setting up and enabling remote access to a MySQL server in Linux. On the remote server/machine hosting your MySQL database software, we need to perform a few configuration steps for it to allow authenticated remote users access.
Create a New MySQL User
It is advisable to work with a remote user who is neither a root MySQL user nor tied to the remote server hosting the MySQL database software.
Access your remote MySQL server and database via SSH.
To create a new MySQL user, we will adhere to the command syntax:
CREATE USER 'username'@'%' IDENTIFIED BY 'your_user_password';
As you have noted, we are using the notation ‘username’@’%’ and not ‘username’@’localhost’ since we want this user to be dynamic enough to access the MySQL server from any other host machine with a different IP address.
mysql> CREATE USER 'remote_user'@'%' IDENTIFIED BY 'password1122';
Let us grant this user some database privileges. For instance, this user can have the same database privileges as the root user only that the root user is bound to the host machine.
mysql> GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%'; mysql> FLUSH PRIVILEGES; mysql> exit;
Enable Remote MySQL Access
Now that we have the remote user created, it’s time to perform some additional configuration changes. By default, the MySQL bind-address is 127.0.0.1 which implies that only localhost users can interact with the MySQL database.
To give access to other users’ IP addresses to your database server, navigate and open the file MySQL configuration file.
$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf OR $ sudo vi /etc/my.cnf
To allow remote access to your MySQL database server, the fields bind-address and mysqlx-bind-address need to be commented out. These configuration changes will prevent the server hosting MySQL database software from only relying on localhost (127.0.0.1) connections. Afterward, any IP address will be allowed to access it.
Restart Your MySQL server and then identify the IP address of the MySQL server.
$ sudo systemctl restart mysql $ ifconfig
Attempting Remote MySQL Database Access
To directly connect to the MySQL database server remotely, adhere to the following MySQL syntax:
$ mysql -u username -h mysql_server_ip_adress -p
In our case, the command will look like the following:
$ mysql -u remote_user -h 192.168.50.130 -p
If you run into the above error as depicted by the screen capture, you will need to configure your MySQL user to use a native password. Sign-in back to your MySQL server via SSH and implement the command:
mysql> ALTER USER 'remote_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password1122'; mysql> exit;
Afterward, exit the MySQL database shell and restart the MySQL daemon.
$ sudo systemctl restart mysql
Re-attempt remote access to your MySQL server.
$ mysql -u remote_user -h 192.168.50.130 -p
And just like that, you can directly and remotely gain access to a MySQL database server from a remote client computer configured to an IP address of your choice.
Enable Remote MySQL Access in Firewall
If you have a firewall enabled on your remote server, you might need to grant access to MySQL’s default port 3306 and grant access to remote_ip_address as shown.
UFW Firewall
$ sudo ufw allow from remote_ip_address to any port 3306
FirewallD
$ sudo firewall-cmd --new-zone=mysqlrule --permanent $ sudo firewall-cmd --reload $ sudo firewall-cmd --permanent --zone=mysqlrule --add-source=remote_ip_address $ sudo firewall-cmd --permanent --zone=mysqlrule --add-port=3306/tcp $ sudo firewall-cmd --reload
Iptables
$ sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT $ sudo iptables -A INPUT -p tcp -s remote_ip_address --dport 3306 -j ACCEPT
That’s all! In this article, you have learned helpful insight into the common ideas of remote MySQL access in Linux.