Xrayは主に中国のネット検閲システムであるGFW(以下、「金盾」と言う)を回避するために利用されている検閲回避ツールである。更新が止まったV2Rayのソースコードを元にProject Xにより管理されている。

 サーバー側にツールを配置後、クライアント側から接続することによりVPNのように通信を行う。VPNとの違いはディープ・パケット・インスペクション(以下、「DPI」と言う)の回避を目的とした通信プロトコルのサポートを行っている点である。

 2022年10月、金盾のアップグレードに合わせ、VMESSやVLESS+XTLSを始めとするXrayでサポートしているプロトコルが繋がりにくくなっているため、金盾回避を目的とする場合はsing-boxを導入し、shadow-tlsプロトコルを使用することを推奨する。

導入

 以下に導入方法を記す。

全プロトコル共通

 全てのプロトコルで必要なものは以下の2つ。

・VPSインスタンス(最小構成で良い)

・静的IP


IPを固定したらSSHでインスタンスに接続。


ルートユーザーになる。

sudo su


インスタンスのタイムゾーンを日本時間に設定。

timedatectl set-timezone Asia/Tokyo


Xrayをインストール

bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install


Trojan

 トロイの木馬。ギリシャ神話のトロイア戦争に登場する木馬に由来し、巧妙に相手を陥れる罠のようにファイヤーウォールからパケットを隠す。紛らわしいがマルウェアのトロイの木馬(Trojan)とは無関係。

 偽装Webサーバーを使い、そのサイトのSSL証明書で通信を暗号化し、パケットを偽装する。検閲者からは一見偽装サイトからパケットを受信しているように見える。


 共通事項に加えて以下が必要。

・インスタンスでWebホスティング(NginxやApacheを使用)

・ドメイン

・SSL証明書


 WebホスティングとSSL証明書の取得方法は、インターネット上に情報が多数あるため割愛する。


Xrayの設定ファイルを作成。

vi /usr/local/etc/xray/config.json


Trojanの設定は以下の通り。

"password"は接続用パスワードを示し、値を必ず一意の値に変更する。

"serverName"は偽装サイトのドメイン名。

"certificateFile"はSSL証明書のパス。

"keyFile"はSSL秘密鍵のパス。

{
  "log":{
    "loglevel": "warning",
    "access": "/var/log/xray/access.log",
    "error": "/var/log/xray/error.log"
  },
  "inbounds": [{
    "port": 443,
    "protocol": "trojan",
    "settings": {
      "clients": [
        {
          "password": "gIljL7ERTJgZC2Kkv2iZvtkQ4MZMdhoTeQOszoAth30=",
          "flow": "xtls-rprx-direct"
        }
      ],
      "fallbacks": [
          {
              "alpn": "http/1.1",
              "dest": 80
          },
          {
              "alpn": "h2",
              "dest": 81
          }
      ]
    },
    "streamSettings": {
        "network": "tcp",
        "security": "xtls",
        "xtlsSettings": {
            "serverName": "abeshinzo.net",
            "alpn": ["http/1.1", "h2"],
            "certificates": [
                {
                    "certificateFile": "/usr/local/etc/xray/abeshinzo.net.pem",
                    "keyFile": "/usr/local/etc/xray/abeshinzo.net.key"
                }
            ]
        }
    }
  }],
  "outbounds": [{
    "protocol": "freedom",
    "settings": {}
  },{
    "protocol": "blackhole",
    "settings": {},
    "tag": "blocked"
  }]
}


Xrayを再起動。

systemctl restart xray


クライアントソフトウェアに以下の値を入力し接続を確認してみよう。

・Address ・・・・・・・・インスタンスのドメイン名

・Port ・・・・・・・・・・設定ファイルに記述したポート番号(443)

・Password ・・・・・・・・設定ファイルに記述したパスワード

・flow ・・・・・・・・・・xtls-rpx-direct

・Network ・・・・・・・・tcp

・head type ・・・・・・・none

・tls ・・・・・・・・・・xtls


Q. 繋がらない

A. "systemctl status xray"で確認してみよう。

   証明書と秘密鍵のパーミッションが原因の可能性が高い。


VMess

 Shadowsocksに似ているが暗号化方式の選択を重視せず、VMessの暗号化方式はクライアントによって指定される。暗号化に時間依存のキーを使用するなど難読性が高い。


