Back to all posts
DevOps

VPNを捨てよう:自宅ネットワークへのパケットロスゼロのプライベートトンネルを構築する

あなたは地球の裏側のホテルに座り、フリーズしたターミナルを見つめています。簡単なSSHコマンドでEnterを押しても、カーソルが点滅するだけです。5分後:Operation timed out(操作がタイムアウトしました)。会社のVPNを立ち上げて再試行すると、今度はジオブロッキングのせいでAPI呼び出しが失敗します。

現実を見ましょう:商用VPNは開発者向けではありません。メンテナンスの悪夢であり、そのIPは地球上のすべてのファイアウォールにフラグを立てられ、標準的な国際ルーティングによるパケットロスはあなたのワークフローを破壊します。

重要なのはこれです。私たちは、岩のように堅固な、ブロック防止のブリッジを構築します。プレミアムVPSを使用してVIPインターネットレーンでトラフィックを捕捉し、リビングルームにあるRaspberry Piに直接穴を開けます。フリーズしたターミナルも、ジオブロックもありません。自宅ネットワークへの生で無制限のアクセスだけです。

ディープダイブ:なぜ標準的なVPNは失敗するのか

ランダムなクラウドサーバーにWireGuardやOpenVPNをデプロイするだけでは、検閲が厳しい地域におけるディープパケットインスペクション(DPI)によって、数時間以内に接続がフラグ付けされ、スロットル(帯域制限)がかけられます。

これに打ち勝つには、2つのものが必要です:

  1. プレミアムルーティング (AS9929/AS10099): これは物理層です。混雑したパブリックネットワークノードをバウンドする代わりに、エリートで低レイテンシのエンタープライズケーブルに位置するVPSを購入します。
  2. VLESS-Reality: これは変装です。VLESS-Realityは、プロキシトラフィックのように見える代わりに、主要なサイト(iCloudやWindows Updateなど)にアクセスする標準的なHTTPSトラフィックとまったく同じように見せます。ファイアウォールには、プライベートネットワークにトンネリングしている開発者ではなく、単にカレンダーを同期している人物しか見えません。

それでは構築しましょう。

プライベートトンネルシステム図


フェーズ1:エリート・リレー(SaltyFish VPS)を入手する

パケットロスゼロのブリッジを構築するには、インターネットの「VIPレーン」に位置するVPSが必要です。ここではSaltyFishを例に使用します。彼らはプレミアムエンタープライズルーティング(AS9929とAS10099)を専門としており、これは国際的な混雑を克服するために不可欠だからです。

1. 登録

portal.saltyfish.io にアクセスし、アカウントを登録します。サーバーの資格情報と請求に必要になるため、実際のメールアドレスを使用してください。

2. 適切なパッケージの選択

ログインし、Services(サービス) -> **Order New Services(新規サービスの注文)**に進みます。

  • Location(場所):"San Jose - Premium" または "Frankfurt - Premium" を探します。
  • Network(ネットワーク):説明に AS9929 または AS10099 が記載されていることを確認してください。これが秘伝のソースです。標準の「BGP」ルートでは同じ安定性は得られません。
  • Specs(スペック):最小の 1vCPU / 1GB RAM プランで、ネットワークトンネルには十分すぎます。

3. チェックアウト

OSとして Debian 12 を選択します。強力なrootパスワードを設定します。支払いを完了します。ステータスが「Active(アクティブ)」になったら、Server IP Address(サーバーIPアドレス) をコピーします。


フェーズ2:クラウドブリッジ(VPS)のデプロイ

VPSは私たちの安定した中継ステーションとして機能します。プレミアムケーブルでトラフィックをキャッチし、自宅に転送します。

ターミナルを開き、新しいSaltyFish VPSにSSH接続して、Dockerを起動します。非常に簡単です:

# VPSにログインし、パスワードを入力
ssh root@[IP_ADDRESS]

システムを更新し、公式スクリプトを使用してDockerをインストールします:

# パッケージを更新し、前提条件をインストール
apt update && apt install -y ufw curl wget nano

# 公式のDockerインストールスクリプトを取得
curl -fsSL https://get.docker.com | sh

# Dockerデーモンを有効にして開始
systemctl enable docker && systemctl start docker

次に、ファイアウォールをロックダウンします。ポート443(クライアント用)と7000(Raspberry Pi用)のみが必要です。

ufw allow ssh
ufw allow 7000/tcp
ufw allow 443/tcp
ufw --force enable

これで、FRPサーバー(frps)をデプロイします。これはリバースプロキシの魔法を処理するため、自宅のルーターのポートフォワーディングをいじる必要はありません。

mkdir -p /root/frp && cd /root/frp

# Dockerを実行する前に設定ファイルを作成
nano frps.toml

