Teeme andmebaasi kaugühenduse kergesti kättesaadavaks

Alustame sellest, et on juhtumeid, kus on vaja luua rakendus andmebaasiühendusega. Seda tehakse selleks, et mitte süveneda tagaküljearendusse ja keskenduda esiküljele, kuna oskused ja käed on piiratud. Ma ei otsusta öelda, et minu lahendus on turvaline, kuid see töötab.

Kuna ma ei armasta maksta hostimine, kasutasin oma töökohal olevat võrku, kus on avalik IP. Siin on selle struktuur:

Teeme andmebaasi kaugühenduse kergesti kättesaadavaks

Mul on juurdepääs mitmele arvutile, täpsemalt 192.168.1.2 (samuti 192.168.0.2), kus on Linux, ja 192.168.0.3, kus on Windows. Üldiselt valisin oma rakenduse jaoks mysql'i ja vaatasin, mis Linuxis on. Seal oli see juba installitud, kuid keegi ei teadnud parooli, ja need, kes teadsid, olid unustanud (need, kes töötasid enne mind). Saades teada, et see ei ole kellelegi vajalik, kustutasin selle ja proovisin uuesti installida. Mälust ei piisanud ja kuna selle vea parandamiseks oleks pidanud ühendama monitori ja klaviatuuri hiirega, otsustasin selle asja lõpetada. Plus, Windowsiga masin on palju võimsam ja mul on endal see kodus sülearvutis. Põhimõtteliselt ei hakka ma installimist kirjelda, selle kohta on palju manuaale ja videosid. Pärast mysql'i installimist Windowsi masinasse otsustasin teha varukoopia tabelitest sülearvutist tööjaama.

See toimub nii (minu juhul):

mysqldump -uroot -p your_base > dump_file.sql

Seejärel loome uue andmebaasi ja taastame varukoopia "uus" masin.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Varufail tuleb uuele masinale üles laadida ja kui see ei ole utiliidi kataloogis, siis täispikk tee sellele. (Ma lihtsalt laadisin varukoopia GitHubi ja kloonisin selle uuele masinale). Lisaks mainiksin, kuidas tabelid luuakse, kuid ma ei salvestanud ekraanipilte ning arvan, et see ei ole isegi 2-3 kursuse üliõpilase jaoks keeruline.

Kui kõik tabelid olid taastatud, oli aeg teha andmebaas kaugühendusele kergesti kättesaadavaks. Üldiselt ei toonud sellised käsud edu (ainult andmete lugemise õiguse (select) andmine)

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

Täpsemalt sain andmebaasi ühendada ainult käsuga,

mysql -h localhost -u client -pclient

kuid nii ei saanud ma enam ühendust

mysql -h 192.168.0.3 -u client -pclient

see ei sobinud mulle ja samuti ei saanud ma root'i kaudu ühendust.

Mysql Workbench aitas andmed, muutes localhost % -ks ja see töötab, kuigi klient ei aidanud. Nüüd saate ühendada andmebaasi konsoolist või koodist mistahes aadressilt.

Teeme andmebaasi kaugühenduse kergesti kättesaadavaks

Samuti tuleb luua kodu- või ettevõttevõrk ja keelata Windowsi tulemüür, vastasel juhul ei saa isegi seda masinat pingida (kui juba ei suuda andmebaasi ühendada).

Pool tööd on tehtud, nüüd on vaja, et ma saaksin kodust andmebaasiga ühendust saada.

Nagu näha võrgu skeemist, tuleb internetti pääsemiseks läbida tee 192.168.0.3-st 192.168.1.1 (ruuter) tagasi. Seadistame marsruudi 192.168.1.1-st 192.168.1.2-ni selliselt:

Teeme andmebaasi kaugühenduse kergesti kättesaadavaks

Kokkuvõttes, pilt ei näita — kirjutan käsitsi:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Seda saab teha ainult ühes alamvõrgus, seega ei saa korraga suunata aadressile 192.168.0.2 või 192.168.0.3.

See on vajalik, et ruuter teaks, kus asub alamvõrk 192.168.0.0/24 (õppige võrgu aluseid, see on kasulik).

Nüüd lisame portide suunamise 3306 (mysql default port (kui te seda installimisel ei muutnud)) aadressile 192.168.1.2.

Teeme andmebaasi kaugühenduse kergesti kättesaadavaks

Jäänud on viimase asja tegemine, see on suunamine Linuxi masinas (seal on kaks võrkaart 192.168.1.2 (liides enp3s1) ja 192.168.0.2 (liides enp3s0)), et võrkaart teadlikud, et suunata andmed aadressilt 192.168.1.2 aadressile 192.168.0.2 ja seejärel meie Windowsi masinale koos MySql-iga.

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
ja viimane rida salvestab sisestatud käsklused nii, et need ei kaoks operatsioonisüsteemi taaskäivitamisel.
sudo service iptables-persistent save

Seega esimene rida tähendab, et me võtame vastu esimese ühenduse, teine ja kolmas, et pakette võib suunata mõlemat pidi, neljas ja viies, et vahetada sihtaadressi ja allikaaadressi. Ja voilà, nüüd saab kodust mysql kaudu ühendust võtta. Ja lõpuks, minu c++ kood, mis selle teeb:

//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); //Если используется оконное приложение
	}
	// Подключаемся к serveri
	if (!mysql_real_connect(conn, "192.168.0.3", "root", "password", "your_base", NULL, NULL, 0))
	{
		// Kui ühendust ei saa luua serverilt 
		// базы данных выводим сообщение об ошибке
		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;
};

Nüüd võib julgelt seda programmi kellelegi edasi saata ja pole vaja selleks kohandada, et see lokaalsetes tingimustes töötaks.

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster