Gjøre databasen tilgjengelig for ekstern tilkobling

La oss starte med det faktum at det er tilfeller når du trenger å lage en applikasjon med en tilkobling til en database. Dette gjøres for ikke å fordype seg for mye i backend-utvikling og konsentrere seg om frontend på grunn av mangel på hender og ferdigheter. Jeg kan ikke si at løsningen min vil være trygg, men den fungerer.

Siden jeg ikke liker å betale for hosting, brukte jeg nettverket på jobben min, det er en hvit IP der. Her er strukturen:

Gjøre databasen tilgjengelig for ekstern tilkobling

Jeg har tilgang til flere datamaskiner, nærmere bestemt 192.168.1.2 (aka 192.168.0.2) med Linux installert og 192.168.0.3 med Windows. Generelt valgte jeg mysql for applikasjonen min og så på hva som var tilgjengelig på Linux. Det var allerede installert der, men ingen vet passordet, og de som visste glemte det (de som jobbet før meg). Etter å ha lært at ingen trengte det, slettet jeg det og prøvde å installere det på nytt. Det var ikke nok minne, og siden jeg for å fikse denne feilen måtte koble til en skjerm og et tastatur med en mus, bestemte jeg meg for å gi opp denne saken. Dessuten er maskinen med Windows mye kraftigere og i tillegg har jeg den på den bærbare datamaskinen hjemme. I prinsippet vil jeg ikke beskrive selve installasjonen; det er mange manualer og videoer om det. Etter å ha installert mysql på en Windows-maskin, bestemte jeg meg for å ta backup av tabellene fra den bærbare datamaskinen til arbeidsstasjonen.

Det er gjort slik (i mitt tilfelle):

mysqldump -uroot -p your_base > dump_file.sql

Deretter oppretter vi en database i den nye databasen og gjenoppretter sikkerhetskopien på den "nye" maskinen.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Sikkerhetskopien må plasseres på den nye maskinen, og kanskje, hvis ikke i katalogen med verktøyet, så den fullstendige banen til den. (Jeg lastet nettopp opp sikkerhetskopien til GitHub og klonet den til en ny maskin). Jeg vil legge til hvordan selve tabellene er laget, men jeg lagret ikke skjermbildene, og jeg tror det ikke er vanskelig selv for en 2-3-årig student.

Når alle tabellene er gjenopprettet, er det på tide å gjøre ekstern tilgang til databasen tilgjengelig. Generelt førte ikke slike kommandoer til suksess (det ga bare lesetillatelse til å velge)

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

Mer presist, jeg kunne koble til databasen bare med kommandoen,

mysql -h localhost -u client -pclient

men denne kunne ikke gjøre det lenger

mysql -h 192.168.0.3 -u client -pclient

Dette fungerte ikke for meg, og jeg kunne ikke koble til via denne adressen som root.

Mysql workbench-programmet hjalp; i innstillingene, endre localhost til % og det fungerer, selv om klienten ikke hjalp. Nå kan du koble til databasen fra konsollen eller fra kode fra hvilken som helst adresse.

Gjøre databasen tilgjengelig for ekstern tilkobling

Du må også lage et hjemme- eller bedriftsnettverk og slå av Windows-brannmuren, ellers vil du ikke engang kunne pinge denne maskinen (enn mindre koble til databasen).

Halve jobben er gjort, nå må jeg kunne koble meg til databasen hjemmefra.

Som du kan se fra nettverksdiagrammet, for å komme til Internett må du gå fra 192.168.0.3 til 192.168.1.1 (ruter), la oss gå i motsatt retning. La oss konfigurere ruten fra 192.168.1.1 til 192.168.1.2 slik:

Gjøre databasen tilgjengelig for ekstern tilkobling

Generelt vises ikke bildet, så jeg skriver det for hånd:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Dette kan bare gjøres i ett undernett, det vil si at du ikke umiddelbart kan videresende til adressen 192.168.0.2 eller 192.168.0.3

Dette er nødvendig slik at ruteren vet hvor subnettet 192.168.0.0/24 er plassert (det er nyttig å lære det grunnleggende om nettverk).

Nå legger vi til portvideresending 3306 (standard mysql-porten (hvis du ikke endret den under installasjonen)) til adressen 192.168.1.2

Gjøre databasen tilgjengelig for ekstern tilkobling

Det vanskeligste som gjenstår er å gjøre videresending på en Linux-maskin (den har to nettverkskort 192.168.1.2 (enp3s1-grensesnitt) og 192.168.0.2 (enp3s0-grensesnitt) slik at nettverkskortene vet hva de skal overføre dem fra 192.168.1.2 til 192.168.0.2, og deretter til vår Windows-maskin med 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

De. Den 1. linjen betyr at vi aksepterer den første forbindelsen, den 2. og 3. at vi kan sende pakker i begge retninger, den 4. og 5. betyr å endre destinasjons- og kildeadressene. Og voila, du kan koble til hjemmefra via mysql. Og til slutt, min C++-kode som gjør dette:

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

Nå kan du trygt sende dette programmet til hvem som helst, og du trenger ikke å skrive det om for å få det til å fungere lokalt.

Kilde: www.habr.com

Legg til en kommentar