Бэкап WD NAS на FREE NAS

Была такая задача, настроить «тянущий» бэкап на FreeNas с сервисов клиента, которые самостоятельно бэкапятся на различные хранилища.

И одним из таких «хранилок» был WD My Cloud Mirror Gen2
Прошерстив интернет нашел кучу различных статей по реализации бэкапов на FreeNas, но ни одной касающейся нужной темы. Задачу еще усложнял тот факт, что оба Nas’а были в разных местах и соответственно за NAT микротиков.

Поэтому саму задачу пришлось разбить на три этапа:

  • Пересмотр текущей схемы резервного копирования
  • Настройка Mikrotik-ов
  • Настройка самих NAS


П.1 — рассматривать не буду, т.к. для всех это сугубо индивидуально, и схема может быть разная. Ограничусь только тем, что на WD должны были хранится бэкапы «железных» серверов в офисе. И настраивал я это дело исходя из имеющегося, так что часть ресурсов бэкапилось силами Veeam Agent, часть теневым копированием, некоторые и во все ограничились бэкапом SQL бд.
П.2 — так же не буду рассматривать, поскольку статей по пробросу портов в Mikrotik в интернете масса. Добавлю только рекомендацию — использовать порты с числом выше 40000, т.к. диапазон ниже достаточно часто попадает под сканирование мошенниками.

 

Дальнейшая часть будет посвящена целиком пункту три, который в моем случае можно разбить на несколько подпунктов, но в данном случае я расскажу как я это реализовал, и надеюсь объясню достаточно понятно. На звание лучшего решения проблемы так же не претендую, исходил из своих навыков и взглядов на жизнь.

К делу. По сколько оба NAS крутятся на Linux Based было решено использовать rsync по протоколу ssh.
Дополнительно, от клиента было пожелание что бы забор бэкапов инициировала именно конечная хранилка, т.е. FreeNas, а значит схема работы такая:

WD My Cloud Mirror работает как обычно, к нему подключаются сервера и кладут свои бэкапы. Так же, по выходным (что бы не нагружать сеть), подключается FreeNas и сам забирает эти бэкапы себе.

1. Для начала нам надо настроить ssh между FreeNas и WD My Cloud Mirror Gen2.

1.1 WD умеет работать с ssh из коробки, поэтому для начала просто включаем в меню web — интерфейса: Настройки — Сеть — SSH, устанавливаем флаг на «вкл» и доп. меню «Настройки» вводим пароль для доступа по ssh.

1.2 Проверяем доступность нашего wd по ssh подключившись к нему с FreeNas:

В меню shell набираем в терминале ssh -p 12345 [email protected] после этого терминал попросит ввести пароль — вводим, тот который указали в п 1.1

ssh -p 12345 [email protected]

На всякий случай разберу команду:

ssh — собственно само подключение по интерфейсу.

-p 12345 — данный ключ указывает по какому порту будем стучаться (т.к. на микротике мы пробросили порт выше 40000), по умолчанию ssh работает на 22 порте.

sshd — имя пользователя, это синоним пользователя root, в идеале его нужно отключать и создавать отдельного пользователя для работы по ssh, в данном примере оставлю как есть.

@10.11.12.13 — ip адрес микротика со стороны wd, если устройства в одной сети — то указывать нужно адрес wd my cloud

1.3 Для автоматической работы, да и с точки зрения безопасности подключения нам нужно избавиться от назойливого пароля. Для этого будем использовать пару сертификатов типа rsa, генерируем их на freenas в терминале:

ssh-keygen -t rsa

Далее вас попросят ввести название сертификата и секретный ключ. В моем случае я оба поля оставил пустыми, в результате в каталоге /root/.ssh/ получил два новых файла: id_rsa и id_rsa.pub те самые приватный и публичный ключи соответственно.

Более подробно про генерацию можно почитать в статье: https://linux.die.net/man/1/ssh-keygen

1.4 Готовим WD My cloud к проверочному соединению по сертификату, заходим к нему по ssh, далле выполняем комнады:

mkdir /home/root/.ssh  ## создаем каталог .shh
chmod 700 /home/root/.ssh ## даем права на папку
exit ## выходим из сессии ssh

Закидываем туда наш id_rsa.pub:

scp -P 12345 id_rsa.pub [email protected]:/home/root/.ssh

разбор команды:

scp — протокол передачи данных по ssh
-P 12345 — порт для подключения, как и у ssh, но в случае с scp «-P» именно большой буквой.
id_rsa.pub — файл нашего публичного ключа
[email protected] — как и в случае ssh, имя пользователя и адрес wd
:/home/root/.ssh — каталог на wd куда положить id_rsa.pub

Более подробную информацию про scp можно почитать здесь https://www.opennet.ru/man.shtml?topic=scp&category=1&russian=0

После этого снова подключаемся по ssh, вводим пароль, и создаем в каталоге .ssh файлик authorized_keys, он как раз таки и будет хранить наш сертификат и сравнивать его при подключении:

