Refactor WireGuard

This commit is contained in:
Meow
2026-09-14 09:21:42 +08:00
parent 46c680b71b
commit 7aa9bea0df
16 changed files with 432 additions and 252 deletions
+2 -2
View File
@@ -68,7 +68,7 @@ export const sidebar: DefaultTheme.Config["sidebar"] = {
link: "/en/config/inbounds/vless.md"
},
{ text: "VMess", link: "/en/config/inbounds/vmess.md" },
{ text: "Wireguard", link: "/en/config/inbounds/wireguard.md" },
{ text: "WireGuard", link: "/en/config/inbounds/wireguard.md" },
{ text: "Hysteria", link: "/en/config/inbounds/hysteria.md" },
{ text: "TUN", link: "/en/config/inbounds/tun.md" }
]
@@ -97,7 +97,7 @@ export const sidebar: DefaultTheme.Config["sidebar"] = {
link: "/en/config/outbounds/vless.md"
},
{ text: "VMess", link: "/en/config/outbounds/vmess.md" },
{ text: "Wireguard", link: "/en/config/outbounds/wireguard.md" },
{ text: "WireGuard", link: "/en/config/outbounds/wireguard.md" },
{ text: "Hysteria", link: "/en/config/outbounds/hysteria.md" }
]
},
+2 -2
View File
@@ -59,7 +59,7 @@ export const sidebar: DefaultTheme.Config["sidebar"] = {
link: "/config/inbounds/vless.md"
},
{ text: "VMess", link: "/config/inbounds/vmess.md" },
{ text: "Wireguard", link: "/config/inbounds/wireguard.md" },
{ text: "WireGuard", link: "/config/inbounds/wireguard.md" },
{ text: "Hysteria", link: "/config/inbounds/hysteria.md" },
{ text: "TUN", link: "/config/inbounds/tun.md" }
]
@@ -85,7 +85,7 @@ export const sidebar: DefaultTheme.Config["sidebar"] = {
link: "/config/outbounds/vless.md"
},
{ text: "VMess", link: "/config/outbounds/vmess.md" },
{ text: "Wireguard", link: "/config/outbounds/wireguard.md" },
{ text: "WireGuard", link: "/config/outbounds/wireguard.md" },
{ text: "Hysteria", link: "/config/outbounds/hysteria.md" }
]
},
+2 -2
View File
@@ -80,7 +80,7 @@ export const sidebar: DefaultTheme.Config["sidebar"] = {
link: "/ru/config/inbounds/vless.md"
},
{ text: "VMess", link: "/ru/config/inbounds/vmess.md" },
{ text: "Wireguard", link: "/ru/config/inbounds/wireguard.md" },
{ text: "WireGuard", link: "/ru/config/inbounds/wireguard.md" },
{ text: "Hysteria", link: "/ru/config/inbounds/hysteria.md" },
{ text: "TUN", link: "/ru/config/inbounds/tun.md" }
]
@@ -113,7 +113,7 @@ export const sidebar: DefaultTheme.Config["sidebar"] = {
},
{ text: "VMess", link: "/ru/config/outbounds/vmess.md" },
{
text: "Wireguard",
text: "WireGuard",
link: "/ru/config/outbounds/wireguard.md"
},
{
+1 -1
View File
@@ -17,7 +17,7 @@ Xray 内置的 DNS 模块,主要有三大用途:
- 如在 VLESS 出站中,将 `targetStrategy` 设置为 `UseIP`,会先通过本地的内置 DNS 模块解析被代理请求的目标域名,再将解析得到的 IP 发给远端代理服务器。
- 如在 VLESS 出站中,将 `sockopt.domainStrategy` 设置为 `UseIP`,会通过内置 DNS 模块解析 VLESS 服务器的域名,再连接解析得到的 IP。
- 如在 Freedom 出站中,将 `sockopt.domainStrategy` 设置为 `UseIP`,会通过内置 DNS 模块解析请求的目标域名,再连接解析得到的 IP。
- 如在 Wireguard 出站中,协议不允许传递域名作为目标,可选用内置 DNS 模块解析为 IP。
- 如在 WireGuard 出站中,协议不允许传递域名作为目标,可选用内置 DNS 模块解析为 IP。
:::
+1 -1
View File
@@ -62,7 +62,7 @@ userLevel 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值.
任意门主要有两个用处 一个是用作透明代理(见下),另一个是映射一个端口。
有时一些服务并不支持使用 Socks5 这样的正向代理,使用 Tun 或者 Tproxy 又有些小题大做了,而这些服务又只和一个 IP 一个端口通信 (比如: iperf, Minecraft server, Wireguard endpoint), 就可以用到任意门。
有时一些服务并不支持使用 Socks5 这样的正向代理,使用 Tun 或者 Tproxy 又有些小题大做了,而这些服务又只和一个 IP 一个端口通信 (比如: iperf, Minecraft server, WireGuard endpoint), 就可以用到任意门。
如以下 Config (假设默认出站为一有效代理)
+67 -26
View File
@@ -1,9 +1,9 @@
# Wireguard
# WireGuard
User-space Wireguard 协议实现。
用户态 WireGuard 协议实现,用于与对端建立 WireGuard 隧道,并接收通过该隧道进入的流量
::: danger
**Wireguard 协议并非专门为翻墙而设计,若在最外层过墙,存在特征可能导致服务器被封锁**
**WireGuard 协议并非专门为翻墙而设计,若在最外层过墙,存在特征可能导致服务器被封锁**
:::
## InboundConfigurationObject
@@ -16,16 +16,20 @@ User-space Wireguard 协议实现。
{
// ...
"protocol": "wireguard",
// [!code focus:10]
// [!code focus:14]
"settings": {
"secretKey": "PRIVATE_KEY",
"secretKey": "SERVER_PRIVATE_KEY",
"peers": [
{
"publicKey": "PUBLIC_KEY",
"allowedIPs": [""]
"publicKey": "CLIENT_PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY",
"keepAlive": 0,
"allowedIPs": ["0.0.0.0/0", "::/0"],
"email": "love@xray.com",
"level": 0
}
],
"mtu": 1420 // optional, default 1420
"mtu": 1420
}
}
]
@@ -34,16 +38,30 @@ User-space Wireguard 协议实现。
> `secretKey`: string
私钥。必填。
服务器私钥。必填。
可以使用命令 `xray wg` 生成服务器密钥对。将输出的 `PrivateKey` 填入此项;与其成对出现的 `Password (PublicKey)` 是服务器公钥。以 Xray 作为 WireGuard 客户端时,应将服务器公钥填入 `outbounds[].settings.peers[].publicKey`
> `peers`: \[ [PeersObject](#peersobject) \]
WireGuard 客户端列表,其中每一项是一个客户端配置。配置多个客户端时,Xray 会将解密后内层 IP 包的源地址与各客户端的 `allowedIPs` 进行匹配,以识别流量所属的客户端。
::: details Xray WireGuard 入站的网络模型
常规 WireGuard 组网(包括点到点、点到站和站到站)需要通信两端各自通过三层网络接口参与 IP 路由。
与之不同,Xray 的 WireGuard 入站无需在系统中创建 TUN,也无需为服务端配置用于组网的隧道内 IP。WireGuard 解密得到的内层 IP 包由内置网络栈处理,其中的 TCP 和 UDP 流量会转换为代理连接并交给 Xray 路由系统,而不是继续转发原始 IP 包。
客户端既可以发送自身流量,也可以作为网关转发其后方网段的流量。Xray 服务端不作为隧道内供客户端访问的三层网络节点,也不会将原始 IP 包交给系统内核继续转发或 NAT。
`allowedIPs` 同时参与两个方向的数据包处理:接收时,WireGuard 会校验解密后内层 IP 包的源地址,Xray 也会根据该地址识别客户端;回包时,WireGuard 会根据内层目标地址选择对应客户端。
:::
> `mtu`: int
Wireguard 底层 tun 的分片大小
WireGuard 隧道内层 IP 包的 MTU。默认 1420
<details>
<summary>MTU的计算方法</summary>
一个wireguard数据包的结构如下
::: details MTU 的计算方法
一个 WireGuard 数据包的结构如下
```
- 20-byte IPv4 header or 40 byte IPv6 header
@@ -56,26 +74,49 @@ Wireguard 底层 tun 的分片大小。
```
`N-byte encrypted data` 即为我们需要的 MTU 的值,根据 endpoint 是 IPv4 还是 IPv6,具体的值可以是 1440 (IPv4) 或者 1420 (IPv6),如果处于特殊环境下再额外减掉即可 (如家宽 PPPoE 额外 -8)。
:::
</details>
> `peers`: \[ [Peers](#peers) \]
peers 服务器列表,其中每一项是一个服务器配置。
### Peers
### PeersObject
```json
{
"publicKey": "PUBLIC_KEY",
"allowedIPs": ["0.0.0.0/0"] // optional, default ["0.0.0.0/0", "::/0"]
"publicKey": "CLIENT_PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY",
"keepAlive": 0,
"allowedIPs": ["0.0.0.0/0", "::/0"],
"email": "love@xray.com",
"level": 0
}
```
> `publicKey`: string
公钥,用于验证
客户端公钥,用于验证。必填。
> `allowedIPs`: string array
以 Xray 作为 WireGuard 客户端时,此处应填写与客户端 `outbounds[].settings.secretKey` 成对的 `Password (PublicKey)`
允许的源IP
> `preSharedKey`: string
额外的对称加密密钥,可选。需与客户端配置一致。
> `keepAlive`: int
服务器向该客户端发送持久保活包的间隔,单位为秒。默认值为 `0`,表示不发送。
> `allowedIPs`: \[ string \]
指定允许由该客户端发送的源 IP 地址或网段,每项使用 CIDR 表示。
客户端出站的 `address` 必须包含在对应服务端 peer 的 `allowedIPs` 中。例如,客户端 `outbounds[].settings.address``["10.0.0.2"]`,则此处可配置为 `["10.0.0.2/32"]`
`allowedIPs` 不只可以填写客户端的隧道内 IP,也可以包含由该 peer 负责转发的网段。例如,第三方 WireGuard 客户端作为 `192.168.10.0/24` 的网关时,可以将该网段填入此处;客户端还需自行配置路由并开启 IP 转发。
仅有一个客户端时可省略,默认值为 `["0.0.0.0/0", "::/0"]`。配置多个客户端时,应显式配置互不冲突的 `allowedIPs`,否则无法可靠地区分客户端。
> `email`: string
用户邮箱,可选,用于区分不同用户的流量(会体现在日志、统计中)。
> `level`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。默认值为 0。
+65 -46
View File
@@ -1,9 +1,9 @@
# Wireguard
# WireGuard
标准 Wireguard 协议实现。
用户态 WireGuard 协议实现,用于与对端建立 WireGuard 隧道,并通过该隧道发送出站流量
::: danger
**Wireguard 协议并非专门为翻墙而设计,若在最外层过墙,存在特征可能导致服务器被封锁**
**WireGuard 协议并非专门为翻墙而设计,若在最外层过墙,存在特征可能导致服务器被封锁**
:::
## OutboundConfigurationObject
@@ -16,24 +16,23 @@
{
// ...
"protocol": "wireguard",
// [!code focus:19]
// [!code focus:18]
"settings": {
"secretKey": "PRIVATE_KEY",
"secretKey": "CLIENT_PRIVATE_KEY",
"address": [
// optional, default ["10.0.0.1", "fd59:7153:2388:b5fd:0000:0000:0000:0001"]
"IPv4_CIDR",
"IPv6_CIDR",
"10.0.0.1",
"fd59:7153:2388:b5fd:0000:0000:0000:0001",
"and more..."
],
"peers": [
{
"endpoint": "ENDPOINT_ADDR",
"publicKey": "PUBLIC_KEY"
"endpoint": "SERVER_ADDR",
"publicKey": "SERVER_PUBLIC_KEY"
}
],
"noKernelTun": false,
"mtu": 1420, // optional, default 1420
"reserved": [1, 2, 3],
"mtu": 1420,
"reserved": [0, 0, 0],
"domainStrategy": "ForceIP"
}
}
@@ -41,36 +40,43 @@
}
```
::: tip
目前 Wireguard 协议 outbound 中不支持设置 `streamSettings`
:::
> `secretKey`: string
用户私钥。必填。
客户端私钥。必填。
> `address`: string array
可以使用命令 `xray wg` 生成客户端密钥对。将输出的 `PrivateKey` 填入此项;与其成对出现的 `Password (PublicKey)` 是客户端公钥。以 Xray 作为 WireGuard 服务器时,应将客户端公钥填入 `inbounds[].settings.peers[].publicKey`
Wireguard 会在本地开启虚拟网卡 tun。使用一个或多个 IP 地址,支持 IPv6。
> `address`: \[ string \]
指定 WireGuard 出站生成的内层 IP 包所使用的本地源地址,即客户端的隧道内 IP。可以配置一个或多个 IPv4 或 IPv6 地址。
默认值为 `["10.0.0.1", "fd59:7153:2388:b5fd:0000:0000:0000:0001"]`
Xray 会根据目标地址的地址族自动选择相应的 IP 作为源地址;如果同一地址族配置了多个 IP,则会按照内部规则选择合适的地址。<br>
WireGuard 服务器的入站配置必须允许这些 IP,并且这些 IP 在服务器的 WireGuard 入站配置中必须唯一。
> `noKernelTun`: true | false
默认情况下核心会检测是否处于 Linux 并且当前用户具有 CAP_NET_ADMIN 权限决定是否启用系统虚拟网卡,否则使用 gvisor, 使用系统虚拟网卡相对性能更高。注意这只是用来处理 IP 包的,和 wireguard kernel module 没有任何关系
是否禁用 TUN,默认值为 `false`;在 LXC 或 Docker 环境中可能需要设为 `true`
这个判断不一定准确,比如一些 lxc 虚拟化可能本来就没有 TUN 权限,这会导致出站无法工作,所以可以在这里设置是否手动禁用。
::: details 我需要启用 `noKernelTun` 吗?
设为 `false` 时,Xray 会自动选择内层 IP 包的处理方式:在 Linux 上且 Xray 进程具有 `CAP_NET_ADMIN` 权限时,创建 TUN 并由内核网络栈处理;在其他平台或权限不足时,使用进程内的 gVisor 网络栈。设为 `true` 时,仅使用 gVisor 网络栈,不会创建 TUN。使用 TUN 通常性能更高。
使用系统虚拟网卡时会占用 IPv6 的 10230 号路由表,每一个其他 wireguard 出站会依次往后使用路由表,比如第二个会使用 10231 号路由表,以此类推
此选项只选择内层 IP 包的处理方式。WireGuard 协议本身仍由 Xray 的用户态实现处理,与内核 WireGuard 模块无关
注意如果在同一个机器上启动第二个 Xray 实例不会接着分配路由表号,会继续尝试使用 10230 号路由表,因为已经被第一个 Xray 实例占用所以会失败无法连接,如果实在需要也需要设置这个选项禁用系统虚拟网卡
上述自动判断不一定准确,例如某些 LXC 环境即使具有 `CAP_NET_ADMIN` 权限,也可能无法使用 TUN,导致出站无法工作;此时应将本项设为 `true`
使用 TUN 时会占用 IPv6 的 10230 号路由表,每一个其他 WireGuard 出站会依次往后使用路由表,比如第二个会使用 10231 号路由表,以此类推。
注意如果在同一个机器上启动第二个 Xray 实例不会接着分配路由表号,会继续尝试使用 10230 号路由表,因为已经被第一个 Xray 实例占用所以会失败无法连接,如果实在需要也需要设置这个选项禁用 TUN。
:::
> `mtu`: int
Wireguard 底层 tun 的MTU大小
WireGuard 隧道内层 IP 包的 MTU。默认 1420
<details>
<summary>MTU 的计算方法</summary>
一个 Wireguard 数据包的结构如下
::: details MTU 的计算方法
一个 WireGuard 数据包的结构如下
```
- 20-byte IPv4 header or 40 byte IPv6 header
@@ -83,35 +89,46 @@ Wireguard 底层 tun 的MTU大小。
```
`N-byte encrypted data` 即为我们需要的 MTU 的值,根据 endpoint 是 IPv4 还是 IPv6,具体的值可以是 1440(IPv4) 或者 1420(IPv6),如果处于特殊环境下再额外减掉即可 (如家宽 PPPoE 额外 -8)。
:::
</details>
> `reserved` \[ byte \]
> `reserved` \[ number \]
WireGuard 协议保留字节,长度为 3,默认全 0,按需填写。
Wireguard 保留字节,按需填写。
> `peers`: \[ [PeersObject](#peersobject) \]
> `peers`: \[ [Peers](#peers) \]
WireGuard 服务器列表,其中每一项是一个服务器配置。配置多个服务器时,Xray 会根据目标 IP 地址对各服务器的 `allowedIPs` 进行前缀匹配,将流量路由至匹配的服务器,从而使不同目标网段可以通过不同的 WireGuard 服务器转发。
Wireguard 服务器列表,其中每一项是一个服务器配置。
::: details Xray WireGuard 出站的数据包模型
进入 WireGuard 出站的 TCP 和 UDP 连接会由网络栈转换为内层 IP 包。内层源地址从 `address` 中选择,内层目标地址则是被代理流量的目标 IP。
Xray 会使用内层目标地址对各 peer 的 `allowedIPs` 进行前缀匹配,由匹配到的 peer 加密封装,并将外层 UDP 数据包发送到该 peer 的 `endpoint`。因此,`address` 表示客户端使用的内层源地址,`allowedIPs` 相当于选择 peer 的目标路由表,而 `endpoint` 才是外层连接的服务器地址。
:::
::: tip
每个 WireGuard 服务器都应根据其 `allowedIPs`,放行 `address` 中相同 IP 族的所有地址:`allowedIPs` 仅包含 IPv4 网段时,应放行 `address` 中列出的所有 IPv4 地址;仅包含 IPv6 网段时同理;同时包含 IPv4 和 IPv6 网段时,应放行其中所有地址。
以 Xray 作为 WireGuard 服务器为例,应在 `inbounds[].settings.peers[].allowedIPs` 中列出这些地址。
:::
> `domainStrategy`: "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4" | "ForceIP"
当 Wireguard 服务器地址为域名、被代理流量目标地址是域名时,控制它们的域名解析策略。
当 WireGuard 服务器地址为域名、被代理流量目标地址是域名时,控制它们的域名解析策略。
不像绝大多数代理协议,Wireguard 不允许传递域名作为目标,所以如果传入目标为域名,需要先解析为 IP 再传送。此处字段含义与 [sockopt.domainStrategy](../transports/sockopt.md#sockoptobject) 中对应的 `Force` 策略相同,默认值为 `ForceIP`
不像绝大多数代理协议,WireGuard 不允许传递域名作为目标,所以如果传入目标为域名,需要先解析为 IP 再传送。此处字段含义与 [sockopt.domainStrategy](../transports/sockopt.md#sockoptobject) 中对应的 `Force` 策略相同,默认值为 `ForceIP`
`sockopt.domainStrategy` 包含诸如 `UseIP` 的选项,在这里不提供,因为 Wireguard 必须获取一个可用的 IP,不能执行 `UseIP` 解析失败后回落为域名的行为。<br>
`sockopt.domainStrategy` 包含诸如 `UseIP` 的选项,在这里不提供,因为 WireGuard 必须获取一个可用的 IP,不能执行 `UseIP` 解析失败后回落为域名的行为。<br>
注意:作用于被代理流量时,此选项还受 `address` 选项的约束,比如你设置了 ForceIPv6v4 但是 address 中没有设置 IPv6 地址,尽管目标域名有 AAAA 记录也不会解析。
### Peers
### PeersObject
```json
{
"endpoint": "ENDPOINT_ADDR",
"publicKey": "PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY", // optional, default "0000000000000000000000000000000000000000000000000000000000000000"
"keepAlive": 0, // optional, default 0
"allowedIPs": ["0.0.0.0/0"] // optional, default ["0.0.0.0/0", "::/0"]
"endpoint": "SERVER_ADDR",
"publicKey": "SERVER_PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY",
"keepAlive": 0,
"allowedIPs": ["0.0.0.0/0", "::/0"]
}
```
@@ -124,16 +141,18 @@ IP: 端口 格式,例如 `162.159.192.1:2408` 或 `[2606:4700:d0::a29f:c001]:2
> `publicKey`: string
服务器公钥,用于验证, 必填。
服务器公钥,用于验证必填。
以 Xray 作为 WireGuard 服务器时,此处应填写与服务器 `inbounds[].settings.secretKey` 成对的 `Password (PublicKey)`
> `preSharedKey`: string
额外的对称加密密钥。
额外的对称加密密钥,可选。需与服务端配置一致
> `keepAlive`: int
心跳包时间间隔,单位为秒,默认为 0 表示无心跳
客户端向该服务器发送持久保活包的间隔,单位为秒,用于在空闲时维持可能存在的 NAT 映射或防火墙状态。仅特殊场景需要开启,且仅客户端开启即可;默认`0`,表示不发送
> `allowedIPs`: string array
Wireguard 仅允许特定源 IP 的流量
指定由该服务器转发的目标 IP 网段,每项使用 CIDR 表示。仅配置一个服务器时可以省略,因为默认值为 `["0.0.0.0/0", "::/0"]`,即所有 IPv4 和 IPv6 目标流量均由该服务器转发。配置多个服务器时,需为每个服务器显式设置 `allowedIPs`,将不同的目标网段分配给相应服务器;Xray 会根据目标 IP 的前缀匹配结果选择服务器
+1 -1
View File
@@ -14,7 +14,7 @@
具体设置如下(以 Debian10 为例):
## 1、安装代理或者 VPN 软件(例如 Wireguard、IPsec 等)
## 1、安装代理或者 VPN 软件(例如 WireGuard、IPsec 等)
根据不同系统和不同软件,请参考官方安装方法
+1 -1
View File
@@ -6,7 +6,7 @@ Xray1.6.5+)新加入了 WireGuard 出站,虽然增加的代码和依赖
这时我们只需要将回国流量导入 Cloudflare Warp,可以在不影响使用体验的情况下达到同样的安全性。
2. 众所周知,大部分机场会记录用户访问域名的日志,某些机场还会审计和阻断一些用户流量。保护用户私密性的一个方法,就是在客户端使用链式代理。
Warp 使用的 WireGuard 轻量级 VPN 协议会在代理层内增加一层加密。对于机场而言,用户所有流量的目标都是 Warp,从而最大程度保护自己的隐私。
3. 方便使用,只需要一个 core 即可完成分流,Wireguard Tun,链式代理的设置。
3. 方便使用,只需要一个 core 即可完成分流,WireGuard Tun,链式代理的设置。
## 申请 Warp 账户
+1 -1
View File
@@ -62,7 +62,7 @@ The value of `userLevel` corresponds to the value of `level` in [policy](../poli
The "Arbitrary Door" has two main uses: one is for transparent proxy (see below), and the other is for mapping a port.
Sometimes some services do not support forward proxies like Socks5, and using Tun or Tproxy is overkill. If these services only communicate with a single IP and port (e.g., iperf, Minecraft server, Wireguard endpoint), you can use `tunnel`.
Sometimes some services do not support forward proxies like Socks5, and using Tun or Tproxy is overkill. If these services only communicate with a single IP and port (e.g., iperf, Minecraft server, WireGuard endpoint), you can use `tunnel`.
For example, the following Config (assuming the default outbound is a valid proxy):
+65 -24
View File
@@ -1,6 +1,6 @@
# WireGuard
User-space WireGuard protocol implementation.
User-space WireGuard protocol implementation for establishing a WireGuard tunnel with a peer and receiving traffic through the tunnel.
::: danger
**The WireGuard protocol is not designed specifically for bypassing firewalls. If used as the outer layer to cross the firewall, its distinct characteristics may lead to the server being blocked.**
@@ -16,16 +16,20 @@ User-space WireGuard protocol implementation.
{
// ...
"protocol": "wireguard",
// [!code focus:10]
// [!code focus:14]
"settings": {
"secretKey": "PRIVATE_KEY",
"secretKey": "SERVER_PRIVATE_KEY",
"peers": [
{
"publicKey": "PUBLIC_KEY",
"allowedIPs": [""]
"publicKey": "CLIENT_PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY",
"keepAlive": 0,
"allowedIPs": ["0.0.0.0/0", "::/0"],
"email": "love@xray.com",
"level": 0
}
],
"mtu": 1420 // optional, default 1420
"mtu": 1420
}
}
]
@@ -34,15 +38,29 @@ User-space WireGuard protocol implementation.
> `secretKey`: string
Private key. Required.
Server private key. Required.
You can generate a server key pair with the `xray wg` command. Enter the generated `PrivateKey` here; the accompanying `Password (PublicKey)` is the server public key. When using Xray as a WireGuard client, enter the server public key in `outbounds[].settings.peers[].publicKey`.
> `peers`: \[ [PeersObject](#peersobject) \]
List of WireGuard clients, where each item is a client configuration. When multiple clients are configured, Xray matches the source address of each decrypted inner IP packet against the clients' `allowedIPs` to identify which client the traffic belongs to.
::: details Network model of an Xray WireGuard inbound
A conventional WireGuard network—including point-to-point, point-to-site, and site-to-site configurations—requires both endpoints to participate in IP routing through Layer 3 network interfaces.
In contrast, an Xray WireGuard inbound does not create a TUN interface on the system, nor does the server need an in-tunnel IP address. The built-in network stack processes the decrypted inner IP packets, converts their TCP and UDP traffic into proxy connections, and passes those connections to the Xray routing system instead of forwarding the original IP packets.
A client can send its own traffic or act as a gateway for networks behind it. The Xray server does not act as a Layer 3 node that clients can access inside the tunnel, and it does not pass the original IP packets to the system kernel for further forwarding or NAT.
`allowedIPs` participates in packet processing in both directions: when receiving packets, WireGuard verifies the source address of the decrypted inner IP packet and Xray uses that address to identify the client; when sending response packets, WireGuard selects the corresponding client based on the inner destination address.
:::
> `mtu`: int
The MTU size of the underlying WireGuard TUN.
<details>
<summary>Method to Calculate MTU</summary>
The MTU of the inner IP packets carried by the WireGuard tunnel. The default is 1420.
::: details How to calculate the MTU
The structure of a WireGuard packet is as follows:
```
@@ -55,27 +73,50 @@ The structure of a WireGuard packet is as follows:
- 16-byte authentication tag
```
`N-byte encrypted data` is the MTU value we need. Depending on whether the endpoint is IPv4 or IPv6, the specific value can be 1440 (IPv4) or 1420 (IPv6). If you are in a special network environment, you may need to subtract more (e.g., home broadband PPPoE requires an extra -8).
`N-byte encrypted data` is the MTU value. Depending on whether the endpoint uses IPv4 or IPv6, the value can be 1440 (IPv4) or 1420 (IPv6). Reduce it further for special network environments if necessary (for example, subtract an additional 8 bytes for home broadband using PPPoE).
:::
</details>
> `peers`: \[ [Peers](#peers) \]
List of peers, where each item is a peer configuration.
### Peers
### PeersObject
```json
{
"publicKey": "PUBLIC_KEY",
"allowedIPs": ["0.0.0.0/0"] // optional, default ["0.0.0.0/0", "::/0"]
"publicKey": "CLIENT_PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY",
"keepAlive": 0,
"allowedIPs": ["0.0.0.0/0", "::/0"],
"email": "love@xray.com",
"level": 0
}
```
> `publicKey`: string
Public key, used for verification.
Client public key used for verification. Required.
> `allowedIPs`: string array
When using Xray as a WireGuard client, enter the `Password (PublicKey)` paired with the client's `outbounds[].settings.secretKey` here.
Allowed source IPs.
> `preSharedKey`: string
Optional additional symmetric encryption key. It must match the client configuration.
> `keepAlive`: int
Interval, in seconds, at which the server sends persistent keepalive packets to this client. The default is `0`, which disables keepalive packets.
> `allowedIPs`: \[ string \]
Specifies the source IP addresses or networks that this client is allowed to send, with each item expressed in CIDR notation.
The client's outbound `address` must be included in the corresponding server peer's `allowedIPs`. For example, if the client's `outbounds[].settings.address` is `["10.0.0.2"]`, this field can be set to `["10.0.0.2/32"]`.
`allowedIPs` can contain not only the client's in-tunnel IP address, but also networks routed through that peer. For example, if a third-party WireGuard client acts as a gateway for `192.168.10.0/24`, that network can be included here; the client must also configure routing and enable IP forwarding itself.
This field can be omitted when only one client is configured; the default is `["0.0.0.0/0", "::/0"]`. When multiple clients are configured, explicitly specify non-overlapping `allowedIPs`; otherwise, Xray cannot reliably distinguish between clients.
> `email`: string
Optional user email used to distinguish traffic from different users. It appears in logs and statistics.
> `level`: number
User level. Connections use the [local policy](../policy.md#levelpolicyobject) associated with this user level. The default is 0.
+70 -51
View File
@@ -1,9 +1,9 @@
# Wireguard
# WireGuard
Standard Wireguard protocol implementation.
User-space WireGuard protocol implementation for establishing a WireGuard tunnel with a peer and sending outbound traffic through the tunnel.
::: danger
**The Wireguard protocol is not designed specifically for bypassing firewalls. If used at the outermost layer to cross the Great Firewall, distinctive characteristics may lead to the server being blocked.**
**The WireGuard protocol is not designed specifically for bypassing firewalls. If used as the outer layer to cross the firewall, its distinct characteristics may lead to the server being blocked.**
:::
## OutboundConfigurationObject
@@ -16,24 +16,23 @@ Standard Wireguard protocol implementation.
{
// ...
"protocol": "wireguard",
// [!code focus:19]
// [!code focus:18]
"settings": {
"secretKey": "PRIVATE_KEY",
"secretKey": "CLIENT_PRIVATE_KEY",
"address": [
// optional, default ["10.0.0.1", "fd59:7153:2388:b5fd:0000:0000:0000:0001"]
"IPv4_CIDR",
"IPv6_CIDR",
"10.0.0.1",
"fd59:7153:2388:b5fd:0000:0000:0000:0001",
"and more..."
],
"peers": [
{
"endpoint": "ENDPOINT_ADDR",
"publicKey": "PUBLIC_KEY"
"endpoint": "SERVER_ADDR",
"publicKey": "SERVER_PUBLIC_KEY"
}
],
"noKernelTun": false,
"mtu": 1420, // optional, default 1420
"reserved": [1, 2, 3],
"mtu": 1420,
"reserved": [0, 0, 0],
"domainStrategy": "ForceIP"
}
}
@@ -41,36 +40,43 @@ Standard Wireguard protocol implementation.
}
```
::: tip
Currently, configuring `streamSettings` is not supported in the Wireguard protocol outbound.
:::
> `secretKey`: string
User private key. Required.
Client private key. Required.
> `address`: string array
You can generate a client key pair with the `xray wg` command. Enter the generated `PrivateKey` here; the accompanying `Password (PublicKey)` is the client public key. When using Xray as a WireGuard server, enter the client public key in `inbounds[].settings.peers[].publicKey`.
Wireguard will start a virtual network interface (tun) locally. Use one or more IP addresses; IPv6 is supported.
> `address`: \[ string \]
Specifies the local source addresses used in the inner IP packets generated by the WireGuard outbound—that is, the client's in-tunnel IP addresses. One or more IPv4 or IPv6 addresses can be configured.
The default is `["10.0.0.1", "fd59:7153:2388:b5fd:0000:0000:0000:0001"]`.
Xray automatically selects a source address from the appropriate address family based on the destination address. If multiple addresses from the same family are configured, it selects a suitable address according to its internal rules.<br>
The WireGuard server's inbound configuration must allow these addresses, and each address must be unique in the server's WireGuard inbound configuration.
> `noKernelTun`: true | false
By default, the core detects if it is running on Linux and if the current user has `CAP_NET_ADMIN` permissions to decide whether to enable the system virtual network interface; otherwise, it uses gVisor. Using the system virtual interface offers relatively higher performance. Note that this is only for processing IP packets and has nothing to do with the wireguard kernel module.
Whether to disable TUN. The default is `false`; you may need to set it to `true` in LXC or Docker environments.
This detection may not always be accurate. For example, some LXC virtualization environments may not have TUN permissions at all, causing the outbound to fail. Therefore, you can set this option to manually disable it.
::: details Do I need to enable `noKernelTun`?
When set to `false`, Xray automatically selects how to process inner IP packets: on Linux, if the Xray process has the `CAP_NET_ADMIN` capability, it creates a TUN interface and uses the kernel network stack; on other platforms or when permissions are insufficient, it uses the in-process gVisor network stack. When set to `true`, only the gVisor network stack is used and no TUN interface is created. Using TUN generally provides better performance.
When using the system virtual interface, it occupies IPv6 routing table number `10230`. Each additional Wireguard outbound will use subsequent routing tables sequentially; for example, the second one will use routing table `10231`, and so on.
This option only selects how inner IP packets are processed. The WireGuard protocol itself is still handled by Xray's user-space implementation and is unrelated to the kernel WireGuard module.
Note that if a second Xray instance is started on the same machine, it will not assign the next routing table number but will continue trying to use routing table `10230`. Since it is already occupied by the first Xray instance, it will fail to connect. If absolutely needed, you must set this option to disable the system virtual interface.
The automatic detection described above is not always accurate. For example, some LXC environments may be unable to use TUN even when they have the `CAP_NET_ADMIN` capability, causing the outbound to fail. In this case, set this option to `true`.
When TUN is used, it occupies IPv6 routing table 10230. Each additional WireGuard outbound uses the next routing table in sequence; for example, the second one uses routing table 10231, and so on.
If a second Xray instance is started on the same machine, it does not continue allocating routing table numbers. Instead, it also tries to use routing table 10230. Because that table is already occupied by the first Xray instance, the second instance cannot connect. If multiple instances are necessary, use this option to disable TUN.
:::
> `mtu`: int
MTU size of the underlying Wireguard tun.
The MTU of the inner IP packets carried by the WireGuard tunnel. The default is 1420.
<details>
<summary>MTU Calculation Method</summary>
The structure of a Wireguard packet is as follows:
::: details How to calculate the MTU
The structure of a WireGuard packet is as follows:
```
- 20-byte IPv4 header or 40 byte IPv6 header
@@ -82,58 +88,71 @@ The structure of a Wireguard packet is as follows:
- 16-byte authentication tag
```
`N-byte encrypted data` is the MTU value we need. Depending on whether the endpoint is IPv4 or IPv6, the specific value can be 1440 (IPv4) or 1420 (IPv6). If in a special environment, subtract further (e.g., home broadband PPPoE requires an extra -8).
`N-byte encrypted data` is the MTU value. Depending on whether the endpoint uses IPv4 or IPv6, the value can be 1440 (IPv4) or 1420 (IPv6). Reduce it further for special network environments if necessary (for example, subtract an additional 8 bytes for home broadband using PPPoE).
:::
</details>
> `reserved` \[ byte \]
> `reserved` \[ number \]
The three WireGuard reserved bytes. All three default to 0; set them as needed.
Wireguard reserved bytes, fill as needed.
> `peers`: \[ [PeersObject](#peersobject) \]
> `peers`: \[ [Peers](#peers) \]
List of WireGuard servers, where each item is a server configuration. When multiple servers are configured, Xray prefix-matches the destination IP address against each server's `allowedIPs` and routes the traffic to the matching server, allowing different destination networks to be forwarded through different WireGuard servers.
List of Wireguard servers, where each item is a server configuration.
::: details Packet model of an Xray WireGuard outbound
TCP and UDP connections entering the WireGuard outbound are converted by the network stack into inner IP packets. The inner source address is selected from `address`, while the inner destination address is the destination IP of the proxied traffic.
Xray prefix-matches the inner destination address against each peer's `allowedIPs`. The matching peer encrypts and encapsulates the packet, and Xray sends the resulting outer UDP packet to that peer's `endpoint`. Therefore, `address` specifies the inner source addresses used by the client, `allowedIPs` acts as the destination routing table used to select a peer, and `endpoint` is the server address used by the outer connection.
:::
::: tip
Each WireGuard server must allow all addresses in `address` that belong to the same address family as its `allowedIPs`: if `allowedIPs` contains only IPv4 networks, allow all IPv4 addresses listed in `address`; if it contains only IPv6 networks, the same rule applies to the IPv6 addresses; if it contains both IPv4 and IPv6 networks, allow all listed addresses.
When using Xray as the WireGuard server, list these addresses in `inbounds[].settings.peers[].allowedIPs`.
:::
> `domainStrategy`: "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4" | "ForceIP"
Controls the domain resolution strategy when the Wireguard server address is a domain name or the target address of the proxied traffic is a domain name.
Controls the domain resolution strategy when the WireGuard server address or the target address of the proxied traffic is a domain name.
Unlike most proxy protocols, Wireguard does not allow passing domain names as targets. Therefore, if the incoming target is a domain name, it must be resolved to an IP before transmission. The meanings of this field match the corresponding `Force` strategies in [sockopt.domainStrategy](../transports/sockopt.md#sockoptobject). The default value is `ForceIP`.
Unlike most proxy protocols, WireGuard does not allow domain names to be passed as targets. If the incoming target is a domain name, it must therefore be resolved to an IP address before transmission. The meanings of this field match the corresponding `Force` strategies in [sockopt.domainStrategy](../transports/sockopt.md#sockoptobject). The default is `ForceIP`.
`sockopt.domainStrategy` includes options like `UseIP`, which are not provided here because Wireguard must obtain a usable IP and cannot perform the behavior of falling back to a domain name after `UseIP` resolution fails.<br>
Note: When applied to proxied traffic, this option is also constrained by the `address` option. For example, if you set `ForceIPv6v4` but no IPv6 address is set in `address`, even if the target domain has AAAA records, they will not be resolved/used.
`sockopt.domainStrategy` includes options such as `UseIP`, which are not available here because WireGuard must obtain a usable IP address and cannot fall back to a domain name when `UseIP` resolution fails.<br>
Note: When applied to proxied traffic, this option is also constrained by `address`. For example, if you set `ForceIPv6v4` but do not configure an IPv6 address in `address`, AAAA records will not be resolved even if the target domain has them.
### Peers
### PeersObject
```json
{
"endpoint": "ENDPOINT_ADDR",
"publicKey": "PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY", // optional, default "0000000000000000000000000000000000000000000000000000000000000000"
"keepAlive": 0, // optional, default 0
"allowedIPs": ["0.0.0.0/0"] // optional, default ["0.0.0.0/0", "::/0"]
"endpoint": "SERVER_ADDR",
"publicKey": "SERVER_PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY",
"keepAlive": 0,
"allowedIPs": ["0.0.0.0/0", "::/0"]
}
```
> `endpoint`: address
Server address, required.
Server address. Required.
URL:Port format, e.g., `engage.cloudflareclient.com:2408`<br>
IP:Port format, e.g., `162.159.192.1:2408` or `[2606:4700:d0::a29f:c001]:2408`
URL:Port format, for example, `engage.cloudflareclient.com:2408`<br>
IP:Port format, for example, `162.159.192.1:2408` or `[2606:4700:d0::a29f:c001]:2408`
> `publicKey`: string
Server public key, used for verification, required.
Server public key used for verification. Required.
When using Xray as a WireGuard server, enter the `Password (PublicKey)` paired with the server's `inbounds[].settings.secretKey` here.
> `preSharedKey`: string
Additional symmetric encryption key.
Optional additional symmetric encryption key. It must match the server configuration.
> `keepAlive`: int
Heartbeat interval in seconds. Default is 0, meaning no heartbeat.
Interval, in seconds, at which the client sends persistent keepalive packets to this server. This maintains any NAT mappings or firewall state during idle periods. Enable it only in special situations and only on the client. The default is `0`, which disables keepalive packets.
> `allowedIPs`: string array
Wireguard only allows traffic from specific source IPs.
Specifies the destination IP networks forwarded by this server, with each item expressed in CIDR notation. This field can be omitted when only one server is configured because the default is `["0.0.0.0/0", "::/0"]`, meaning that the server forwards all IPv4 and IPv6 destination traffic. When multiple servers are configured, explicitly set `allowedIPs` for each server to assign different destination networks to the appropriate server; Xray selects the server by prefix-matching the destination IP address.
+1 -1
View File
@@ -62,7 +62,7 @@
У Dokodemo door есть два основных варианта использования: прозрачное проксирование (см. ниже) и перенаправление портов.
Иногда некоторые сервисы не поддерживают прямое проксирование, такое как Socks5, а использование Tun или Tproxy является излишним, и эти сервисы взаимодействуют только с одним IP-адресом и одним портом (например: iperf, сервер Minecraft, конечная точка Wireguard), тогда можно использовать произвольную дверь.
Иногда некоторые сервисы не поддерживают прямое проксирование, такое как Socks5, а использование Tun или Tproxy является излишним, и эти сервисы взаимодействуют только с одним IP-адресом и одним портом (например: iperf, сервер Minecraft, конечная точка WireGuard), тогда можно использовать произвольную дверь.
Например, следующая конфигурация (предполагается, что исходящее соединение по умолчанию является допустимым прокси):
+75 -34
View File
@@ -1,9 +1,9 @@
# Wireguard
# WireGuard
Реализация протокола Wireguard в пользовательском пространстве.
Реализация протокола WireGuard в пространстве пользователя для установления туннеля WireGuard с удалённым узлом и приёма входящего через этот туннель трафика.
::: danger
**Протокол Wireguard не предназначен для обхода блокировок. Использование его на внешнем уровне может привести к блокировке сервера из-за характерных признаков.**
**Протокол WireGuard не предназначен специально для обхода блокировок. При использовании на внешнем уровне его характерные признаки могут привести к блокировке сервера.**
:::
## InboundConfigurationObject
@@ -16,16 +16,20 @@
{
// ...
"protocol": "wireguard",
// [!code focus:10]
// [!code focus:14]
"settings": {
"secretKey": "PRIVATE_KEY",
"secretKey": "SERVER_PRIVATE_KEY",
"peers": [
{
"publicKey": "PUBLIC_KEY",
"allowedIPs": [""]
"publicKey": "CLIENT_PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY",
"keepAlive": 0,
"allowedIPs": ["0.0.0.0/0", "::/0"],
"email": "love@xray.com",
"level": 0
}
],
"mtu": 1420 // необязательно, по умолчанию 1420
"mtu": 1420
}
}
]
@@ -34,48 +38,85 @@
> `secretKey`: string
Приватный ключ. Обязательное поле.
Закрытый ключ сервера. Обязательное поле.
Пару ключей сервера можно создать командой `xray wg`. Укажите здесь полученный `PrivateKey`; выведенный вместе с ним `Password (PublicKey)` является открытым ключом сервера. Если Xray используется в качестве клиента WireGuard, открытый ключ сервера следует указать в `outbounds[].settings.peers[].publicKey`.
> `peers`: \[ [PeersObject](#peersobject) \]
Список клиентов WireGuard, каждый элемент которого содержит конфигурацию одного клиента. Если настроено несколько клиентов, Xray сопоставляет адрес источника расшифрованного внутреннего IP-пакета с `allowedIPs` каждого клиента, чтобы определить, какому клиенту принадлежит трафик.
::: details Сетевая модель входящего подключения Xray WireGuard
В обычной сети WireGuard, включая соединения «точка — точка», «точка — сеть» и «сеть — сеть», обе стороны участвуют в IP-маршрутизации через сетевые интерфейсы третьего уровня.
В отличие от такой схемы, входящее подключение Xray WireGuard не создаёт TUN-интерфейс в системе, а серверу не требуется назначать внутренний IP-адрес туннеля. Расшифрованные внутренние IP-пакеты обрабатываются встроенным сетевым стеком: содержащийся в них TCP- и UDP-трафик преобразуется в прокси-соединения и передаётся системе маршрутизации Xray вместо дальнейшей пересылки исходных IP-пакетов.
Клиент может отправлять как собственный трафик, так и трафик сетей за ним, выступая в роли шлюза. Сервер Xray не является доступным клиентам узлом третьего уровня внутри туннеля и не передаёт исходные IP-пакеты системному ядру для дальнейшей маршрутизации или NAT.
`allowedIPs` используется при обработке пакетов в обоих направлениях: при приёме WireGuard проверяет адрес источника расшифрованного внутреннего IP-пакета, а Xray использует этот адрес для определения клиента; при отправке ответных пакетов WireGuard выбирает соответствующего клиента по внутреннему адресу назначения.
:::
> `mtu`: int
Размер фрагментации уровня tun в Wireguard.
MTU внутренних IP-пакетов в туннеле WireGuard. Значение по умолчанию — 1420.
<details>
<summary>Метод расчета MTU</summary>
Структура пакета Wireguard выглядит следующим образом:
::: details Расчёт MTU
Структура пакета WireGuard:
```
- 20-байтный IPv4-заголовок или 40-байтный IPv6-заголовок
- 8-байтный UDP-заголовок
- 4 байта — тип
- 4 байта — индекс ключа
- 8 байт — nonce
- N байт — зашифрованные данные
- 16 байт — аутентификационный тег
- 20-byte IPv4 header or 40 byte IPv6 header
- 8-byte UDP header
- 4-byte type
- 4-byte key index
- 8-byte nonce
- N-byte encrypted data
- 16-byte authentication tag
```
`N байт — зашифрованные данные` — это и есть значение MTU, которое зависит от того, используется ли IPv4 или IPv6. Значение может быть 1440 (IPv4) или 1420 (IPv6). В особых условиях значение может быть дополнительно уменьшено (например, для PPPoE — минус 8 байт).
`N-byte encrypted data` — требуемое значение MTU. В зависимости от того, использует ли endpoint IPv4 или IPv6, оно может составлять 1440 (IPv4) или 1420 (IPv6). В особых сетевых условиях значение при необходимости следует дополнительно уменьшить, например ещё на 8 байт для домашнего подключения через PPPoE.
:::
</details>
> `peers`: \[ [Peers](#peers) \]
Список серверов peers, каждая запись представляет конфигурацию одного сервера.
### Peers
### PeersObject
```json
{
"publicKey": "PUBLIC_KEY",
"allowedIPs": ["0.0.0.0/0"] // необязательно, по умолчанию ["0.0.0.0/0", "::/0"]
"publicKey": "CLIENT_PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY",
"keepAlive": 0,
"allowedIPs": ["0.0.0.0/0", "::/0"],
"email": "love@xray.com",
"level": 0
}
```
> `publicKey`: string
Публичный ключ для верификации.
Открытый ключ клиента, используемый для проверки. Обязательное поле.
> `allowedIPs`: string array
Если Xray используется в качестве клиента WireGuard, здесь следует указать `Password (PublicKey)`, соответствующий закрытому ключу клиента в `outbounds[].settings.secretKey`.
Разрешенные исходные IP-адреса.
> `preSharedKey`: string
Дополнительный симметричный ключ шифрования. Необязательное поле. Он должен совпадать с ключом в конфигурации клиента.
> `keepAlive`: int
Интервал отправки сервером этому клиенту пакетов persistent keepalive, в секундах. Значение по умолчанию — `0`, то есть пакеты не отправляются.
> `allowedIPs`: \[ string \]
Задаёт IP-адреса или подсети, которые этому клиенту разрешено использовать в качестве адреса источника. Каждый элемент указывается в формате CIDR.
Значение `address` исходящего подключения клиента должно входить в `allowedIPs` соответствующего пира на сервере. Например, если `outbounds[].settings.address` клиента равно `["10.0.0.2"]`, здесь можно указать `["10.0.0.2/32"]`.
В `allowedIPs` можно указывать не только внутренний IP-адрес клиента, но и сети, трафик которых маршрутизируется через этот пир. Например, если сторонний клиент WireGuard служит шлюзом для `192.168.10.0/24`, эту сеть можно добавить сюда; на самом клиенте также необходимо настроить маршрутизацию и включить пересылку IP-пакетов.
При наличии только одного клиента поле можно опустить; значение по умолчанию — `["0.0.0.0/0", "::/0"]`. Если настроено несколько клиентов, необходимо явно указать непересекающиеся значения `allowedIPs`, иначе надёжно различать клиентов будет невозможно.
> `email`: string
Необязательный адрес электронной почты пользователя для различения трафика разных пользователей. Отображается в журналах и статистике.
> `level`: number
Уровень пользователя. Для соединений применяется [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню. Значение по умолчанию — 0.
+76 -57
View File
@@ -1,9 +1,9 @@
# Wireguard
# WireGuard
Стандартная реализация протокола Wireguard.
Реализация протокола WireGuard в пространстве пользователя для установления туннеля WireGuard с удалённым узлом и отправки исходящего трафика через этот туннель.
::: danger
**Протокол Wireguard не предназначен для обхода блокировок. Использование его на внешнем уровне может привести к блокировке сервера из-за характерных признаков.**
**Протокол WireGuard не предназначен специально для обхода блокировок. При использовании на внешнем уровне его характерные признаки могут привести к блокировке сервера.**
:::
## OutboundConfigurationObject
@@ -16,24 +16,23 @@
{
// ...
"protocol": "wireguard",
// [!code focus:19]
// [!code focus:18]
"settings": {
"secretKey": "PRIVATE_KEY",
"secretKey": "CLIENT_PRIVATE_KEY",
"address": [
// необязательно, по умолчанию ["10.0.0.1", "fd59:7153:2388:b5fd:0000:0000:0000:0001"]
"IPv4_CIDR",
"IPv6_CIDR",
"10.0.0.1",
"fd59:7153:2388:b5fd:0000:0000:0000:0001",
"and more..."
],
"peers": [
{
"endpoint": "ENDPOINT_ADDR",
"publicKey": "PUBLIC_KEY"
"endpoint": "SERVER_ADDR",
"publicKey": "SERVER_PUBLIC_KEY"
}
],
"noKernelTun": false,
"mtu": 1420, // необязательно, по умолчанию 1420
"reserved": [1, 2, 3],
"mtu": 1420,
"reserved": [0, 0, 0],
"domainStrategy": "ForceIP"
}
}
@@ -41,77 +40,95 @@
}
```
::: tip
На данный момент протокол Wireguard в режиме outbound не поддерживает настройку `streamSettings`.
:::
> `secretKey`: string
Личный ключ пользователя. Обязательное поле.
Закрытый ключ клиента. Обязательное поле.
> `address`: string array
Пару ключей клиента можно создать командой `xray wg`. Укажите здесь полученный `PrivateKey`; выведенный вместе с ним `Password (PublicKey)` является открытым ключом клиента. Если Xray используется в качестве сервера WireGuard, открытый ключ клиента следует указать в `inbounds[].settings.peers[].publicKey`.
Wireguard запускает локальный виртуальный сетевой интерфейс tun. Поддерживается использование одного или нескольких IP-адресов, включая IPv6.
> `address`: \[ string \]
Задаёт локальные адреса источника для внутренних IP-пакетов, создаваемых исходящим подключением WireGuard, то есть внутренние IP-адреса клиента в туннеле. Можно указать один или несколько адресов IPv4 или IPv6.
Значение по умолчанию — `["10.0.0.1", "fd59:7153:2388:b5fd:0000:0000:0000:0001"]`.
Xray автоматически выбирает адрес источника нужного семейства в зависимости от адреса назначения. Если настроено несколько адресов одного семейства, подходящий адрес выбирается по внутренним правилам.<br>
Конфигурация входящего подключения на сервере WireGuard должна разрешать эти адреса, и каждый из них должен быть уникальным в конфигурации входящего подключения WireGuard на сервере.
> `noKernelTun`: true | false
По умолчанию система проверяет, работает ли она на Linux и имеет ли пользователь права CAP_NET_ADMIN, чтобы решить, использовать ли системный виртуальный интерфейс. Если он не используется, применяется gvisor. Системный виртуальный интерфейс обеспечивает более высокую производительность. Обратите внимание, что это относится только к обработке IP-пакетов и не связано с ядром Wireguard.
Отключает использование TUN. Значение по умолчанию — `false`; в средах LXC или Docker может потребоваться значение `true`.
Эта проверка может быть неточной. Например, некоторые виртуализации lxc могут изначально не иметь прав на TUN, что приведет к невозможности работы outbound. В таких случаях можно вручную отключить использование системного интерфейса.
::: details Нужно ли включать `noKernelTun`?
При значении `false` Xray автоматически выбирает способ обработки внутренних IP-пакетов: в Linux, если процесс Xray имеет привилегию `CAP_NET_ADMIN`, создаётся TUN-интерфейс и используется сетевой стек ядра; на других платформах или при недостаточных правах используется работающий внутри процесса сетевой стек gVisor. При значении `true` используется только сетевой стек gVisor и TUN-интерфейс не создаётся. Использование TUN обычно обеспечивает более высокую производительность.
При использовании системного интерфейса IPv6 резервирует таблицу маршрутов с номером 10230. Для каждого нового Wireguard outbound таблица увеличивается на 1 (10231, 10232 и т.д.).
Этот параметр определяет только способ обработки внутренних IP-пакетов. Сам протокол WireGuard по-прежнему обрабатывается пользовательской реализацией Xray и не связан с модулем WireGuard ядра.
Если на одной машине запускается второй экземпляр Xray, он попытается использовать таблицу 10230, что вызовет конфликт с первым экземпляром. В таких случаях необходимо отключить использование системного интерфейса.
Описанное автоматическое определение не всегда работает точно. Например, некоторые среды LXC могут не позволять использовать TUN даже при наличии привилегии `CAP_NET_ADMIN`, из-за чего исходящее подключение не будет работать. В таком случае установите значение `true`.
При использовании TUN задействуется таблица маршрутизации IPv6 с номером 10230. Каждое следующее исходящее подключение WireGuard последовательно использует следующую таблицу: например, второе подключение использует таблицу 10231 и так далее.
Если на том же компьютере запустить второй экземпляр Xray, нумерация таблиц не продолжится: второй экземпляр также попытается использовать таблицу 10230. Поскольку она уже занята первым экземпляром Xray, подключение установить не удастся. Если запуск нескольких экземпляров необходим, используйте этот параметр для отключения TUN.
:::
> `mtu`: int
MTU нижнего уровня tun в Wireguard.
MTU внутренних IP-пакетов в туннеле WireGuard. Значение по умолчанию — 1420.
<details>
<summary>Метод расчета MTU</summary>
Структура пакета Wireguard:
::: details Расчёт MTU
Структура пакета WireGuard:
```
- 20-байтный заголовок IPv4 или 40-байтный заголовок IPv6
- 8-байтный заголовок UDP
- 4 байта — тип
- 4 байта — индекс ключа
- 8 байт — nonce
- N байт — зашифрованные данные
- 16 байт — аутентификационный тег
- 20-byte IPv4 header or 40 byte IPv6 header
- 8-byte UDP header
- 4-byte type
- 4-byte key index
- 8-byte nonce
- N-byte encrypted data
- 16-byte authentication tag
```
`N байт — зашифрованные данные` — это значение MTU. Для IPv4 оно равно 1440, для IPv6 — 1420. В особых условиях значение может быть уменьшено (например, для PPPoE — минус 8 байт).
`N-byte encrypted data` — требуемое значение MTU. В зависимости от того, использует ли endpoint IPv4 или IPv6, оно может составлять 1440 (IPv4) или 1420 (IPv6). В особых сетевых условиях значение при необходимости следует дополнительно уменьшить, например ещё на 8 байт для домашнего подключения через PPPoE.
:::
</details>
> `reserved` \[ byte \]
> `reserved` \[ number \]
Три зарезервированных байта протокола WireGuard. По умолчанию все три равны 0; при необходимости укажите требуемые значения.
Зарезервированные байты Wireguard, заполняются при необходимости.
> `peers`: \[ [PeersObject](#peersobject) \]
> `peers`: \[ [Peers](#peers) \]
Список серверов WireGuard, каждый элемент которого содержит конфигурацию одного сервера. Если настроено несколько серверов, Xray сопоставляет IP-адрес назначения с `allowedIPs` каждого сервера по префиксу и направляет трафик на совпавший сервер. Таким образом, разные сети назначения можно обслуживать через разные серверы WireGuard.
Список серверов Wireguard. Каждая запись представляет конфигурацию одного сервера.
::: details Модель пакетов исходящего подключения Xray WireGuard
TCP- и UDP-соединения, поступающие в исходящее подключение WireGuard, преобразуются сетевым стеком во внутренние IP-пакеты. Внутренний адрес источника выбирается из `address`, а внутренним адресом назначения становится IP-адрес назначения проксируемого трафика.
Xray сопоставляет внутренний адрес назначения с `allowedIPs` каждого пира по префиксу. Совпавший пир шифрует и инкапсулирует пакет, после чего внешний UDP-пакет отправляется на `endpoint` этого пира. Таким образом, `address` задаёт внутренние адреса источника клиента, `allowedIPs` служит таблицей маршрутов назначения для выбора пира, а `endpoint` является адресом сервера для внешнего соединения.
:::
::: tip
Каждый сервер WireGuard должен разрешать все адреса из `address`, семейство которых совпадает с семейством адресов в его `allowedIPs`: если `allowedIPs` содержит только сети IPv4, необходимо разрешить все IPv4-адреса из `address`; если только сети IPv6 — все IPv6-адреса; если присутствуют сети обоих семейств — все указанные адреса.
Если в качестве сервера WireGuard используется Xray, перечислите эти адреса в `inbounds[].settings.peers[].allowedIPs`.
:::
> `domainStrategy`: "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4" | "ForceIP"
Управляет стратегией разрешения доменных имен, когда адрес сервера Wireguard является доменным именем или целевой адрес проксируемого трафика является доменным именем.
Управляет стратегией разрешения доменных имён, когда адрес сервера WireGuard или адрес назначения проксируемого трафика является доменным именем.
В отличие от большинства прокси-протоколов, Wireguard не позволяет передавать доменные имена в качестве целей. Если цель задана доменным именем, перед передачей его необходимо разрешить в IP. Значения этого поля соответствуют стратегиям `Force` в [sockopt.domainStrategy](../transports/sockopt.md#sockoptobject). По умолчанию используется `ForceIP`.
В отличие от большинства прокси-протоколов, WireGuard не позволяет передавать доменные имена в качестве назначения. Поэтому, если входящее назначение задано доменным именем, перед отправкой его необходимо разрешить в IP-адрес. Значения этого поля соответствуют стратегиям `Force` в [sockopt.domainStrategy](../transports/sockopt.md#sockoptobject). Значение по умолчанию `ForceIP`.
В `sockopt.domainStrategy` доступны опции, такие как `UseIP`, которые здесь отсутствуют, так как Wireguard должен получить действительный IP-адрес и не может выполнять откат к доменному имени после неудачного разрешения `UseIP`.<br>
Примечание: при применении к проксируемому трафику эта опция также ограничивается опцией `address`. Например, если вы установили `ForceIPv6v4`, но в `address` не задан IPv6-адрес, то даже при наличии у целевого домена AAAA-записей они не будут разрешены.
В `sockopt.domainStrategy` есть такие параметры, как `UseIP`, но здесь они недоступны: WireGuard должен получить пригодный IP-адрес и не может вернуться к доменному имени при ошибке разрешения `UseIP`.<br>
Примечание: при применении к проксируемому трафику этот параметр также ограничен настройкой `address`. Например, если задано `ForceIPv6v4`, но в `address` нет адреса IPv6, записи AAAA не будут разрешаться, даже если они существуют для домена назначения.
### Peers
### PeersObject
```json
{
"endpoint": "ENDPOINT_ADDR",
"publicKey": "PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY", // необязательно, по умолчанию "0000000000000000000000000000000000000000000000000000000000000000"
"keepAlive": 0, // необязательно, по умолчанию 0
"allowedIPs": ["0.0.0.0/0"] // необязательно, по умолчанию ["0.0.0.0/0", "::/0"]
"endpoint": "SERVER_ADDR",
"publicKey": "SERVER_PUBLIC_KEY",
"preSharedKey": "PRE_SHARED_KEY",
"keepAlive": 0,
"allowedIPs": ["0.0.0.0/0", "::/0"]
}
```
@@ -119,21 +136,23 @@ MTU нижнего уровня tun в Wireguard.
Адрес сервера. Обязательное поле.
Формат URL:порт, например, `engage.cloudflareclient.com:2408`.
Формат IP:порт, например, `162.159.192.1:2408` или `[2606:4700:d0::a29f:c001]:2408`.
Формат URL:порт, например `engage.cloudflareclient.com:2408`<br>
Формат IP:порт, например `162.159.192.1:2408` или `[2606:4700:d0::a29f:c001]:2408`
> `publicKey`: string
Публичный ключ сервера для проверки. Обязательное поле.
Открытый ключ сервера, используемый для проверки. Обязательное поле.
Если Xray используется в качестве сервера WireGuard, здесь следует указать `Password (PublicKey)`, соответствующий закрытому ключу сервера в `inbounds[].settings.secretKey`.
> `preSharedKey`: string
Дополнительный симметричный ключ шифрования.
Дополнительный симметричный ключ шифрования. Необязательное поле. Он должен совпадать с ключом в конфигурации сервера.
> `keepAlive`: int
Интервал отправки пакетов heartbeat, в секундах. Значение по умолчанию — 0 (отсутствие heartbeat).
Интервал отправки клиентом этому серверу пакетов persistent keepalive, в секундах. Они поддерживают возможные сопоставления NAT или состояние межсетевого экрана в периоды простоя. Включайте этот параметр только при необходимости и только на стороне клиента. Значение по умолчанию — `0`, то есть пакеты не отправляются.
> `allowedIPs`: string array
Wireguard пропускает только трафик с определенных IP-адресов.
Задаёт IP-сети назначения, пересылаемые через этот сервер. Каждый элемент указывается в формате CIDR. При наличии только одного сервера поле можно опустить: значение по умолчанию — `["0.0.0.0/0", "::/0"]`, то есть через сервер направляется весь трафик к адресам IPv4 и IPv6. Если настроено несколько серверов, необходимо явно задать `allowedIPs` для каждого из них и распределить сети назначения между соответствующими серверами; Xray выбирает сервер путём сопоставления префикса IP-адреса назначения.
+1 -1
View File
@@ -13,7 +13,7 @@
Вот как это настроить (на примере Debian 10):
## 1. Установите прокси-сервер или VPN-клиент (например, Wireguard, IPsec и т.д.)
## 1. Установите прокси-сервер или VPN-клиент (например, WireGuard, IPsec и т.д.)
Обратитесь к официальной документации для получения инструкций по установке для вашей системы и программного обеспечения.