Які робіцца даступнай базу дадзеных для выдаленага падлучэння

Пачнём з таго што бываюць выпадкі, калі трэба рабіць прыкладанне з падлучэннем да базы дадзеных. Гэта робіцца для таго каб асоба не капацца ў бэкэнд распрацоўцы і сканцэнтравацца на франдэндзе з-за недахопу рук і навыкаў. Я не бяруся казаць, што маё рашэнне будзе бяспечным, але яно працуе.

Паколькі я не люблю плаціць за хостынг, я скарыстаўся сеткай на сваёй працы, там ёсьць белы IP. Вось яе структура:

Які робіцца даступнай базу дадзеных для выдаленага падлучэння

У мяне маецца доступ да некалькіх кампутараў дакладней да 192.168.1.2 (ён жа 192.168.0.2) тамака варта Linux і да 192.168.0.3 з Windows. Увогуле, для свайго прыкладання я абраў mysql і паглядзеў што ёсць на Linux. Там ужо быў усталяваны ён, але пароль ніхто не ведае, а тыя хто ведалі забыліся (тыя, хто працаваў да мяне). Даведаўшыся што ён нікому не патрэбен, я яго выдаліў і паспрабаваў усталяваць нанова. Памяць не хапала і паколькі каб выправіць гэтую памылку прыйшлося б падключаць да яго манітор і клавіятуру з мышшу, я вырашыў кінуць гэтую справу. Тым больш што машына з Windows куды магутней і плюс да ўсяго ў мяне ў самога варта яна на наўтбуку хатнім. У прынцыпе саму ўстаноўку я апісваць не буду, ёсць куча мануалаў і відэа пра гэта. Усталяваўшы mysql на Windows машыну, я вырашыў зрабіць бэкап табліц з наўтбука на працоўную станцыю.

Робіцца гэта так (у маім выпадку):

mysqldump -uroot -p your_base > dump_file.sql

Далей у новай базе дадзеных ствараем базу дадзеных і аднаўляем бэкап на новай машыне.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Файл з бэкапам трэба на новую машыну пакласці і магчыма калі не ў дырэкторыі з утылітай то поўны шлях да яе. (Я проста заліў бэкап на гітхаб і кланаваў яго на новую машыну). Я б дадаў як ствараюцца самі табліцы, але не захаваў скрыны, ды і думаю гэта не складана нават студэнту 2-3 курса.

Калі аднавіў усе табліцы, прыйшоў час зрабіць даступным выдалены доступ да БД. Увогуле, такія каманды да поспеху не прывялі (выдаў толькі права на чытанне select)

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

Дакладней я мог падключыцца да базы толькі камандай,

mysql -h localhost -u client -pclient

а такі ўжо не мог

mysql -h 192.168.0.3 -u client -pclient

мне гэта не падыходзіла таксама не мог далучыцца праз гэты адрас і ад root.

Дапамагла праграма mysql workbench тамака ў наладах змяняеце localhost на % і працуе, хоць client гэта не дапамагло. Цяпер вы можаце падлучацца да бд з кансолі ці з кода з любога адрасу.

Які робіцца даступнай базу дадзеных для выдаленага падлучэння

Яшчэ трэба зрабіць сетку хатняй або прадпрыемствы і выключыць брандмаўэр Windows інакш не зможаце нават зрабіць пінг гэтай машыны(не тое каб падлучыцца да бд).

Падлога справы зроблена, далей трэба каб я мог з дому падключыцца да базы дадзеных.

Як відаць са схемы сеткі, то да інтэрнэту трэба прайсці шлях ад 192.168.0.3 да 192.168.1.1 (роўтэр) пойдзем у зваротны бок. Настроім маршрут ад 192.168.1.1 да 192.168.1.2 вось такім чынам:

Які робіцца даступнай базу дадзеных для выдаленага падлучэння

Увогуле, карцінку не паказвае - напішу рукамі:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Гэта можна зрабіць толькі ў адной падсеткі гэта значыць нельга адразу пракінуць на адрас 192.168.0.2 ці 192.168.0.3

Гэта трэба каб роўтэр ведаў дзе знаходзіцца падсетку 192.168.0.0/24 (вучыце асновы сетак гэта карысна).

Цяпер дадаем пракід порта 3306 (порт mysql па дэфолце (калі вы яго пры ўсталёўцы толькі не памянялі)) на адрас 192.168.1.2

Які робіцца даступнай базу дадзеных для выдаленага падлучэння

Вось засталося зрабіць самае складанае гэта зрабіць форвардынг на лінукс машыне (на ёй дзве сеткавыя карткі 192.168.1.2 (інтэрфейс enp3s1) і 192.168.0.2 (інтэрфейс enp3s0) каб сецявухі ведалі што перакінуць іх з 192.168.1.2. нашу Windows машыну з 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

Г.зн. 1я радок значыць што мы прымаем першае злучэнне, 2я і 3я што можна ў абодва бакі пускаць пакеты, 4я і 5я значыць замену адрасу прызначэння і крыніцы. І вуаля можна канэкціцца з дому праз mysql. І напрыканцы мой код на з, які гэта робіць:

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

Цяпер можна смела скідваць гэтую праграму каму заўгодна, і не трэба перапісваць каб яна працавала лакальна.

Крыніца: habr.com

Дадаць каментар