プロのヒント: Dockerコマンドを実行する前にfrps.tomlファイルを作成することをスキップしないでください。存在しないファイルをDockerボリュームマウントに渡すと、Dockerはそれをディレクトリと見なし、frps.tomlという名前のフォルダを作成します。厄介なOCI runtime create failedエラーが発生し、それをrm -rfで削除しなければならなくなります。この頭痛の種を避けてください。

これをfrps.tomlに貼り付けます:

# VPS(例:Saltyfish VPS)の設定
serverAddr = "Your_VPS_Public_IP"
# Raspberry Piが接続するポート
bindPort = 7000
# 推測されないようなものに変更してください
auth.token = "YOUR_SUPER_SECRET_PASSWORD" 

[[proxies]]
name = "xray-reality"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8443
remotePort = 443

スピンアップします:

docker run -d --name frps --restart=always \
  --network host \
  -v /root/frp/frps.toml:/etc/frp/frps.toml \
  snowdreamtech/frps

フェーズ3:ホームベースのロックダウン(Raspberry Pi)

今度はクラウドから離れて自宅に向かいます。セキュアトンネルの終端として機能するようにRaspberry Piを準備する必要があります。

3.1 接続性の確認

ログインを試みる前に、Raspberry Piがローカルネットワーク上で生きていることを確認してください。IPアドレスを見つけ(通常はルーターの管理ページから)、pingを送信します:

ping YOUR-PI-IP # またはIPを直接使用

0.0% packet loss と表示されれば、準備完了です。

3.2 Raspberry PiへのSSH接続

ターミナルを開き、Piにジャンプします。初めて接続する場合は、「ホストの真正性(authenticity of host)」に関する警告が表示されます。yesと入力して、それをknown_hostsに追加します。

ssh your_username@YOUR-PI-IP # ローカルIPアドレス、またはRaspberry Piのホスト名を使用します。

3.3 「コマンドが見つかりません(Command Not Found)」の罠

多くの開発者がすぐにDockerコマンドを実行しようとして、-bash: docker: command not found に見舞われます。パニックにならないでください。それは単にDockerがまだインストールされていないことを意味します。

エンジンを稼働させるために、公式の便利なスクリプトを実行します:

curl -fsSL https://get.docker.com | sudo sh

3.4 権限管理

デフォルトでは、Dockerにはroot権限が必要です。5秒ごとにsudoと入力するのを避けるために、ユーザーをdockerグループに追加します:

# $USERを実際のユーザー名に置き換えてください
sudo usermod -aG docker $USER
newgrp docker

3.5 3X-UI コントロールパネルのデプロイ

次に、オペレーションの頭脳をデプロイします。このパネルはVLESS-Realityの認証情報を管理します。

docker run -itd \
   -p 2053:2053 \
   -p 8443:8443 \
   --name 3x-ui \
   --restart=always \
   ghcr.io/mhsanaei/3x-ui:latest

3.6 FRPクライアントの接続

最後に、Piをクラウドブリッジ(VPS)に接続し直す必要があります。

パスに関するプロのヒント: /home/pi/frpのようなハードコードされたパスを使用しないでください。セットアップによっては、ホームディレクトリがユーザー名にちなんで名付けられている場合があります(例:/home/elvisli)。ホームフォルダを参照するには、常に ~/ を使用してください。

mkdir -p ~/frp && cd ~/frp
nano frpc.toml

設定を貼り付けます(VPSのトークンと一致させます):

serverAddr = "YOUR_VPS_PUBLIC_IP"
serverPort = 7000
auth.token = "YOUR_SUPER_SECRET_PASSWORD"

[[proxies]]
name = "xray-reality"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8443
remotePort = 443 

