Xray-coreとXTLS-RealityによるLinuxでのステルスVPN構築:トラフィックが通常のHTTPSに見える

Network tutorial - IT technology blog
Network tutorial - IT technology blog

なぜ一般的なVPNはブロックされやすいのか?

50人規模のオフィスと小規模なデータセンターのネットワークを管理しているので、VPNがブロックされる問題は日常茶飯事だ。OpenVPN、WireGuard——どちらもセキュリティ面では優れているが、共通の弱点がある:トラフィックに固有の「フィンガープリント」が存在することだ。Deep Packet Inspection(DPI)なら数秒で検知してブロックできてしまう。

Xray-coreとXTLS-Realityはまったく異なるアプローチを採用している。VPNパケットをカプセル化して送信するのではなく、トラフィックを有名サイトへの通常のHTTPS通信に偽装する。ファイアウォールから見ると、馴染みのあるドメインへの正当なTLSハンドシェイクにしか見えない——何も怪しいものはない。この技術は「トラフィックカモフラージュ」とも呼ばれる。

XTLS-Realityは通常のVPNと何が違うのか?

  • OpenVPN/WireGuard:独自のヘッダーを持つ専用トンネルを作成するため、DPIで容易に検出される
  • XTLS-Reality:実在するWebサイト(例:www.microsoft.com)のTLS証明書を「借用」する——トラフィックはそのドメインへのHTTPS通信と見分けがつかない
  • 独自ドメインもSSL証明書も不要——サーバーは通常通り動作する
  • VLESSプロトコルを使用——VMessより軽量で、無駄なオーバーヘッドがない

開始前の準備

始める前に、以下のものを準備しておこう:

  • ブロックされていないネットワーク環境にあるLinux VPS(Ubuntu 20.04+またはDebian 11+)
  • rootまたはsudo権限でのサーバーへのSSHアクセス
  • nginxやapacheに使われていない443番ポート

このガイドはUbuntu 22.04で動作確認済みだ。443番ポートが使用中の場合は、Xrayを8443番に変更するか、nginxをリバースプロキシとして設定する——詳しくは記事末尾のトラブルシューティングで説明する。

Linux ServerへのXray-coreインストール

ステップ1:Xray-coreのインストール

Xray-coreには公式インストールスクリプトがある——コマンド1つで完了だ:

# Xray-coreの最新バージョンをインストール
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install

# バージョンを確認
xray version

インストーラーが残りの処理を自動的に行う:

  • バイナリを/usr/local/bin/xrayにダウンロード
  • systemdサービスxray.serviceを作成
  • /usr/local/etc/xray/にconfigディレクトリを作成

ステップ2:UUIDとXTLS-Reality用キーペアの生成

Realityの特徴は、通常のSSL証明書の代わりにX25519キーペアを使用する点だ。独自ドメインの取得も、Let’s Encryptも不要——従来の方法より格段にシンプルだ。

# UUIDを生成(クライアントの「パスワード」として使用)
xray uuid
# 出力例: a3f2b1c4-d5e6-7890-abcd-ef1234567890

# Reality用のキーペアを生成
xray x25519
# 出力:
# Private key: aBcDeFgH...
# Public key:  XyZwVuTs...

今すぐ3つを保存しておこう:UUIDPrivate keyPublic key。Private keyは特に機密性が高い——これを入手した人物はあなたのサーバーになりすますことができる。

ステップ3:ショートIDの生成

# ランダムなショートIDを生成(8バイトの16進数)
openssl rand -hex 8
# 例: a1b2c3d4e5f6a7b8

XTLS-RealityでのXray-core設定

サーバー側の設定

/usr/local/etc/xray/config.jsonを作成する:

{
  "log": {
    "loglevel": "warning",
    "access": "/var/log/xray/access.log",
    "error": "/var/log/xray/error.log"
  },
  "inbounds": [
    {
      "listen": "0.0.0.0",
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [
          {
            "id": "自分のUUIDを入力",
            "flow": "xtls-rprx-vision"
          }
        ],
        "decryption": "none"
      },
      "streamSettings": {
        "network": "tcp",
        "security": "reality",
        "realitySettings": {
          "show": false,
          "dest": "www.microsoft.com:443",
          "xver": 0,
          "serverNames": [
            "www.microsoft.com"
          ],
          "privateKey": "プライベートキーを入力",
          "shortIds": [
            "ショートIDを入力"
          ]
        }
      },
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "tag": "direct"
    },
    {
      "protocol": "blackhole",
      "tag": "block"
    }
  ]
}

理解すべき最も重要な3つのパラメータ:

  • dest: "www.microsoft.com:443"——トラフィックはMicrosoftへの接続に見える。TLS 1.3をサポートする任意の大手ドメインに変更可能
  • flow: "xtls-rprx-vision"——最新のXTLSモードで、現時点で最も効果的なDPIバイパス方式
  • privateKey——xray x25519コマンドで生成したPrivate key(Public keyではない!)を入力

