Rendiamo il database accessibile per la connessione remota

Iniziamo col dire che ci sono casi in cui è necessario sviluppare un'applicazione con collegamento a un database. Questo viene fatto per non dover lavorare troppo sullo sviluppo del backend e concentrarsi sul frontend a causa della mancanza di risorse e competenze. Non pretendo di dire che la mia soluzione sarà sicura, ma funziona.

Poiché non mi piace pagare per hosting, ho utilizzato la rete del mio lavoro, dove c'è un IP pubblico. Ecco la sua struttura:

Rendiamo il database accessibile per la connessione remota

Ho accesso a diversi computer, più precisamente a 192.168.1.2 (che è anche 192.168.0.2) dove è installato Linux e a 192.168.0.3 con Windows. Fondamentalmente, per la mia applicazione ho scelto mysql e ho controllato cosa c'era su Linux. Era già installato, ma nessuno conosceva la password, e coloro che la sapevano l'avevano dimenticata (quelli che hanno lavorato prima di me). Sapendo che non serviva a nessuno, l'ho disinstallato e ho provato a reinstallarlo. La memoria non bastava e poiché per correggere questo problema avrei dovuto collegare un monitor e una tastiera con mouse, ho deciso di abbandonare l'idea. Inoltre, la macchina con Windows è molto più potente e per di più ce l'ho anche sul mio portatile domestico. Fondamentalmente non descriverò l'installazione, ci sono un sacco di manuali e video su questo. Dopo aver installato mysql sulla macchina Windows, ho deciso di fare un backup delle tabelle dal portatile alla workstation.

Si fa così (nel mio caso):

mysqldump -uroot -p your_base > dump_file.sql

Poi, nella nuova base di dati creiamo un 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 copiato sulla nuova macchina e, se non si trova nella directory dell'utilità, è possibile che serva il percorso completo. (Io ho semplicemente caricato il backup su GitHub e l'ho clonata sulla nuova macchina). Avrei aggiunto come si creano le stesse tabelle, ma non ho salvato gli screenshot, e penso che non sia complicato anche per uno studente del secondo o terzo anno.

Quando ho ripristinato tutte le tabelle, è arrivato il momento di rendere accessibile l'accesso remoto al database. Fondamentalmente, tali comandi non hanno portato successo (hanno dato solo il diritto di lettura select)

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

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

mysql -h localhost -u client -pclient

ma in questo modo non potevo

mysql -h 192.168.0.3 -u client -pclient

questo non andava bene, non riuscivo nemmeno a collegarmi tramite questo indirizzo e nemmeno da root.

Il programma mysql workbench mi ha aiutato, basta cambiare localhost con % nelle impostazioni e funziona, anche se il client non ha aiutato. Ora puoi connetterti al db dalla console o dal codice da qualsiasi indirizzo.

Rendiamo il database accessibile per la connessione remota

È necessario creare una rete domestica o aziendale e disattivare il firewall di Windows, altrimenti non riuscirai nemmeno a fare ping a questa macchina (figurati a connetterti al db).

Un passo è stato fatto, ora devo poter connettermi al database da casa.

Come si può vedere dallo schema di rete, per arrivare a Internet bisogna percorrere il tragitto da 192.168.0.3 a 192.168.1.1 (router) e andiamo all'incontrario. Configureremo il percorso da 192.168.1.1 a 192.168.1.2 in questo modo:

Rendiamo il database accessibile per la connessione remota

In generale, non mostra l'immagine — 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, quindi non si può riprodurre direttamente all'indirizzo 192.168.0.2 o 192.168.0.3

Questo è necessario affinché il router sappia dove si trova la sottorete 192.168.0.0/24 (impara le basi delle reti, è utile).

Ora aggiungiamo l'inoltro della porta 3306 (porta mysql per default (a meno che non l'abbiate cambiata durante l'installazione)) all'indirizzo 192.168.1.2

Rendiamo il database accessibile per la connessione remota

Restano da fare le operazioni più difficili, cioè fare l'inoltro su una macchina Linux (che 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 di rinviare il traffico da 192.168.1.2 a 192.168.0.2, e poi sulla 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
l'ultima riga salva i comandi inseriti affinché non vengano cancellati al riavvio del sistema operativo
sudo service iptables-persistent save

Cioè, la prima riga significa che accettiamo la prima connessione, la seconda e la terza che possiamo inviare pacchetti in entrambe le direzioni, la quarta e la quinta significa la sostituzione dell'indirizzo di destinazione e sorgente. E voilà, puoi connetterti da casa tramite mysql. E infine, il mio codice in 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); //Если используется оконное приложение
	}
	// Подключаемся к server
	if (!mysql_real_connect(conn, "192.168.0.3", "root", "password", "your_base", NULL, NULL, 0))
	{
		// Se non è possibile stabilire una connessione con server 
		// базы данных выводим сообщение об ошибке
		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 tranquillamente inviare questo programma a chiunque, e non è necessario modificarlo affinché funzioni in locale.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster