データベースをリモート接続できるようにする

データベースに接続するアプリケーションを作成する必要がある場合があるという事実から始めましょう。 これは、人手やスキルの不足によりバックエンドの開発に深入りしすぎてフロントエンドに集中することを避けるために行われます。 私のソリューションが安全であるとは言えませんが、機能します。

お金を払うのが好きじゃないから ホスティング職場のパブリックIPを持つネットワークを使用しました。その構造は次のとおりです。

データベースをリモート接続できるようにする

У меня имеется доступ к нескольким компьютерам точнее к 192.168.1.2 (он же 192.168.0.2) там стоит Linux и к 192.168.0.3 с Windows. В общем, для своего приложения я выбрал mysql и посмотрел что есть на Linux. Там уже был установлен он, но пароль никто не знает, а те кто знали забыли (те кто работал до меня). Узнав что он никому не нужен, я его удалил и попытался установить заново. Память не хватало и поскольку чтобы исправить эту ошибку пришлось бы подключать к нему монитор и клавиатуру с мышью, я решил бросить это дело. Тем более что машина с Windows куда мощней и плюс ко всему у меня у самого стоит она на ноутбуке домашнем. В принципе саму установку я описывать не буду, есть куча мануалов и видео про это. Установив mysql на Windows машину, я решил сделать бэкап таблиц с ноутбука на рабочую станцию.

それは次のように行われます(私の場合):

mysqldump -uroot -p your_base > dump_file.sql

次に、新しいデータベースにデータベースを作成し、「新しい」マシンにバックアップを復元します。

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


バックアップ ファイルは新しいマシンに配置する必要があります。ユーティリティのあるディレクトリにない場合は、そのフル パスを配置する必要があります。 (バックアップを GitHub にアップロードし、新しいマシンにクローンを作成しました)。 テーブル自体の作成方法を追加しますが、スクリーンショットは保存しませんでした。2、3 年生でも難しくないと思います。

すべてのテーブルが復元されたら、データベースへのリモート アクセスが可能になります。 一般に、このようなコマンドは成功しませんでした (選択するための読み取り権限のみが与えられました)。

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

より正確には、次のコマンドでのみデータベースに接続できました。

mysql -h localhost -u client -pclient

でもこれはもう無理だった

mysql -h 192.168.0.3 -u client -pclient

これは私にとっては機能せず、このアドレスを介して root として接続できませんでした。

mysql ワークベンチ プログラムが役に立ちました。設定で localhost を % に変更すると機能しますが、クライアントは役に立ちませんでした。 これで、コンソールから、または任意のアドレスのコードからデータベースに接続できるようになりました。

データベースをリモート接続できるようにする

Еще нужно сделать сеть домашней или предприятия и выключить брандмауэр Windows иначе не сможете даже сделать пинг этой машины(не то чтобы подключится к бд).

仕事の半分は終わったので、今度は自宅からデータベースに接続できるようにする必要があります。

ネットワーク図からわかるように、インターネットにアクセスするには、192.168.0.3 から 192.168.1.1 (ルーター) に移動する必要があります。ここでは、逆方向に進みます。 192.168.1.1 から 192.168.1.2 へのルートを次のように設定しましょう。

データベースをリモート接続できるようにする

通常、写真では表示されないので、手書きで書きます。

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

これは 192.168.0.2 つのサブネット内でのみ実行できます。つまり、アドレス 192.168.0.3 または XNUMX にすぐに転送することはできません。

これは、ルーターがサブネット 192.168.0.0/24 の場所を認識するために必要です (ネットワークの基本を学習すると役立ちます)。

次に、ポート転送 3306 (デフォルトの mysql ポート (インストール中に変更しなかった場合)) をアドレス 192.168.1.2 に追加します。

データベースをリモート接続できるようにする

Вот осталось сделать самое сложное это сделать форвардинг на линукс машине(на ней две сетевые карточки 192.168.1.2 (интерфейс enp3s1) и 192.168.0.2(интерфейс enp3s0) чтобы сетевухи знали что перебросить их с 192.168.1.2 на 192.168.0.2, а потом на нашу Windows машину с 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

それらの。 1 行目は最初の接続を受け入れることを意味し、2 行目と 3 行目はパケットを両方向に送信できることを意味し、4 行目と 5 行目は宛先アドレスと送信元アドレスを変更することを意味します。 ほら、自宅から mysql 経由で接続できるようになりました。 そして最後に、これを行う私の C++ コード:

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

これで、このプログラムを誰にでも安全に送信できるようになり、ローカルで動作させるためにプログラムを書き直す必要がなくなります。

出所: habr.com

DDoS 保護機能を備えた信頼性の高いサイト用ホスティング、VPS VDS サーバーを購入する 🔥 DDoS攻撃対策付きの信頼性の高いウェブサイトホスティング、VPS/VDSサーバーを購入しましょう | ProHoster