Xrayの設定ファイルを作成。

vi /usr/local/etc/xray/config.json


VMessの設定は以下の通り。

"port"は使用するポート番号で任意の値に変更可。インスタンスの設定で要開放。

"id"はUUIDを示し、"********-****-****-****-************"を必ず一意の値に変更する。uuidgenコマンドで生成すると良い。

{
  "log":{
    "loglevel": "warning",
    "access": "/var/log/xray/access.log",
    "error": "/var/log/xray/error.log"
  },
  "inbounds": [{
    "port": 10086,
    "protocol": "vmess",
    "settings": {
      "clients": [
        {
          "id": "********-****-****-****-************",
          "level": 1,
          "alterId": 64
        }
      ]
    }
  }],
  "outbounds": [{
    "protocol": "freedom",
    "settings": {}
  },{
    "protocol": "blackhole",
    "settings": {},
    "tag": "blocked"
  }],
  "routing": {
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "blocked"
      }
    ]
  }
}


環境変数の値を設定。

vi /etc/systemd/system/xray.service


[Service]の末尾に以下追記。

Environment=XRAY_VMESS_AEAD_FORCED=false


Xrayを再起動。

systemctl restart xray


クライアントソフトウェアに以下の値を入力し接続を確認してみよう。

・Address ・・・・・・インスタンスのグローバルIPアドレス

・Port ・・・・・・・設定ファイルに記述したポート番号

・id ・・・・・・・・設定ファイルに記述したUUID

・alterId ・・・・・・設定ファイルのalterId

・security ・・・・・"chacha20-poly1305"を選択

・Network ・・・・・・tcp

・head type ・・・・・none


Shadowsocks-2022

 Shadowsocksは、SOCKS5サーバーをsslocalとssserverに分割してインターネットトラフィックを難読化し、DPIの回避を行う。

 Shadowsocks-2022では従来の物からパフォーマンスを向上させ、完全なリプレイ保護を備えており、古いプロトコルのセキュリティ問題に対処している。


Xrayの設定ファイルを作成。

vi /usr/local/etc/xray/config.json


Shadowsocks-2022の設定は以下の通り。

"port"は使用するポート番号で任意の値に変更可。インスタンスの設定で要開放。

"password"は接続用パスワードを示し、値を必ず一意の値に変更する。32ビット長のパスワードが必須で、openssl rand -base64 32で生成すると良い。

{
  "log":{
    "loglevel": "warning",
    "access": "/var/log/xray/access.log",
    "error": "/var/log/xray/error.log"
  },
  "inbounds": [{
    "port": 8488,
    "protocol": "shadowsocks",
    "settings": {
        "method": "2022-blake3-aes-256-gcm",
        "password": "gIljL7ERTJgZC2Kkv2iZvtkQ4MZMdhoTeQOszoAth30=",
        "network": "tcp,udp"
    }
  }],
  "outbounds": [{
    "protocol": "freedom",
    "settings": {}
  },{
    "protocol": "blackhole",
    "settings": {},
    "tag": "blocked"
  }],
  "routing": {
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "blocked"
      }
    ]
  }
}


Xrayを再起動。

systemctl restart xray


クライアントソフトウェアに以下の値を入力し接続を確認してみよう。

・Address ・・・・・・インスタンスのグローバルIPアドレス

・Port ・・・・・・・設定ファイルに記述したポート番号

・password ・・・・・設定ファイルに記述した接続用パスワード

・security ・・・・・"2022-blake3-aes-256-gcm"を選択


クライアント

Windows

v2rayN

 オープンソースのWindows用V2Rayクライアント。Xray coreとv2fly coreをサポートしている。


 GitHub https://github.com/2dust/v2rayN


 GitHubのrereasesよりv2rayN-Core.zipをダウンロードし、任意のディレクトリに解凍。

 v2rayN.exeを実行するとクライアントが起動する。


Android

V2RayNG

 オープンソースのAndroid用V2Rayクライアント。最新版ではXray coreをサポートしている。


 PlayStore https://play.google.com/store/apps/details?id=com.v2ray.ang

 GitHub https://github.com/2dust/v2rayNG


iOS・iPad OS

