Membuat database tersedia untuk koneksi jarak jauh

Mari kita mulai dengan fakta bahwa ada kalanya Anda perlu membuat aplikasi dengan koneksi database. Hal ini dilakukan agar tidak terlalu mendalami pengembangan back-end dan berkonsentrasi pada front-end karena kurangnya tangan dan keterampilan. Saya tidak akan mengatakan bahwa solusi saya akan aman, tetapi berhasil.

Karena saya tidak suka membayar hosting, saya menggunakan jaringan di tempat kerja saya, ada IP putih. Berikut adalah strukturnya:

Membuat database tersedia untuk koneksi jarak jauh

Saya memiliki akses ke beberapa komputer, lebih tepatnya 192.168.1.2 (alias 192.168.0.2) ada Linux dan 192.168.0.3 dengan Windows. Secara umum, untuk aplikasi saya, saya memilih mysql dan melihat apa yang ada di Linux. Itu sudah diinstal di sana, tetapi tidak ada yang tahu kata sandinya, dan yang tahu lupa (yang bekerja sebelum saya). Setelah mengetahui bahwa tidak ada yang membutuhkannya, saya menghapusnya dan mencoba menginstalnya lagi. Tidak ada cukup memori, dan karena untuk memperbaiki kesalahan ini saya harus menghubungkan monitor dan keyboard dengan mouse, saya memutuskan untuk keluar dari bisnis ini. Selain itu, mesin Windows jauh lebih bertenaga, dan ditambah segalanya, saya sendiri memilikinya di laptop saya di rumah. Pada prinsipnya, saya tidak akan menjelaskan penginstalan itu sendiri, ada banyak manual dan video tentangnya. Setelah menginstal mysql di mesin Windows, saya memutuskan untuk mencadangkan tabel dari laptop ke workstation.

Ini dilakukan seperti ini (dalam kasus saya):

mysqldump -uroot -p your_base > dump_file.sql

Selanjutnya, kami membuat database di database baru dan memulihkan cadangan di mesin "baru".

mysql -h localhost -u root -p

create database your_base;
use your_base;

mysql -uroot -p your_base < dump_file.sql

show tables;


File dengan cadangan harus diletakkan di mesin baru, dan jika tidak ada di direktori dengan utilitas, maka jalur lengkapnya dimungkinkan. (Saya baru saja mengunggah cadangan ke github dan mengkloningnya ke mesin baru). Saya akan menambahkan bagaimana tabel itu sendiri dibuat, tetapi saya tidak menyimpan tangkapan layarnya, dan menurut saya itu tidak sulit bahkan untuk siswa 2-3 tahun.

Ketika saya memulihkan semua tabel, saatnya membuat akses jarak jauh ke database tersedia. Secara umum, perintah seperti itu tidak berhasil (hanya diberikan hak untuk membaca pilih)

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

Lebih tepatnya, saya hanya bisa terhubung ke database dengan perintah,

mysql -h localhost -u client -pclient

dan yang ini tidak bisa

mysql -h 192.168.0.3 -u client -pclient

Itu tidak cocok untuk saya, saya juga tidak bisa terhubung melalui alamat ini sebagai root.

Program meja kerja mysql membantu, di pengaturan Anda mengubah localhost menjadi% dan berfungsi, meskipun klien tidak membantu. Sekarang Anda dapat terhubung ke database dari konsol atau dari kode dari alamat mana pun.

Membuat database tersedia untuk koneksi jarak jauh

Anda juga perlu membuat jaringan rumah atau perusahaan dan mematikan firewall Windows, jika tidak, Anda bahkan tidak akan dapat melakukan ping ke mesin ini (bukan karena akan terhubung ke database).

Setengah dari pekerjaan selesai, maka saya harus bisa terhubung ke database dari rumah.

Seperti yang Anda lihat dari diagram jaringan, Anda harus pergi ke Internet dari 192.168.0.3 ke 192.168.1.1 (router), mari kita pergi ke arah yang berlawanan. Mari atur rute dari 192.168.1.1 ke 192.168.1.2 seperti ini:

Membuat database tersedia untuk koneksi jarak jauh

Secara umum, gambar tidak ditampilkan - saya akan menulis dengan tangan saya:

route add 192.168.0.0 mask 255.255.255.0 gateway 192.168.1.2

Ini hanya dapat dilakukan dalam satu subnet, yaitu, Anda tidak dapat langsung meneruskan ke alamat 192.168.0.2 atau 192.168.0.3

Ini diperlukan agar router mengetahui di mana subnet 192.168.0.0/24 berada (mempelajari dasar-dasar jaringan berguna).

Sekarang kami menambahkan penerusan port 3306 (port mysql secara default (jika Anda tidak mengubahnya selama instalasi)) ke alamat 192.168.1.2

Membuat database tersedia untuk koneksi jarak jauh

Sekarang hal yang paling sulit dilakukan adalah melakukan penerusan pada mesin Linux (memiliki dua kartu jaringan 192.168.1.2 (antarmuka enp3s1) dan 192.168.0.2 (antarmuka enp3s0) sehingga kartu jaringan tahu apa yang harus ditransfer dari 192.168.1.2 ke 192.168.0.2, lalu ke mesin Windows kami dengan 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

Itu. Baris ke-1 berarti kami menerima koneksi pertama, baris ke-2 dan ke-3 memungkinkan untuk mengirim paket di kedua arah, baris ke-4 dan ke-5 berarti penggantian alamat tujuan dan sumber. Dan voila, Anda dapat terhubung dari rumah melalui mysql. Dan terakhir, kode C++ saya yang melakukan ini:

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

Sekarang Anda dapat dengan aman membuang program ini kepada siapa pun, dan Anda tidak perlu menulis ulang agar berfungsi secara lokal.

Sumber: www.habr.com

Tambah komentar