Введение
По умолчанию сервер MySQL принимает соединения только с локального хоста, что означает, что к нему могут получить доступ только приложения, работающие на том же хосте.
Однако в некоторых ситуациях необходимо разрешить удаленные подключения. Например, когда вы хотите подключиться к удаленному серверу 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, по умолчанию установлено значение 127.0.0.1 (слушать только на локальном хосте).
В этом примере мы настроим сервер 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, набрав:
sudo mysql
Если вы используете старый собственный плагин аутентификации MySQL для входа в систему как root, выполните следующую команду и введите пароль при появлении запроса:
mysql -u root -p
В оболочке MySQL используйте оператор GRANT, чтобы предоставить доступ вашему удаленному пользователю.
GRANT ALL ON database_name.* TO username@'ip_address' IDENTIFIED BY 'password';
Где это находится:
- имя_базы_данных — это имя базы данных, к которой будет подключаться пользователь.
- username — это имя пользователя MySQL.
- ip_address — это IP-адрес, с которого будет подключаться пользователь. Используйте %, чтобы разрешить пользователю подключаться с любого IP-адреса.
- пароль — это пароль пользователя.
Например, чтобы предоставить доступ к базе данных с именем db_noviello пользователю с именем dbuser и паролем 12345678 с клиентского компьютера с IP-адресом 10.10.99.99, выполните:
GRANT ALL ON db_noviello.* TO dbuser@'10.10.99.99' IDENTIFIED BY '12345678';
Конфигурация брандмауэра
Последним шагом является настройка брандмауэра для разрешения трафика через порт 3306 (порт MySQL по умолчанию) с удаленных компьютеров.
iptables
Если вы используете iptables в качестве брандмауэра, следующая команда разрешит доступ с любого IP-адреса в Интернете к порту MySQL (не рекомендуется):
sudo iptables -A INPUT -p tcp --destination-port 3306 -j ACCEPT
Разрешить доступ с определенного IP-адреса:
sudo iptables -A INPUT -s 10.10.99.99 -p tcp --destination-port 3306 -j ACCEPT
УФВ
UFW — это инструмент брандмауэра по умолчанию в Ubuntu. Чтобы разрешить доступ с любого IP-адреса в Интернете (не рекомендуется):
sudo ufw allow 3306/tcp
Разрешить доступ с определенного IP-адреса:
sudo ufw allow from 10.10.99.99 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 --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --permanent --zone=mysqlzone --add-source=10.10.99.99/32
sudo firewall-cmd --permanent --zone=mysqlzone --add-port=3306/tcp
sudo firewall-cmd --reload
Проверить изменения
Чтобы убедиться, что удаленный пользователь может подключиться к серверу MySQL, выполните следующую команду с другого сервера или с вашего локального компьютера:
mysql -u username -h ip_address -p
username — это имя пользователя, которому вы предоставили доступ, а ip_address — это IP-адрес хоста, на котором работает сервер MySQL.
Если все настроено правильно, вы сможете получить доступ к удаленному серверу MySQL.
Если вы получаете сообщение об ошибке, подобное приведенному ниже, порт 3306 не открыт или сервер MySQL не прослушивает IP-адрес.
ERROR 2003 (HY000): Can't connect to MySQL server on '10.10.99.99' (111)"
Следующая ошибка указывает на то, что пользователь, к которому вы пытаетесь получить доступ, не имеет разрешений на доступ к удаленному серверу MySQL.
"ERROR 1130 (HY000): Host '10.10.99.99' is not allowed to connect to this MySQL server"
Вывод
Руководство закончено, вы сможете подключиться к удаленному серверу базы данных MySQL.