Shadowrocket

 香港のSHADOW LAUNCH TECHNOLOGYが提供するプロプライエタリな有料V2Rayクライアント。iOS・iPad OSで更新が続いていて、VLESS+XTLSをサポートしているクライアントソフトウェアはこれくらい。


 AppStore https://apps.apple.com/jp/app/shadowrocket/id932747118


Linux

Qv2ray

 オープンソースのLinux用GUI V2Rayクライアント。2021年で更新が止まってしまっているためShadowsocks-2022はサポートされていない。


 GitHub https://github.com/Qv2ray/Qv2ray


 GitHubのrereasesより、Qv2ray-v2.7.0-linux-x64.AppImageをダウンロード。

 また、別途V2Ray-coreを入手し、任意のディレクトリ(Homeディレクトリ等)に解凍。

 Qv2ray-v2.7.0-linux-x64.AppImageのパーミッションを設定し、起動後「設定→カーネル設定→V2Ray コアのパス」にて先程配置したディレクトリを指定する。


複数プロトコルのサポート

 Xrayの設定ファイル(/usr/local/etc/xray/config.json)の"inbounds"に以下の様に記述すると、同一インスタンスにて複数プロトコルを使い分ける事ができる。

 ポート番号はそれぞれ異なる番号にしたほうが良い。

 例:Shadowsocks-2022とVmess

  "inbounds": [{
    "port": 8488,
    "protocol": "shadowsocks",
    "settings": {
        "method": "2022-blake3-aes-256-gcm",
        "password": "gIljL7ERTJgZC2Kkv2iZvtkQ4MZMdhoTeQOszoAth30=",
        "network": "tcp,udp"
    }
  },{
    "port": 10086,
    "protocol": "vmess",
    "settings": {
      "clients": [
        {
          "id": "272768b2-ef4f-447f-8a41-fb5119a1955c",
          "level": 1,
          "alterId": 64
        }
      ]
    }
  }],

X-UI

 X-UIは上記Xray各種プロトコルに対応し、ブラウザから一元管理するGUIパネル

 元は中国語だが英語に翻訳しているバージョンがあるのでここではそのインストール方法を記述する

 対応プロトコルは vmess, vless, trojan, shadowsocks, dokodemo-door, socks, http

bash <(curl -Ls https://raw.githubusercontent.com/NidukaAkalanka/x-ui-english/master/install.sh)

 GitHub https://github.com/NidukaAkalanka/x-ui-english

WireGuardとの比較

 Xrayはネットワークプロキシであるのに対し、WireGuardはVPNである。VPNと違う点は、外部から識別可能なトンネリングを行わずにhttpsのようにTCPプロトコルでデータの送受信を行う点である。XrayでVPNのようにクライアントのすべてのトラフィックをリルートする場合、クライアントソフトウェアが必要であるが、WireGuardはカーネルに組み込むことができるため、Xrayのクライアントを実行するユーザー空間よりもクライアント側のソフトウェアセキュリティが強化される。

 結論はこれらを何に使用するかによって決まり、インターネットサービスプロバイダやファイヤーウォールを欺くにはXray、通信の暗号化や拠点間通信、IPアドレスの秘匿化が目的(ISPやFWにVPNを使っていることが知られても良い)場合はWireGuardに軍配が上がる。Xrayは現在の日本において限定的な用途しか存在しないのかもしれない。


おまけ(広告ブロック)

 サーバー側で使用するDNSにAdGuard DNSを指定し、広告をクライアント側に送信しないようにする。セキュアな通信環境を入手する目的でXrayを導入する場合、パブリックDNSを使用するリスクは自己責任で判断する。

 各ディストリビューションで設定が異なるため一例を記載する。

Ubuntu 20.04 LTS

resolved.confを編集する。

vi /etc/systemd/resolved.conf


[Resolve]にAdGuardのDNSサーバーを記載。

DNS=94.140.14.14, 94.140.15.15


ローカルDNSを経由せず、指定したDNSリゾルバに直接聞きにいくようシンボリックリンクを変更

ln -f -s /run/systemd/resolve/resolv.conf /etc/resolv.conf


systemd-resolvedを再起動。

systemctl restart systemd-resolved

関連項目

ツール・ソフトウェア・アプリ
専ブラ ChMate - やる夫BBS+エディター
広告ブロック
匿名化・情報セキュリティ VPN - Xray - Sing-box - 防弾ホスティングサーバー
その他 ウェブ魚拓魚拓の取り方) - やる夫BBS+エディター