inbounds:ローカルアプリの入口
inboundsでは、リクエストを受け付けるアドレスとポート、使用するプロキシプロトコルを定義します。端末内のアプリから接続する場合は、通常ループバックアドレスを使い、プロキシポートをLANに公開しないようにします。例ではSOCKSとHTTPを別々のポートで待ち受けています。アプリ側でも対応するプロトコルを指定してください。ポートに固定の標準値はないため、クライアント設定に表示された実際の値を使います。システムプロキシとは異なり、inboundsを設定しただけではブラウザーにプロキシの使用を通知できません。両方を正しく設定して初めてリクエストがコアに届きます。
{
"inbounds": [
{
"tag": "socks-in",
"listen": "127.0.0.1",
"port": 10808,
"protocol": "socks",
"settings": { "auth": "noauth", "udp": true }
},
{
"tag": "http-in",
"listen": "127.0.0.1",
"port": 10809,
"protocol": "http",
"settings": {}
}
]
}
outbounds:プロトコルとtag
outboundsは、受け取ったリクエストを宛先へ送ります。直接接続にはfreedom、遮断にはblackholeを使います。プロキシ経由のアウトバウンドには、対応するプロトコルのリモート接続情報が必要です。tagは設定内で参照する名前であり、プロトコル名ではありません。routingのoutboundTagは、ここで定義したtagと完全に一致させる必要があります。この例に含まれるのは直接接続と遮断だけで、リモートプロキシはありません。一般的な設定では、ルールに一致しない場合に配列の先頭のアウトバウンドが使われることがあります。ルールだけでなく、配列の順序も確認してください。
{
"outbounds": [
{
"tag": "direct",
"protocol": "freedom",
"settings": {}
},
{
"tag": "block",
"protocol": "blackhole",
"settings": {}
}
]
}
routing:ルールを判定してアウトバウンドを選ぶ
ルーティングルールは上から順に判定され、一致すると対応するアウトバウンドが選択されます。前の広い条件が先にリクエストを処理してしまわないよう、より具体的なドメインやアドレスのルールを先に配置してください。この例では、プライベートアドレスをdirectへ送ります。このアウトバウンドが定義済みであることが前提です。IPIfNonMatchは、ドメインルールに一致しないときにアドレスを解決して判定することを示します。すべてのアプリが組み込みDNSを一律に使うという意味ではありません。geoipやgeositeが参照するデータセットも利用可能である必要があり、ルールの記述自体にデータは含まれません。
{
"routing": {
"domainStrategy": "IPIfNonMatch",
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
}
]
}
}
dns:リゾルバーの設定だけではDNS通信をすべて処理できない
dnsモジュールでは、コア内蔵リゾルバーが使用するサーバーを設定します。DNSが使われるタイミングは、ルーティングポリシーやアウトバウンド設定、アプリがドメイン名とIPアドレスのどちらを渡すかによっても変わります。この例ではhostsによる静的な対応付けと、DNSサーバーの基本構造を示しています。これらの項目を追加するだけで、すべてのDNS通信を処理できるわけではありません。ブラウザーの暗号化DNS、システムのリゾルバー、コアのリゾルバーが同時に使われる場合もあります。名前解決の経路を調べるときは、リクエストの発生元と使用されたアウトバウンドをそれぞれ確認し、想定どおりか判断してください。
{
"dns": {
"hosts": {
"domain:example.com": "192.0.2.1"
},
"servers": [
"https://1.1.1.1/dns-query"
],
"queryStrategy": "UseIPv4"
}
}
policy:レベルごとの接続動作
policyでは、ユーザーレベルに応じた接続ポリシーを設定します。たとえば、ハンドシェイクの待ち時間やアイドル接続のタイムアウトを指定できます。levelsの数値キーはレベルを表し、サーバー番号ではありません。関連するユーザー設定で対応するlevelを指定すると、ポリシーが適用されます。例の時間単位は秒で、数値は構造を示すためのものです。あらゆるネットワークに適した推奨値ではありません。タイムアウトを短くしすぎると、遅いハンドシェイクや長時間接続が切れることがあります。接続が途切れる場合は、ログとネットワーク状態を確認してから、一度に一つの値だけを変更して比較してください。
{
"policy": {
"levels": {
"0": {
"handshake": 4,
"connIdle": 300,
"uplinkOnly": 2,
"downlinkOnly": 5
}
}
}
}
subscription:クライアント側の管理項目
サブスクリプションはクライアントが管理するもので、V2RayコアのJSONトップレベルキーではありません。クライアントはサブスクリプションの内容を読み込み、接続情報を実行可能な設定に変換します。サブスクリプションの更新は、コアのアップデートとは別です。サブスクリプションURLにアクセス用の認証情報が含まれる場合があるため、スクリーンショットや公開ログに表示しないよう注意してください。以下は有効なコア設定の一部で、最終的な設定におけるoutboundsの位置を示しています。サブスクリプション形式ではありません。directしか含まれていないため、サブスクリプションの読み込みの代わりにはなりません。実際のプロキシ情報は、利用可能な接続設定から生成してください。
{
"outbounds": [
{
"tag": "direct",
"protocol": "freedom",
"settings": {}
}
]
}