Zpřístupnění databáze pro vzdálené připojení

Začněme tím, že jsou chvíle, kdy potřebujete vytvořit aplikaci s připojením k databázi. Dělá se to proto, abychom se příliš neponořili do vývoje back-endu a soustředili se na front-end kvůli nedostatku rukou a dovedností. Nebudu říkat, že moje řešení bude bezpečné, ale funguje.

Jelikož nerad platím za hosting, využil jsem síť v práci, je tam bílá IP. Zde je jeho struktura:

Zpřístupnění databáze pro vzdálené připojení

Mám přístup k více počítačům, přesněji na 192.168.1.2 (aka 192.168.0.2) je tam Linux a 192.168.0.3 s Windows. Obecně jsem pro svou aplikaci vybral mysql a podíval se na to, co je na Linuxu. Už to tam bylo nainstalované, ale nikdo nezná heslo a kdo věděl, zapomněl (ti, co pracovali přede mnou). Poté, co jsem se dozvěděl, že to nikdo nepotřebuje, jsem to smazal a zkusil nainstalovat znovu. Paměti bylo málo, a protože k opravě této chyby bych k ní musel připojit monitor a klávesnici s myší, rozhodl jsem se s tímto podnikáním skončit. Navíc stroj s Windows je mnohem výkonnější a navíc ho sám mám doma na notebooku. Samotnou instalaci v zásadě popisovat nebudu, existuje o ní spousta návodů a videí. Po instalaci mysql na počítači se systémem Windows jsem se rozhodl zálohovat tabulky z notebooku na pracovní stanici.

Dělá se to takto (v mém případě):

mysqldump -uroot -p your_base > dump_file.sql

Dále vytvoříme databázi v nové databázi a obnovíme zálohu na „novém“ 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;


Soubor se zálohou musí být umístěn na nový počítač, a pokud není v adresáři s obslužným programem, je možná úplná cesta k němu. (Právě jsem nahrál zálohu na github a naklonoval ji do nového počítače). Doplnil bych, jak se tvoří samotné tabulky, ale neuložil jsem si screenshoty a myslím, že to není těžké ani pro 2-3letého studenta.

Když jsem obnovil všechny tabulky, je čas zpřístupnit vzdálený přístup k databázi. Obecně platí, že takové příkazy nevedly k úspěchu (s ohledem pouze na právo číst vybrat)

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

Přesněji řečeno, mohl jsem se připojit k databázi pouze příkazem,

mysql -h localhost -u client -pclient

a tenhle nemohl

mysql -h 192.168.0.3 -u client -pclient

Nevyhovovalo mi to, také jsem se nemohl připojit přes tuto adresu jako root.

Pomohl program mysql workbench, tam v nastavení změníš localhost na% a jde to, ač klient nepomohl. Nyní se můžete k databázi připojit z konzole nebo z kódu z libovolné adresy.

Zpřístupnění databáze pro vzdálené připojení

Musíte také vytvořit domácí nebo podnikovou síť a vypnout bránu firewall systému Windows, jinak na tento stroj nebudete moci ani pingnout (ne že se připojí k databázi).

Polovina práce je hotová, pak se potřebuji připojit k databázi z domova.

Jak můžete vidět ze schématu sítě, musíte přejít na internet z 192.168.0.3 na 192.168.1.1 (router), pojďme opačným směrem. Nastavíme trasu z 192.168.1.1 na 192.168.1.2 takto:

Zpřístupnění databáze pro vzdálené připojení

Obecně se obrázek nezobrazuje - budu psát rukama:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

To lze provést pouze v jedné podsíti, to znamená, že nemůžete okamžitě přeposílat na adresu 192.168.0.2 nebo 192.168.0.3

To je nutné, aby router věděl, kde se nachází podsíť 192.168.0.0/24 (je užitečné naučit se základy sítí).

Nyní přidáme přesměrování portů 3306 (ve výchozím nastavení port mysql (pokud jste jej nezměnili během instalace)) na adresu 192.168.1.2

Zpřístupnění databáze pro vzdálené připojení

Nyní je nejobtížnější provést předávání na počítači s Linuxem (má dvě síťové karty 192.168.1.2 (rozhraní enp3s1) a 192.168.0.2 (rozhraní enp3s0), aby síťové karty věděly, co je přenést z 192.168.1.2 na 192.168.0.2 a poté na náš počítač se systémem 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

Tito. 1. řádek znamená, že přijímáme první spojení, 2. a 3. že je možné posílat pakety oběma směry, 4. a 5. znamená nahrazení cílové a zdrojové adresy. A voila, můžete se připojit z domova přes mysql. A nakonec můj kód C++, který dělá 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;
};

Nyní můžete tento program bezpečně shodit komukoli a nemusíte jej přepisovat, aby fungoval lokálně.

Zdroj: www.habr.com

Přidat komentář