Membuat database tersedia untuk koneksi jarak jauh

Untuk memulainya, ada saatnya Anda perlu membuat aplikasi dengan koneksi ke database. Hal ini dilakukan agar tidak mempelajari perkembangan backend dan fokus pada frontend karena kurangnya tangan dan keterampilan. Saya tidak berani mengatakan bahwa solusi saya akan aman, tetapi berhasil.

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



Saya memiliki akses ke beberapa komputer lebih tepatnya ke 192.168.1.2 (alias 192.168.0.2) Linux ada di sana dan ke 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 sandi, dan mereka yang tahu lupa (mereka yang bekerja sebelum saya). Setelah mengetahui bahwa tidak ada yang membutuhkannya, saya menghapusnya dan mencoba menginstalnya kembali. Tidak ada cukup memori, dan karena saya harus menghubungkan monitor dan keyboard dengan mouse untuk memperbaiki kesalahan ini, saya memutuskan untuk keluar dari bisnis ini. Selain itu, mesin Windows jauh lebih kuat dan ditambah segalanya, saya sendiri memilikinya di laptop rumah saya. Pada prinsipnya, saya tidak akan menjelaskan instalasi itu sendiri, ada banyak manual dan video tentang itu. Setelah menginstal mysql pada mesin Windows, saya memutuskan untuk membuat cadangan tabel dari laptop ke workstation.

Ini dilakukan seperti ini (dalam kasus saya):

mysqldump -uroot -p your_base > dump_file.sql 

Kemudian di database baru kami membuat database dan mengembalikan cadangan pada 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 cadangan harus diletakkan di mesin baru dan mungkin jika tidak di direktori utilitas maka path lengkap untuk itu. (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 layar, dan saya pikir itu tidak sulit bahkan untuk siswa 2-3 tahun.

Ketika saya mengembalikan semua tabel, saatnya membuat akses jarak jauh ke basis data dapat diakses. Secara umum, perintah seperti itu tidak mengarah pada keberhasilan (hanya diizinkan untuk membaca izin baca)

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

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

 mysql -h localhost -u client -pclient 

tapi yang ini tidak bisa

 mysql -h 192.168.0.3 -u client -pclient 

itu tidak cocok untuk saya dan tidak bisa terhubung melalui alamat ini dan dari root.

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



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

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

Seperti yang dapat dilihat dari diagram jaringan, maka Anda harus beralih dari 192.168.0.3 ke 192.168.1.1 (router) ke Internet, mari kita pergi ke arah yang berlawanan. Atur rute dari 192.168.1.1 ke 192.168.1.2 seperti ini:



Secara umum, gambar tidak menunjukkan - 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 pada satu subnet, yaitu, Anda tidak dapat segera meneruskannya 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 (pelajari dasar-dasar jaringan, ini berguna).

Sekarang tambahkan port probros 3306 (port mysql secara default (jika Anda tidak mengubahnya saat instalasi)) ke alamat 192.168.1.2



Tetap melakukan hal yang paling sulit adalah melakukan penerusan pada mesin Linux (ada dua kartu jaringan 192.168.1.2 di atasnya (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, dan kemudian 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 

Yaitu Baris ke-1 berarti kita menerima koneksi pertama, ke-2 dan ke-3 yang dapat Anda mulai paket di kedua sisi, ke-4 dan ke-5 berarti mengganti alamat dan sumber tujuan. Dan voila, Anda dapat terhubung dari rumah melalui mysql. Dan akhirnya, 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-descriptor\n"); //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: %s\n", 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: %s\n", 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 menjatuhkan program ini kepada siapa pun, dan Anda tidak perlu menulis ulang untuk bekerja secara lokal.

Source: https://habr.com/ru/post/id461503/


All Articles