TL;DR
- 100MB/リクエストのアップロード制限があるよ
- 踏み台を立てて
Tailscaleを通そう - nextcloudならチャンク分割でいけるかも
はじめに
おうちサーバーでいろいろセルフホストされている皆様、ポート開放いらずでサービス公開できるCloudflare Tunnel、重宝されているのではないでしょうか。
immichで外出先からスマホの写真をアップロードしたり、nextcloudで友人とファイルのやりとりをしたり、いろいろ使っていると思います。
が、いざimmichに長時間の動画をアップロードしようとしたときに413 Request Entity Too Largeで弾かれたり、オンラインストレージにzipを投げて渡そうと思ったらめちゃくちゃにアップロードが遅くなったりします。
これは、Cloudflare Tunnelにクライアントからのアップロードは100MB/1リクエストまでという制限のためです。
さて困ったぞ、我が家は固定IPを申し込んでいないからポートを開けられない、開けられるけど生IP出したくないって方のために代替策を書いていきます。
ポート自由に開けられるおうちで生IPなんか気にしないって方はおとなしく自宅に直接接続してください。
踏み台VPS + Tailscale + リバースプロキシ(Nginx or HAProxy)
私が思いつく限りベストの選択肢です。
2,000円弱/月程度で借りられるVPSを踏み台にしつつ、advertise routeした自宅tailscaleに踏み台側から接続します。
tailscaleのSubnet Routerを利用して踏み台VPSから自宅内ネットワークへの全アクセスを取得します。(もちろんサービスノードに直接tailscaleをインストールしてもOK)
踏み台側のリバースプロキシからtailscaleネットワークを経由してローカルネットワークに転送する構成です。
メリット
- ポート開放が不要
- 転送ルートがセキュア
デメリット
- 踏み台VPSの料金がかかる
- VPSによっては月次転送量や速度制限がかかる
VPS業者
個人的なおすすめはAkamaiのLinodeです。
東京リージョンがあり、それなりに安く使えます。
イン40Gbps/アウト2Gbpsを提供します。
サンプル設定とか
Nginxのデフォルト転送設定もアップロード容量制限があるので、もろもろ対策したnginxのconfサンプルです。
server {
listen 443 ssl;
server_name immich.example.com;
# SSL設定とかここ
location / {
# 自宅サーバーのTailscale IP (例: 100.x.y.z)
# Subnet Routerを使っていればローカルIPアドレスでOK
proxy_pass http://100.10.20.40:2283;
# 必須設定
client_max_body_size 0; # 無制限にする
proxy_read_timeout 600s;
proxy_send_timeout 600s;
# ヘッダー情報の転送
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket対応 (Immich/Nextcloud等で必要)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
アクセス元IPアドレスについて
この構成だとアクセス元IPアドレスがすべてVPSのものになります。
自宅側のHTTPサーバー(ここではnginx)で書き換えてあげましょう。
set_real_ip_from 100.10.20.30; # ← 踏み台VPSのIPを入れる
# どのヘッダーを見てIPを復元するか指定
real_ip_header X-Forwarded-For;
# 再帰的な検索を有効化(多段プロキシの場合に有効)
real_ip_recursive on;
nextcloudはconfig.phpにこんな感じの設定を入れてもいいと思います。
'trusted_proxies' => ['100.10.20.30'], // VPSのIPを指定
'forwarded_for_headers' => ['HTTP_X_FORWARDED_FOR'],
セキュリティとか
踏み台のVPS乗っ取られたら自宅ネットワーク終わりじゃね、って思ったあなた、大正解です。
tailscaleのACLはちゃんと設定しましょう。
{ "action": "accept", "src": ["tag:vps"], "dst": ["tag:home-server:80", "tag:home-server:443"] }
こんな感じのACLで、自宅サーバーへの転送対象ポートを制限できます。
完全無料で出来ない......ってコト!?
できないこともないです。
OCIのAlwaysFreeのArmインスタンスならそこそこの性能で使えたはずです。(うろ覚え)
アウトバウンドも最大10TBくらいまでいけた気がします。
ただし、いつAlwaysFreeがなくなるかわからない上、アカウント審査が厳しめです。
GCPの無料枠だと大容量トラフィック流したときにVMがフリーズします。
あと普通にセットアップ時のストレスがデカい。
というか固定IPなんかどこでも500円ちょいなんだから大人しく申し込めばいいと思います。
おまけ
nextcloudに限りますが、アップロード時のチャンク分割設定を利用して制限を回避できます。
ただし、分割量が増える分CPUリソースを消費します。
1チャンク90MBにしています。
occ config:system:set --type int --value 94371840 files.chunked_upload.max_size
