Disponibilizando o banco de dados para conexão remota

Comecemos pelo fato de que há casos em que é necessário fazer uma aplicação com conexão a um banco de dados. Isso é feito para não se aprofundar muito no desenvolvimento de backend e concentrar-se no frontend devido à falta de mãos e habilidades. Não posso dizer que minha solução será segura, mas funciona.

Como não gosto de pagar hospedagem, usei a rede do meu trabalho, lá tem um IP branco. Aqui está sua estrutura:

Disponibilizando o banco de dados para conexão remota

Tenho acesso a vários computadores, mais precisamente 192.168.1.2 (também conhecido como 192.168.0.2) com Linux instalado e 192.168.0.3 com Windows. Em geral, escolhi o mysql para minha aplicação e olhei o que estava disponível no Linux. Já estava instalado lá, mas ninguém sabe a senha, e quem sabia esqueceu (quem trabalhou antes de mim). Ao saber que ninguém precisava dele, apaguei-o e tentei instalá-lo novamente. Não havia memória suficiente e como para corrigir esse erro teria que conectar um monitor e teclado com mouse, resolvi desistir desse assunto. Além disso, a máquina com Windows é muito mais potente e, além disso, tenho ela no meu laptop em casa. A princípio não vou descrever a instalação em si, existem muitos manuais e vídeos sobre ela. Tendo instalado o mysql em uma máquina Windows, decidi fazer backup das tabelas do meu laptop para a minha estação de trabalho.

É feito assim (no meu caso):

mysqldump -uroot -p your_base > dump_file.sql

A seguir, criamos um banco de dados no novo banco 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 de backup deve ser colocado na nova máquina e, talvez, se não estiver no diretório com o utilitário, o caminho completo para ele. (Acabei de enviar o backup para o GitHub e cloná-lo em uma nova máquina). Eu acrescentaria como as próprias tabelas são criadas, mas não salvei as capturas de tela e acho que não é difícil, mesmo para um aluno de 2 a 3 anos.

Quando todas as tabelas forem restauradas, é hora de disponibilizar o acesso remoto ao banco de dados. Em geral, esses comandos não levaram ao sucesso (deram apenas permissão de leitura para selecionar)

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

Mais precisamente, eu poderia me conectar ao banco de dados apenas com o comando,

mysql -h localhost -u client -pclient

mas este não aguentava mais

mysql -h 192.168.0.3 -u client -pclient

Isso não funcionou para mim e não consegui me conectar através deste endereço como root.

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

Disponibilizando o banco de dados para conexão remota

Você também precisa criar uma rede doméstica ou empresarial e desligar o firewall do Windows, caso contrário você não conseguirá nem fazer ping nesta máquina (muito menos conectar-se ao banco de dados).

Metade do trabalho está feito, agora preciso conseguir me conectar ao banco de dados de casa.

Como você pode ver no diagrama de rede, para acessar a Internet você precisa ir de 192.168.0.3 a 192.168.1.1 (roteador), vamos na direção oposta. Vamos configurar a rota de 192.168.1.1 a 192.168.1.2 assim:

Disponibilizando o banco de dados para conexão remota

Em geral a imagem não aparece, então vou escrever à mão:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

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

Isso é necessário para que o roteador saiba onde está localizada a sub-rede 192.168.0.0/24 (é útil aprender o básico sobre redes).

Agora adicionamos o encaminhamento de porta 3306 (a porta padrão do MySQL (se você não a alterou durante a instalação)) ao endereço 192.168.1.2

Disponibilizando o banco de dados para conexão remota

A coisa mais difícil que resta a fazer é encaminhar em uma máquina Linux (ela tem duas placas de rede 192.168.1.2 (interface enp3s1) e 192.168.0.2 (interface enp3s0) para que as placas de rede saibam para onde transferi-las de 192.168.1.2 para 192.168.0.2 e depois 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
и последняя строчка сохраняет введенные команды чтобы они при перезапуске оси не стерлись
sudo service iptables-persistent save

Aqueles. A 1ª linha significa que aceitamos a primeira conexão, a 2ª e a 3ª que podemos enviar pacotes nas duas direções, a 4ª e a 5ª significam alterar os endereços de destino e origem. E pronto, você pode se conectar de casa via mysql. E finalmente, meu código 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); //Если используется оконное приложение
	}
	// Подключаемся к серверу
	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;
};

Agora você pode enviar este programa com segurança para qualquer pessoa e não precisa reescrevê-lo para que funcione localmente.

Fonte: habr.com

Adicionar um comentário