ネットワーク暗号化差分バックアップ 2026年版

ozy's labo.


ネットワーク暗号化差分バックアップ 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級データでは初回バックアップが非常に重いです.そのため以下の運用が有効です.

  1. ローカルディスクでrepository作成
  2. 初回バックアップ実行
  3. repositoryを遠隔地へコピー
  4. 以後ネットワーク差分バックアップ
    • ローカル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」を実行してください.


Date: 2026-03-13

Author: ozyukiwo

Created: 2026-03-14 土 06:52

Emacs 26.3 (Org mode 9.1.9)

Validate