Tornando o banco de dados acessível para conexão remota

Vamos começar pelo fato de que existem situações em que é necessário criar um aplicativo com conexão a um banco de dados. Isso é feito para evitar complicações com o desenvolvimento de back-end e se concentrar no front-end devido à falta de recursos e habilidades. Não afirmo que minha solução será segura, mas ela funciona.

Como eu não gosto de pagar por para PrestaShop, eu utilizei a rede do meu trabalho, que possui um IP público. Aqui está a sua estrutura:

Tornando o banco de dados acessível para conexão remota

Tenho acesso a vários computadores, especificamente ao 192.168.1.2 (também 192.168.0.2) onde está o Linux e ao 192.168.0.3 com Windows. Enfim, para meu aplicativo eu escolhi o MySQL e verifiquei o que havia no Linux. Ele já estava instalado lá, mas ninguém sabia a senha e aqueles que sabiam esqueceram (os que trabalharam antes de mim). Descobrindo que ele não era necessário, eu o removi e tentei reinstalar. A memória não era suficiente e como para corrigir esse erro teria que conectar um monitor, teclado e mouse, decidi desistir. Além disso, a máquina com Windows é muito mais potente e, para completar, eu mesmo a tenho no meu notebook pessoal. De fato, não vou descrever a instalação, pois existem muitos manuais e vídeos sobre isso. Depois de instalar o MySQL na máquina Windows, eu decidi fazer um backup das tabelas do notebook para a estação de trabalho.

Isso é feito assim (no meu caso):

mysqldump -uroot -p your_base > dump_file.sql

Em seguida, na nova base de dados, criamos a base de dados e restauramos o backup na "nova" máquina.

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


O arquivo com o backup precisa ser colocado na nova máquina e, possivelmente, se não estiver no diretório da ferramenta, o caminho completo até ele. (Eu simplesmente coloquei o backup no GitHub e clonei para a nova máquina). Gostaria de incluir como as próprias tabelas são criadas, mas não salvei as capturas de tela, e acredito que não seria difícil nem para um estudante do segundo ou terceiro ano.

Quando recuperei todas as tabelas, era hora de permitir o acesso remoto ao banco de dados. No geral, esses comandos não foram eficazes (só concedeu permissão de leitura select).

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

Na verdade, eu conseguia me conectar ao banco apenas pelo comando,

mysql -h localhost -u client -pclient

mas não conseguia assim

mysql -h 192.168.0.3 -u client -pclient

isso não me servia, e também não consegui me conectar através desse endereço e nem como root.

O programa mysql workbench ajudou; nas configurações, você altera localhost para % e funciona, embora isso não tenha ajudado com o cliente. Agora você pode se conectar ao banco de dados a partir do console ou do código de qualquer endereço.

Tornando o banco de dados acessível para conexão remota

Também é necessário criar uma rede doméstica ou empresarial e desativar o firewall do Windows, caso contrário, você não conseguirá nem mesmo fazer ping nessa máquina (quanto mais se conectar ao banco de dados).

Uma parte do trabalho está feita; agora preciso conseguir me conectar ao banco de dados de casa.

Como pode ser visto no diagrama de rede, para chegar à internet, é preciso percorrer o caminho de 192.168.0.3 até 192.168.1.1 (roteador); vamos no sentido inverso. Vamos configurar o roteamento de 192.168.1.1 para 192.168.1.2 da seguinte maneira:

Tornando o banco de dados acessível para conexão remota

Em suma, como a figura não aparece — vou escrever manualmente:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Isso só pode ser feito em uma única sub-rede, ou seja, não é possível redirecionar imediatamente para o endereço 192.168.0.2 ou 192.168.0.3.

Isso é necessário para que o roteador saiba onde está a sub-rede 192.168.0.0/24 (aprenda os fundamentos das redes, isso é útil).

Agora adicionamos o encaminhamento da porta 3306 (porta mysql por padrão (caso você não tenha alterado durante a instalação)) para o endereço 192.168.1.2.

Tornando o banco de dados acessível para conexão remota

A próxima tarefa mais difícil é configurar o encaminhamento na máquina Linux (que possui duas placas de rede: 192.168.1.2 (interface enp3s1) e 192.168.0.2 (interface enp3s0)) para que as placas saibam que devem redirecionar de 192.168.1.2 para 192.168.0.2, e então para nossa máquina Windows com 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
 e a última linha salva os comandos inseridos para que não sejam apagados ao reiniciar o sistema operacional
sudo service iptables-persistent save

Ou seja, a primeira linha significa que aceitamos a primeira conexão, a segunda e a terceira permitem que os pacotes sejam enviados em ambas as direções, a quarta e a quinta significam a substituição do endereço de destino e origem. E voilà, agora é possível se conectar de casa através do mysql. E para finalizar, meu código em C++ que faz isso:

//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); //Если используется оконное приложение
	}
	// Подключаемся к servidor
	if (!mysql_real_connect(conn, "192.168.0.3", "root", "password", "your_base", NULL, NULL, 0))
	{
		// Se não for possível estabelecer a conexão com servidor 
		// базы данных выводим сообщение об ошибке
		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;
};

Agora posso enviar este programa para qualquer pessoa e não precisarei reescrevê-lo para que funcione localmente.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster