Introduzione

Per impostazione predefinita, il server MySQL accetta solo le connessioni provenienti da localhost, il che significa che è possibile accedervi solo dalle applicazioni in esecuzione sullo stesso host.

Tuttavia, in alcune situazioni, è necessario consentire connessioni remote. Ad esempio, quando si desidera connettersi al server MySQL remoto dal proprio sistema locale o quando si utilizza una distribuzione multi-server in cui l'applicazione è in esecuzione su un computer diverso dal server di database.

In questa guida, seguiremo i passaggi necessari per consentire le connessioni remote verso un server MySQL. Le stesse istruzioni valgono per MariaDB.

Configurazione di MySQL Server

Il primo passo è impostare il server MySQL per l'ascolto su uno specifico indirizzo IP o tutti gli indirizzi IP sulla macchina.

Se il server MySQL e i client possono comunicare tra loro su una rete privata, l'opzione migliore è impostare il server MySQL per l'ascolto solo sull'IP privato. Altrimenti, se si desidera connettersi al server su una rete pubblica, impostare il server MySQL per l'ascolto su tutti gli indirizzi IP della macchina.

Per fare ciò, è necessario modificare il file di configurazione di MySQL e aggiungere o modificare il valore dell'opzione bind-address. È possibile impostare un singolo indirizzo IP e intervalli IP. Se l'indirizzo è impostato con 0.0.0.0, il server MySQL accetta connessioni su tutte le interfacce IPv4 dell'host. Se hai configurato IPv6 sul tuo sistema, invece di usare 0.0.0.0 utilizza invece ::.

La posizione del file di configurazione di MySQL varia in base alla distribuzione. In Ubuntu e Debian il file si trova in /etc/mysql/mysql.conf.d/mysqld.cnf, mentre nelle distribuzioni basate su Red Hat come CentOS, il file si trova in /etc/my.cnf.

Apri il file con il tuo editor di testo:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Cerca la riga bind-address, per impostazione predefinita, il valore è impostato su 127.0.0.1 (ascolta solo in localhost).

In questo esempio, imposteremo il server MySQL per l'ascolto su tutte le interfacce IPv4 modificando il valore in 0.0.0.0:

bind-address           = 0.0.0.0
# skip-networking

Se è presente una riga contenente skip-networking, commentala aggiungendo # all'inizio della riga.

In MySQL 8.0 e versioni successive, il parametro bind-address potrebbe non essere presente. In questo caso, aggiungilo nella sezione [mysqld].

Al termine, riavviare il servizio MySQL per rendere effettive le modifiche. Solo i root o gli utenti con privilegi sudo possono riavviare i servizi.

Per riavviare il servizio MySQL su Debian o Ubuntu, digitare:

sudo systemctl restart mysql

Sulle distribuzioni basate su RedHat come CentOS per riavviare l'esecuzione del servizio:

sudo systemctl restart mysqld

Concessione dell'accesso a un utente da una macchina remota

Il passaggio successivo è consentire l'accesso al database all'utente remoto.

Accedi al server MySQL come utente root digitando:

sudo mysql

Se si utilizza il vecchio plug-in nativo di autenticazione MySQL per accedere come root, eseguire il comando seguente e inserire la password quando richiesto:

mysql -uroot -p

Dall'interno della shell MySQL, utilizzare l'istruzione GRANT per concedere l'accesso al vostro utente remoto.

GRANT ALL ON database_name.* TO [email protected]'ip_address' IDENTIFIED BY 'password';

Dove:

  • database_name è il nome del database a cui l'utente si connetterà.
  • username è il nome dell'utente MySQL.
  • ip_address è l' indirizzo IP da cui l'utente si connetterà. Utilizzare % per consentire all'utente di connettersi da qualsiasi indirizzo IP.
  • password è la password dell'utente.

Ad esempio, per concedere l'accesso a un database con nome db_noviello da parte di un utente denominato dbuser  con password 12345678 da un computer client con IP 10.10.99.99, eseguire:

GRANT ALL ON db_noviello.* TO [email protected]'10.10.99.99' IDENTIFIED BY '12345678';

Configurazione del firewall

L'ultimo passaggio è configurare il firewall in modo da consentire il traffico sulla porta 3306 (porta predefinita MySQL) dai computer remoti.

iptables

Se si utilizza iptables come firewall, il comando seguente consentirà l'accesso da qualsiasi indirizzo IP su Internet verso la porta MySQL (non consigliato):

sudo iptables -A INPUT -p tcp --destination-port 3306 -j ACCEPT

Consenti accesso da un indirizzo IP specifico:

sudo iptables -A INPUT -s 10.10.99.99 -p tcp --destination-port 3306 -j ACCEPT

UFW

UFW è lo strumento firewall predefinito in Ubuntu. Per consentire l'accesso da qualsiasi indirizzo IP su Internet (non consigliato):

sudo ufw allow 3306/tcp

Consenti accesso da un indirizzo IP specifico:

sudo ufw allow from 10.10.99.99 to any port 3306

FirewallD

FirewallD è lo strumento di gestione firewall predefinito in CentOS. Per consentire l'accesso da qualsiasi indirizzo IP su Internet (non consigliato):

sudo firewall-cmd --permanent --zone=public --add-port=3306/tcpsudo firewall-cmd --reload

Per consentire l'accesso da un indirizzo IP specifico su una porta specifica, è possibile creare una nuova zona FirewallD o utilizzare una regola avanzata.

Crea una nuova zona chiamata 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/tcpsudo firewall-cmd --reload

Verifica delle modifiche

Per verificare che l'utente remoto possa connettersi al server MySQL, eseguire il comando seguente da un altro server o dal vostro computer locale:

mysql -u username -h ip_address -p

username è il nome dell'utente a cui hai concesso l'accesso e ip_address è l'indirizzo IP dell'host su cui è in esecuzione il server MySQL.

Se tutto è configurato correttamente, sarai in grado di accedere al server MySQL remoto.

Se viene visualizzato un errore come quello indicato di seguito, la porta 3306 non è aperta o il server MySQL non è in ascolto sull'indirizzo IP .

ERROR 2003 (HY000): Can't connect to MySQL server on '10.10.99.99' (111)"

L'errore seguente indica che l'utente a cui stai tentando di accedere non dispone delle autorizzazioni per accedere al server MySQL remoto.

"ERROR 1130 (HY000): Host ‘10.10.99.99’ is not allowed to connect to this MySQL server" 

Conclusione

La guida è terminata, dovresti essere in grado di connetterti verso un MySQL Database Server remoto.