baculaでバックアップのままの設定だと外部のバックアップが取れない。
と言うのも、Firewallの外から内部にアクセス出来ないからだ。
あろうことか、Bacula File Daemonはこれをやろうとする。いや、やろうとしてもどういう設定にして良いのかわからないはずだ。
NATだからローカルIPアドレスを設定すればいいの?
てか、そもそも動的IPだとFile DaemonからSorage Daemonにアクセスする為にちょこちょこIPアドレスを書き換えないといけないじゃん!
あっ、グローバルIPに書き換えたらLAN内のバックアップが取れないじゃん!!
なんて事にはならず、普通はVPNを張ったりするだろう。
ここでは(私は違うが)面倒くさがり屋の為に、VPN環境を構築せず既存の環境のままバックアップする方法を書く。
Contents
前提
- VPSやレンタルサーバ、専用サーバなど、バックアップ対象がLAN内に無い。
- 動的IPでインターネットに接続している。
※もちろんこれらの制約が無くても可。
事前準備
Storage Daemonに付ける適当なホスト名を考える。変な名前でなければなんでもOK。
鍵認証
パスフレーズ無しでログイン出来るようにする。
vipwでbaculaユーザを一時的にログイン可能にして公開鍵認証を新たに設定するか、既存ユーザの.ssh配下をbaculaユーザのホームディレクトリにコピーしてオーナーを変える。
なお、ポートフォワードやトンネリングは良く行なわれているが、以下の設定ではこの逆(リバース)を行なう。
ディレクタのStorage設定
bacula-dir.confの該当するStorageのaddressを事前準備で考えたホスト名に変える。
Webminでは、左カラムの「Bacula Backup System」→「Storage Daemons」→該当ストレージ名→「Hostname or IP address」にStorage Daemonに付けるホスト名を設定する。
baculaサーバ側の名前解決
bacula Storage Daemin(LAN内/ローカル)のサーバのhostsや内向きDNSにIPアドレスと考えたStorae Daemonのホスト名の設定を行う。
hostsの場合は
1 | vi /etc/hosts |
1 | [IPアドレス] [考えたStorage Daemonのサーバ名] |
のフォーマットで記述する。
baculaクライアント側の名前解決
bacula File Daemin(WAN/リモート/VPSやレンタルサーバ)側のサーバのhostsにIPアドレスと考えたStorae Daemonのホスト名の設定を行う。
1 | vi /etc/hosts |
1 | 127.0.0.1 [考えたStorage Daemonのサーバ名] |
のフォーマットで記述する。
上記の設定で各々Storage Daemonは自セグメント内にある事になる。
が、当然このままだとStorage Daemonが別なので、VPS側のバックアップは取れない。
これを同一にするためリバーストンネリングを行う。
リバーストンネリングを行うスクリプトの作成
Storage Daemonサーバにリバーストンネリングするshellスクリプトを作成する。
1 | vi /etc/bacula/reverse_port.sh |
1 2 | #!/bin/sh nohup ssh -fNtR 9103:localhost:9103 [vpsユーザ名]@[vpsサーバ名] > /dev/null 2>&1 & |
スクリプトの登録及び終了処理の登録
webminで「Bacuup Jobs」→「Add a new backup job」→「Command before job」に作成したスクリプト「/etc/bacula/reverse_port.sh」を、「Command after job」に「pkill -f ‘ssh -fNtR 9103’」を登録する。
これで
- リバーストンネリング作成
- Fire Daemonが自分自身のローカルのポートにバックアップデータを書き出す
- リバーストンネリングによりLAN内のStorage Daemonにバックアップデータが流される
- pkillでトンネリングの削除
という流れになる。
チェック項目
- リモート/ローカルそれぞれのファイアウォールは適切にポートが開けられているか?
- 回線ルータの設定はローカルのStorage Daemonに流れるようNAT / PATの設定がしてあるか?