De database beschikbaar maken voor verbinding op afstand

Laten we beginnen met het feit dat er gevallen zijn waarin u een applicatie moet maken met een verbinding met een database. Dit wordt gedaan om niet te veel in de backend-ontwikkeling te duiken en zich te concentreren op de frontend vanwege een gebrek aan handen en vaardigheden. Ik kan niet zeggen dat mijn oplossing veilig zal zijn, maar het werkt.

Omdat ik niet graag voor hosting betaal, heb ik het netwerk op mijn werk gebruikt, daar staat een wit IP-adres. Hier is de structuur:

De database beschikbaar maken voor verbinding op afstand

Ik heb toegang tot verschillende computers, meer bepaald 192.168.1.2 (ook wel 192.168.0.2 genoemd) met Linux daar geïnstalleerd en 192.168.0.3 met Windows. Over het algemeen koos ik mysql voor mijn applicatie en keek ik naar wat er beschikbaar was op Linux. Het was daar al geïnstalleerd, maar niemand kent het wachtwoord, en degenen die het wisten zijn het vergeten (degenen die vóór mij werkten). Toen ik erachter kwam dat niemand het nodig had, heb ik het verwijderd en geprobeerd het opnieuw te installeren. Er was niet genoeg geheugen, en aangezien ik om deze fout te verhelpen een monitor en toetsenbord met een muis erop zou moeten aansluiten, besloot ik deze kwestie op te geven. Bovendien is de machine met Windows veel krachtiger en bovendien heb ik hem thuis op mijn laptop staan. De installatie zelf zal ik in principe niet beschrijven; er zijn veel handleidingen en video's over. Nadat ik mysql op een Windows-machine had geïnstalleerd, besloot ik een back-up van de tabellen van mijn laptop naar mijn werkstation te maken.

Het gaat als volgt (in mijn geval):

mysqldump -uroot -p your_base > dump_file.sql

Vervolgens maken we een database aan in de nieuwe database en herstellen we de back-up op de “nieuwe” machine.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Het back-upbestand moet op de nieuwe machine worden geplaatst en, indien niet in de map met het hulpprogramma, dan het volledige pad ernaartoe. (Ik heb zojuist de back-up naar GitHub geüpload en naar een nieuwe machine gekloond). Ik zou willen toevoegen hoe de tabellen zelf zijn gemaakt, maar ik heb de schermafbeeldingen niet opgeslagen, en ik denk dat het zelfs voor een 2-3-jarige student niet moeilijk is.

Wanneer alle tabellen zijn hersteld, is het tijd om externe toegang tot de database beschikbaar te maken. Over het algemeen leidden dergelijke opdrachten niet tot succes (het gaf alleen leesrechten om te selecteren)

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

Om precies te zijn, ik kon alleen verbinding maken met de database met het commando:

mysql -h localhost -u client -pclient

maar deze kon het niet meer

mysql -h 192.168.0.3 -u client -pclient

Dit werkte niet voor mij en ik kon via dit adres geen verbinding maken als root.

Het mysql workbench-programma hielp; verander in de instellingen localhost in % en het werkt, hoewel de client niet hielp. Nu kunt u vanaf de console of via code vanaf elk adres verbinding maken met de database.

De database beschikbaar maken voor verbinding op afstand

U moet ook een thuis- of bedrijfsnetwerk maken en de Windows-firewall uitschakelen, anders kunt u deze machine niet eens pingen (laat staan ​​verbinding maken met de database).

De helft van het werk is gedaan, nu moet ik vanuit huis verbinding kunnen maken met de database.

Zoals je kunt zien in het netwerkdiagram, moet je om toegang te krijgen tot internet van 192.168.0.3 naar 192.168.1.1 (router) gaan, laten we in de tegenovergestelde richting gaan. Laten we de route van 192.168.1.1 naar 192.168.1.2 als volgt configureren:

De database beschikbaar maken voor verbinding op afstand

Over het algemeen is de afbeelding niet zichtbaar, dus ik zal het met de hand schrijven:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Dit kan maar in één subnet, dat wil zeggen dat je niet meteen kunt doorsturen naar het adres 192.168.0.2 of 192.168.0.3

Dit is nodig zodat de router weet waar het subnet 192.168.0.0/24 zich bevindt (het leren van de basisprincipes van netwerken is handig).

Nu voegen we port forwarding 3306 (de standaard mysql-poort (als je deze tijdens de installatie niet hebt gewijzigd)) toe aan het adres 192.168.1.2

De database beschikbaar maken voor verbinding op afstand

Het moeilijkste wat je nog moet doen is het doorsturen op een Linux-machine (deze heeft twee netwerkkaarten 192.168.1.2 (enp3s1-interface) en 192.168.0.2 (enp3s0-interface), zodat de netwerkkaarten weten wat ze moeten overbrengen van 192.168.1.2 naar 192.168.0.2 en vervolgens naar onze Windows-machine met 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

Die. De 1e regel betekent dat we de eerste verbinding accepteren, de 2e en 3e dat we pakketten in beide richtingen kunnen verzenden, de 4e en 5e betekent dat de bestemmings- en bronadressen worden gewijzigd. En voila, je kunt vanuit huis verbinding maken via mysql. En tot slot, mijn C++-code die dit doet:

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

Nu kunt u dit programma veilig naar iedereen sturen en hoeft u het niet te herschrijven om het lokaal te laten werken.

Bron: www.habr.com

Voeg een reactie