この記事は、サーバーへの設定インポートを済ませ、V2Rayの設定をさらに理解したいユーザー向けです。すべての項目を暗記するのではなく、「インバウンドで通信を受け、ルーティングで判定し、アウトバウンドから送信する」という構造を把握し、tag・ログ・設定の境界から問題を切り分けることを重視します。
まず設定ファイル内の通信経路を把握する
V2Rayの設定ファイルはJSONオブジェクトで、トップレベルの項目がログ、ドメイン解決、インバウンド、アウトバウンド、ルーティングを制御します。コアはファイルを上から1行ずつ実行するのではなく、起動時に設定全体を読み込み、待受ポート、アウトバウンド処理、ルーティングルールを構築します。設定を理解するときは、行番号ではなくデータの流れに沿って読みましょう。
アプリはまず本機のSOCKSまたはHTTPプロキシポートへリクエストを渡します。これは設定のinboundsに対応します。インバウンドが宛先アドレスを識別すると、接続はルーティングモジュールへ渡されます。routingはルールの順序に従ってアウトバウンドのタグを選択し、最終的にoutboundsでそのタグに対応する処理がリモート接続を確立するか、宛先へ直接アクセスします。dnsは解決が必要なドメインに結果を提供し、logはその過程の警告やエラーを記録します。
以下のサンプルでは、本機のSOCKSポート10808を使用し、VMessプロキシのアウトバウンドとfreedomによる直接接続のアウトバウンドを定義します。プライベートアドレスは直接接続、それ以外のTCP・UDP通信はプロキシへ送ります。例のドメインには予約済みのexample.comを使っていますが、構造を示すためだけのもので、実際に利用できるサーバー設定ではありません。
{
"log": {
"loglevel": "warning"
},
"dns": {
"servers": [
"localhost",
"1.1.1.1"
]
},
"inbounds": [
{
"tag": "socks-in",
"listen": "127.0.0.1",
"port": 10808,
"protocol": "socks",
"settings": {
"auth": "noauth",
"udp": true
},
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
}
}
],
"outbounds": [
{
"tag": "proxy",
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "server.example.com",
"port": 443,
"users": [
{
"id": "11111111-2222-4333-8444-555555555555",
"security": "auto"
}
]
}
]
},
"streamSettings": {
"network": "tcp",
"security": "none"
}
},
{
"tag": "direct",
"protocol": "freedom",
"settings": {}
}
],
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": [
"geoip:private"
],
"outboundTag": "direct"
},
{
"type": "field",
"network": "tcp,udp",
"outboundTag": "proxy"
}
]
}
}
inbounds:通信をコアへ渡せる接続元を定義する
設定の要点
inboundsはインバウンドの配列で、各要素が1つの待受入口を表します。サンプルではアドレスを127.0.0.1、ポートを10808、プロトコルをsocksに制限しています。つまり、このポートへ接続できるのは本機のプログラムだけで、LAN内の他の端末はこの入口を直接利用できません。
listenとportはコアが接続を待ち受ける場所を決め、protocolはポートへ入ってくるデータの解釈方法を決めます。ポートに特別な仕組みがあるわけではなく、有効な範囲内で他のプログラムに使われておらず、アプリに設定したプロキシポートと一致していれば利用できます。ブラウザーが127.0.0.1:10808に設定されているのに、設定が10809を待ち受けていれば、リクエストはコアに届きません。
settingsとsniffingの役割
設定の要点
インバウンドのsettingsは、選択したプロトコルによって決まります。SOCKSインバウンドではauthとudpに意味がありますが、これらの項目を別のプロトコルのインバウンドへそのまま移しても有効とは限りません。ドキュメントを読むときは、似た名前だけで設定を流用せず、その項目がどのプロトコルに属するかを先に確認しましょう。
sniffingは、接続開始時のデータから宛先ドメインを補います。アプリが先にドメインをIPへ解決し、IPだけをプロキシへ渡すことがあります。スニッフィングを有効にすると、コアがHTTPのホストフィールドやTLSハンドシェイク情報からドメインを復元し、ドメインベースのroutingルールが適用される可能性があります。スニッフィングはドメイン解決器ではなく、dnsの代替でもありません。
tagはインバウンドの内部識別子で、ルーティングルールはinboundTagを使って通信元を区別できます。listen: 127.0.0.1は、現在の端末だけで使うローカルプロキシ入口に適しています。portが競合すると、通常は待受に失敗した、またはアドレスがすでに使用中であるというメッセージがログに表示されます。udp: trueは、SOCKSインバウンドでUDPリクエストを処理できることを示します。ただし、実際に転送できるかどうかはアウトバウンドのプロトコルとサーバー側の設定にも左右されます。
outbounds:通信がどこから出ていくかを定義する
設定の要点
outboundsも配列ですが、役割はインバウンドと逆で、コアが最終的な宛先へ接続する方法を記述します。プロキシのアウトバウンドには通常、サーバーアドレス、サーバーポート、ユーザー識別子、プロトコルパラメータ、トランスポート設定が含まれます。直接接続のアウトバウンドにはfreedomを使用し、本機から宛先へ直接アクセスします。明示的に遮断したい場合は、専用の拒否アウトバウンドを使い、タグで参照することもできます。
サンプルのproxyとdirectはいずれもtagです。routingはアウトバウンドの内容を複製せず、どのtagへ渡すかだけを記録します。タグを変更するときは、ルーティングルールも必ず確認してください。たとえばdirectをlocal-directに変更した場合、古い名前を参照するoutboundTagは意図したアウトバウンドを指せなくなります。
proxyアウトバウンド
- プロトコル
- VMess
- リモートポート
- 443
- トランスポート
- TCP
- ユーザー識別子
- UUID形式
サーバーアドレス、ユーザー識別子、トランスポートパラメータはサーバー側の設定と一致している必要があります。
directアウトバウンド
- プロトコル
- freedom
- リモートサーバー
- 不要
- 参照タグ
- direct
- 代表的な用途
- LANへの直接接続
本機のネットワークから直接接続しますが、本機のDNS、ルーティング、ファイアウォールの影響を受けます。
プロトコルパラメータとトランスポートパラメータは別の層
VMessを例にすると、settings内のvnextはリモートサーバーとユーザーを記述し、streamSettingsは基盤となるネットワークとセキュリティ方式を記述します。サーバーポートが正しくてもトランスポート方式が一致しなければ、TCP接続が確立していてもプロトコルのハンドシェイクは失敗します。そのため、接続問題を切り分ける際はアドレス、ポート、ユーザー識別子だけを確認してはいけません。
| 項目の位置 | 担当する内容 | よくあるエラー |
|---|---|---|
settings.vnext |
サーバーアドレス、ポート、ユーザーパラメータ | アドレスの無効化、ポートの誤り、ユーザー識別子の不一致 |
streamSettings.network |
TCP、WebSocketなどのトランスポート種別 | クライアントとサーバーで異なるトランスポートを選択 |
streamSettings.security |
トランスポート層のセキュリティ方式 | セキュリティ方式がサーバー側と不一致 |
tag |
routingから参照する内部名 | 名前を変更したのにルールを同期して修正していない |
結論:まず階層を確認し、その後に項目の値を比較する
アドレスとポートはプロトコル設定、ネットワーク種別とトランスポートのセキュリティはstreamSettingsに属します。パラメータを誤った階層に置くと、値自体が正しくてもコアは期待どおりに解釈できません。
routing:ルールに従ってインバウンド接続をアウトバウンドへ渡す
設定の要点
routing.rulesは順序を持つルール配列です。コアは最初のルールから確認し、最初に一致したルールのoutboundTagを使用します。そのため、具体性の高いルールを前に、範囲の広いフォールバックルールを後ろに置くのが基本です。TCPとUDPをすべて対象にするルールを先頭に置くと、後続のLAN直接接続ルールは一致できません。
サンプルの1つ目のルールはgeoip:privateでプライベートアドレスに一致させ、directへ渡します。代表的なプライベート範囲は10.0.0.0/8、172.16.0.0/12、192.168.0.0/16です。2つ目はTCPとUDPに一致し、残りの通信をプロキシへ送ります。ルール数は少なくても、「具体的なルールを優先し、広いルールを後ろに置く」という基本原則が表れています。
- ルールの
typeがコアのサポート対象であることを確認し、一般的なフィールド一致ルールではfieldを使用します。 - 条件がドメイン、IP、ポート、ネットワーク種別、インバウンドタグのどれに該当するかを確認します。
- 上から順に、最初に一致する可能性のあるルールを探します。期待しているルールだけを見てはいけません。
outboundTagがoutbounds内のいずれかのtagと、大文字・小文字を含めて完全に一致しているか確認します。- 一時的にログレベルを上げてコアを再起動し、実際の宛先とエラーが発生した段階をログで確認します。
domainStrategyは、ルーティングのためにドメインを解決するタイミングを決める
設定の要点
サンプルではIPIfNonMatchを使用します。宛先がドメイン形式で入り、ドメインルールに一致しなかった場合、ルーティングモジュールはそのドメインを解決してから、IPルールとの一致を試行できます。これにより、アドレスリストベースのルールでドメイン宛ての通信も処理できますが、解決処理が1回増えます。
domainStrategyは「すべてのDNSリクエストをどのアウトバウンドへ送るか」を切り替えるものではなく、システムDNS設定と同じものでもありません。主に、routingの一致処理でドメインをIPへ解決するかどうか、またそのタイミングに影響します。DNSサーバーの選択、問い合わせの経路、最終接続の宛先アドレスは、dns、ルーティングルール、アウトバウンド設定を組み合わせて判断する必要があります。
| 一致条件 | 例 | 解決に適した問題 |
|---|---|---|
| ドメイン | domain |
完全なドメイン名、サブドメイン範囲、登録済みドメインカテゴリで振り分ける |
| IP | ip |
CIDR、個別アドレス、アドレスカテゴリで振り分ける |
| ポート | port |
指定した宛先ポートを特定の出口へ渡す |
| インバウンドタグ | inboundTag |
異なるローカル入口に別々の出口ポリシーを適用する |
| ネットワーク種別 | network |
TCPとUDPの通信を区別する |
結論:振り分けがおかしいときは、まずルールの順序を確認する
宛先がいつも同じ出口へ送られる場合は、まず前方の広範なルールに先に捕捉されていないかを確認し、次にドメインがIPへ変換済みか、アウトバウンドタグが存在するかを確認します。
dnsとlog:名前解決とトラブルシューティングを支援する
dnsは、コアが利用できるDNSサーバーと関連する解決戦略を定義します。サンプルではlocalhostと1.1.1.1を順に記載し、サーバーリストの構造を示しています。実際の設定では、ネットワーク環境とルーティングの目的に応じて解決方法を選び、問い合わせが想定したアウトバウンドで処理されるか確認してください。
アプリ自身の名前解決、OSによる名前解決、V2Ray内蔵DNSは明確に区別する必要があります。アプリが先にドメインを解決し、IPだけをSOCKSインバウンドへ渡した場合、コアは同じドメイン検索を再実行するとは限りません。sniffingを有効にするとドメインを復元できる場合がありますが、成功するかどうかはプロトコル通信から該当情報を抽出できるかに左右されます。ドメイン振り分けを調べるときは、まずコアが実際に受け取ったのがドメインかIPかを確認します。
dnsセクション
- サンプルサーバー
- localhost
- 予備アドレス
- 1.1.1.1
- 主な役割
- ドメインを解決する
- 関連モジュール
- routing
解決結果がIPルールの一致に使われる場合はありますが、dns自体が最終的な出口を決めるわけではありません。
logセクション
- サンプルのレベル
- warning
- トラブルシューティング用レベル
- infoまたはdebug
- 主な役割
- 実行状態を記録する
- 重点情報
- 待受と接続のエラー
詳細ログは一時的な診断に適しています。問題の切り分けが終わったら、より簡潔なレベルへ戻せます。
loglevelは出力の詳細度を制御します。通常の運用ではwarningにすると警告とエラーを残せます。リクエストの経路を確認したい場合は、一時的にinfoまたはdebugへ変更します。詳細レベルでは記録量が増えるため、問題解決後も長期間そのままにするのは避けてください。
- 起動後も待受ポートがまったく開かない:まずJSON構文、項目の型、ポートの使用状況を確認します。
- ローカルポートには接続できるがリモート接続に失敗する:outboundsのサーバー、プロトコル、トランスポートパラメータを確認します。
- プロキシは使えるが振り分けが間違っている:routingの順序、宛先の形式、outboundTagを確認します。
- ドメインは失敗するがIPにはアクセスできる:DNS応答、解決経路、ドメイン戦略を確認します。
- UDPアプリだけが異常:インバウンドでUDPが許可されているか確認し、アウトバウンドとサーバー側のUDP対応も確認します。
クライアントで設定を生成して手動で切り分ける
v2rayN、v2rayNG、v2flyNGは、GUIで指定したサーバーとルーティングの項目に基づいてコア設定を生成します。サブスクリプションURLや共有リンクは主に、1台のサーバーに必要なプロトコルパラメータを提供します。クライアントはさらにローカルインバウンド、ログ、DNS、ルーティングの内容を追加するため、共有リンクの項目だけでは、最終的にコアへ渡される完全なJSONとは通常一致しません。
GUIクライアントを使う場合、実行時に生成されたファイルを長期的な設定元として直接編集するのはおすすめしません。クライアントがコアを再起動したり、サーバーを切り替えたり、設定を更新したりすると、生成ファイルが上書きされる可能性があります。より確実なのは、まず画面上で該当項目を変更し、ログまたは生成結果でフィールドを確認する方法です。独立した設定を管理する必要がある場合は、別ファイルとして管理し、変更のたびに構文チェックと起動テストを行ってください。
設定の構文は正しいのに、なぜコアはすぐ終了するのですか?
JSONが正しいというのは、テキストを解析できることを意味するだけです。続けて起動ログを確認し、未知の項目、項目の型の誤り、ポートの競合、routingが存在しないアウトバウンドタグを参照していないかを調べます。
ブラウザーに10808を設定したのに、なぜリクエストログがありませんか?
inboundsが実際に127.0.0.1:10808を待ち受けていることを確認し、ブラウザーでSOCKSプロキシを選択しているか、HTTPプロキシになっていないかを確認します。両端のプロトコル種別は一致していなければなりません。
直接接続ルールを追加したのに、通信がproxyを経由し続けるのはなぜですか?
直接接続ルールを広範なプロキシルールより前に移動し、outboundTagが正確にdirectと記述されているか確認します。また、宛先がコアへ入る時点でドメインなのかIPなのかも確認してください。
このJSONをそのままv2rayNへインポートできますか?
コアの完全な設定と、クライアントのサーバーエントリでは構造が異なります。完全な設定を読み込む場合は、クライアントが用意する対応する設定画面を使用してください。通常のサーバーインポートには、VMess、VLESSの共有リンクまたはサブスクリプションURLを使います。
loglevelを変更したのに、なぜ変化が見えないのですか?
ファイルを保存してからコアを再起動し、編集しているファイルが現在のプロセスで実際に読み込まれている設定か確認します。GUIクライアントは起動のたびに実行用設定を再生成することがあります。
推奨する最小限の切り分け手順
- まずJSONを解析できることを確認し、すべてのオブジェクト、配列、カンマ、引用符の位置が正しいか確認します。
- コアを起動し、
127.0.0.1:10808がすでに待ち受けているか確認します。 - 一時的に、明確なプロキシアウトバウンドと直接接続アウトバウンドを1つずつだけ残し、変数を減らします。
- routingルールを2つ使い、プライベートアドレスは直接接続、それ以外はプロキシになることを確認します。
- 基本接続が確立したら、ドメインカテゴリ、ポート条件、追加のアウトバウンドを1つずつ加えます。
- 一度に変更するのは関連する項目の1グループだけにし、再起動後すぐに該当するログを確認します。
V2Ray設定の要点は、各項目を接続経路に置き換えて理解することです。inboundsは受信、routingは選択、outboundsは送信、dnsはドメインの一致と接続に必要な解決結果の提供、logは各段階の診断情報を担います。問題が起きたら、この5つの境界に沿って範囲を少しずつ絞るほうが、プロトコル、ポート、DNS、ルーティングを同時に変更するより検証可能な結論に近づけます。