Hacer que la base de datos esté disponible para la conexión remota

Para empezar, hay casos en los que es necesario crear una aplicación con una conexión a una base de datos. Esto se hace para no profundizar demasiado en el desarrollo backend y concentrarse en el frontend debido a la falta de manos y habilidades. No puedo decir que mi solución sea segura, pero funciona.

Como no me gusta pagar por el hosting, usé la red en mi trabajo, allí hay una IP blanca. Aquí está su estructura:

Hacer que la base de datos esté disponible para la conexión remota

Tengo acceso a varias computadoras, más precisamente 192.168.1.2 (también conocido como 192.168.0.2) con Linux instalado allí y 192.168.0.3 con Windows. En general, elegí mysql para mi aplicación y miré lo que estaba disponible en Linux. Ya estaba instalada allí, pero nadie sabe la contraseña y los que la sabían la olvidaron (los que trabajaron antes que yo). Al enterarme de que nadie lo necesitaba, lo eliminé e intenté instalarlo nuevamente. No había suficiente memoria y, como para corregir este error tendría que conectarle un monitor y un teclado con un mouse, decidí abandonar este asunto. Además, la máquina con Windows es mucho más potente y además la tengo en mi portátil de casa. En principio no describiré la instalación en sí, hay muchos manuales y vídeos al respecto. Después de instalar mysql en una máquina con Windows, decidí hacer una copia de seguridad de las tablas desde mi computadora portátil a mi estación de trabajo.

Se hace así (en mi caso):

mysqldump -uroot -p your_base > dump_file.sql

A continuación, creamos una base de datos en la nueva base de datos y restauramos la copia de seguridad en la “nueva” máquina.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


El archivo de copia de seguridad debe colocarse en la nueva máquina y, quizás, si no en el directorio con la utilidad, entonces la ruta completa al mismo. (Acabo de subir la copia de seguridad a GitHub y la cloné en una nueva máquina). Agregaría cómo se crean las tablas, pero no guardé las capturas de pantalla y creo que no es difícil ni siquiera para un estudiante de 2 o 3 años.

Cuando se hayan restaurado todas las tablas, es hora de habilitar el acceso remoto a la base de datos. En general, tales comandos no tuvieron éxito (solo dieron permiso de lectura para seleccionar)

create user 'client'@'%' IDENTIFIED by 'client';
grant select on your_base . * to 'client'@'%';
flush privileges;

Más precisamente, podría conectarme a la base de datos solo con el comando,

mysql -h localhost -u client -pclient

pero este ya no pudo más

mysql -h 192.168.0.3 -u client -pclient

Esto no funcionó para mí y no pude conectarme a través de esta dirección como root.

El programa mysql workbench ayudó; en la configuración, cambie localhost a % y funciona, aunque el cliente no ayudó. Ahora puedes conectarte a la base de datos desde la consola o desde el código de cualquier dirección.

Hacer que la base de datos esté disponible para la conexión remota

También necesita crear una red doméstica o comercial y apagar el firewall de Windows; de lo contrario, ni siquiera podrá hacer ping a esta máquina (y mucho menos conectarse a la base de datos).

La mitad del trabajo está hecha, ahora necesito poder conectarme a la base de datos desde casa.

Como puede ver en el diagrama de red, para acceder a Internet es necesario pasar de 192.168.0.3 a 192.168.1.1 (enrutador), vayamos en la dirección opuesta. Configuremos la ruta de 192.168.1.1 a 192.168.1.2 así:

Hacer que la base de datos esté disponible para la conexión remota

En general, la imagen no se ve, así que la escribiré a mano:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Esto solo se puede hacer en una subred, es decir, no se puede reenviar inmediatamente a la dirección 192.168.0.2 o 192.168.0.3.

Esto es necesario para que el enrutador sepa dónde se encuentra la subred 192.168.0.0/24 (es útil aprender los conceptos básicos de las redes).

