¿Qué debo hacer para permitir el acceso remoto a MySQL en el servidor Unbuntu 20.04?

¿Qué debo hacer para permitir el acceso remoto a MySQL en el servidor Unbuntu 20.04?

Tengo un pequeño script de Python para recopilar las calificaciones de las tareas de los estudiantes y de los trabajos de clase en línea de la tabla allstudentsAnswers20BE.

Esto funciona muy bien en mi antigua página web de alojamiento web compartido.

En el nuevo servidor en la nube Ubuntu 20.04, me rechazan la conexión. No tengo experiencia ejecutando un servidor en la nube.

Permití los puertos 33060 y 3306 en UFW

Mi ip de casa no está fija.

Cuando ejecuto mi secuencia de comandos Python, aparece este error al intentar conectarme al servidor en la nube.

pymysql.err.OperationalError: (1130, "183.206.16.30' no puede conectarse a este servidor MySQL")

netstat dice que mysqld está escuchando en 33060 y 3306, así que permití ambos en el firewall ufw

Conectándome al servidor en la nube a través de ssh, ejecuté:

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

Cambié la línea bind-address a 0.0.0.0 (también probé *)

Reinicié mysql: sudo systemctl restart mysql

Debe haber algo más que deba configurarse, del lado del servidor.

Cualquier consejo sobre lo que podría ser, por favor, realmente necesito que esto funcione.

También obtuve esta información (supongamos que la IP de mi nube es 123.456.789.123):

pedro@ebs-105422:~$ nc -v -w 2 123.456.789.123 3306 ¡
La conexión al puerto 123.456.789.123 3306 [tcp/mysql] fue exitosa! pedro@ebs-105422:~$

¿Esto significa que mysqld está escuchando en 3530? ¿O es ese el PID de mysqld?

pedro@ebs-105422:~$ sudo netstat -tap | grep mysql tcp 0 0 0.0.0.0:mysql 0.0.0.0:* ESCUCHAR 3530/mysqld
tcp6 0 0 [::]:33060 [::]:* ESCUCHAR 3530/mysqld
pedro@ebs-105422:~$

A continuación se muestra mysql en el servidor, confirmando el puerto 3306

mysql> mostrar variables donde nombre_variable en ('nombre de host','puerto');
+---------------+------------+
| nombre_variable | Valor |
+---------------+------------+
| nombre de host | ebs-105422 |
| puerto | 3306 | +---------------+------------+
2 filas en conjunto (0,01 seg)

mysql>

Respuesta1

Lo descubrí, esta respuesta es solo para ayudar a cualquiera que pueda tener el mismo problema. Esta forma probablemente no sea tan segura, con 3306 abierto, pero a) solo tengo tarea b) todavía necesitas el nombre de usuario y la contraseña.

Cuando creas un usuario en mysql se ve así, también cuando lo haces vía ssh en el servidor:

CREAR USUARIO 'peter'@'localhost' IDENTIFICADO POR 'contraseña';
CONCEDA TODOS LOS PRIVILEGIOS EN some_db.* A 'peter'@'localhost';

Si desea acceso remoto, debe cambiar los datos del usuario (o crear un nuevo usuario):

RENOMBRAR USUARIO 'peter'@'localhost' A 'peter'@'%';
CONCEDER TODO EN somedb.* A 'peter'@'%';

% aquí aparentemente representa cualquier ip

Luego también vía ssh en el servidor:

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

encuentra la recta que tiene

dirección de enlace = 127.0.0.1

cambiar esto a

dirección de enlace = 0.0.0.0

Ctrl X para salir de nano nano le pregunta si desea guardar, presione y, luego ingrese para guardar en el mismo lugar donde abrió /etc/mysql/mysql.conf.d/mysqld.cnf

Luego (en el servidor):

sudo systemctl reiniciar mysql

Después de eso, mi Python funcionó bien desde el shell inactivo:

def mysqlRemoteAttn(clas): 
    # To connect remote MySQL database 
    conn = pymysql.connect( 
        host='123.456.789.123',
        port=3306,
        user='myusername',  
        password = 'mypassword', 
        db='allstudentsdb', 
        ) 
      
    cur = conn.cursor()

    sql = f"SELECT studentnr, attn_this_week FROM allstudents{clas}"
    cur.execute(sql)
    output = cur.fetchall()           
            
    # To close the connection 
    conn.close()
    return output

# get the attendance from the webpage MySQL
results = mysqlRemoteAttn(clas)

información relacionada