Padaryti duomenų bazę prieinamą nuotoliniam ryšiui

Pradėkime nuo to, kad yra atvejų, kai reikia sukurti programą su ryšiu su duomenų baze. Tai daroma siekiant per daug nesigilinti į backend kūrimą ir susikoncentruoti ties frontend dėl rankų ir įgūdžių stokos. Negaliu pasakyti, kad mano sprendimas bus saugus, bet jis veikia.

Kadangi nemėgstu mokėti už hostingą, darbe naudojau tinklą, ten baltas IP. Štai jo struktūra:

Padaryti duomenų bazę prieinamą nuotoliniam ryšiui

Turiu prieigą prie kelių kompiuterių, tiksliau 192.168.1.2 (aka 192.168.0.2) su ten įdiegta Linux ir 192.168.0.3 su Windows. Apskritai savo programai pasirinkau mysql ir pažiūrėjau, kas yra Linux sistemoje. Ten jau buvo įdiegta, bet slaptažodžio niekas nežino, o kas žinojo, pamiršo (kas dirbo iki manęs). Sužinojęs, kad jo niekam nereikia, ištryniau ir bandžiau įdiegti dar kartą. Nepakako atminties, o kadangi norint ištaisyti šią klaidą tektų prie jos prijungti monitorių ir klaviatūrą su pele, nusprendžiau šio reikalo atsisakyti. Be to, aparatas su „Windows“ yra daug galingesnis ir plius, aš jį turiu savo nešiojamajame kompiuteryje. Iš principo neaprašysiu paties diegimo, yra daug vadovų ir vaizdo įrašų apie tai. Įdiegęs mysql „Windows“ kompiuteryje, nusprendžiau sukurti atsargines lentelių kopijas iš nešiojamojo kompiuterio į savo darbo vietą.

Tai daroma taip (mano atveju):

mysqldump -uroot -p your_base > dump_file.sql

Tada sukuriame duomenų bazę naujoje duomenų bazėje ir atkuriame atsarginę kopiją „naujame“ kompiuteryje.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Atsarginės kopijos failas turi būti patalpintas naujame kompiuteryje ir, galbūt, jei ne kataloge su programa, tada visas kelias į jį. (Aš ką tik įkėliau atsarginę kopiją į „GitHub“ ir klonavau ją į naują įrenginį). Pridurčiau, kaip kuriamos pačios lentelės, bet ekrano kopijų neišsaugojau, ir manau, kad tai nėra sunku net 2-3 metų studentui.

Kai visos lentelės bus atkurtos, laikas padaryti nuotolinę prieigą prie duomenų bazės. Apskritai tokios komandos nepasiekė sėkmės (suteikė tik skaitymo leidimą pasirinkti)

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

Tiksliau, prie duomenų bazės galėjau prisijungti tik su komanda,

mysql -h localhost -u client -pclient

bet šis to nebegalėjo

mysql -h 192.168.0.3 -u client -pclient

Tai man neveikė ir negalėjau prisijungti per šį adresą kaip root.

Padėjo mysql workbench programa, nustatymuose pakeiti localhost į % ir veikia, nors klientas nepadėjo. Dabar galite prisijungti prie duomenų bazės iš konsolės arba naudodami kodą iš bet kurio adreso.

Padaryti duomenų bazę prieinamą nuotoliniam ryšiui

Taip pat reikia susikurti namų ar verslo tinklą ir išjungti Windows užkardą, antraip net negalėsite pinguoti šio įrenginio (jau nekalbant apie prisijungimą prie duomenų bazės).

Pusė darbo atlikta, dabar turiu turėti galimybę prisijungti prie duomenų bazės iš namų.

Kaip matote iš tinklo schemos, norint patekti į internetą, reikia pereiti nuo 192.168.0.3 iki 192.168.1.1 (maršrutizatorius), eikime priešinga kryptimi. Sukonfigūruokime maršrutą nuo 192.168.1.1 iki 192.168.1.2 taip:

Padaryti duomenų bazę prieinamą nuotoliniam ryšiui

Apskritai paveikslėlis nerodomas, todėl parašysiu ranka:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Tai galima padaryti tik viename potinklyje, ty negalite iš karto persiųsti adresu 192.168.0.2 arba 192.168.0.3

Tai būtina, kad maršrutizatorius žinotų, kur yra 192.168.0.0/24 potinklis (pramoka išmokti tinklų pagrindus).

Dabar prie adreso 3306 pridedame prievado persiuntimą 192.168.1.2 (numatytasis mysql prievadas (jei jo nepakeitėte diegdami)

Padaryti duomenų bazę prieinamą nuotoliniam ryšiui

Sunkiausias dalykas, kurį belieka padaryti, yra atlikti persiuntimą Linux kompiuteryje (turi dvi tinklo plokštes 192.168.1.2 (enp3s1 sąsaja) ir 192.168.0.2 (enp3s0 sąsaja), kad tinklo plokštės žinotų, ką jas perkelti iš 192.168.1.2. į 192.168.0.2, o tada į mūsų Windows įrenginį su 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-oji eilutė reiškia, kad priimame pirmąjį ryšį, 2-oji ir 3-oji, kad galime siųsti paketus abiem kryptimis, 4-oji ir 5-oji reiškia paskirties ir šaltinio adresų keitimą. Ir voila, galite prisijungti iš namų per mysql. Ir galiausiai, mano C++ kodas, kuris tai daro:

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

Dabar galite saugiai siųsti šią programą bet kam ir jums nereikia jos perrašyti, kad ji veiktų vietoje.

Šaltinis: www.habr.com

Добавить комментарий