Ahora agregamos el reenvío de puerto 3306 (el puerto mysql predeterminado (si no lo cambió durante la instalación)) a la dirección 192.168.1.2

Hacer que la base de datos esté disponible para la conexión remota

Lo más difícil que queda por hacer es reenviar en una máquina Linux (tiene dos tarjetas de red 192.168.1.2 (interfaz enp3s1) y 192.168.0.2 (interfaz enp3s0) para que las tarjetas de red sepan desde qué transferirlas 192.168.1.2 a 192.168.0.2, y luego a nuestra máquina Windows con MySql.

sudo iptables -A FORWARD -i enp3s1 -o enp3s0 -p tcp --syn --dport 3306 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -i enp3s1 -o enp3s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i enp3s0 -o enp3s1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A PREROUTING -i enp3s1 -p tcp --dport 3306 -j DNAT --to-destination 192.168.0.3
sudo iptables -t nat -A POSTROUTING -o enp3s0 -p tcp --dport 3306 -d 192.168.0.3 -j SNAT --to-source 192.168.1.2
и последняя строчка сохраняет введенные команды чтобы они при перезапуске оси не стерлись
sudo service iptables-persistent save

Aquellos. La 1ª línea significa que aceptamos la primera conexión, la 2ª y 3ª que podemos enviar paquetes en ambas direcciones, la 4ª y 5ª significa cambiar las direcciones de destino y origen. Y listo, puedes conectarte desde casa a través de mysql. Y finalmente, mi código C++ que hace esto:

//DataBaseConnection.cpp
#include "DataBaseConnection.h"

DataBaseConnection::DataBaseConnection()
{
}
void DataBaseConnection::Connect()
{
	// Получаем дескриптор соединения
	conn = mysql_init(NULL);
	if (conn == NULL)
	{
		// Если дескриптор не получен – выводим сообщение об ошибке
		fprintf(stderr, "Error: can'tcreate MySQL-descriptorn");
		//exit(1); //Если используется оконное приложение
	}
	// Подключаемся к серверу
	if (!mysql_real_connect(conn, "192.168.0.3", "root", "password", "your_base", NULL, NULL, 0))
	{
		// Если нет возможности установить соединение с сервером 
		// базы данных выводим сообщение об ошибке
		fprintf(stderr, "Error: can't connect to database: %sn", mysql_error(conn));
	}
	else
	{
		// Если соединение успешно установлено выводим фразу - "Success!"
		fprintf(stdout, "Success!n");
	}
}
std::vector<std::string> DataBaseConnection::Query()
{
	vectordrum.clear();
	std::string query = "SELECT * FROM drum where id=0";
	const char * q = query.c_str();
	qstate = mysql_query(conn, q);
	if (!qstate)
	{
		res = mysql_store_result(conn);
		while (row = mysql_fetch_row(res))
		{
			//printf("ID: %s,Position: %s, Image: %sn", row[0], row[1], row[2]);
			vectordrum.push_back(row[2]);
		}
	}
	else
	{
		std::cout << "Query failed:" << mysql_error(conn) << std::endl;
	}
	return vectordrum;
}
void DataBaseConnection::Close()
{
	// Закрываем соединение с сервером базы данных
	mysql_close(conn);
}
DataBaseConnection::~DataBaseConnection()
{
	vectordrum.clear();
}
//DataBaseConnection.h
#pragma once
#include <iostream>
#include <mysql.h>
#include <vector>
#pragma comment(lib,"mysqlcppconn.lib")
#pragma comment(lib,"libmysql.lib")
class DataBaseConnection
{
public:
	DataBaseConnection();
	void Connect();
	std::vector<std::string> Query();
	void Close();
	~DataBaseConnection();
	MYSQL *conn;
	MYSQL_ROW row;
	MYSQL_RES *res;
	int qstate;
	std::vector<std::string> vectordrum;
};

Ahora puedes enviar este programa de forma segura a cualquier persona y no tienes que reescribirlo para que funcione localmente.

Fuente: habr.com

Añadir un comentario