Омогућавање базе података за даљинско повезивање

Почнимо са чињеницом да постоје случајеви када треба да направите апликацију са везом на базу података. Ово је учињено како се не би превише упуштали у развој бацкенд-а и концентрисали се на фронтенд због недостатка руку и вештина. Не могу рећи да ће моје решење бити безбедно, али функционише.

Пошто не волим да плаћам хостинг, користио сам мрежу на послу, тамо је бели ИП. Ево његове структуре:

Омогућавање базе података за даљинско повезивање

Имам приступ неколико рачунара, тачније 192.168.1.2 (ака 192.168.0.2) са инсталираним Линуком и 192.168.0.3 са Виндовс-ом. Генерално, изабрао сам мискл за своју апликацију и погледао шта је доступно на Линук-у. Тамо је већ био инсталиран, али нико не зна лозинку, а они који су знали заборавили су (они који су радили пре мене). Пошто сам сазнао да никоме није потребан, обрисао сам га и покушао поново да га инсталирам. Није било довољно меморије, а како бих исправио ову грешку морао сам да повежем монитор и тастатуру са мишем на њу, одлучио сам да одустанем од ове ствари. Штавише, машина са Виндовс-ом је много моћнија и плус, имам је на лаптопу код куће. У принципу, нећу описивати саму инсталацију, постоји много приручника и видео записа о томе. Након што сам инсталирао мискл на Виндовс машину, одлучио сам да направим резервну копију табела са свог лаптопа на своју радну станицу.

То се ради овако (у мом случају):

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 године.

Када су све табеле враћене, време је да омогућите даљински приступ бази података. Генерално, такве команде нису довеле до успеха (дале су само дозволу за читање за одабир)

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

Ово ми није успело и нисам могао да се повежем преко ове адресе као роот.

Мискл воркбенцх програм је помогао; у подешавањима промените лоцалхост у % и ради, иако клијент није помогао. Сада се можете повезати са базом података са конзоле или из кода са било које адресе.

Омогућавање базе података за даљинско повезивање

Такође морате да направите кућну или пословну мрежу и искључите Виндовс заштитни зид, иначе нећете моћи ни да пингујете ову машину (а камоли да се повежете са базом података).

Пола посла је обављено, сада морам да се повежем са базом података од куће.

Као што видите из мрежног дијаграма, да бисте дошли до Интернета потребно је да пређете са 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 (подразумевани мискл порт (ако га нисте променили током инсталације)) на адресу 192.168.1.2

Омогућавање базе података за даљинско повезивање

Најтеже преостаје да урадите прослеђивање на Линук машини (има две мрежне картице 192.168.1.2 (енп3с1 интерфејс) и 192.168.0.2 (енп3с0 интерфејс) како би мрежне картице знале шта да их пренесу са 192.168.1.2 на 192.168.0.2, а затим на нашу Виндовс машину са МиСкл.

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. значи промену одредишне и изворне адресе. И воила, можете се повезати од куће преко мискл-а. И на крају, мој Ц++ код који ово ради:

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

Сада можете безбедно да пошаљете овај програм било коме и не морате да га преписујете да би радио локално.

Извор: ввв.хабр.цом

Додај коментар