ネットワーク暗号化差分バックアップ 2026年版
ネットワーク暗号化差分バックアップ 2026年版
ファイルシステムをネットワーク経由,暗号化,差分バックアップする方法を考えてみました.
ひと昔前は同じ事をするのに結構苦労したのですが,現在ではツールの進化とVPNの様なサービスの進化で,割と簡単に実現出来ます.
概要
遠隔地(例:親戚宅)へバックアップを保存する場合,以下の条件を満たす仕組みが望ましいです.
- 保存先ではデータ内容を読めない(暗号化)
- 差分転送によりネットワーク帯域を節約
- TB級データに対応
- 特殊ファイルシステムに依存しない
- SSH/VPN越しに安全に転送
- どんな事があっても復号出来るパスワードベースの暗号ロジック
この条件を満たすバックアップツールとして
restic を利用する構成を検討します.
resticとは
resticは暗号化・重複排除・スナップショット機能を持つバックアップツールです.
機能だけ見ればまるで btrfs ですが,これはファイルシステムではなく,EXT4など既存のファイルシステム上に構築されたデータベースです.
特徴
- クライアント側暗号化
- チャンク分割による差分転送
- 重複排除
- スナップショット管理
- SSH/SFTP経由での保存
- 単一バイナリで動作
- FUSEや特殊FS不要
保存先のストレージは完全に暗号化されるため,バックアップ保存先の管理者でもデータ内容を読むことは出来ません.
セキュリティ
resticの暗号化仕様
- AES-256
- Poly1305 MAC
- クライアント側暗号化
保存先には以下のようなランダムデータのみ保存されます.
repo/data/ab/abcdef123456…
rsyncとの比較
| 項目 | rsync | restic |
|---|---|---|
| 暗号保存 | × | ○ |
| 差分転送 | ○ | ○ |
| 重複排除 | × | ○ |
| スナップショット | × | ○ |
| 遠隔バックアップ | ○ | ○ |
TB級バックアップではresticの方が容量効率が高いです.
内部構造
resticはデータをチャンク化して保存します.
file
↓
chunk
chunk
chunk
同一チャンクは一度しか保存されないため,バックアップ回数が増えても容量増加は最小になります.
repository構造
repo/
- config
- data/
- index/
- snapshots/
dataディレクトリには暗号化されたデータチャンクが格納されます.
基本操作
repository作成
restic -r /mnt/restic init
パスワードを設定すると,
以降すべてのデータは暗号化されます.
バックアップ
例: /home をバックアップ
restic -r /mnt/restic backup /home
スナップショット確認
restic -r /mnt/restic snapshots
ファイル一覧確認
例: latest は最後にバックアップしたスナップショット.
restic -r /mnt/restic ls latest
最新バックアップを復元
restic -r /mnt/restic restore latest --target /restore
snapshot削除
古いバックアップを削除
restic forget --keep-last 7 --prune
これは
- 最新7個のスナップショットを残す
- 不要データを削除する
という意味です.
よく使う保持ポリシー
restic forget \ --keep-last 7 \ --keep-daily 14 \ --keep-weekly 8 \ --keep-monthly 12 \ --prune
意味
- 最新7回
- 14日分の日次
- 8週分の週次
- 12ヶ月分の月次
を残します.
–prune については後述.
パスワード入力を省略
パスワードファイルを作る.
echo "mypassword" > ~/.restic-pass chmod 600 ~/.restic-pass
利用
restic --password-file ~/.restic-pass snapshots
環境変数の利用
.bashrc などで,
# for restic export RESTIC_REPOSITORY=/mnt/restic export RESTIC_PASSWORD_FILE=/home/yourname/.restic-pass
-r /path/to/repo の入力とパスワード入力を省略出来ます.
tailscale VPNで遠隔バックアップ構成
tailscale インストール.
curl -fsSL https://tailscale.com/install.sh | sh
実行.
sudo tailscale up
–ssh オプションもあるが,これは tailscale の機能だけで ssh ログインするもので,OS 標準の OpenSSH (sftpとか)を利用する場合は不要らしい.
ブラウザが開くので google アカウントなどでログイン.
100.xxx.xxx.xxx みたいな IP アドレスが割り振られる.
ifconfig すると,tailscale0 みたいなインターフェースがアップリンクしている.
route には出ないが,userspace + wireguard で処理されているので普通のルーティングテーブルには出ない.
接続先のマシンでも同じ事を繰り返す.
100.100.xxx 単位から違うが,100.100.0.0/10 なので,同一ネットワークとなる.
ネットワーク内の状態を確認.登録した別マシンが見える.
tailscale status
この状態で,VPN 経由であらゆるアクセスが可能になっている.正直,手間要らずでかなり感動モノ.
システム起動時に実行されてるか確認.
systemctl status tailscaled
切断.
sudo tailscale down
MagicDNSの設定(マシン名でアクセス)
100.100.xxx.xxx は面倒.
ブラウザから設定ページで MagicDNS をオンにする.
すると,xxx-xxx.ts.net みたいなドメイン名が配布される.xxx 部分はランダムな組み合わせで,ある程度自由になる.
machine-name.xxx-xxx.ts.net みたいなホスト名でアクセス可能.
さらに,MagicDNS の補完機能により,machine-name のみでもアクセス可能.
但し,tailscale で初期状態で割り当てられたマシン名は,現在のマシン名,つまり,/etc/hostname の筈.
/etc/hosts と重複した場合は,そちらが優先されるので,LAN 内を見に行ってしまって繋がらない,という事は有り得る.
スマートな解決策としては,以下のどちらかかと.
- VPN 経由したい場合は常に machine.xxx-xxx.ts.net の形を使用する.
- tailnet 内のマシン名を変える.例: vpn-xxx
restic と組み合わせる.
例:Tailscale VPN + SSH
自宅PC
│
│ restic
│
Tailscale VPN
│
│ SFTP
│
親戚宅Linux
└ backup HDD
保存先はSFTP指定できます.
restic -r sftp:user@server:/mnt/restic backup /home
初回バックアップ高速化
TB級データでは初回バックアップが非常に重いです.そのため以下の運用が有効です.
- ローカルディスクでrepository作成
- 初回バックアップ実行
- repositoryを遠隔地へコピー
- 以後ネットワーク差分バックアップ
- ローカルrepository作成,初回バックアップ,repositoryコピー.
- ローカルrepository作成,初回バックアップ,repositoryコピー.
restic -r /mnt/localrepo init restic -r /mnt/localrepo backup /home rsync -a /mnt/localrepo/ user@server:/mnt/restic/
- 以後は遠隔repositoryへバックアップ
restic -r sftp:user@server:/mnt/restic backup /home
整合性チェック
repositoryコピー後は整合性確認を行います.
restic -r sftp:user@server:/mnt/restic check
自動バックアップ
cron例
crontab -e
毎日3時バックアップ
0 3 * * * restic -r sftp:user@server:/mnt/restic backup /home
古いバックアップ削除
保持ポリシー例
- 日次 7世代
- 週次 4世代
不要ファイルはそのままでは 実際には消されません .
restic prune または以下の様に forget + –prune して掃除する必要があります.
restic forget --keep-daily 7 --keep-weekly 4 --prune
バックアップスクリプト実例
#!/bin/bash
set -e
# ==== 設定 ====
REPO=/mnt/restic
PASSFILE=/root/.restic-pass
SRC=/home
LOG=/var/log/restic-backup.log
export RESTIC_REPOSITORY="$REPO"
export RESTIC_PASSWORD_FILE="$PASSFILE"
# ==== マウント確認 ====
mountpoint -q "$REPO" || {
echo "$(date) ERROR: repo not mounted" >> "$LOG"
exit 1
}
# ==== repo確認 ====
test -f "$REPO/config" || {
echo "$(date) ERROR: not a restic repo" >> "$LOG"
exit 1
}
echo "$(date) backup start" >> "$LOG"
# ==== バックアップ ====
restic backup "$SRC" >> "$LOG" 2>&1
# ==== 保持ポリシー ====
restic forget \
--keep-last 7 \
--keep-daily 14 \
--keep-weekly 8 \
--keep-monthly 12 \
--prune >> "$LOG" 2>&1
# ==== 整合性チェック(軽量)====
restic check --read-data-subset=1% >> "$LOG" 2>&1
echo "$(date) backup finished" >> "$LOG"
よくある事故
マウント忘れ
/mnt/restic が未マウントのままバックアップすると
ローカルディレクトリに保存されてしまいます.
対策としては,
mountpoint -q /mnt/restic || exit 1
ファイルチェック版.マウントされていないと,ファイルが存在しない.
test -f /mnt/restic/.restic-repo || exit 1
ディレクトリパーミッション制限.マウントポイントを 000 にしておく.
未マウントで書き込もうとすると,permission denied となる.
mkdir /mnt/restic chmod 000 /mnt/restic
pruneしない
forget だけでは容量は減りません.
restic forget --keep-last 7 --prune
repoをバックアップしてしまう
repoディレクトリをバックアップ対象にすると
自己参照になり容量が増え続けます.
除外
restic backup / --exclude /mnt/restic
まぁ,/ をバックアップするなら /dev や /tmp や /proc なども除外すべきですが.
まとめ
restic は非常に強力なバックアップツールですが,
運用で重要なのは次の3つです.
- マウント確認
- forget + prune
- 定期的な check
この3つを守れば,かなり安全に運用できます.
rsync を使い慣れた Unix ユーザーなら,違和感無く使いこなせると思います.
但し,挙動の違いは理解しておく必要があります. rsync src dst && rsync dst src とは違います.
元々のバックアップ元に上書きレストアした場合,レポジトリ内に存在しないファイルを消してくれる訳ではなく,飽くまで上書き展開となります.
(rsync では –delete を付けない挙動)
また,mount オプションがありますが,read only なので,さらにそこに rsync する事や,ファイルシステム感覚でマウントして中身を弄る事は基本出来ません.
tar 的な考え方を導入すると解りやすいです.そう,超高機能な tar です.
遠隔地バックアップ構成として
Tailscale + restic + cron
の組み合わせは
- 暗号化
- 差分転送
- スナップショット
- 大容量対応
を同時に実現できるため,家庭用遠隔バックアップ構成として非常に有効です.
おまけ
以下,restic –help の翻訳.
restic は,暗号化されたリポジトリに複数のファイルやディレクトリのバージョンを保存できるバックアップツールです.このリポジトリは,さまざまなバックエンドに保存されます.
使い方:
restic [コマンド]
利用可能なコマンド:
backup ファイルやディレクトリの新しいバックアップを作成
cache ローカルキャッシュディレクトリに対して操作
cat 内部オブジェクトを標準出力(stdout)に表示
check リポジトリに誤りがあるかチェック
diff 2つのスナップショットの差分を表示
dump バックアップされたファイルを標準出力(stdout)に表示
find ファイル,ディレクトリ,または restic ID を検索
forget リポジトリからスナップショットを削除
generate マニュアルページおよび自動補完ファイル(bash,zsh)を生成
help 任意のコマンドについてのヘルプ
init 新しいリポジトリを初期化
key キー(パスワード)を管理
list リポジトリ之内のオブジェクトを一覧表示
ls スナップショット内のファイルを一覧表示
migrate マイグレーションを適用
mount リポジトリをマウント
prune リポジトリから不要なデータを削除
rebuild-index 新しいインデックスファイルを作成
recover リポジトリからデータを回復
restore スナップショットからデータを抽出
self-update restic バイナリを更新
snapshots すべてのスナップショットを一覧表示
stats リポジトリをスキャンし,基本的な統計情報を表示
tag スナップショットのタグを変更
unlock 他のプロセスが作成したロックを解除
version バージョン情報を表示
フラグ:
--cacert file ルート証明書を読み込むファイル(デフォルト:システム証明書を使用)
--cache-dir string キャッシュディレクトリを設定(デフォルト:システムのデフォルトキャッシュディレクトリを使用)
--cleanup-cache 旧いキャッシュディレクトリを自動削除
-h, --help 任意のコマンドについてのヘルプ
--json JSONモードに設定(サポートするコマンドにのみ適用)
--key-hint string 最初に暗号化を試みるキーID(デフォルト:$RESTIC_KEY_HINT)
--limit-download int ダウンロードを最大速度(KiB/s)で制限(デフォルト:無制限)
--limit-upload int アップロードを最大速度(KiB/s)で制限(デフォルト:無制限)
--no-cache ローカルキャッシュを使用しない
--no-lock リポジトリをロックしない(読み取り専用リポジトリでの一部の操作を可能にする)
-o, --option key=value 拡張オプションを設定(key=value,複数回指定可能)
--password-command string パスワードを取得するシェルコマンドを指定(デフォルト:$RESTIC_PASSWORD_COMMAND)
-p, --password-file string リポジトリパスワードをファイルから読み込む(デフォルト:$RESTIC_PASSWORD_FILE)
-q, --quiet 詳細な進行状況報告を出さない
-r, --repo string バックアップまたは復元の対象リポジトリ(デフォルト:$RESTIC_REPOSITORY)
--tls-client-cert string PEM形式でエンコードされたTLSクライアント証明書とプライベートキーを含むファイルのパス
-v, --verbose n 詳細な出力(--verboseを複数回指定またはレベルnを指定)
より詳しい情報については,「restic [コマンド] --help」を実行してください.