果報

二度寝して待つ

TailscaleとSambaで自分専用のファイル共有サーバを作る

Tailscaleネットワーク(tailnet)からのみ接続できるファイル共有領域をSambaで自宅サーバ上に構築したときのメモです。

前提として、以下の環境で作業します。

  • OS: Ubuntu 24.04 LTS
  • samba: 4.19.5-Ubuntu
  • tailscaled: 1.80.2

余談ですが、Sambaのコンテナ化も一時考えましたが、ホストとコンテナ間の連携が複雑そうで断念しました。

Samba

sambaのインストール

aptでインストールします。

$ sudo apt install samba -y

ファイル共有するディレクトリの作成

sambaでファイル共有するディレクトリを作成します。

$ mkdir -p /mnt/smb

smb.confの編集

この記事で最も肝となるsambaの設定を編集します。一応、編集前にバックアップします。

$ sudo cp -a smb.conf smb.conf.default
$ sudo nano /etc/samba/smb.conf

設定内容は色々試行錯誤して、最終的に以下に落ち着きました。

[global]
   workgroup = WORKGROUP
   server string = %h
   interfaces = lo enp1s0
   bind interfaces only = yes
   smb ports = 445
   min protocol = SMB3
   hosts allow = 100.64.0.0/10
   unix extensions = no
   load printers = no
   log file = /var/log/samba/log.%m
   max log size = 1000
   logging = file
   panic action = /usr/share/samba/panic-action %d
   server role = standalone server
   obey pam restrictions = yes
   unix password sync = yes
   passwd program = /usr/bin/passwd %u
   passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
   pam password change = yes
   map to guest = bad user
   usershare allow guests = no
   unix charset = UTF-8
   dos charset = CP932
   disable netbios = yes
   disable spoolss = yes
   use sendfile = yes
   min receivefile size = 16384
   aio read size = 16384
   aio write size = 16384
   dfree cache time = 60
   block size = 4096

[smb]
   path = /mnt/smb
   security = user
   writable = yes
   read only = no
   guest ok = no
   force user = xxxxx
   force group = xxxxx
   create mask = 0644
   force create mode = 0644
   directory mask = 0755
   force directory mode = 0755
   store dos attributes = yes
   map archive = no
   dos filemode = yes
   valid users = xxxxx
smb.confの詳細

以下、デフォルトから変更した箇所を補足します。ちなみに、日本語の完全リファレンスは一応あるのですが、長年の変更によってものすごいボリュームで、結局何を設定すればいいのか分からないです。

   interfaces = lo enp1s0
   bind interfaces only = yes
   smb ports = 445

sambaで使うNICとポートを限定します。ポートはこのあと設定するTailscaleとも関連します。

   min protocol = SMB3

個人用途なので、最新のSMBプロトコルしか使用しないようにします。

   hosts allow = 100.64.0.0/10

接続元のIPアドレスをTailscaleネットワーク100.64.0.0/10にして、アクセスを限定します。今回はやりませんが、特定の端末IPだけとか、もっと限定することも可能です。

   unix charset = UTF-8
   dos charset = CP932

UNIX(Linux)とWindowsでの文字コードを指定します。

   use sendfile = yes
   min receivefile size = 16384
   aio read size = 16384
   aio write size = 16384
   dfree cache time = 60
   block size = 4096

性能向上のためのバッファサイズ等の設定のようですが、参考サイトからのコピペで、正直よくわかってません。

   store dos attributes = yes
   map archive = no
   dos filemode = yes

Windowsファイルのファイル属性(実行/アーカイブ等)やアクセス権の動作をWindowsに近い動作にする設定のようですが、参考サイトからのコピペで、正直よくわかってません。

smb.confの検証

以下のコマンドでsmb.confの検証ができます。エラーがなければOKです。

$ sudo testparm

sambaユーザの追加

以下のコマンドでsambaユーザを追加します。今回はOSと同じにしました。

$ sudo pdbedit -a $USER

表示されるプロンプトに従ってパスワードを設定します。

sambaの再起動

以下のコマンドでsambaを再起動し、smb.confを反映します。

$ sudo systemctl restart smbd

Tailscale

tailscaledのインストール

公式ドキュメントに従って、以下のコマンドでTailscaleクライアントをインストールします。

$ curl -fsSL https://tailscale.com/install.sh | sh

TCPポートフォワーダーの設定

tailscale serveという機能を使用して、Tailscaleネットワークからの445ポートへのアクセスを、ローカルの445ポート(samba)に転送します。

$ sudo tailscale serve --bg --tcp 445 tcp://localhost:445

tailscale serveは他にも色々なことに使えて、例えばTailscaleネットワーク限定でHTTPSのウェブサイトを公開することもできる便利な機能です。

tailscale.com

動作確認

Tailscaleクライアントをインストールした端末であれば、エクスプローラー等から以下のアドレスで接続できるはずです。

\\{tailscaleホスト名}\{samba共有名}

おわりに

構築する前は「2025年に今更Sambaなんて…」と気分が上がらなかったですが

  • 一般的なエクスプローラーで直感的にファイルを操作できる
  • Tailscaleさえあれば自宅以外からでも接続できる(スマホからの接続もOK)
  • TailscaleによるVPN接続なので、自宅サーバのポートを新たに開放する必要がない

と、Tailscaleと組み合わせることでメリットがたくさんあり、今では便利に使ってます。

参考リンク

blog.future.ad.jp

zenn.dev

github.com