サービスの起動

# ログディレクトリを作成
mkdir -p /var/log/xray
chown nobody:nogroup /var/log/xray

# 起動前にconfigを検証
xray run -test -config /usr/local/etc/xray/config.json

# 起動して自動起動を有効化
systemctl start xray
systemctl enable xray

# ステータスを確認
systemctl status xray
# UFW(Ubuntu)でポートを開放
ufw allow 443/tcp
ufw reload

# iptablesを使用する場合
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables-save > /etc/iptables/rules.v4

クライアント側の設定

接続文字列でのインポート(最速の方法)

最速の方法はURIを生成してアプリに直接貼り付けることだ。v2rayN(Windows)、v2rayNG(Android)、Shadowrocket(iOS)はすべてこのフォーマットに対応している:

vless://UUID@SERVER-IP:443?encryption=none&flow=xtls-rprx-vision&security=reality&sni=www.microsoft.com&fp=chrome&pbk=PUBLIC-KEY&sid=SHORT-ID&type=tcp#MyXrayVPN

それぞれの部分を置き換える:

  • UUID→ ステップ2で生成したUUID
  • SERVER-IP→ VPSのIPアドレス
  • PUBLIC-KEY→ Public key(Private keyではない)
  • SHORT-ID→ ステップ3で生成したShort ID

Linuxクライアントでの手動設定

Linuxクライアントでは、サーバーと同様の手順でXrayをインストールして独自のconfigを作成する。ローカルのXrayはポート1080でSOCKS5プロキシとして動作し、他のアプリはそこ経由でトラフィックをルーティングする:

{
  "inbounds": [
    {
      "port": 1080,
      "listen": "127.0.0.1",
      "protocol": "socks",
      "settings": { "udp": true }
    }
  ],
  "outbounds": [
    {
      "protocol": "vless",
      "settings": {
        "vnext": [
          {
            "address": "SERVER-IP",
            "port": 443,
            "users": [
              {
                "id": "UUID",
                "flow": "xtls-rprx-vision",
                "encryption": "none"
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "reality",
        "realitySettings": {
          "serverName": "www.microsoft.com",
          "fingerprint": "chrome",
          "show": false,
          "publicKey": "PUBLIC-KEY",
          "shortId": "SHORT-ID",
          "spiderX": "/"
        }
      }
    }
  ]
}
# Xrayクライアントを起動
xray run -config client-config.json

# SOCKS5プロキシ経由で接続をテスト
curl --proxy socks5h://127.0.0.1:1080 https://api.ipify.org
# 出力はVPSのIPになる——トラフィックがプロキシ経由であることを確認

確認とモニタリング

ログとサーバーステータスの確認

# リアルタイムでログを確認
journalctl -u xray -f

# アクセスログを確認
tail -f /var/log/xray/access.log

# エラーログを確認
tail -f /var/log/xray/error.log

# リッスン中のポートを確認
ss -tlnp | grep :443

クイックモニタリングスクリプト

毎朝Xrayの状態確認に使っているスクリプトだ——2秒でサーバーが正常かどうかわかる:

#!/bin/bash
# /usr/local/bin/xray-check.shに保存してchmod +xを実行

echo "=== Xray Service ==="
systemctl is-active xray && echo "Status: RUNNING" || echo "Status: STOPPED"

echo ""
echo "=== Active Connections ==="
ss -tnp | grep xray | wc -l | xargs -I{} echo "Connections: {}"

echo ""
echo "=== Last 5 Errors ==="
tail -5 /var/log/xray/error.log 2>/dev/null || echo "No errors"

echo ""
echo "=== Memory Usage ==="
ps aux | grep '[x]ray' | awk '{print "CPU: "$3"% | MEM: "$4"% | PID: "$2}'
chmod +x /usr/local/bin/xray-check.sh
xray-check.sh

新バージョンへのXray-coreアップデート

# アップデートのためインストーラーを再実行
bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install

# 新しいバージョンを確認
xray version

# Restart service
systemctl restart xray

よくあるエラーと対処法

「failed to handler mux client connection」エラー:クライアントとサーバーで異なるflowを使用している。両方がxtls-rprx-visionを使っていることを確認。

nginx/apacheが443番ポートを使用している場合:configでXrayを8443番ポートに変更するか、SNIに基づいてXrayにトラフィックを転送するnginx stream proxyを設定する。

トラフィックがまだブロックされるdestをTLS 1.3が強力な別のドメインに変更してみよう——addons.mozilla.org:443www.cloudflare.com:443は通常うまく機能する。serverNamesも合わせて更新することを忘れずに。

新しいユーザーの追加:新しいUUIDを生成し(xray uuid)、サーバーconfigのclients配列に追加して、systemctl reload xrayを実行するだけで完了。1人につき1つのUUID——管理がとてもシンプルだ。

Share: