Начнем с того что бывают случаи, когда нужно делать приложение с подключением к базе данных. Это делается для того чтобы особо не копаться в бэкэнд разработке и сконцентрироваться на фронтэнде из-за нехватки рук и навыков. Я не берусь говорить, что мое решение будет безопасным, но оно работает.

Поскольку я не люблю платить за хостинг, я воспользовался сетью на своей работе, там есть белый 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;


Файл с бэкапом надо на новую машину положить и возможно если не в директории с утилитой то полный путь к ней. (Я просто залил бэкап на гитхаб и клонировал его на новую машину). Я бы добавил как создаются сами таблицы, но не сохранил скрины, да и думаю это не сложно даже студенту 2-3 курса.

Когда восстановил все таблицы, пришло время сделать доступным удаленный доступ к бд. В общем, такие команды к успеху не привели (выдал только право на чтение select)

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 workbench там в настройках меняете localhost на % и работает, хотя client это не помогло. Теперь вы можете подключаться к бд из консоли или из кода с любого адреса.



Еще нужно сделать сеть домашней или предприятия и выключить брандмауэр 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

Это нужно чтобы роутер знал где находится подсеть 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. И напоследок мой код на с++ который это делает:

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

Теперь можно смело скидывать эту программу кому угодно, и не надо переписывать чтобы она работала локально.

Комментарии (33)


  1. amarao
    26.07.2019 17:00
    +2

    Память не хватало и поскольку чтобы исправить эту ошибку пришлось бы подключать к нему монитор и клавиатуру с мышью...


    /thread.


    Доктор, мне очень хотелось сходить в туалет, но поскольку моя голова не пролезала в бачок унитаза, я разобрал водогрей и использовал резинку уплотнителя для того, чтобы связать ручку окна и входной двери. А вот модель детальки для печати на 3D-принтере для того, чтобы удерживать провод от водогрея на безопасном расстоянии от держателя туалетной бумаги.


    1. nochkin
      26.07.2019 18:26

      «учите основы сетей это полезно»!
      Стыдно не знать, что при подключении монитора память увеличивается. А если клавиатуру и мышь, то вообще выше крыше будет.
      Про это знает «даже студент 2-3 курса».

      А если серъёзно, то я видел как-то приложение, которое обращалась к базе похожим способом. Правда, через какое-то время автор этой программы долго грустил когда ему увели всю базу и потёрли его данные.
      Надо было ему добавить сообщение типа: «Вот вам ключи от квартиры. Но, пожалуйста, кроме туалета ничего не трогайте, так как деньги на полке мне нужны для других вещей».


      1. amarao
        26.07.2019 18:33

        На Кипре в деревнях можно зайти в ларёк, там никого нет, взять что нужно, положить деньги на кассе и идти себе спокойно. Т.е. как стратегия — вполне нормально.


        А вот с компетенцией — ой.


        1. nochkin
          26.07.2019 21:12

          Есть много мест (не только на Кипре), где такое присутствует. Даже сдачу можно взять из общей кучи. И народ так делает без проблем.
          Но, к сожалению, современный интернет не в этом списке мест.


      1. Gremlin92 Автор
        26.07.2019 18:35

        Так я пароли и адреса изменил если не заметили, например вместо белого адреса в коде там адрес внутри сети, а пользователь root имеет пароль не password к тому же у меня есть бэкап базы и там просто пару таблиц которые имеют меньше 30 строк в сумме, я их использую для программы которую пишу как хобби


        1. nochkin
          26.07.2019 21:16

          В рабочей программе ведь пароли и адреса настоящие.
          Количество строк в таблице никак на это не влияет. Уже давно в этом плане количество информации вообще не коррелирует с размером её ценности.
          И это я не говорю, что некоторые «редиски» могут этим воспользоваться для атаки на другие хосты напрямую или косвенно.


          1. Gremlin92 Автор
            26.07.2019 21:27

            Скажем так, пусть пробуют, а там можно и реально выкладывать сервер в общий доступ.


    1. Gremlin92 Автор
      26.07.2019 18:53

      Очень конструктивная критика


      1. amarao
        28.07.2019 11:32
        +3

        Это не конструктивная критика, а последняя стадия защитного сарказма. Вместо описания проблемы вы описываете решение, и на каждом следующем этапе решения проблема становится всё более… непонятной.


  1. awMinor
    26.07.2019 17:09
    +2

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


    Помимо выключения брандмаузера ещё стоит отключить антивирус и запустить *.mp3.exe.

    Для решения данной задачи отлично подходит SSH-тунель и все SQL клиенты умеют с этим работать. А вывесить базу данных в интернет это очень вредный совет.


    1. Gremlin92 Автор
      26.07.2019 18:29
      -1

      Я ж сказал что не безопасно


  1. kashtan404
    26.07.2019 17:41
    +1

    Там уже был установлен он, но пароль никто не знает, а те кто знали забыли (те кто работал до меня).

    Кто был установлен? Mysql? Первая же ссылка из гугла. Не благодарите.
    Узнав что он никому не нужен, я его удалил и попытался установить заново.

    Вообще bad practice. Если говорят что «никому не нужно», значит точно найдется тот, кто потом докажет, что это не так.
    Память не хватало и поскольку чтобы исправить эту ошибку пришлось бы подключать к нему монитор и клавиатуру с мышью, я решил бросить это дело.

    Памяти не хватало на что? Какой объем был и какой нужен? Для чего нужно подключать мониторы/мышки/клавиатуры к тачке с линухой, которая сервер и скорее всего без гуев, если есть ssh?

    К сожалению, не совсем понял ваш ветвистый путь решения достаточно простой проблемы.


    1. Gremlin92 Автор
      26.07.2019 18:08

      Гуй есть и да я к ней по ssh коннектюсь


  1. Samouvazhektra
    26.07.2019 17:46
    +3

    Поскольку я не люблю платить за хостинг, я воспользовался сетью на своей работе, там есть белый IP. Вот ее структура:

    Если вы главный IT-шник в компании, то я ей сочувствую, а если не главный, то если вам за такое ничего не поотрывают и не открутят — вам очень повезет


    1. POS_troi
      26.07.2019 18:11

      «А и так сойдёт» :)


  1. szelga
    26.07.2019 19:02

    image


  1. skymal4ik
    26.07.2019 19:07
    +1

    Наверное стоило сбросить пароль для бд, посмотреть что за база и данные там, и задокументировать.

    Про ssh туннель выше уже писали. Или VPN.

    В целом, учитесь и больше думайте наперёд, пригодится и вам, и работодателя.


  1. skymal4ik
    26.07.2019 19:09
    +1

    Ещё вопрос, devops тэг здесь для чего? Тут простейшие правила dnat и техники. Никакой автоматизацией или оркестрацией и не пахнет.


    1. Gremlin92 Автор
      26.07.2019 19:20

      Хм, я просто не знал какой тег подходит, вроде тут используется много вещей из computer science


      1. Mikluho
        27.07.2019 09:18

        много вещей из computer science
        ни одной.


  1. selivanov_pavel
    26.07.2019 19:22
    +2

    Здесь просто всё плохо, прямо каждая строчка.

    >

    Зачем вы выложили в открытый доступ схему сети?

    > пароль никто не знает, а те кто знали забыли

    сбросить пароль?

    > Память не хватало и поскольку чтобы исправить эту ошибку пришлось бы подключать к нему монитор и клавиатуру с мышью

    ssh? swapfile, если не хватает памяти для работы пакетного менеджера?

    > Помогла программка mysql workbench там в настройках меняете localhost на %

    UPDATE mysql.user…?

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

    Может, не выключать фаервол, а прописать нужные исключения?

    > дальше нужно чтобы я мог из дома подключится к базе данных

    Зачем гонять по интернету незашифрованный трафик? mysql тривиально заворачивается в ssh тоннель, или умеет ssl.


    1. Gremlin92 Автор
      26.07.2019 19:47

      Если бы не было схемы сети, я думаю мой пост забраковали бы. А если серьезно, то что в этом такого сеть защищена, пусть не на 100%, но на 99,99%. Я уже сам её проинспектировал и могу сказать, что не взломают, разве что кулхацкеры из фильмов. Насчет исключений даже не знаю какая именно программа отвечает за пинг, я много с пингом провозился, думал что 0.254 блокирует траффик, а оказалось, что похоже брандмауэр не для красоты стоит и что-то реально делает. Например с 192.168.0.2 пинг на 192.168.0.3 шел, а с 192.168.1.1 уже нет. Еще я смотрел траффик кода Query() в программе wireshark, вроде там SSL используется. По остальным вопросам я не настолько опытен чтобы знать всё и вся.


      1. selivanov_pavel
        26.07.2019 20:28
        +1

        > По остальным вопросам я не настолько опытен чтобы знать всё и вся.

        Так я не против изучения всяких полезных штук, но на пост на хабре эти упражнения никак не тянут: решена достаточно тривиальная задача, да ещё и не лучшим способом.

        > сеть защищена, пусть не на 100%, но на 99,99%

        Не надо выкладывать в общий доступ ничего сверх не обходимого. Это общий принцип. Никто не может знать всех способов, как какая-то информация может в дальнейшем повредить. То, что вы не видите явных проблем в защите — не значит, что их не увидит кто-то другой.

        > Насчет исключений даже не знаю какая именно программа отвечает за пинг, я много с пингом провозился

        За ответ на ping отвечает сетевой стек операционной системы. В брандмауэре настраиваются соответствующие правила для icmp протокола.

        > Еще я смотрел траффик кода в программе wireshark, вроде там SSL используется

        Если явно не настраивался при установке/настройке mysql — вряд ли. Как минимум сертификаты надо сгенерить self-signed или откуда-то получить.


  1. lslayer
    26.07.2019 20:09
    +1

    Подпишусь на комментарии, интересно чем все закончится.


    1. kashtan404
      26.07.2019 20:19
      +1

      Да тоже ради этого подписался.
      Но чтобы не было оффтопом: товарищ автор, мы тут все такие, конечно, «токсичные», накинулись на вас, но вам бы реально подучить матчасть, чтобы не нести чепухи. Я это говорю не чтобы задеть вас, а чтобы вы получили знания. Таким образом грамотных IT-специалистов станет больше, от чего выиграет вся IT-сфера.
      Начните вот с этого — habr.com/en/post/140552 (там выпадающий список «все выпуски» чтобы не городить гору ссылок). Очень доступно про сети и с чем их едят.
      А дальше — все просто! Используйте гугл и ютуб. На ютубе очень много обучающих лекций и презентаций, а в гугле можно найти решения типичных проблем.
      Успехов вам и с Днем сисадмина!


  1. fpir
    27.07.2019 09:44

    Блин, если написать статью «как я добавил контроллер домена в демилитаризованную зону», то в коментах можно будет найти подробные инструкции по поднятию ngnix и его безопасных настройках.


  1. koluka
    27.07.2019 10:30

    Жила была рабочая сетка, и тут в ней появляется «специалист devops» вкорячивающий в нее черный ход с надписью «пожалуйста не заходите». И все это из за стремления сэкономить 500р на хостинг.
    ЗЫ Может это кто решил пошутить в день админа?


    1. tempick
      27.07.2019 13:24

      да есть хостинги, где 10гб дают за 250руб. Что там у него в базе должно быть, чтобы ему этого не хватило?


  1. Matisumi
    27.07.2019 14:12

    > Евгений Петряев Gremlin92
    > Инженер-программист

    Серьезно?


    1. Gremlin92 Автор
      27.07.2019 15:44

      Серьёзней не куда


  1. ZaEzzz
    29.07.2019 07:16
    +2

    После прочтения этого опуса в голове вертелась только одна мысль: "ой дурак" (с) не помню откуда.
    Кроме открытой базы я еще переживаю за качество опубликованного ресурса — там дыры могут быть более жестокие.


    1. kashtan404
      29.07.2019 10:17
      +2

      Это фраза Милославского из «Иван Васильевич меняет профессию».


      1. ZaEzzz
        29.07.2019 22:29
        +1

        Точно! Спасибо за восстановление памяти. Надо пересмотреть.
        И да, именно с это интонацией.