Rendre la base de données disponible pour une connexion à distance

Commençons par le fait qu'il existe des cas où vous devez créer une application avec une connexion à une base de données. Ceci est fait afin de ne pas trop se plonger dans le développement backend et de se concentrer sur le frontend en raison d'un manque de mains et de compétences. Je ne peux pas dire que ma solution sera sûre, mais elle fonctionne.

Comme je n'aime pas payer pour l'hébergement, j'ai utilisé le réseau au travail, il y a une IP blanche là-bas. Voici sa structure :

Rendre la base de données disponible pour une connexion à distance

J'ai accès à plusieurs ordinateurs, plus précisément 192.168.1.2 (alias 192.168.0.2) avec Linux installé là-bas et 192.168.0.3 avec Windows. En général, j'ai choisi MySQL pour mon application et j'ai regardé ce qui était disponible sous Linux. Il y était déjà installé, mais personne ne connaît le mot de passe, et ceux qui le connaissaient l'ont oublié (ceux qui ont travaillé avant moi). Ayant appris que personne n'en avait besoin, je l'ai supprimé et j'ai essayé de le réinstaller. Il n'y avait pas assez de mémoire, et comme pour corriger cette erreur, je devrais y connecter un moniteur et un clavier avec une souris, j'ai décidé d'abandonner cette question. De plus, la machine avec Windows est bien plus puissante et en plus, je l'ai sur mon ordinateur portable à la maison. En principe, je ne décrirai pas l'installation elle-même, il existe de nombreux manuels et vidéos à ce sujet. Après avoir installé MySQL sur une machine Windows, j'ai décidé de sauvegarder les tables de mon ordinateur portable sur mon poste de travail.

Cela se fait comme ceci (dans mon cas) :

mysqldump -uroot -p your_base > dump_file.sql

Ensuite, nous créons une base de données dans la nouvelle base de données et restaurons la sauvegarde sur la « nouvelle » machine.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


Le fichier de sauvegarde doit être placé sur la nouvelle machine et, peut-être, s'il ne se trouve pas dans le répertoire contenant l'utilitaire, alors le chemin complet d'accès à celui-ci. (Je viens de télécharger la sauvegarde sur GitHub et de la cloner sur une nouvelle machine). J'ajouterais comment les tableaux eux-mêmes sont créés, mais je n'ai pas enregistré les captures d'écran, et je pense que ce n'est pas difficile même pour un étudiant de 2-3 ans.

Lorsque toutes les tables ont été restaurées, il est temps de rendre disponible l'accès à distance à la base de données. En général, de telles commandes n'ont pas abouti (elles ne donnaient que l'autorisation de lecture pour sélectionner)

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

Plus précisément, je ne pouvais me connecter à la base de données qu'avec la commande,

mysql -h localhost -u client -pclient

mais celui-là n'en pouvait plus

mysql -h 192.168.0.3 -u client -pclient

Cela n'a pas fonctionné pour moi et je n'ai pas pu me connecter via cette adresse en tant que root.

Le programme MySQL Workbench a aidé ; dans les paramètres, remplacez localhost par % et cela fonctionne, même si le client n'a pas aidé. Vous pouvez désormais vous connecter à la base de données depuis la console ou depuis le code de n'importe quelle adresse.

Rendre la base de données disponible pour une connexion à distance

Vous devez également créer un réseau domestique ou professionnel et désactiver le pare-feu Windows, sinon vous ne pourrez même pas envoyer une requête ping à cette machine (et encore moins vous connecter à la base de données).

La moitié du travail est fait, je dois maintenant pouvoir me connecter à la base de données depuis chez moi.

Comme vous pouvez le voir sur le schéma du réseau, pour accéder à Internet il faut passer du 192.168.0.3 au 192.168.1.1 (routeur), allons dans le sens inverse. Configurons la route de 192.168.1.1 à 192.168.1.2 comme ceci :

Rendre la base de données disponible pour une connexion à distance

En général, l'image ne s'affiche pas, je vais donc l'écrire à la main :

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Cela ne peut être fait que dans un sous-réseau, c'est-à-dire que vous ne pouvez pas transférer immédiatement vers l'adresse 192.168.0.2 ou 192.168.0.3.

Ceci est nécessaire pour que le routeur sache où se trouve le sous-réseau 192.168.0.0/24 (apprendre les bases des réseaux est utile).

Maintenant, nous ajoutons la redirection de port 3306 (le port MySQL par défaut (si vous ne l'avez pas modifié lors de l'installation)) à l'adresse 192.168.1.2

Rendre la base de données disponible pour une connexion à distance

La chose la plus difficile à faire est de faire du transfert sur une machine Linux (elle possède deux cartes réseau 192.168.1.2 (interface enp3s1) et 192.168.0.2 (interface enp3s0) pour que les cartes réseau sachent quoi les transférer depuis 192.168.1.2 vers 192.168.0.2, puis vers notre machine Windows avec 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

Ceux. La 1ère ligne signifie que nous acceptons la première connexion, la 2ème et la 3ème que nous pouvons envoyer des paquets dans les deux sens, la 4ème et la 5ème signifie changer les adresses de destination et de source. Et voilà, vous pouvez vous connecter depuis chez vous via MySQL. Et enfin, mon code C++ qui fait ceci :

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

Vous pouvez désormais envoyer ce programme à n’importe qui en toute sécurité et vous n’avez pas besoin de le réécrire pour le faire fonctionner localement.

Source: habr.com

Ajouter un commentaire