Rendere il database disponibile per la connessione remota

Cominciamo dal fatto che ci sono casi in cui è necessario creare un'applicazione con una connessione a un database. Questo viene fatto per non approfondire troppo lo sviluppo del backend e concentrarsi sul frontend per mancanza di mani e competenze. Non posso dire che la mia soluzione sarà sicura, ma funziona.

Dato che non mi piace pagare per l'hosting, ho utilizzato la rete al lavoro, lì c'è un IP bianco. Ecco la sua struttura:

Rendere il database disponibile per la connessione remota

Ho accesso a diversi computer, più precisamente 192.168.1.2 (aka 192.168.0.2) con Linux installato e 192.168.0.3 con Windows. In generale, ho scelto mysql per la mia applicazione e ho guardato cosa era disponibile su Linux. Era già installato lì, ma nessuno conosce la password e chi la sapeva l'ha dimenticata (chi ha lavorato prima di me). Avendo saputo che nessuno ne aveva bisogno, l'ho cancellato e ho provato a installarlo di nuovo. Non c'era abbastanza memoria e poiché per correggere questo errore avrei dovuto collegare un monitor e una tastiera con un mouse, ho deciso di rinunciare a questo argomento. Inoltre, la macchina con Windows è molto più potente e in più ce l'ho sul mio laptop a casa. In linea di principio, non descriverò l'installazione in sé, ci sono molti manuali e video a riguardo. Avendo installato mysql su una macchina Windows, ho deciso di eseguire il backup delle tabelle dal mio laptop alla mia workstation.

Si fa così (nel mio caso):

mysqldump -uroot -p your_base > dump_file.sql

Successivamente, creiamo un database nel nuovo database e ripristiniamo il backup sulla “nuova” macchina.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Il file di backup deve essere posizionato sulla nuova macchina e, forse, se non nella directory con l'utilità, quindi nel percorso completo. (Ho appena caricato il backup su GitHub e l'ho clonato su una nuova macchina). Aggiungerei come vengono create le tabelle stesse, ma non ho salvato gli screenshot e penso che non sia difficile nemmeno per uno studente di 2-3 anni.

Una volta ripristinate tutte le tabelle, è il momento di rendere disponibile l'accesso remoto al database. In generale, tali comandi non hanno portato al successo (davano solo il permesso di lettura per selezionare)

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

Più precisamente potrei collegarmi al database solo con il comando,

mysql -h localhost -u client -pclient

ma questo non poteva più farlo

mysql -h 192.168.0.3 -u client -pclient

Questo non ha funzionato per me e non sono riuscito a connettermi tramite questo indirizzo come root.

Il programma mysql workbench ha aiutato; nelle impostazioni, cambia localhost in% e funziona, anche se il client non ha aiutato. Ora puoi connetterti al database dalla console o dal codice da qualsiasi indirizzo.

Rendere il database disponibile per la connessione remota

È inoltre necessario creare una rete domestica o aziendale e disattivare il firewall di Windows, altrimenti non sarai nemmeno in grado di eseguire il ping di questa macchina (per non parlare di connettersi al database).

Metà del lavoro è fatto, ora devo potermi connettere al database da casa.

Come puoi vedere dallo schema di rete, per accedere ad Internet devi passare da 192.168.0.3 a 192.168.1.1 (router), andiamo nella direzione opposta. Configuriamo il percorso da 192.168.1.1 a 192.168.1.2 in questo modo:

Rendere il database disponibile per la connessione remota

In generale, l'immagine non si vede, quindi lo scriverò a mano:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Questo può essere fatto solo in una sottorete, cioè non è possibile inoltrare immediatamente all'indirizzo 192.168.0.2 o 192.168.0.3

Ciò è necessario affinché il router sappia dove si trova la sottorete 192.168.0.0/24 (è utile apprendere le basi delle reti).

Ora aggiungiamo il port forwarding 3306 (la porta mysql predefinita (se non l'hai modificata durante l'installazione)) all'indirizzo 192.168.1.2

Rendere il database disponibile per la connessione remota

La cosa più difficile da fare è eseguire l'inoltro su una macchina Linux (ha due schede di rete 192.168.1.2 (interfaccia enp3s1) e 192.168.0.2 (interfaccia enp3s0) in modo che le schede di rete sappiano cosa trasferirle da 192.168.1.2 a 192.168.0.2 e poi alla nostra macchina 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

Quelli. La prima riga significa che accettiamo la prima connessione, la 1a e la 2a che possiamo inviare pacchetti in entrambe le direzioni, la 3a e la 4a significano cambiare gli indirizzi di destinazione e di origine. E voilà, puoi connetterti da casa tramite mysql. E infine, il mio codice C++ che fa questo:

//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;
};

Ora puoi inviare in sicurezza questo programma a chiunque e non devi riscriverlo per farlo funzionare localmente.

Fonte: habr.com

Aggiungi un commento