Gör databasen tillgänglig för fjärranslutningar

Låt oss börja med att det finns tillfällen då det är nödvändigt att göra en applikation som ansluter till en databas. Detta görs för att inte behöva gräva ner sig i backendutveckling och istället fokusera på frontend på grund av brist på resurser och färdigheter. Jag påstår inte att min lösning kommer att vara säker, men den fungerar.

Eftersom jag inte gillar att betala för hosting, använde jag nätverket på mitt jobb, där det finns en offentlig IP. Här är dess struktur:

Gör databasen tillgänglig för fjärranslutningar

Jag har tillgång till flera datorer, närmare bestämt till 192.168.1.2 (också 192.168.0.2) som har Linux och till 192.168.0.3 med Windows. För min applikation valde jag mysql och tittade på vad som fanns på Linux. Det var redan installerat där, men ingen kände till lösenordet, och de som visste hade glömt det (de som jobbade innan mig). När jag insåg att den inte behövdes av någon, tog jag bort den och försökte installera om den. Minne var en bristvara och eftersom jag skulle behöva ansluta en skärm och tangentbord med mus för att åtgärda det, bestämde jag mig för att ge upp. Dessutom är maskinen med Windows mycket kraftfullare och dessutom har jag den själv på min stationära laptop. Jag kommer inte att beskriva själva installationen, det finns massor av manualer och videor om detta. Efter att ha installerat mysql på Windows-maskinen beslutade jag mig för att göra en backup av tabellerna från min laptop till arbetsstationen.

Det görs så här (i mitt fall):

mysqldump -uroot -p your_base > dump_file.sql

Därefter skapar vi en databas i den nya databasen och återställer backupen på den "nya" maskinen.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Backup-filen måste läggas på den nya maskinen och eventuellt, om den inte ligger i mappen med verktyget, så bör den fullständiga sökvägen anges. (Jag laddade bara upp backupen på GitHub och klonade den på den nya maskinen). Jag skulle ha lagt till hur tabellerna själva skapas, men jag sparade inte skärmdumpar och jag tror inte att det är svårt ens för en student i 2-3 årskursen.

När jag hade återställt alla tabeller var det dags att göra databasen tillgänglig för fjärråtkomst. Dessa kommandon ledde överlag inte till framgång (de gav bara rätt till läsning med select)

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

Jag kunde endast ansluta till databasen med kommandot,

mysql -h localhost -u client -pclient

men jag kunde inte använda detta

mysql -h 192.168.0.3 -u client -pclient

det passade mig inte heller och jag kunde inte ansluta via den adressen och som root.

Programmet mysql workbench hjälpte, där ändrar du localhost till % i inställningarna så fungerar det, även om det inte hjälpte klienten. Nu kan du ansluta till databasen från konsolen eller från koden från vilken adress som helst.

Gör databasen tillgänglig för fjärranslutningar

Du behöver också skapa ett privat nätverk eller företagsnätverk och stänga av Windows-brandväggen, annars kan du inte ens pinga den här maskinen (än mindre ansluta till databasen).

Halva jobbet är gjort, nu behöver jag kunna ansluta till databasen hemifrån.

Som man kan se från nätverksschemat, så måste man gå från 192.168.0.3 till 192.168.1.1 (routern) för att nå internet. Vi gör det i omvänd riktning. Vi konfigurerar en väg från 192.168.1.1 till 192.168.1.2 på följande sätt:

Gör databasen tillgänglig för fjärranslutningar

I allmänhet visar bilden inte — jag skriver det för hand:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Detta kan göras endast inom ett och samma subnet, det vill säga man kan inte direkt vidarebefordra till adress 192.168.0.2 eller 192.168.0.3.

Detta är nödvändigt så att routern vet var subnetet 192.168.0.0/24 ligger (lär dig grunderna i nätverk, det är användbart).

Nu lägger vi till vidarebefordran av port 3306 (standardport för mysql (om du inte har ändrat den vid installationen)) till adress 192.168.1.2.

Gör databasen tillgänglig för fjärranslutningar

Kvar finns den svåraste delen, att göra vidarebefordran på Linux-maskinen (den har två nätverkskort 192.168.1.2 (gränssnitt enp3s1) och 192.168.0.2(gränssnitt enp3s0)) så att nätverkskortena vet att de ska skicka paket från 192.168.1.2 till 192.168.0.2 och sedan vidare till vår Windows-maskin med 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
och den sista raden sparar de inmatade kommandona så att de inte raderas vid omstart av operativsystemet
sudo service iptables-persistent save

Det vill säga, den första raden betyder att vi accepterar den första anslutningen, den andra och tredje att vi kan släppa paket åt båda håll, den fjärde och femte innebär ersättningen av destinations- och källadressen. Och voila, man kan ansluta hemifrån via mysql. Och sist men inte minst, min kod i c++ som gör detta:

//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); //Если используется оконное приложение
	}
	// Подключаемся к servern
	if (!mysql_real_connect(conn, "192.168.0.3", "root", "password", "your_base", NULL, NULL, 0))
	{
		// Om det inte går att upprätta en anslutning till servern 
		// базы данных выводим сообщение об ошибке
		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 kan jag fritt dela detta program med vem som helst, och det behöver inte skrivas om för att fungera lokalt.

Källa: habr.com

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster