Поскольку я не люблю платить за хостинг, я воспользовался сетью на своей работе, там есть белый 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)
awMinor
26.07.2019 17:09+2Еще нужно сделать сеть домашней или предприятия и выключить брандмауэр Windows иначе не сможете даже сделать пинг этой машины(не то чтобы подключится к бд).
Помимо выключения брандмаузера ещё стоит отключить антивирус и запустить *.mp3.exe.
Для решения данной задачи отлично подходит SSH-тунель и все SQL клиенты умеют с этим работать. А вывесить базу данных в интернет это очень вредный совет.
kashtan404
26.07.2019 17:41+1Там уже был установлен он, но пароль никто не знает, а те кто знали забыли (те кто работал до меня).
Кто был установлен? Mysql? Первая же ссылка из гугла. Не благодарите.
Узнав что он никому не нужен, я его удалил и попытался установить заново.
Вообще bad practice. Если говорят что «никому не нужно», значит точно найдется тот, кто потом докажет, что это не так.
Память не хватало и поскольку чтобы исправить эту ошибку пришлось бы подключать к нему монитор и клавиатуру с мышью, я решил бросить это дело.
Памяти не хватало на что? Какой объем был и какой нужен? Для чего нужно подключать мониторы/мышки/клавиатуры к тачке с линухой, которая сервер и скорее всего без гуев, если есть ssh?
К сожалению, не совсем понял ваш ветвистый путь решения достаточно простой проблемы.
Samouvazhektra
26.07.2019 17:46+3Поскольку я не люблю платить за хостинг, я воспользовался сетью на своей работе, там есть белый IP. Вот ее структура:
Если вы главный IT-шник в компании, то я ей сочувствую, а если не главный, то если вам за такое ничего не поотрывают и не открутят — вам очень повезет
skymal4ik
26.07.2019 19:07+1Наверное стоило сбросить пароль для бд, посмотреть что за база и данные там, и задокументировать.
Про ssh туннель выше уже писали. Или VPN.
В целом, учитесь и больше думайте наперёд, пригодится и вам, и работодателя.
skymal4ik
26.07.2019 19:09+1Ещё вопрос, devops тэг здесь для чего? Тут простейшие правила dnat и техники. Никакой автоматизацией или оркестрацией и не пахнет.
selivanov_pavel
26.07.2019 19:22+2Здесь просто всё плохо, прямо каждая строчка.
>
Зачем вы выложили в открытый доступ схему сети?
> пароль никто не знает, а те кто знали забыли
сбросить пароль?
> Память не хватало и поскольку чтобы исправить эту ошибку пришлось бы подключать к нему монитор и клавиатуру с мышью
ssh? swapfile, если не хватает памяти для работы пакетного менеджера?
> Помогла программка mysql workbench там в настройках меняете localhost на %
UPDATE mysql.user…?
> сделать сеть домашней или предприятия и выключить брандмауэр Windows иначе не сможете даже сделать пинг этой машины
Может, не выключать фаервол, а прописать нужные исключения?
> дальше нужно чтобы я мог из дома подключится к базе данных
Зачем гонять по интернету незашифрованный трафик? mysql тривиально заворачивается в ssh тоннель, или умеет ssl.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 используется. По остальным вопросам я не настолько опытен чтобы знать всё и вся.
selivanov_pavel
26.07.2019 20:28+1> По остальным вопросам я не настолько опытен чтобы знать всё и вся.
Так я не против изучения всяких полезных штук, но на пост на хабре эти упражнения никак не тянут: решена достаточно тривиальная задача, да ещё и не лучшим способом.
> сеть защищена, пусть не на 100%, но на 99,99%
Не надо выкладывать в общий доступ ничего сверх не обходимого. Это общий принцип. Никто не может знать всех способов, как какая-то информация может в дальнейшем повредить. То, что вы не видите явных проблем в защите — не значит, что их не увидит кто-то другой.
> Насчет исключений даже не знаю какая именно программа отвечает за пинг, я много с пингом провозился
За ответ на ping отвечает сетевой стек операционной системы. В брандмауэре настраиваются соответствующие правила для icmp протокола.
> Еще я смотрел траффик кода в программе wireshark, вроде там SSL используется
Если явно не настраивался при установке/настройке mysql — вряд ли. Как минимум сертификаты надо сгенерить self-signed или откуда-то получить.
lslayer
26.07.2019 20:09+1Подпишусь на комментарии, интересно чем все закончится.
kashtan404
26.07.2019 20:19+1Да тоже ради этого подписался.
Но чтобы не было оффтопом: товарищ автор, мы тут все такие, конечно, «токсичные», накинулись на вас, но вам бы реально подучить матчасть, чтобы не нести чепухи. Я это говорю не чтобы задеть вас, а чтобы вы получили знания. Таким образом грамотных IT-специалистов станет больше, от чего выиграет вся IT-сфера.
Начните вот с этого — habr.com/en/post/140552 (там выпадающий список «все выпуски» чтобы не городить гору ссылок). Очень доступно про сети и с чем их едят.
А дальше — все просто! Используйте гугл и ютуб. На ютубе очень много обучающих лекций и презентаций, а в гугле можно найти решения типичных проблем.
Успехов вам и с Днем сисадмина!
fpir
27.07.2019 09:44Блин, если написать статью «как я добавил контроллер домена в демилитаризованную зону», то в коментах можно будет найти подробные инструкции по поднятию ngnix и его безопасных настройках.
koluka
27.07.2019 10:30Жила была рабочая сетка, и тут в ней появляется «специалист devops» вкорячивающий в нее черный ход с надписью «пожалуйста не заходите». И все это из за стремления сэкономить 500р на хостинг.
ЗЫ Может это кто решил пошутить в день админа?tempick
27.07.2019 13:24да есть хостинги, где 10гб дают за 250руб. Что там у него в базе должно быть, чтобы ему этого не хватило?
ZaEzzz
29.07.2019 07:16+2После прочтения этого опуса в голове вертелась только одна мысль: "ой дурак" (с) не помню откуда.
Кроме открытой базы я еще переживаю за качество опубликованного ресурса — там дыры могут быть более жестокие.kashtan404
29.07.2019 10:17+2Это фраза Милославского из «Иван Васильевич меняет профессию».
ZaEzzz
29.07.2019 22:29+1Точно! Спасибо за восстановление памяти. Надо пересмотреть.
И да, именно с это интонацией.
amarao
Память не хватало и поскольку чтобы исправить эту ошибку пришлось бы подключать к нему монитор и клавиатуру с мышью...
/thread.
Доктор, мне очень хотелось сходить в туалет, но поскольку моя голова не пролезала в бачок унитаза, я разобрал водогрей и использовал резинку уплотнителя для того, чтобы связать ручку окна и входной двери. А вот модель детальки для печати на 3D-принтере для того, чтобы удерживать провод от водогрея на безопасном расстоянии от держателя туалетной бумаги.
nochkin
«учите основы сетей это полезно»!
Стыдно не знать, что при подключении монитора память увеличивается. А если клавиатуру и мышь, то вообще выше крыше будет.
Про это знает «даже студент 2-3 курса».
А если серъёзно, то я видел как-то приложение, которое обращалась к базе похожим способом. Правда, через какое-то время автор этой программы долго грустил когда ему увели всю базу и потёрли его данные.
Надо было ему добавить сообщение типа: «Вот вам ключи от квартиры. Но, пожалуйста, кроме туалета ничего не трогайте, так как деньги на полке мне нужны для других вещей».
amarao
На Кипре в деревнях можно зайти в ларёк, там никого нет, взять что нужно, положить деньги на кассе и идти себе спокойно. Т.е. как стратегия — вполне нормально.
А вот с компетенцией — ой.
nochkin
Есть много мест (не только на Кипре), где такое присутствует. Даже сдачу можно взять из общей кучи. И народ так делает без проблем.
Но, к сожалению, современный интернет не в этом списке мест.
Gremlin92 Автор
Так я пароли и адреса изменил если не заметили, например вместо белого адреса в коде там адрес внутри сети, а пользователь root имеет пароль не password к тому же у меня есть бэкап базы и там просто пару таблиц которые имеют меньше 30 строк в сумме, я их использую для программы которую пишу как хобби
nochkin
В рабочей программе ведь пароли и адреса настоящие.
Количество строк в таблице никак на это не влияет. Уже давно в этом плане количество информации вообще не коррелирует с размером её ценности.
И это я не говорю, что некоторые «редиски» могут этим воспользоваться для атаки на другие хосты напрямую или косвенно.
Gremlin92 Автор
Скажем так, пусть пробуют, а там можно и реально выкладывать сервер в общий доступ.
Gremlin92 Автор
Очень конструктивная критика
amarao
Это не конструктивная критика, а последняя стадия защитного сарказма. Вместо описания проблемы вы описываете решение, и на каждом следующем этапе решения проблема становится всё более… непонятной.