Automatyczna kopia zapasowa Mikrotika
Bardzo lubię routery Mikrotika (a dokładniej RouterOS zainstalowany na platformie RouterBoard). Konstrukcje te mają całkiem fajny stosunek możliwości do ceny i w miarę poukładany (jak dla mnie) interfejs. Za ich pomocą można stworzyć naprawdę rozbudowane konfiguracje (szczególnie na większych pudełkach typu CCR), zawierające kilka niekoniecznie zależnych od siebie mechanizmów. I tutaj pojawia się tytułowe zagadnienie: mając router z dopracowaną w najdrobniejszych szczegółach konfiguracją, dobrze byłoby zgrać ją gdzieś na bok, uodparniając nasze środowisko na awarię sprzętu. Co więcej, dobrze by było, gdyby kopia bezpieczeństwa wykonywała się okresowo sama, uwalniając nas od konieczności pamiętania o takim szczególe. Jest to szczególnie ważne wszędzie tam, gdzie konfiguracja dynamicznie się zmienia (choćby ze względu na wpisy w firewallu lub definicje adresów MAC w serwerze DHCP).
Okazuje się, że mając do dyspozycji komputer działający pod kontrolą Linuksa, możemy taki mechanizm w prosty sposób uruchomić. Co więcej, nie będzie nam potrzebne nic, poza klientem SSH i SCP.
Załóżmy, że nasz router znajduje się pod adresem 10.0.0.1 i mamy na nim poprawnie skonfigurowaną usługę SSH. Pierwszym krokiem jest wygenerowanie pary kluczy na komputerze, na który będziemy pobierać konfigurację routera:
[kbechler@waterfall ~]$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/kbechler/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/kbechler/.ssh/id_dsa.
Your public key has been saved in /home/kbechler/.ssh/id_dsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx kbechler@waterfall
The key's randomart image is:
+--[ DSA 1024]----+
[....]
+-----------------+
[kbechler@waterfall ~]$
Wynikiem tego polecenia będą dwa pliki, zawierające nasz klucz prywatny (~/.ssh/id_dsa) oraz publiczny (~/.ssh/id_dsa.pub). Pamiętajmy, że klucz prywatny jest tajny i pod żadnym pozorem nie powinniśmy go udostępniać osobom trzecim!
Drugim krokiem jest skopiowanie klucza publicznego do routera. Najprościej jest to uczynić przez SSH, np. za pomocą takiego polecenia:
[kbechler@waterfall ~]$ scp ~/.ssh/id_dsa.pub kbechler@10.0.0.1:/
id_dsa.pub 100% 618 0.6KB/s 00:00
[kbechler@waterfall ~]$
Tak, wrzucam plik do głównego katalogu routera. Nie przeszkadza mi to specjalnie i nie wydaje się błędem.
Krok trzeci, to przypisanie klucza publicznego do odpowiedniego użytkownika na routerze. Za pomocą konsoli routera robi się to tak: user ssh-keys import public-key-file=id_dsa.pub user=kbechler
W tym momencie powinniśmy mieć możliwość zalogowania się na router bez podawania hasła (za pomocą kluczy SSH). Sprawdźmy, czy to na pewno działa:
[kbechler@waterfall ~]$ ssh kbechler@10.0.0.1 "/system health print"
voltage: 23.8V
temperature: 34C
[kbechler@waterfall ~]$
Jeżeli zadziałało, to ostatnim krokiem jest napisanie prostego skryptu, który będzie wykonywał na routerze kopię konfiguracji i pobierał ją na lokalny komputer. Można to zrobić na przykład tak (wersja dla kilku urządzeń, która zapisuje kopie zapasową w postaci pliku binarnego, jak i skrypt z poszczególnymi poleceniami konfigruacyjnymi):
#!/bin/bash
DEST="/data/backup"
TODAY=`date +%Y%m%d`
for r in 10.0.0.1 192.168.0.1; do
echo "*** Zapisuje konfiguracje routera ${r}..."
ssh -l kbechler ${r} "export compact file=backup; system backup save name=backup"
echo "*** Kopiuje konfiguracje z routera ${r}..."
scp kbechler@${r}:/backup.backup ${DEST}/mikrotik/${r}.${TODAY}.backup
scp kbechler@${r}:/backup.rsc ${DEST}/mikrotik/${r}.${TODAY}.rsc
done
UWAGA! W pobranych plikach znajdują się dane wrażliwe. Nie należy przechowywać ich w niezabezpieczonym miejscu. Co więcej, jeżeli do routera mają dostęp także inne osoby, to po pobraniu plików należy je usunąć z pamięci flash routera.