「ペーストのゴミ(Paste Garbage)」に注意: ターミナルに ^[[200~ が表示された場合は、「ブラケット・ペースト・モード」がうまくいっていないサインです。これは、ブラウザからターミナルにコピーする際によく発生します。コマンドを実行する前に、バックスペースでこれらの余分な文字を削除してください。

トンネルクライアントを起動します:

docker run -d --name frpc --restart=always \
  --network host \
  -v ~/frp/frpc.toml:/etc/frp/frpc.toml \
  snowdreamtech/frpc

物理トンネルが確立されました。自宅のPiはクラウドVPSに「見える」ようになりました。

フェーズ4:VLESS-Realityクローク(外套)の設定

ローカルネットワーク上のブラウザを開き、http://YOUR_PI_LOCAL_IP:2053 にアクセスします。admin / admin でログインします。

  1. Inbounds(インバウンド) -> Add Inbound(インバウンドの追加) に進みます。
  2. Protocol(プロトコル)を vless に、Port(ポート)を 8443 に設定します。
  3. Flow(フロー)を xtls-rprx-vision に設定します。
  4. Security(セキュリティ)を reality に設定します。
  5. uTLS を chrome に設定し、Dest/Server Names を www.icloud.com:443 に設定します。(これにより、トンネルがAppleのクラウド同期トラフィックと同一に見えるようになります)。
  6. Get New Keys(新しいキーの取得) と Generate(生成)(ShortIds用)をクリックします。
  7. 保存します。

新しいルールの横にあるQRコードアイコンをクリックし、Copy Link(リンクのコピー) をクリックします。vless://... で始まるごちゃごちゃした文字列が得られます。

フェーズ5:クライアントのセットアップ(iPhoneおよびMac用のShadowrocket)

PiからVPSへのトンネルが稼働したので、電話を接続する必要があります。

5.1 ノードのエクスポート

  1. 3X-UIパネルにアクセスします。
  2. VLESSインバウンドの3つのドット(メニュー)をクリックします。
  3. "Export All URLs"(すべてのURLをエクスポート) を選択します。これにより、vless:// リンクがクリップボードにコピーされます。

5.2 Shadowrocketへのインポート

  1. iPhoneで Shadowrocket を開きます。
  2. クリップボードのリンクが自動的に検出され、追加するかどうか尋ねられるはずです。Add(追加) をクリックします。
  3. ポップアップが表示されない場合は、+ アイコンをクリックし、Type(タイプ) を URI に設定して、リンクを貼り付けます。

5.3 ブリッジの構成

これが最も重要なステップです。デフォルトでは、ノードはPiのローカルIPを指しています。これをクラウドブリッジにリダイレクトする必要があります。

  1. 新しいノードの横にある (i) アイコンをタップします。
  2. Address(アドレス):ローカルIPを削除し、SaltyFish VPSパブリックIP を入力します。
  3. Port(ポート):これを 443 に変更します。
  4. Type(タイプ):VLESS となっていることを確認します。
  5. Save(保存) をクリックします。

5.4 起動テスト

外部の世界からアーキテクチャが機能することを証明するために:

  1. Wi-Fiをオフにします。Cellular Data(5G/LTE)を使用していることを確認してください。
  2. Shadowrocketで、自分のノードを選択します(小さなオレンジ色の点が表示されます)。
  3. メインスイッチを Connected(接続済み) に切り替えます。
  4. google.com にアクセスします。ロードされたら、パブリックインターネットから自宅のネットワークへのトンネリングに成功しています。

フェーズ6:macOS 開発者のセットアップ

開発者にとって、単なるブラウザプロキシを持っているだけでは十分ではありません。ワークステーション全体にトンネルを尊重させる必要があります。

6.1 インストール

Apple Silicon Mac (M1/M2/M3) をお持ちの場合は、Mac App Store から macOS 版の Shadowrocket を直接インストールできます。これはサードパーティのラッパーを使用するよりもはるかに効率的です。

6.2 ターミナルプロキシ

macOS のターミナルアプリ(Git、npm、curl)は、通常、システムの VPN 設定を無視します。これらを手動で「配線」する必要があります。

  1. ローカルポートの確認:Shadowrocket Mac で、Settings(設定) -> Proxy(プロキシ) に移動します。HTTP/SOCKS5 ポート(通常は 1082)をメモします。

  2. 即時プロキシ:現在のセッションをプロキシ化するために、ターミナルでこれを実行します:

export http_proxy=http://127.0.0.1:1082
export https_proxy=http://127.0.0.1:1082

テストします:curl -I https://www.google.com。HTTP/2 200 が表示されれば、機能しています。

  • 永続的なエイリアス:エレガントなワークフローのために、これらを ~/.zshrc に追加します:

  • # プロキシをオンにする
    alias proxy="export http_proxy=http://127.0.0.1:1082; export https_proxy=http://127.0.0.1:1082; echo 'Terminal Proxy ON'"
    # プロキシをオフにする
    alias unproxy="unset http_proxy https_proxy; echo 'Terminal Proxy OFF'"
    

    source ~/.zshrc を実行します。これで proxy と入力するだけで暗躍できます。


    フェーズ7:Git SSH プロキシ

    これはほとんどの開発者が陥る「罠」です。GitHubにSSHキー(git clone git@github.com...)を使用している場合、SSHプロトコルを使用しているため、http_proxyは完全に無視されます。

    これを修正するには、ローカルトンネルを使用するようにSSHクライアント自体を設定する必要があります。

    1. SSH構成を編集します:nano ~/.ssh/config。
    2. 一番上にこのブロックを追加します:
    Host github.com
        HostName github.com
        User git
        # GitHubのSSHトラフィックをShadowrocketのSOCKS5ポート経由に強制する
        ProxyCommand nc -X 5 -x 127.0.0.1:1082 %h %p
    
  • 保存して終了します。これで、どこにいてもgit pushコマンドがプライベートトンネルを通って飛んでいくようになります。
  • 結論

    あなたはもはや公共のWi-Fiや商用VPNのブロックのなすがままではありません。あなたは、リモートワークステーションを自宅の拠点に直接接続する、エンタープライズグレードのプライベートルーターレーンを手に入れました。

    安全で。高速に。ハッピーコーディング。