Sprístupnenie databázy pre vzdialené pripojenie

Začnime tým, že sú chvíle, keď potrebujete vytvoriť aplikáciu s databázovým pripojením. Robí sa to preto, aby sme sa príliš neponárali do vývoja back-endu a sústredili sa na front-end kvôli nedostatku rúk a zručností. Nebudem tvrdiť, že moje riešenie bude bezpečné, ale funguje.

Keďže nerád platím za hosting, sieť som využíval v práci, je tam biela IP. Tu je jeho štruktúra:

Sprístupnenie databázy pre vzdialené pripojenie

Mám prístup k viacerým počítačom, presnejšie na 192.168.1.2 (alias 192.168.0.2) je tam Linux a 192.168.0.3 s Windows. Vo všeobecnosti som si pre svoju aplikáciu vybral mysql a pozrel som sa, čo je na Linuxe. Už to tam bolo nainštalované, ale nikto nevie heslo a kto vedel, zabudol (tí, čo pracovali predo mnou). Po tom, čo som sa dozvedel, že ho nikto nepotrebuje, som ho vymazal a skúsil znova nainštalovať. Nebolo dostatok pamäte a keďže na opravu tejto chyby by som k nej musel pripojiť monitor a klávesnicu s myšou, rozhodol som sa s týmto podnikaním skončiť. Navyše, stroj so systémom Windows je oveľa výkonnejší a navyše ho sám mám doma na notebooku. V zásade nebudem popisovať samotnú inštaláciu, existuje o nej množstvo návodov a videí. Po nainštalovaní mysql na počítač so systémom Windows som sa rozhodol zálohovať tabuľky z prenosného počítača na pracovnú stanicu.

Robí sa to takto (v mojom prípade):

mysqldump -uroot -p your_base > dump_file.sql

Ďalej vytvoríme databázu v novej databáze a obnovíme zálohu na „novom“ počítači.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Súbor so zálohou musí byť umiestnený na novom počítači a ak nie je v adresári s obslužným programom, potom je možná úplná cesta k nemu. (Práve som nahral zálohu na github a naklonoval som ju do nového počítača). Doplnil by som, ako sa vytvárajú samotné tabuľky, ale neuložil som si snímky obrazovky a myslím, že to nie je ťažké ani pre 2-3 ročného študenta.

Keď som obnovil všetky tabuľky, je čas sprístupniť vzdialený prístup k databáze. Vo všeobecnosti takéto príkazy neviedli k úspechu (vzhľadom na výber iba práva na čítanie)

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

Presnejšie povedané, mohol som sa pripojiť k databáze iba príkazom,

mysql -h localhost -u client -pclient

a tento nemohol

mysql -h 192.168.0.3 -u client -pclient

Nevyhovovalo mi to, tiež som sa nevedel pripojiť cez túto adresu ako root.

Pomohol program mysql workbench, tam v nastaveniach zmenis localhost na% a ide to, hoci klient nepomohol. Teraz sa môžete pripojiť k databáze z konzoly alebo z kódu z ľubovoľnej adresy.

Sprístupnenie databázy pre vzdialené pripojenie

Musíte tiež vytvoriť domácu alebo podnikovú sieť a vypnúť bránu firewall systému Windows, inak nebudete môcť tento počítač ani pingnúť (nie že sa pripojí k databáze).

Polovica práce je hotová, potom sa potrebujem vedieť pripojiť k databáze z domu.

Ako môžete vidieť zo sieťového diagramu, musíte prejsť na internet z 192.168.0.3 na 192.168.1.1 (smerovač), poďme opačným smerom. Nastavme trasu z 192.168.1.1 na 192.168.1.2 takto:

Sprístupnenie databázy pre vzdialené pripojenie

Vo všeobecnosti sa obrázok nezobrazuje - napíšem rukami:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Dá sa to urobiť iba v jednej podsieti, to znamená, že nemôžete okamžite presmerovať na adresu 192.168.0.2 alebo 192.168.0.3

Je to potrebné, aby smerovač vedel, kde sa nachádza podsieť 192.168.0.0/24 (užitočné je naučiť sa základy sietí).

Teraz pridáme port forwarding 3306 (predvolene mysql port (ak ste ho nezmenili počas inštalácie)) na adresu 192.168.1.2

Sprístupnenie databázy pre vzdialené pripojenie

Teraz je najťažšie urobiť presmerovanie na počítači so systémom Linux (má dve sieťové karty 192.168.1.2 (rozhranie enp3s1) a 192.168.0.2 (rozhranie enp3s0), aby sieťové karty vedeli, čo majú preniesť z 192.168.1.2 na 192.168.0.2 a potom na náš počítač so systémom Windows s 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

Tie. 1. riadok znamená, že akceptujeme prvé spojenie, 2. a 3. že je možné posielať pakety oboma smermi, 4. a 5. znamená nahradenie cieľovej a zdrojovej adresy. A voila, môžete sa pripojiť z domu cez mysql. A nakoniec môj kód C++, ktorý robí toto:

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

Teraz môžete tento program bezpečne vyhodiť komukoľvek a nemusíte ho prepisovať, aby fungoval lokálne.

Zdroj: hab.com

Pridať komentár