なぜ一般的な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つを保存しておこう:UUID、Private key、Public 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で生成したUUIDSERVER-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:443やwww.cloudflare.com:443は通常うまく機能する。serverNamesも合わせて更新することを忘れずに。
新しいユーザーの追加:新しいUUIDを生成し(xray uuid)、サーバーconfigのclients配列に追加して、systemctl reload xrayを実行するだけで完了。1人につき1つのUUID——管理がとてもシンプルだ。