cd /home/root/.ssh ## переходим в каталог .ssh
vi authorized_keys ## создаем файл authorized_keys в редакторе vi
:wq ## это команда редактора vi, что бы сохранить файл и выйти из редактора.

Далее копируем содержимое id_rsa.pub в authorized_keys:

cat id_rsa.pub > authorized_keys

И раздаем права на сам файл:

chmod 644 /home/root/.ssh/authorized_keys

Выходим из сессии командой exit и повторно подключаемся для проверки. Если всё сделали правильно — пароль больше не запросит и сразу пропустит в терминал WD.

Небольшая ремарка:

После этого был доволен проделанной работой и ушёл домой, планируя доделать остаток работы с утра. Однако придя на следующий день на работу был очень удивлен, тем, что при подключении снова запросило пароль. А так же, зайдя на WD не обнаружил созданных ранее файликов и папок. Немного поэкспериментировав — выяснилось, что при перезагрузке WD разворачивает операционку заново и соответственно изменения не сохраняются. Примерно неделю потратил на выяснение путей обхода этой чертовщины. В результате нашел несколько статей и возможных вариантов решений. Пришлось их немного переработать, ссылки обязательно добавлю ниже.

1.5 И так, мы проверили, нас пускает без пароля, однако при перезагрузке всё, что мы сделали — будет безвозвратно утеряно. Поэтому делаем следующее:

копируем наш id_rsa (на всякий случай) и authorized_keys в каталог /usr/local/config/ (оттуда и выполнятся загрузка) :

cp /home/root/.ssh/authorized_keys /usr/local/config

тут пояснять особо нечего cp — копировать, откуда и куда.

1.6 Записываем всё, что сделали в первый раз в скрипт, который в последствии будет настраивать в редакторе vi

vi /usr/local/config/ssh_on_run ## запускаем редактор, создавая файл с именем

I — переходим в режим редактирования

#!/bin/bash
mkdir /home/root/.ssh
chmod 700 /home/root/.ssh
cp /usr/local/config/authorized_keys /home/root/.ssh
chmod 644 /home/root/.ssh/authorized_keys
Сам скрипт

Esc — переключаемся в режим работы с терминалом
:wq — сохраняем файл и выходим

Данный скрипт просто повторяет все действия, которые мы выполнили ранее.

1.7 Нам необходимо отредактировать файлик /usr/local/config/config.xml — который и выполняет запуск, добавив туда наш скрипт, я забирал файл с помощью cp и редактировал на своем пк, потом заменял его обратными действиями. Можно выполнить это на месте с помощью встроенного редактора vi. Решать вам:

В теле xml находим открывающий тег и идем от него, там по порядку описаны запускающиеся сервисы и иные приложения, в моем случае они заканчивались с <name id="9"> , после этого я и в пихнул наш скрипт, но с id=20 :

<name id="20">ssh_on_run</name>

Чуть ниже сами задачи будут расписаны более подробно, поэтому для простоты ищем закрывающий тег и добавляем над ним условия для выполнения нашего скрипта:

<ssh_on_run>
  <item id="1">
  <method>3</method>
   <1>*/5</1>
    <2>*</2>
    <3>*</3>
    <4>*</4>
    <5>*</5>
    <run>/usr/local/config/ssh_on_run.sh</run>
  </item>
</ssh_on_run>
  1. Дело за малым, настроить rsync для копирования на FreeNas.
    Для начала я настроил необходимые pool для своих бэкапов. Тут в принципе не думаю что проблемы у кого то будут, к тому же оно идивидуально под каждый случай свое. Далее варианта два, у фринас есть встроенный функционал rsync, однако я с этим GUI не разобрался и пошел по старинке.

Я добавил ряд скриптов в crond — аля планировщик задач, только на *nix.

rsync -avzhe 'ssh -p 12345' --ignore-existing [email protected]:/mnt/HD/HD_a2/catalogdlybackupov /mnt/raid/catalogdlyabackupov

rsync — утилита для синхрона
-a, --archive — работа в режиме архивирования, сохраняются права доступа и информация о владельцах;
-v, --verbose — говорливость, выводит имена обрабатываемых файлов;
-z, --compress — включить сжатие передаваемых данных;
-h, --human-readable вывод цифр в читаемом виде (Кб, Мб, Гб)
-e — используемый интерфейс
'ssh -p 12345' — говорим что rsync по ssh с портом таким том
--ignore-existing — пропускать существующие файл (он сравнивает файлы и если есть 1 в 1 не выкачивает)

Дальше — путь откуда брать и куда класть. И сохраняем указав периодичность выполнения в интерфейсе FreeNas

На этой прекрасной ноте у меня. Пишите комменты, задавайте вопросы. Буду рад ответить)

Во время проработки данного вопроса пользовался следующими материалами:

Оставьте первый комментарий

Отправить ответ

Ваш e-mail не будет опубликован.


*