Add English translate (WIP)

This commit is contained in:
hmol233 2021-05-26 19:05:53 +08:00
parent 43ef4990f5
commit b2093dcba0
No known key found for this signature in database
GPG Key ID: D617A9DAB0C992D5
132 changed files with 10521 additions and 22 deletions

View File

@ -29,6 +29,12 @@ export default defineUserConfig<DefaultThemeOptions>({
title: "Project X", title: "Project X",
description: "Xray 官方文档", description: "Xray 官方文档",
}, },
/*
"/en": {
lang: "en-US",
title: "Project X",
description: "Official document of Xray",
},*/
}, },
themeConfig: { themeConfig: {
smoothScroll: true, smoothScroll: true,
@ -50,6 +56,10 @@ export default defineUserConfig<DefaultThemeOptions>({
tip: "提示", tip: "提示",
warning: "注意", warning: "注意",
danger: "警告", danger: "警告",
lastUpdatedText: "最近更改",
selectLanguageName: "简体中文",
selectLanguageText: "多语言",
selectLanguageAriaLabel: "多语言",
sidebar: { sidebar: {
"/config/": sidebar.getConfigSidebar( "/config/": sidebar.getConfigSidebar(
"特性详解", "特性详解",
@ -79,6 +89,40 @@ export default defineUserConfig<DefaultThemeOptions>({
}, },
navbar: navbar.hans, navbar: navbar.hans,
}, },
"/en": {
ToggleText: "Toggle Theme",
repoLabel: "Source",
selectLanguageName: "English",
// TODO: translation
sidebar: {
"/en/config/": sidebar.getConfigSidebar(
"特性详解",
"基础配置",
"入站代理",
"出站代理",
"底层传输",
"/en/config/"
),
"/en/document/level-0/": sidebar.getDocumentLv0Sidebar(
"小小白白话文",
"/en/document/level-0/"
),
"/en/document/level-1/": sidebar.getDocumentLv1Sidebar(
"入门技巧",
"/en/document/level-1/"
),
"/en/document/level-2/": sidebar.getDocumentLv2Sidebar(
"进阶技巧",
"/en/document/level-2/"
),
"/en/development/": sidebar.getDevelopmentSidebar(
"开发指南",
"协议详解",
"/en/development/"
),
},
navbar: navbar.en,
},
}, },
}, },
head: [["link", { rel: "icon", href: `/logo.png` }]], head: [["link", { rel: "icon", href: `/logo.png` }]],

View File

@ -6,12 +6,13 @@ export const hans: NavbarConfig = [
{ text: "配置指南", link: "/config/" }, { text: "配置指南", link: "/config/" },
{ text: "开发指南", link: "/development/" }, { text: "开发指南", link: "/development/" },
{ text: "使用指南", link: "/document/" }, { text: "使用指南", link: "/document/" },
{ ];
text: "多语言",
ariaLabel: "Language Menu", // TODO: translation
children: [ export const en: NavbarConfig = [
{ text: "简体中文", link: "/" }, { text: "首页", link: "/en" },
{ text: "English", link: "/en" }, { text: "大史记", link: "/en/about/news.md" },
], { text: "配置指南", link: "/en/config/" },
}, { text: "开发指南", link: "/en/development/" },
{ text: "使用指南", link: "/en/document/" },
]; ];

View File

@ -1,9 +1,7 @@
<template> <template>
<nav class="navbar-links toggle-bar"> <nav v-if="enable" class="navbar-links toggle-bar">
<div class="navbar-links-item"> <div class="navbar-links-item">
<a v-if="enable" class="nav-link" @click.prevent="toggleTheme">{{ <a class="nav-link" @click.prevent="toggleTheme">{{ text }}</a>
text
}}</a>
</div> </div>
</nav> </nav>
</template> </template>
@ -14,16 +12,15 @@ import { useThemeLocaleData } from "@vuepress/plugin-theme-data/lib/client";
import { ToggleOptions } from "../types"; import { ToggleOptions } from "../types";
export default defineComponent({ export default defineComponent({
data() { computed: {
return { enable: function (): Boolean {
enable: false, const option = useThemeLocaleData<ToggleOptions>();
text: "", return option.value.enableToggle;
}; },
}, text: function (): String {
mounted() { const option = useThemeLocaleData<ToggleOptions>();
const option = useThemeLocaleData<ToggleOptions>(); return option.value.ToggleText;
this.enable = option.value.enableToggle; },
this.text = option.value.ToggleText;
}, },
methods: { methods: {
toggleTheme() { toggleTheme() {

101
docs/en/README.md Normal file
View File

@ -0,0 +1,101 @@
---
home: true
heroImage: /LogoX2.png
heroText: Project X
tagline: 不畏浮云遮望眼 · 金睛如炬耀苍穹
actions:
- text: 由此开始 →
link: /document/
type: primary
- text: 配置指南 →
link: /config/
type: secondary
features:
- title: 极速协议
details: 原创 VLESS 与 XTLS 协议摆脱冗余加密释放CPU算力
- title: 自由组合
details: |
完善的回落机制,有效防止主动探测,多服务共享端口
- title: 超低占用
details: |
OpenWRT RaspberryPi 等各种精简设备皆可使用
- title: 强大路由
details: |
高可定制化的路由系统,满足各类使用需求,充分发挥网络性能
- title: 完整兼容
details: |
完整兼容 v2ray-core 配置文件与 API 调用
- title: 亲和力
details: |
活跃的社区讨论及贡献MPL 2.0 开源许可协议
footer: Licensed under CC-BY-SA 4.0 | Copyright 2020-Present Project X Community
---
## XTLS ? Xray ? V2Ray ?
**XTLS are brilliant ideas for TLS we study, while Xray is the best practice we maintain.**
- Xray-core 是 v2ray-core 的超集,含更好的整体性能和 XTLS 等一系列增强,且完全兼容 v2ray-core 的功能及配置。
- 只有一个可执行文件,含 ctl 的功能run 为默认指令
- 配置上完全兼容,环境变量和 API 对应要改为以 XRAY\_ 开头
- 全平台开放了裸协议的 ReadV
- 提供完整的 VLESS & Trojan XTLS 支持,均有 ReadV
- 提供了 XTLS 多种流控模式, 性能一骑绝尘!
> “配置兼容,整体更好”
- Xray-flutter 是一个优雅的跨平台图形界面工具. <Badge text="WIP" type="warning"/>
### 我们是谁?
> **It doesn't matter who we are. What matters is that we will keep riding and not look back.**
### 帮助 Xray 变得更强
欢迎帮助 Xray 变得更强!
- 🖥️ 帮助开发和测试 Xray, 提交高质量的 Pull request.
- 📩 在 [GitHub Issues](https://github.com/XTLS/Xray-core/issues) 或 [讨论区](https://github.com/XTLS/Xray-core/discussions)发起建设性或有意义的 issue 与 discussion.
- 📝 写下您的使用心得并提交至 Xray 的 [文档网站](https://github.com/XTLS/XTLS.github.io).
- 💬 在 Telegram 群帮助群友/灌水.
- **...事实上,每一份对 Xray 的支持都会让 Xray 变得更强大**
### Telegram
- [Project X 交流群](https://t.me/projectXray)
- 交流群可在底线之上随便水,不要撕逼,没有滥权。
- 有问题尽管随便问,知道的尽量回答。
- 禁政治,禁 NSFW
- [Project X 频道](https://t.me/projectXtls)
- 发布 Project X 的最新资讯
### 致谢
- 感谢所有人的支持!
- 感谢各类脚本、Docker 镜像、客户端支持...感谢所有帮忙完善生态的大佬们!
- 感谢为 Xray 网站和文档添砖加瓦的朋友们.
- 感谢提出有意义的建议和意见的朋友们.
- 感谢 Telegram 群每一位帮助群友的朋友.
### 更多关于 project X
- 如果你想知道更多关于 project X 的理念与密闻, 请点击[这里](./faq/about/)
- 如果你想知道更多关于 project X 的足迹与成长, 请点击[这里](./about/news.md)
### License
[Mozilla Public License Version 2.0](https://github.com/XTLS/Xray-core/blob/main/LICENSE)
### Stargazers over time
> Project X 的 GitHub 主仓库 Xray-core 已获 2000 starsProject X 群人数近 3000频道订阅数 1000+
[![Stargazers over time](https://starchart.cc/XTLS/Xray-core.svg)](https://starchart.cc/XTLS/Xray-core)

240
docs/en/about/news.md Normal file
View File

@ -0,0 +1,240 @@
---
sidebar: auto
---
# 大史记
## 2021.4.6
- VuePress Next.
- With Dark Mode.
## 2021.4.4
- 本文档迎来的新的首页。
- 本文档迎来了暗黑模式。
- ~~当然,暗黑模式还有各种各样的问题。具体的内容还需要慢慢调整。~~
- 另Telegram 群聊突破了 5000 人!还加入了 Anti-Spam 机器人!
- 🎉🎉🎉
## 2021.4.1 <Badge>[v1.4.2](https://github.com/XTLS/Xray-core/releases/tag/v1.4.2)</Badge>
- 不是愚人节玩笑,今天更新。
- 加入 Browser Dialer用与改变 TLS 指纹与行为。
- 加入 uTLS用与改变 TLS Client Hello 的指纹。
- 顺便修复了一大堆奇妙的问题,具体的内容见更新日志。
## 2021.3.25
<!-- prettier-ignore -->
没错还在变。 -_-
## 2021.3.15
文档网站正在悄悄的进行着某些神秘的变化。。。,🙊🙊🙊
## 2021.3.14 <Badge>[v1.4.0](https://github.com/XTLS/Xray-core/releases/tag/v1.4.0)</Badge>
- Happy Pi-Day!
- 这次是个大更新:
- 为链式代理引入了传输层支持。
- 为 Dialer 引入了 Domain Strategy解决奇妙的 DNS 问题。
- 添加了 gRPC 传输方式,与更快一点的 Multi Mode。
- 添加了 WebSocket Early-Data 功能,减少了 WebSocket 的延迟。
- 添加了 FakeDNS。
- 还修复了系列的问题,添加了各类功能,详情请见更新日志。
- 还是 VuePress 比较爽啊(
## 2021.3.3 <Badge>[1.3.1](https://github.com/XTLS/Xray-core/releases/tag/v1.3.1)</Badge>
- 这个版本使用了 Golang 1.16,正式原生支持 Apple Silicon。
- 同时修复了一个会导致 Panic 的 bug。~~Holmium\_认为这是在骗、在偷袭。~~
- 修复了几个遗留问题。
## 2021.2.14 <Badge>[1.3.0](https://github.com/XTLS/Xray-core/releases/tag/v1.3.0)</Badge>
- Happy 🐮 Year 🎉!
- v1.3.0 通过非常巧妙的机制实现了 V 系协议全部 FullCone同时保证了一定的兼容性。
- OHHHHHHHHHHHH
## 2021.01.31 <Badge>[1.2.4](https://github.com/XTLS/Xray-core/releases/tag/v1.2.4)</Badge>
- 解决两个“连接至标准 Socks 服务端时可能出错”的历史遗留问题。
- 似乎这个版本没有什么改变,但这只是暴风雨前的宁静。
- (没错我就是先知)
> 你个傻子,你拿的是 UNO 牌。
## 2021.01.25
- 全互联网最好最详细的秘籍入门篇同学们练熟了吗? 🍉 老师开始连载[秘籍第一层](../document/level-1/)咯...
- [英文版文档网站](../en)逐渐增加内容 ing, 感谢各位大佬的辛苦付出~!
## 2021.01.22 <Badge>[1.2.3](https://github.com/XTLS/Xray-core/releases/tag/v1.2.3)</Badge>
- 对 SS 协议的支持**又**变强了, 支持单端口多用户!
- 对 trojan 协议的支持也**又**变强了, trojan 的回落也解锁 SNI 分流的新姿势啦~!
- _(VLESS: 嘤嘤嘤)_
- UDP 奇奇怪怪的 BUG 被干掉了, 一个字, "稳定".
- 嗅探可以排除你不想嗅探的域名, 可以开启一些新玩法.
- 向发现问题->开 issue->自行测试->自行分析->自行找到问题->自行解决->然后给上下游提交 PR 的大佬 <img src="https://avatars2.githubusercontent.com/u/8384161?s=32" width="32px" height="32px" alt="a"/> [@Bohan Yang](https://github.com/bohanyang) 致敬!
- 其他美味小樱桃, 惯例更新品尝就对啦.
## 2021.01.19
- 一些数字
- 版本发布了 10&nbsp;&nbsp; 个 tag
- 解决掉了 100&nbsp; 个 issue
- 复刻了 300&nbsp; 个 fork
- 点了 2000 个 star
- 群 3000 个 人
## 2021.01.17
- 辛苦的翻译工作开始了, 感谢<img src="https://avatars2.githubusercontent.com/u/60207794?s=32" width="32px" height="32px" alt="a"/> [@玖柒 Max](https://github.com/jiuqi9997)和其他所有的翻译大佬们.
- [English version](https://xtls.github.io/en/)
## 2021.01.15 <Badge>[1.2.2](https://github.com/XTLS/Xray-core/releases/tag/v1.2.2)</Badge>
- 回落分流又解锁了奇怪的新姿势! 回落中可以根据 SNI 分流啦~!
- 之前预告的 UUID 修改正式上线.([往下看往下看](#2021.01.12))
- 日志现在看起来比上一次顺眼又更顺眼了一丢丢.
- 远程 DOH 和其他的 DNS 模式一样学会了走路由分流.
- 当然还有其他各种小糖果.(更新品尝就对了)
- 啊, 还有, 世界上第一個 M1 上跑起 Xray 的男人是 Anthony TSE
## 2021.01.12
- 将要到来的 UUID 修改, 支持自定义字符串和 UUID 之间的映射. 这意味着你将可以这样在配置文件中写 id 来对应用户.
- 客户端写 "id": "我爱 🍉 老师 1314",
- 服务端写 "id": "5783a3e7-e373-51cd-8642-c83782b807c5" (此 UUID 是 `我爱🍉老师1314` 的 UUID 映射)
- 🍉 老师的[小小白白话文](../document/level-0/)大结局, 撒花.
## 2021.01.10 <Badge>[1.2.1](https://github.com/XTLS/Xray-core/releases/tag/v1.2.1)</Badge>
- [小小白白话文](../document/level-0/)连载上线啦,🍉 老师呕心沥血之作, 手把手教你从什么都不会到熟练配置 Xray!
- (可能是整个互联网上, 最详细最有耐心的教你从 0 开始配置的教程)
- [透明代理](../document/level-2/)也增加了更多文章.
- 还有很多细节修改, 文档将会越来越规范!
- 感谢 [@ricuhkaen](https://github.com/ricuhkaen) , [@BioniCosmos](https://github.com/BioniCosmos), [@kirin](https://github.com/kirin10000)
* 大量的 UDP 相关修复, 甚至可以在育碧的土豆服务器上玩彩虹六号!
* Google Voice 应该也可以正常使用 v2rayNG 拨打了.
* 日志现在看起来更顺眼.
## 2021.01.07
- 礼貌和尊重本应是社区不需要明说的准则之一。
## 2021.01.05
- 文档网站正在悄悄的进行着某些神秘的变化。。。,🙊🙊🙊
## 2021.01.03
- 文档仓库第一个 PR。🎉
[透明代理TProxy配置教程 ](../document/level-2/tproxy.md) ,感谢<img src="https://avatars2.githubusercontent.com/u/41363844?s=32" width="32px" height="32px" alt="a"/> [@BioniCosmos](https://github.com/BioniCosmos)
- tg 群突破 2500。
## 2021.01.01
【祝大家新年快乐,嗨皮牛耶!】🎆🎇🎆 <Badge>[1.2.0](https://github.com/XTLS/Xray-core/releases/tag/v1.2.0)</Badge>
🎁 在元旦的最后几分钟v1.2.0 它来了,带着周五必更的惯例,带着各位贡献大佬的心血以及 @rprxx 的黑眼圈,不负众望的来了!
- 圣诞礼物[v1.1.5](#20201225)后的元旦礼物 🎁,游戏玩家大福利,全面 FullCone。
- UDP 还会继续增强!)
- 如果你已经拆过圣诞礼物,这次还有比圣诞礼物更精美的包装和小糖果哦。(同样不用问,更新品尝就对了)
- (不,下面不是广告,是里程碑。)
- Xray 是有史以来第一个不受限制的多协议平台:只需 Xray 即可解决问题,无需借力其它实现。
- 一人扛起了所有!支持各大主流协议!
- 一骑绝尘的性能!
- 日趋完善的功能!
- 可怕的生命力与社区亲和力!
- Xray 将继续保持前行! 因此 [Xray 需要更多的英雄!!](https://github.com/XTLS/Xray-core/discussions/56)
- PS请品请细品[release notes](https://github.com/XTLS/Xray-core/releases/tag/v1.2.0)每一句。似乎有一个小秘密小彩蛋 ~~(啊,有人敲门...我一会和你们说)~~
## 2020.12.29
透明代理的游戏玩家利好! Xray-core tproxy 入站, socks 出站 UDP FullCone 测试版, [TG 群](https://t.me/projectXray)火热测试中
## 2020.12.25 <Badge>[1.1.5](https://github.com/XTLS/Xray-core/releases/tag/v1.1.5)</Badge>
圣诞节快乐!
- 游戏玩家的圣诞礼物!你可以用 xray 爽快的打游戏啦!因为有了 SS/trojan UDP fullcone
- 你可以用你喜欢的格式写配置文件了,比如 yaml比如 toml...
- VLESS 的 UDP fullcone 和更多增强很快就到!)
- 无须再担心证书验证被墙OCSP stapling 已经上线!
- kirin 带来了一大波 脚本更新.[脚本在此](https://github.com/XTLS/Xray-install)
- 还有更多美味小樱桃!(不用问,更新品尝就对了)
## 2020.12.24
因为某些不可描述的原因Xray 的文档网站已在发布日前偷跑上线。
网址为:[没错你正在看的就是](https://xtls.github.io)
大家可以查阅各种内容也欢迎纠错/提出建议(可发往文档 github 仓库的 issue 区)
文档网站需要不断完善和增加内容,以及完善设计。
因此更欢迎大家一起为文档建设添砖加瓦。
[文档的仓库](https://github.com/XTLS/XTLS.github.io)
仓库的 readme 中有简略教程说明如何帮助 xray 改进文档网站.
欢迎大家查看,纠错,修改,增加心得。
## 2020.12.23
Xray-core Shadowsocks UDP FullCone 测试版, [TG 群](https://t.me/projectXray)火热测试中
## 2020.12.21
- Project X 群人数 2000+
- 群消息(含游戏群) 日均破万
## 2020.12.18 <Badge>[1.1.4](https://github.com/XTLS/Xray-core/releases/tag/v1.1.4)</Badge>
- 更低的启动内占用和内存使用优化
- 随意定制的 TLS 提高你的 SSL 评级
- 支持 XTLS 入站的 Splice 以及支持 trojan 的 XTLS
- 还有在您路由器上使用的 Splice 最佳使用模式建议
## 2020.12.17
鉴于日益增长群人数和游戏需求, 开启了[TG 游戏群](https://t.me/joinchat/UO4NixbB_XDQJOUjS6mHEQ)
## 2020.12.15
[安装脚本 dev 分支](https://github.com/XTLS/Xray-install/tree/dev)开启, 持续更新功能中.
## 2020.12.11 <Badge>[1.1.3](https://github.com/XTLS/Xray-core/releases/tag/v1.1.3)</Badge>
- 完整版本的 REDIRECT 透明代理模式.
- 软路由 splice 流控模式的优化建议.
## 2020.12.06 <Badge>[1.1.2](https://github.com/XTLS/Xray-core/releases/tag/v1.1.2)</Badge>
- 流控增加 splice 模式, Linux 限定, 性能一骑绝尘.
- 增强了 API 兼容
## 2020.12.04
增加 splice 模式
## 2020.11.27
- Project X 的 GitHub 主仓库 Xray-core 已获 500+ stars
- 登上了 GitHub Trending
- Project X 群人数破千,频道订阅数 500+
## 2020.11.25 <Badge>[1.0.0](https://github.com/XTLS/Xray-core/releases/tag/v1.0.0)</Badge>
Xray 的第一个版本.
- 基于 v2ray-core 修改而来,改动较大
- 全面增强, 性能卓越, 完全兼容
## 2020.11.23
project X start
> ~~梦开始的时候~~

77
docs/en/config/README.md Normal file
View File

@ -0,0 +1,77 @@
---
title: 配置文件
lang: zh-CN
---
> **这个章节将告诉您所有的 Xray 配置细节,掌握这些内容,在您手中 Xray 将发挥更大威力。**
## 概述
Xray 的配置文件为 json 格式, 客户端和服务端的配置格式没有区别, 只是实际的配置内容不一样。
形式如下:
```json
{
"log": {},
"api": {},
"dns": {},
"routing": {},
"policy": {},
"inbounds": [],
"outbounds": [],
"transport": {},
"stats": {},
"reverse": {},
"fakedns": {}
}
```
::: warning
如果你刚接触 Xray, 您可以先点击查看[快速入门中的配置运行](../document/install.md), 学习最基本的配置方式, 然后查看本章节内容以掌握所有 Xray 的配置方式。
:::
## 基础配置模块
> log:[LogObject](./log.md)
日志配置,控制 Xray 输出日志的方式.
> api:[ApiObject](./api.md)
提供了一些 API 接口供远程调用。
> dns: [DnsObject](./dns.md)
内置的 DNS 服务器. 如果没有配置此项,则使用系统的 DNS 设置。
> routing: [RoutingObject](./routing.md)
路由功能。可以设置规则分流数据从不同的 outbound 发出.
> policy: [PolicyObject](./policy.md)
本地策略,可以设置不同的用户等级和对应的策略设置。
> inbounds: \[ [InboundObject](./inbound.md) \]
一个数组,每个元素是一个入站连接配置。
> outbounds: \[ [OutboundObject](./outbound.md) \]
一个数组,每个元素是一个出站连接配置。
> transport: [TransportObject](./transport.md)
用于配置 Xray 其它服务器建立和使用网络连接的方式。
> stats: [StatsObject](./stats.md)
用于配置流量数据的统计。
> reverse: [ReverseObject](./reverse.md)
反向代理。可以把服务器端的流量向客户端转发,即逆向流量转发。
> fakedns: [FakeDnsObject](./fakedns.md)
FakeDNS 配置。可配合透明代理使用,以获取实际域名。

90
docs/en/config/api.md Normal file
View File

@ -0,0 +1,90 @@
# API 接口
API 接口配置提供了一些基于 [gRPC](https://grpc.io/)的 API 接口供远程调用。
可以通过 api 配置模块开启接口. 当 api 配置开启时Xray 会自建一个出站代理,须手动将所有的 API 入站连接通过 [路由规则配置](./routing.md) 指向这一出站代理。
请参考本节中的 [相关配置](#相关配置)
::: warning
大多数用户并不会用到此 API新手可以直接忽略这一项。
:::
## ApiObject
`ApiObject` 对应配置文件的 `api` 项。
```json
{
"api": {
"tag": "api",
"services": ["HandlerService", "LoggerService", "StatsService"]
}
}
```
> `tag`: string
出站代理标识。
> `services`: \[string\]
开启的 API 列表,可选的值见 [API 列表](#支持的-api-列表)。
## 相关配置
可以在 inbounds 配置中增加一个 api 的 inbound
```json
"inbounds": [
{
"listen": "127.0.0.1",
"port": 10085,
"protocol": "dokodemo-door",
"settings": {
"address": "127.0.0.1"
},
"tag": "api"
}
]
```
在路由配置中增加针对 api inbound 的路由规则
```json
"routing": {
"settings": {
"rules": [
{
"inboundTag": [
"api"
],
"outboundTag": "api",
"type": "field"
}
]
},
"strategy": "rules"
}
```
## 支持的 API 列表
### HandlerService
一些对于入站出站代理进行修改的 API可用的功能如下
- 添加一个新的入站代理;
- 添加一个新的出站代理;
- 删除一个现有的入站代理;
- 删除一个现有的出站代理;
- 在一个入站代理中添加一个用户(仅支持 VMess、VLESS、Trojan、Shadowsocksv1.3.0+
- 在一个入站代理中删除一个用户(仅支持 VMess、VLESS、Trojan、Shadowsocksv1.3.0+
### LoggerService
支持对内置 Logger 的重启,可配合 logrotate 进行一些对日志文件的操作。
### StatsService
内置的数据统计服务,详见 [统计信息](./stats.md)。

151
docs/en/config/dns.md Normal file
View File

@ -0,0 +1,151 @@
# 内置 DNS 服务器
## DNS 服务器
Xray 内置的 DNS 模块,主要有两大用途:
- 在路由阶段, 解析域名为 IP, 并且根据域名解析得到的 IP 进行规则匹配以分流. 是否解析域名及分流和路由配置模块中 `domainStrategy` 的值有关, 只有在设置以下两种值时,才会使用内置 DNS 服务器进行 DNS 查询:
- "IPIfNonMatch", 请求一个域名时,进行路由里面的 domain 进行匹配,若无法匹配到结果,则对这个域名使用内置 DNS 服务器进行 DNS 查询,并且使用查询返回的 IP 地址再重新进行 IP 路由匹配。
- "IPOnDemand", 当匹配时碰到任何基于 IP 的规则,将域名立即解析为 IP 进行匹配。
- 解析目标地址进行连接。
- 如 在 `freedom` 出站中,将 `domainStrategy` 设置为 `UseIP`, 由此出站发出的请求, 会先将域名通过内置服务器解析成 IP, 然后进行连接。
- 如 在 `sockopt` 中,将 `domainStrategy` 设置为 `UseIP`, 此出站发起的系统连接,将先由内置服务器解析为 IP, 然后进行连接。
::: tip TIP 1
内置 DNS 服务器所发出的 DNS 查询请求,会自动根据路由配置进行转发。
:::
::: tip TIP 2
只支持最基本的 IP 查询A 和 AAAA 记录)。其他查询不会进入内置 DNS 服务器。
:::
## DNS 处理流程
DNS 服务器配置模块可以配置多个 DNS 服务器, 并且指定优先匹配列表.
1. 查询的域名与某个 DNS 服务器指定的域名列表匹配时Xray 会优先使用这个 DNS 服务器进行查询。
2. 无匹配时, 按从上往下的顺序进行查询,并且会跳过 1 步骤中使用的最后一个服务器。
3. 只返回匹配 expectIPs 的 IP 列表。
DNS 服务器的处理流程示意图如下:
![](./dns_flow.png?classes=border,shadow)
## DnsObject
`DnsObject` 对应配置文件的 `dns` 项。
```json
{
"dns": {
"hosts": {
"baidu.com": "127.0.0.1"
},
"servers": [
"8.8.8.8",
"8.8.4.4",
{
"address": "1.2.3.4",
"port": 5353,
"domains": ["domain:xray.com"],
"expectIPs": ["geoip:cn"]
},
"localhost"
],
"clientIp": "1.2.3.4",
"tag": "dns_inbound"
}
}
```
> `hosts`: map{string: address}
静态 IP 列表,其值为一系列的 "域名": "地址"。其中地址可以是 IP 或者域名。在解析域名时,如果域名匹配这个列表中的某一项:
- 当该项的地址为 IP 时,则解析结果为该项的 IP
- 当该项的地址为域名时,会使用此域名进行 IP 解析,而不使用原始域名。
域名的格式有以下几种形式:
- 纯字符串:当此字符串完整匹配目标域名时,该规则生效。例如 "xray.com" 匹配 "xray.com",但不匹配 "www.xray.com"。
- 正则表达式:由 `"regexp:"` 开始,余下部分是一个正则表达式。当此正则表达式匹配目标域名时,该规则生效。例如 "regexp:\\\\.goo.\*\\\\.com\$" 匹配 "www.google.com"、"fonts.googleapis.com",但不匹配 "google.com"。
- 子域名 (推荐):由 `"domain:"` 开始,余下部分是一个域名。当此域名是目标域名或其子域名时,该规则生效。例如 "domain:xray.com" 匹配 "www.xray.com" 与 "xray.com",但不匹配 "wxray.com"。
- 子串:由 `"keyword:"` 开始,余下部分是一个字符串。当此字符串匹配目标域名中任意部分,该规则生效。比如 "keyword:sina.com" 可以匹配 "sina.com"、"sina.com.cn" 和 "www.sina.com",但不匹配 "sina.cn"。
- 预定义域名列表:由 `"geosite:"` 开头,余下部分是一个名称,如 `geosite:google` 或者 `geosite:cn`。名称及域名列表参考 [预定义域名列表](./routing.md#预定义域名列表)。
> `servers`: \[string | [ServerObject](#serverobject) \]
一个 DNS 服务器列表支持的类型有两种DNS 地址(字符串形式)和 [ServerObject](#serverobject) 。
当它的值是一个 DNS IP 地址时,如 `"8.8.8.8"`Xray 会使用此地址的 53 端口进行 DNS 查询。
当值为 `"localhost"` 时,表示使用本机预设的 DNS 配置。
当值是 `"https://host:port/dns-query"` 的形式,如 `"https://dns.google/dns-query"`Xray 会使用 `DNS over HTTPS` (RFC8484, 简称 DOH) 进行查询。有些服务商拥有 IP 别名的证书,可以直接写 IP 形式,比如 `https://1.1.1.1/dns-query`。也可使用非标准端口和路径,如 `"https://a.b.c.d:8443/my-dns-query"`
当值是 `"https+local://host:port/dns-query"` 的形式,如 `"https+local://dns.google/dns-query"`Xray 会使用 `DOH本地模式` 进行查询,即 DOH 请求不会经过 Routing/Outbound 等组件,直接对外请求,以降低耗时。一般适合在服务端使用。也可使用非标端口和路径。
当值是 `fakedns` 时,将使用 FakeDNS 功能进行查询。
::: tip TIP 1
当使用 `localhost` 时,本机的 DNS 请求不受 Xray 控制,需要额外的配置才可以使 DNS 请求由 Xray 转发。
:::
::: tip TIP 2
不同规则初始化得到的 DNS 客户端会在 Xray 启动日志中以 `info` 级别体现,比如 `local DOH``remote DOH``udp` 等模式。
:::
::: tip TIP 3
(v1.4.0+) 可以在 [日志](./log.md) 中打开 DNS 查询日志。
:::
> `clientIp`: string
用于 DNS 查询时通知服务器以指定 IP 位置。不能是私有地址。
> `tag`: string
由内置 DNS 发出的查询流量,除 `localhost``DOHL_` 模式外,都可以用此标识在路由使用 `inboundTag` 进行匹配。
### ServerObject
```json
{
"address": "1.2.3.4",
"port": 5353,
"domains": ["domain:xray.com"],
"expectIPs": ["geoip:cn"]
}
```
> `address`: address
一个 DNS 服务器列表支持的类型有两种DNS 地址(字符串形式)和 ServerObject 。
当它的值是一个 DNS IP 地址时,如 "8.8.8.8"Xray 会使用此地址的 53 端口进行 DNS 查询。
当值为 "localhost" 时,表示使用本机预设的 DNS 配置。
当值是 `"https://host:port/dns-query"` 的形式,如 `"https://dns.google/dns-query"`Xray 会使用 `DNS over HTTPS` (RFC8484, 简称 DOH) 进行查询。有些服务商拥有 IP 别名的证书,可以直接写 IP 形式,比如 `https://1.1.1.1/dns-query`。也可使用非标准端口和路径,如 `"https://a.b.c.d:8443/my-dns-query"`
当值是 `"https+local://host:port/dns-query"` 的形式,如 `"https+local://dns.google/dns-query"`Xray 会使用 DOH 本地模式 进行查询,即 DOH 请求不会经过 Routing/Outbound 等组件,直接对外请求,以降低耗时。一般适合在服务端使用。也可使用非标端口和路径。
当值是 `fakedns` 时,将使用 FakeDNS 功能进行查询。
> `port`: number
DNS 服务器端口,如 `53`。此项缺省时默认为 `53`。当使用 DOH 模式该项无效,非标端口应在 URL 中指定。
> `domains`: \[string\]
一个域名列表,此列表包含的域名,将优先使用此服务器进行查询。域名格式和 [路由配置](./routing.md#ruleobject) 中相同。
> `expectIPs`:\[string\]
一个 IP 范围列表,格式和 [路由配置](./routing.md#ruleobject) 中相同。
当配置此项时Xray DNS 会对返回的 IP 的进行校验,只返回包含 expectIPs 列表中的地址。
如果未配置此项,会原样返回 IP 地址。

BIN
docs/en/config/dns_flow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 KiB

40
docs/en/config/fakedns.md Normal file
View File

@ -0,0 +1,40 @@
# FakeDNS
FakeDNS 通过伪造 DNS 以获取目标域名,能够降低 DNS 查询时的延迟、配合透明代理获取目标域名。
::: warning
FakeDNS 有可能会污染本地 DNS导致 Xray 关闭后“无法访问网络”。
:::
## FakeDNSObject
`FakeDNSObject` 对应配置文件的 `fakedns` 项。
```json
{
"ipPool": "198.18.0.0/16",
"poolSize": 65535
}
```
> `ipPool`: CIDR
FakeDNS 将使用此选项指定的 IP 块分配地址。
> `poolSize`: int
指定 FakeDNS 储存的 域名-IP 映射的最大数目。当映射数超过此值后,会按照 LRU 规则淘汰映射。默认为 65535。
### 如何使用?
FakeDNS 本质上是一个 [DNS 服务器](./dns.md#serverobject),能够与任意 DNS 规则配合使用。
::: tip
只有将 DNS 查询路由到 FakeDNS才能使其发挥作用。
:::
另外,你需要在入站中开启 `Sniffing` ,并使用 `fakedns` 目标地址重置。
::: warning
如果 FakeIP 没有被正确的还原为域名,将无法连接到服务器。
:::

View File

@ -0,0 +1,48 @@
# 环境变量
Xray 提供以下环境变量以供修改 Xray 的一些底层配置。
## XTLS 信息显示
### VLESS
- 名称:`xray.vless.xtls.show``XRAY_VLESS_XTLS_SHOW`
- 默认值:`""`
使用 VLESS 协议时,设置此环境变量为 true 时, 会在终端或日志中输出 XTLS 的相关信息.
::: tip
可打开此环境变量并根据是否有输出 XTLS 相关信息, 来确定 XTLS 是否成功被应用.
:::
### TROJAN
- 名称:`xray.trojan.xtls.show``XRAY_TROJAN_XTLS_SHOW`
- 默认值:`""`
使用 trojan 协议时, 设置此环境变量为 true 时, 会在终端或日志中输出 XTLS 的相关信息.
::: tip
可打开此环境变量并根据是否有输出 XTLS 相关信息, 来确定 XTLS 是否成功被应用.
:::
## 资源文件路径
- 名称:`xray.location.asset``XRAY_LOCATION_ASSET`
- 默认值:和 Xray 文件同路径。
这个环境变量指定了一个文件夹位置,这个文件夹应当包含 geoip.dat 和 geosite.dat 文件。
## 配置文件位置
- 名称:`xray.location.config``XRAY_LOCATION_CONFIG`
- 默认值:和 Xray 文件同路径。
这个环境变量指定了一个文件夹位置,这个文件夹应当包含 config.json 文件。
## 多配置目录
- 名称:`xray.location.confdir``XRAY_LOCATION_CONFDIR`
- 默认值:`""`
这个目录内的 `.json` 文件会按文件名顺序读取,作为多配置选项。

View File

@ -0,0 +1,100 @@
# Fallback 回落
> **Fallback 是 Xray 的最强大功能之一, 可有效防止主动探测, 自由配置常用端口多服务共享**
fallback 为 Xray 提供了高强度的防主动探测性, 并且具有独创的首包回落机制.
fallback 也可以将不同类型的流量根据 path 进行分流, 从而实现一个端口, 多种服务共享.
目前您可以在使用 VLESS 或者 trojan 协议时, 通过配置 fallbacks 来使用回落这一特性, 并且创造出非常丰富的组合玩法.
## fallbacks 配置
```json
"fallbacks": [
{
"dest": 80
}
]
```
> `fallbacks`: \[ [FallbackObject](#fallbackobject) \]
一个数组,包含一系列强大的回落分流配置。
### FallbackObject
```json
{
"name": "",
"alpn": "",
"path": "",
"dest": 80,
"xver": 0
}
```
**`fallbacks` 是一个数组,这里是其中一个子元素的配置说明。**
`fallbacks` 项是可选的,只能用于 TCP+TLS 传输组合
- 该项有子元素时,[Inbound TLS](../transport.md#tlsobject) 需设置 `"alpn":["http/1.1"]`。\*\*
通常,你需要先设置一组 `alpn``path` 均省略或为空的默认回落,然后再按需配置其它分流。
VLESS 会把 TLS 解密后首包长度 < 18 或协议版本无效身份认证失败的流量转发到 `dest` 指定的地址
其它传输组合必须删掉 `fallbacks` 项或所有子元素,此时也不会开启 FallbackVLESS 会等待读够所需长度,协议版本无效或身份认证失败时,将直接断开连接。
> `name`: string
尝试匹配 TLS SNI(Server Name Indication),空为任意,默认为 ""
> `alpn`: string
尝试匹配 TLS ALPN 协商结果,空为任意,默认为 ""
有需要时VLESS 才会尝试读取 TLS ALPN 协商结果,若成功,输出 info `realAlpn =` 到日志。
用途:解决了 Nginx 的 h2c 服务不能同时兼容 http/1.1 的问题Nginx 需要写两行 listen分别用于 1.1 和 h2c。
注意fallbacks alpn 存在 `"h2"` 时,[Inbound TLS](../transport.md#tlsobject) 需设置 `"alpn":["h2","http/1.1"]`,以支持 h2 访问。
::: tip
Fallback 内设置的 `alpn` 是匹配实际协商出的 ALPN而 Inbound TLS 设置的 `alpn` 是握手时可选的 ALPN 列表,两者含义不同。
:::
> `path`: string
尝试匹配首包 HTTP PATH空为任意默认为空非空则必须以 `/` 开头,不支持 h2c。
智能有需要时VLESS 才会尝试看一眼 PATH不超过 55 个字节;最快算法,并不完整解析 HTTP若成功输出 INFO 日志 `realPath =`
用途:分流其它 inbound 的 WebSocket 流量或 HTTP 伪装流量,没有多余处理、纯粹转发流量,理论性能比 Nginx 更强。
注意:**fallbacks 所在入站本身必须是 TCP+TLS**,这是分流至其它 WS 入站用的,被分流的入站则无需配置 TLS。
> `dest`: string | number
决定 TLS 解密后 TCP 流量的去向,目前支持两类地址:(该项必填,否则无法启动)
1. TCP格式为 `"addr:port"`,其中 addr 支持 IPv4、域名、IPv6若填写域名也将直接发起 TCP 连接(而不走内置的 DNS
2. Unix domain socket格式为绝对路径形如 `"/dev/shm/domain.socket"`,可在开头加 `@` 代表 [abstract](https://www.man7.org/linux/man-pages/man7/unix.7.html)`@@` 则代表带 padding 的 abstract。
若只填 port数字或字符串均可形如 `80``"80"`,通常指向一个明文 http 服务addr 会被补为 `"127.0.0.1"`)。
> `xver`: number
发送 [PROXY protocol](https://www.haproxy.org/download/2.2/doc/proxy-protocol.txt),专用于传递请求的真实来源 IP 和端口,填版本 1 或 2默认为 0即不发送。若有需要建议填 1。
目前填 1 或 2功能完全相同只是结构不同且前者可打印后者为二进制。Xray 的 TCP 和 WS 入站均已支持接收 PROXY protocol。
::: warning
若你正在 [配置 Nginx 接收 PROXY protocol](https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/#configuring-nginx-to-accept-the-proxy-protocol),除了设置 proxy_protocol 外,还需设置 set_real_ip_from否则可能会出问题。
:::
### 补充说明
- 将匹配到最精确的子元素,与子元素的排列顺序无关。若配置了几个 alpn 和 path 均相同的子元素,则会以最后的为准。
- 回落分流均是解密后 TCP 层的转发,而不是 HTTP 层,只在必要时检查首包 PATH。
- 您可以查看更多的关于 Fallbacks 的使用技巧和心得
- [Fallbacks 功能简析](../documents/level-1/fallbacks-lv1)
## Fallbacks 设计理论 <Badge text="WIP" type="warning"/>

View File

@ -0,0 +1,176 @@
# 多文件配置
Xray 程序支持使用多个配置文件。
多配置文件的主要作用在于分散不同作用模块配置,便于管理和维护。
该功能主要考虑是为了丰富 Xray 的生态链,比如对于 GUI 的客户端,一般只实现节点选择等固定的功能,对于太复杂的配置难以图形化实现;只需留一个 `confdir` 的自定义配置目录供配置复杂的功能;对于服务器的部署脚本,只需往 `confdir` 添加文件即可实现配置多种协议。
## 多文件启动
::: tip
启动信息中会提示依次读入的每个配置文件,留意启动信息是否符合你预设的顺序。
:::
```shell
$ xray run -confdir /etc/xray/confs
```
也可使用 `Xray.location.confdir``Xray_LOCATION_CONFDIR` 指定 `confdir`
参数 `-confdir` 的作用优先于环境变量,如果参数指定了有效的目录则不再读取环境变量中的路径。
## 规则说明
### 普通对象(`{}`
**在 json 的顶级对象当中,后者覆盖或补充前者。**
比如:
- base.json
```json
{
"log": {},
"api": {},
"dns": {},
"stats": {},
"policy": {},
"transport": {},
"routing": {},
"inbounds": []
}
```
- outbounds.json
```json
{
"outbounds": []
}
```
以多配置启动 Xray
```bash
$ xray run -confdir /etc/xray/confs
```
这两个配置文件的就等效于合成一起的整配置。当需要修改出口节点,只需要修改 `outbounds.json` 内容。
如果需要改编日志 log 的级别,也不需要改 `base.json`,只需后续增加一个配置:
- debuglog.json
```json
{
"log": {
"loglevel": "debug"
}
}
```
启动顺序放置在 base 后,即可输出 debug 级别的日志
### 数组(`[]`
在 json 配置中的`inbounds``outbounds`是数组结构,他们有特殊的规则:
- 当配置中的数组元素有 2 或以上,覆盖前者的 inbounds/oubounds
- 当配置中的数组元素只有 1 个时,查找原有`tag`相同的元素进行覆盖;若无法找到:
- 对于 inbounds添加至最后inbounds 内元素顺序无关)
- 对于 outbounds添加至最前outbounds 默认首选出口);但如果文件名含有 tail大小写均可添加至最后。
借助多配置,可以很方便为原有的配置添加不同协议的 inbound而不必修改原有配置。
以下例子不是有效配置,只为展示上述规则。
- 000.json
```json
{
"inbounds": [
{
"protocol": "socks",
"tag": "socks",
"port": 1234
}
]
}
```
- 001.json
```json
{
"inbounds": [
{
"protocol": "http",
"tag": "http"
}
]
}
```
- 002.json
```json
{
"inbounds": [
{
"protocol": "socks",
"tag": "socks",
"port": 4321
}
]
}
```
三个配置将会合成为:
```json
{
"inbounds": [
{
"protocol": "socks",
"tag": "socks",
"port": 4321 // < 002顺序在000后因此覆盖tag为socks的inbound端口为4321
},
{
"protocol": "http",
"tag": "http"
}
]
}
```
## 推荐的多文件列表
执行:
```bash
for BASE in 00_log 01_api 02_dns 03_routing 04_policy 05_inbounds 06_outbounds 07_transport 08_stats 09_reverse; do echo '{}' > "/etc/Xray/$BASE.json"; done
```
```bash
for BASE in 00_log 01_api 02_dns 03_routing 04_policy 05_inbounds 06_outbounds 07_transport 08_stats 09_reverse; do echo '{}' > "/usr/local/etc/Xray/$BASE.json"; done
```
```bash
.
├── 00_log.json
├── 01_api.json
├── 02_dns.json
├── 03_routing.json
├── 04_policy.json
├── 05_inbounds.json
├── 06_outbounds.json
├── 07_transport.json
├── 08_stats.json
└── 09_reverse.json
0 directories, 10 files
```

View File

@ -0,0 +1,46 @@
# VLESS 协议详解
> **VLESS 是原创的无状态的轻量传输协议, 也是 Xray 一切的开始**
## 协议详解 <Badge text="WIP" type="warning"/>
## 配置模板
[Xray-examples](https://github.com/xtls/Xray-examples) 有完整的 VLESS 配置示例供参考。(但目前不能保证其它协议的配置示例质量)
## 客户端开发指引
1. VLESS 协议本身还会有不兼容升级,但客户端配置文件参数基本上是只增不减的。**所以如果你开发了用 core 的客户端,现在就可以适配。** iOS 客户端的协议实现则需紧跟升级。
2. **视觉标准UI 标识请统一用 VLESS**,而不是 VLess / Vless / vless配置文件不受影响代码内则顺其自然。
3. `encryption` 应做成输入框而不是选择框,新配置的默认值应为 `none`,若用户置空则应代填 `none`
**以下为已支持图形化配置 VLESS 的部分客户端列表,推荐使用:**(排名不分先后顺序)
- OpenWrt
- [PassWall](https://github.com/xiaorouji/openwrt-passwall)
- [Hello World](https://github.com/jerrykuku/luci-app-vssr)
- [ShadowSocksR Plus+](https://github.com/fw876/helloworld)
- Windows
- [v2rayN](https://github.com/2dust/v2rayN)
- [Qv2ray](https://github.com/Qv2ray/Qv2ray)
- Android
- [v2rayNG](https://github.com/2dust/v2rayNG)
- [Kitsunebi](https://github.com/rurirei/Kitsunebi/tree/release_xtls)
- iOS / Mac
- [Shadowrocket](https://apps.apple.com/app/shadowrocket/id932747118)
## Fallbacks
Fallbacks 是 Xray 独创的新型协议回落模式解析, 可有效防止主动探测, 自由配置常用端口多服务共享.
目前 Xray 中的 VLESS 和 trojan 协议支持 Fallbacks.
- [Fallbacks 配置说明](../fallback/#fallbacks-配置)
- [Fallbacks 功能简析]()
- [Fallbacks 设计理论](../fallback/#fallbacks-设计理论)
## VLESS 分享链接标准
感谢 <img src="https://avatars2.githubusercontent.com/u/7822648?s=32" width="32px" height="32px" alt="a"/> [@DuckSoft](https://github.com/DuckSoft) 的提案!
目前为初步提案, 详情请见 [VMessAEAD / VLESS 分享链接标准提案](https://github.com/XTLS/Xray-core/issues/91)

View File

@ -0,0 +1,5 @@
# XTLS 深度剖析
> **XTLS 是 Xray 的原创黑科技, 也是使 Xray 性能一骑绝尘的核心动力**
<Badge text="WIP" type="warning"/>

135
docs/en/config/inbound.md Normal file
View File

@ -0,0 +1,135 @@
# 入站代理
入站连接用于接收发来的数据,可用的协议请见[inbound 可用协议列表](./inbounds/)。
## InboundObject
`InboundObject` 对应配置文件中 `inbounds` 项的一个子元素。
```json
{
"inbounds": [
{
"listen": "127.0.0.1",
"port": 1080,
"protocol": "协议名称",
"settings": {},
"streamSettings": {},
"tag": "标识",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
},
"allocate": {
"strategy": "always",
"refresh": 5,
"concurrency": 3
}
}
]
}
```
> `listen`: address
监听地址IP 地址或 Unix domain socket默认值为 `"0.0.0.0"`,表示接收所有网卡上的连接.
可以指定一个系统可用的 IP 地址。
支持填写 Unix domain socket格式为绝对路径形如 `"/dev/shm/domain.socket"`,可在开头加 `@` 代表 [abstract](https://www.man7.org/linux/man-pages/man7/unix.7.html)`@@` 则代表带 padding 的 abstract。
填写 Unix domain socket 时,`port``allocate` 将被忽略,协议目前可选 VLESS、VMess、Trojan传输方式可选 TCP、WebSocket、HTTP/2。
> `port`: number | "env:variable" | string
端口。接受的格式如下:
- 整型数值:实际的端口号。
- 环境变量:以 `"env:"` 开头,后面是一个环境变量的名称,如 `"env:PORT"`。Xray 会以字符串形式解析这个环境变量。
- 字符串:可以是一个数值类型的字符串,如 `"1234"`;或者一个数值范围,如 `"5-10"` 表示端口 5 到端口 10这 6 个端口。
当只有一个端口时Xray 会在此端口监听入站连接。当指定了一个端口范围时,取决于 `allocate` 设置。
> `protocol`: string
连接协议名称,可选的协议类型见 [inbound 可用协议列表](./inbounds/)。
> `settings`: InboundConfigurationObject
具体的配置内容,视协议不同而不同。详见每个协议中的 `InboundConfigurationObject`
> `streamSettings`: [StreamSettingsObject](./transport.md#streamsettingsobject)
底层传输方式transport是当前 Xray 节点和其它节点对接的方式
> `tag`: string
> 此入站连接的标识,用于在其它的配置中定位此连接。
::: danger
当其不为空时,其值必须在所有 `tag` 中**唯一**。
:::
> `sniffing`: [SniffingObject](#sniffingobject)
流量探测主要作用于在透明代理等用途.
比如一个典型流程如下:
1. 如有一个设备上网,去访问 abc.com,首先设备通过 DNS 查询得到 abc.com 的 IP 是 1.2.3.4,然后设备会向 1.2.3.4 去发起连接.
2. 如果不设置嗅探,Xray 收到的连接请求是 1.2.3.4,并不能用于域名规则的路由分流.
3. 当设置了 sniffing 中的 enable 为 true,Xray 处理此连接的流量时,会从流量的数据中,嗅探出域名,即 abc.com
4. Xray 会把 1.2.3.4 重置为 abc.com.路由就可以根据域名去进行路由的域名规则的分流
因为变成了一个向 abc.com 请求的连接, 就可以做更多的事情, 除了路由域名规则分流, 还能重新做 DNS 解析等其他工作.
当设置了 sniffing 中的 enable 为 true, 还能嗅探出 bittorrent 类型的流量, 然后可以在路由中配置"protocol"项来设置规则处理 BT 流量, 比如服务端用来拦截 BT 流量, 或客户端固定转发 BT 流量到某个 VPS 去等.
> `allocate`: [AllocateObject](#allocateobject)
当设置了多个 port 时, 端口分配的具体设置
### SniffingObject
```json
{
"enabled": true,
"destOverride": ["http", "tls", "fakedns"],
"metadataOnly": false
}
```
> `enabled`: true | false
是否开启流量探测。
> `destOverride`: \["http" | "tls" | "fakedns" \]
当流量为指定类型时,按其中包括的目标地址重置当前连接的目标。
> `metadataOnly`: true | false
当启用时,将仅使用连接的元数据嗅探目标地址。此时,`http``tls` 将不能使用。
### AllocateObject
```json
{
"strategy": "always",
"refresh": 5,
"concurrency": 3
}
```
> `strategy`: "always" | "random"
端口分配策略。
- `"always"` 表示总是分配所有已指定的端口,`port` 中指定了多少个端口Xray 就会监听这些端口。
- `"random"` 表示随机开放端口,每隔 `refresh` 分钟在 `port` 范围中随机选取 `concurrency` 个端口来监听。
> `refresh`: number
随机端口刷新间隔,单位为分钟。最小值为 `2`,建议值为 `5`。这个属性仅当 `strategy` 设置为 `"random"` 时有效。
> `concurrency`: number
随机端口数量。最小值为 `1`,最大值为 `port` 范围的三分之一。建议值为 `3`

View File

@ -0,0 +1,33 @@
# Inbounds 协议
> 这个章节包含了目前所有可用于 Inbounds 的协议及具体配置细节.
## 协议列表
> [Dokodemo-door](./dokodemo.md)
Dokodemo door任意门可以监听一个本地端口并把所有进入此端口的数据发送至指定服务器的一个端口从而达到端口映射的效果。
> [HTTP](./http.md)
HTTP 协议
> [Socks](./socks.md)
标准 Socks 协议实现,兼容 [Socks 4](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)、Socks 4a 和 [Socks 5](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)。
> [VLESS](./vless.md)
VLESS 是一个无状态的轻量传输协议,可以作为 Xray 客户端和服务器之间的桥梁。
> [VMess](./vmess.md)
[VMess](../development/protocols/vmess.md) 是一个加密传输协议,,可以作为 Xray 客户端和服务器之间的桥梁。
> [Trojan](./trojan.md)
[Trojan](https://trojan-gfw.github.io/trojan/protocol) 协议
> [Shadowsocks](./shadowsocks.md)
[Shadowsocks](https://zh.wikipedia.org/wiki/Shadowsocks) 协议。

View File

@ -0,0 +1,50 @@
# Dokodemo-Door
Dokodemo door任意门可以监听一个本地端口并把所有进入此端口的数据发送至指定服务器的一个端口从而达到端口映射的效果。
## InboundConfigurationObject
```json
{
"address": "8.8.8.8",
"port": 53,
"network": "tcp",
"timeout": 0,
"followRedirect": false,
"userLevel": 0
}
```
> `address`: address
将流量转发到此地址。可以是一个 IP 地址,形如 `"1.2.3.4"`,或者一个域名,形如 `"xray.com"`。字符串类型。
`followRedirect`(见下文)为 `true` 时,`address` 可为空。
> `port`: number
将流量转发到目标地址的指定端口,范围 \[1, 65535\],数值类型。必填参数。
> `network`: "tcp" | "udp" | "tcp,udp"
可接收的网络协议类型。比如当指定为 `"tcp"` 时,仅会接收 TCP 流量。默认值为 `"tcp"`
> `timeout`: number
连接空闲的时间限制。单位为秒。默认值为 `300`。处理一个连接时,如果在 `timeout` 时间内,没有任何数据被传输,则中断该连接。
> `followRedirect`: true | false
当值为 `true`dokodemo-door 会识别出由 iptables 转发而来的数据,并转发到相应的目标地址。
可参考 [传输配置](../transport.md#sockoptobject) 中的 `tproxy` 设置。
> `userLevel`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
userLevel 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值. 如不指定, 默认为 0。
## 透明代理配置样例
此部分请参考[透明代理TProxy配置教程](../../document/level-2/tproxy)。

View File

@ -0,0 +1,79 @@
# HTTP
HTTP 协议。
::: warning
**http 协议没有对传输加密,不适宜经公网中传输,更容易成为被人用作攻击的肉鸡。**
:::
`http` 入站更有意义的用法是在局域网或本机环境下监听,为其他程序提供本地服务。
::: tip TIP 1
`http proxy` 只能代理 tcp 协议udp 系的协议均不能通过。
:::
::: tip TIP 2
在 Linux 中使用以下环境变量即可在当前 session 使用全局 HTTP 代理(很多软件都支持这一设置,也有不支持的)。
- `export http_proxy=http://127.0.0.1:8080/` (地址须改成你配置的 HTTP 入站代理地址)
- `export https_proxy=$http_proxy`
:::
## InboundConfigurationObject
```json
{
"timeout": 0,
"accounts": [
{
"user": "my-username",
"pass": "my-password"
}
],
"allowTransparent": false,
"userLevel": 0
}
```
> `timeout`: number
连接空闲的时间限制。单位为秒。默认值为 `300`, 0 表示不限时。
处理一个连接时,如果在 `timeout` 时间内,没有任何数据被传输,则中断该连接。
> `accounts`: \[[AccountObject](#accountobject)\]
一个数组,数组中每个元素为一个用户帐号。默认值为空。
`accounts` 非空时HTTP 代理将对入站连接进行 Basic Authentication 验证。
> `allowTransparent`: true | false
当为 `true` 时,会转发所有 HTTP 请求,而非只是代理请求。
::: tip
若配置不当,开启此选项会导致死循环。
:::
> `userLevel`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
userLevel 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。
### AccountObject
```json
{
"user": "my-username",
"pass": "my-password"
}
```
> `user`: string
用户名,字符串类型。必填。
> `pass`: string
密码,字符串类型。必填。

View File

@ -0,0 +1,87 @@
# Shadowsocks
[Shadowsocks](https://zh.wikipedia.org/wiki/Shadowsocks) 协议,兼容大部分其它版本的实现。
目前兼容性如下:
- 支持 TCP 和 UDP 数据包转发,其中 UDP 可选择性关闭;
- 推荐的加密方式:
- AES-256-GCM
- AES-128-GCM
- ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305
- none 或 plain
不推荐的加密方式:
- AES-256-CFB
- AES-128-CFB
- ChaCha20
- ChaCha20-IETF
::: danger
"none" 不加密方式下,服务器端不会验证 "password" 中的密码。为确保安全性, 一般需要加上 TLS 并在传输层使用安全配置,例如 WebSocket 配置较长的 path
:::
## InboundConfigurationObject
```json
{
"settings": {
"clients": [
{
"password": "密码",
"method": "aes-256-gcm",
"level": 0,
"email": "love@xray.com"
}
],
"network": "tcp,udp"
}
}
```
> `network`: "tcp" | "udp" | "tcp,udp"
可接收的网络协议类型。比如当指定为 `"tcp"` 时,仅会接收 TCP 流量。默认值为 `"tcp"`
## ClientObject
```json
{
"password": "密码",
"method": "aes-256-gcm",
"level": 0,
"email": "love@xray.com"
}
```
::: tip
(v1.2.3+) Xray 支持 Shadowsocks 单端口多用户,但是需要将该入站所有用户的加密方式设置为 AEAD。
:::
> `method`: string
必填。
- 推荐的加密方式:
- AES-256-GCM
- AES-128-GCM
- ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305
- none 或 plain
> `password`: string
必填,任意字符串。
Shadowsocks 协议不限制密码长度,但短密码会更可能被破解,建议使用 16 字符或更长的密码。
> `level`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
`level` 的值, 对应 [policy](../policy.md#levelpolicyobject) 中 `level` 的值。 如不指定, 默认为 0。
> `email`: string
用户邮箱,用于区分不同用户的流量(日志、统计)。

View File

@ -0,0 +1,75 @@
# Socks
标准 Socks 协议实现,兼容 [Socks 4](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)、Socks 4a 和 [Socks 5](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)。
::: danger
**socks 协议没有对传输加密,不适宜经公网中传输**
:::
`socks` 入站更有意义的用法是在局域网或本机环境下监听,为其他程序提供本地服务。
## InboundConfigurationObject
```json
{
"auth": "noauth",
"accounts": [
{
"user": "my-username",
"pass": "my-password"
}
],
"udp": false,
"ip": "127.0.0.1",
"userLevel": 0
}
```
> `auth`: "noauth" | "password"
Socks 协议的认证方式,支持 `"noauth"` 匿名方式和 `"password"` 用户密码方式。
默认值为 `"noauth"`
> `accounts`: \[ [AccountObject](#accountobject) \]
一个数组,数组中每个元素为一个用户帐号。
此选项仅当 `auth``password` 时有效。
默认值为空。
> `udp`: true | false
是否开启 UDP 协议的支持。
默认值为 `false`
> `ip`: address
当开启 UDP 时Xray 需要知道本机的 IP 地址。
默认值为 `"127.0.0.1"`
> `userLevel`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
userLevel 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。
### AccountObject
```json
{
"user": "my-username",
"pass": "my-password"
}
```
> `user`: string
用户名,字符串类型。必填。
> `pass`: string
密码,字符串类型。必填。

View File

@ -0,0 +1,87 @@
# Trojan
[Trojan](https://trojan-gfw.github.io/trojan/protocol) 协议
::: danger
Trojan 被设计工作在正确配置的加密 TLS 隧道
:::
## InboundConfigurationObject
```json
{
"clients": [
{
"password": "password",
"email": "love@xray.com",
"level": 0,
"flow": "xtls-rprx-direct"
}
],
"fallbacks": [
{
"dest": 80
}
]
}
```
> `clients`: \[ [ClientObject](#clientobject) \]
一个数组,代表一组服务端认可的用户.
其中每一项是一个用户 [ClientObject](#clientobject)。
> `fallbacks`: \[ [FallbackObject](../examples/fallback.md) \]
一个数组,包含一系列强大的回落分流配置(可选)。
fallbacks 的具体配置请点击[FallbackObject](../examples/fallback.md#fallbacks-配置)
::: tip
Xray 的 Trojan 有完整的 fallbacks 支持,配置方式完全一致。
触发回落的条件也与 VLESS 类似:首包长度 < 58 或第 57 个字节不为 `\r`因为 Trojan 没有协议版本或身份认证失败
:::
### ClientObject
```json
{
"password": "password",
"email": "love@xray.com",
"level": 0,
"flow": "xtls-rprx-direct"
}
```
> `password`: string
必填,任意字符串。
> `email`: string
邮件地址,可选,用于标识用户
::: danger
如果存在多个 ClientObject, 请注意 email 不可以重复。
:::
> `level`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
userLevel 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。
> `flow`: string
流控模式,用于选择 XTLS 的算法。
目前入站协议中有以下流控模式可选:
- `xtls-rprx-origin`:最初的流控模式,此时客户端仅可选择 `xtls-rprx-origin``xtls-rprx-origin-udp443` 这两种流控模式。该模式纪念价值大于实际使用价值。
- `xtls-rprx-direct`**推荐**,所有平台皆可使用的典型流控方式,此时客户端可选择任何流控模式
::: warning 注意
`flow` 被指定时,还需要将该入站协议的 `streamSettings.security` 一项指定为 `xtls``tlsSettings` 改为 `xtlsSettings`。详情请参考 [streamSettings](../transport.md#streamsettingsobject)。
:::
此外,目前 XTLS 仅支持 TCP、mKCP、DomainSocket 这三种传输方式。

View File

@ -0,0 +1,100 @@
# VLESS
::: danger
目前 VLESS 没有自带加密,请用于可靠信道,如 TLS。
目前 VLESS 不支持分享。
:::
VLESS 是一个无状态的轻量传输协议,它分为入站和出站两部分,可以作为 Xray 客户端和服务器之间的桥梁。
与 [VMess](./vmess.md) 不同VLESS 不依赖于系统时间,认证方式同样为 UUID但不需要 alterId。
## InboundConfigurationObject
```json
{
"clients": [
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"level": 0,
"email": "love@xray.com",
"flow": "xtls-rprx-direct"
}
],
"decryption": "none",
"fallbacks": [
{
"dest": 80
}
]
}
```
> `clients`: \[ [ClientObject](#clientobject) \]
一个数组,代表一组服务端认可的用户.
其中每一项是一个用户 [ClientObject](#clientobject)。
> `decryption`: "none"
现阶段需要填 `"none"`,不能留空。
若未正确设置 decryption 的值,使用 Xray 或 -test 时会收到错误信息。
注意这里是 decryption和 clients 同级。
decryption 和 vmess 协议的 encryption 的位置不同,是因为若套一层约定加密,服务端需要先解密才能知道是哪个用户。
> `fallbacks`: \[ [FallbackObject](../features/fallback.md) \]
一个数组,包含一系列强大的回落分流配置(可选)。
fallbacks 的具体配置请点击 [FallbackObject](../features/fallback.md#fallbacks-配置)
### ClientObject
```json
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"level": 0,
"email": "love@xray.com",
"flow": "xtls-rprx-direct"
}
```
> `id`: string
VLESS 的用户 ID可以是任意小于 30 字节的字符串, 也可以是一个合法的 UUID.
自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写 id 来标识同一用户,即
- 写 `"id": "我爱🍉老师1314"`,
- 或写 `"id": "5783a3e7-e373-51cd-8642-c83782b807c5"` (此 UUID 是 `我爱🍉老师1314` 的 UUID 映射)
其映射标准在 [VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158)
你可以使用命令 `xray uuid -i "自定义字符串"` 生成自定义字符串所映射的的 UUID。
> 也可以使用命令 `xray uuid` 生成随机的 UUID.
> `level`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。
> `email`: string
用户邮箱,用于区分不同用户的流量(会体现在日志、统计中)。
> `flow`: string
流控模式,用于选择 XTLS 的算法。
目前入站协议中有以下流控模式可选:
- `xtls-rprx-origin`:最初的流控模式,此时客户端仅可选择 `xtls-rprx-origin``xtls-rprx-origin-udp443` 这两种流控模式。该模式纪念价值大于实际使用价值。
- `xtls-rprx-direct`**推荐**,所有平台皆可使用的典型流控方式,此时客户端可选择任何流控模式
::: warning 注意
`flow` 被指定时,还需要将该入站协议的 `streamSettings.security` 一项指定为 `xtls``tlsSettings` 改为 `xtlsSettings`。详情请参考 [streamSettings](../transport.md#streamsettingsobject)。
:::
此外,目前 XTLS 仅支持 TCP、mKCP、DomainSocket 这三种传输方式。

View File

@ -0,0 +1,150 @@
# VMess
[VMess](../../development/protocols/vmess.md) 是一个加密传输协议,通常作为 Xray 客户端和服务器之间的桥梁。
::: danger
VMess 依赖于系统时间,请确保使用 Xray 的系统 UTC 时间误差在 90 秒之内,时区无关。在 Linux 系统中可以安装`ntp`服务来自动同步系统时间。
:::
## InboundConfigurationObject
```json
{
"clients": [
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"level": 0,
"alterId": 0,
"email": "love@xray.com"
}
],
"default": {
"level": 0,
"alterId": 0
},
"detour": {
"to": "tag_to_detour"
},
"disableInsecureEncryption": false
}
```
> `clients`: \[ [ClientObject](#clientobject) \]
一个数组,代表一组服务端认可的用户.
其中每一项是一个用户[ClientObject](#clientobject)。
当此配置用作动态端口时Xray 会自动创建用户。
> `detour`: [DetourObject](#detourobject)
指示对应的出站协议使用另一个服务器。
> `default`: [DefaultObject](#defaultobject)
可选clients 的默认配置。仅在配合`detour`时有效。
> `disableInsecureEncryption`: true | false
是否禁止客户端使用不安全的加密方式,如果设置为 true 当客户端指定下列加密方式时,服务器会主动断开连接。
- `"none"`
- `"aes-128-cfb"`
默认值为`false`
### ClientObject
```json
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"level": 0,
"alterId": 4,
"email": "love@xray.com"
}
```
> `id`: string
Vmess 的用户 ID可以是任意小于 30 字节的字符串, 也可以是一个合法的 UUID.
::: tip
自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写 id 来标识同一用户,即
- 写 `"id": "我爱🍉老师1314"`,
- 或写 `"id": "5783a3e7-e373-51cd-8642-c83782b807c5"` (此 UUID 是 `我爱🍉老师1314` 的 UUID 映射)
:::
其映射标准在 [VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158)
你可以使用命令 `xray uuid -i "自定义字符串"` 生成自定义字符串所映射的的 UUID。
> 也可以使用命令 `xray uuid` 生成随机的 UUID.
> `level`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。
> `alterId`: number
为了进一步防止被探测,一个用户可以在主 ID 的基础上,再额外生成多个 ID。这里只需要指定额外的 ID 的数量,推荐值为 0 代表启用 VMessAEAD。
最大值 65535。这个值不能超过服务器端所指定的值。
不指定的话,默认值是 0。
::: tip
客户端 AlterID 设置为 0 代表启用 VMessAEAD ;服务端为自动适配,可同时兼容启用和未开启 VMessAEAD 的客户端。
客户端可通过设置环境变量 `Xray_VMESS_AEAD_DISABLED=true` 强行禁用 VMessAEAD
:::
> `email`: string
用户邮箱地址,用于区分不同用户的流量。
### DetourObject
```json
{
"to": "tag_to_detour"
}
```
> `to`: string
一个 inbound 的`tag`, 指定的 inbound 的必须是使用 VMess 协议的 inbound.
### DefaultObject
```json
{
"level": 0,
"alterId": 0
}
```
> `level`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。
> `alterId`: number
动态端口的默认`alterId`,默认值为`0`
## VMess MD5 认证信息 玷污机制
为了进一步对抗可能的探测和封锁,每个 VMess 认证数据的服务端结构都会包含一个一次写入的玷污状态标记,初始状态为无瑕状态,当服务器检测到重放探测时或者因为其他原因入站连接出错以致校验数据不正确时,该连接所对应的请求认证数据会被玷污。
被玷污的认证数据无法被用于建立连接,当攻击者或客户端使用被玷污的认证数据建立连接时,服务器会输出包含 `invalid user` `ErrTainted` 的错误信息,并阻止该连接。
当服务器没有受到重放攻击时,该机制对正常连接的客户端没有影响。
如果服务器正在被重放攻击,可能会出现连接不稳定的情况。
::: tip
拥有服务器 UUID 以及其他连接数据的恶意程序可能根据此机制对服务器发起拒绝服务攻击,受到此类攻击的服务可以通过修改 `proxy/vmess/validator.go` 文件中 `func (v \*TimedUserValidator) BurnTaintFuse(userHash []byte) error` 函数的 `atomic.CompareAndSwapUint32(pair.taintedFuse, 0, 1)` 语句为 `atomic.CompareAndSwapUint32(pair.taintedFuse, 0, 0)` 来解除服务器对此类攻击的安全保护机制。使用 VMessAEAD 认证机制的客户端不受到 VMess MD5 认证信息 玷污机制 的影响。
:::

47
docs/en/config/log.md Normal file
View File

@ -0,0 +1,47 @@
# 日志配置
日志配置,控制 Xray 输出日志的方式.
Xray 有两种日志, 访问日志和错误日志, 你可以分别配置两种日志的输出方式.
## LogObject
LogObject 对应配置文件的 `log` 项。
```json
{
"log": {
"access": "文件地址",
"error": "文件地址",
"loglevel": "warning",
"dnsLog": false
}
}
```
> `access`: string
访问日志的文件地址,其值是一个合法的文件地址,如`"/var/log/Xray/access.log"`Linux或者`"C:\\Temp\\Xray\\_access.log"`Windows。当此项不指定或为空值时表示将日志输出至 stdout。
- 特殊值`none`,即关闭 access log。
> `error`: string
错误日志的文件地址,其值是一个合法的文件地址,如`"/var/log/Xray/error.log"`Linux或者`"C:\\Temp\\Xray\\_error.log"`Windows。当此项不指定或为空值时表示将日志输出至 stdout。
- 特殊值`none`,即关闭 error log。
> `loglevel`: "debug" | "info" | "warning" | "error" | "none"
error 日志的级别, 指示 error 日志需要记录的信息.
默认值为 `"warning"`
- `"debug"`:调试程序时用到的输出信息。同时包含所有 `"info"` 内容。
- `"info"`:运行时的状态信息等,不影响正常使用。同时包含所有 `"warning"` 内容。
- `"warning"`:发生了一些并不影响正常运行的问题时输出的信息,但有可能影响用户的体验。同时包含所有 `"error"` 内容。
- `"error"`Xray 遇到了无法正常运行的问题,需要立即解决。
- `"none"`:不记录任何内容。
> `dnsLog`: bool
是否启用 DNS 查询日志,例如:`DOH//doh.server got answer: domain.com -> [ip1, ip2] 2.333ms`

112
docs/en/config/outbound.md Normal file
View File

@ -0,0 +1,112 @@
# 出站代理
出站连接用于发送数据,可用的协议请见 [outbound 可用协议列表](./outbounds/)。
## OutboundObject
`OutboundObject` 对应配置文件中 `outbounds` 项的一个子元素。
::: tip
列表中的第一个元素作为主 outbound。当路由匹配不存在或没有匹配成功时流量由主 outbound 发出。
:::
```json
{
"outbounds": [
{
"sendThrough": "0.0.0.0",
"protocol": "协议名称",
"settings": {},
"tag": "标识",
"streamSettings": {},
"proxySettings": {
"tag": "another-outbound-tag"
},
"mux": {}
}
]
}
```
> `sendThrough`: address
用于发送数据的 IP 地址,当主机有多个 IP 地址时有效,默认值为 `"0.0.0.0"`
> `protocol`: string
连接协议名称,可选的协议类型见 [outbound 可用协议列表](./outbounds/)。
> `settings`: OutboundConfigurationObject
具体的配置内容,视协议不同而不同。详见每个协议中的 `OutboundConfigurationObject`
> `tag`: string
此出站连接的标识,用于在其它的配置中定位此连接。
::: danger
当其不为空时,其值必须在所有 `tag`**唯一**
:::
> `streamSettings`: [StreamSettingsObject](./transport.md#streamsettingsobject)
底层传输方式transport是当前 Xray 节点和其它节点对接的方式
> `proxySettings`: [ProxySettingsObject](#proxysettingsobject)
出站代理配置。当出站代理生效时,此 outbound 的 `streamSettings` 将不起作用。
> `mux`: [MuxObject](#muxobject)
Mux 相关的具体配置。
### ProxySettingsObject
```json
{
"tag": "another-outbound-tag"
}
```
> `tag`: string
当指定另一个 outbound 的标识时,此 outbound 发出的数据,将被转发至所指定的 outbound 发出。
::: danger
这种转发方式**不经过**底层传输方式。如果需要使用支持底层传输方式的转发,请使用 [SockOpt.dialerProxy](./transport.md#sockoptobject)。
:::
::: danger
此选项与 SockOpt.dialerProxy 不兼容
:::
::: tip
兼容 v2fly/v2ray-core 的配置 [transportLayer](https://www.v2fly.org/config/outbounds.html#proxysettingsobject)
:::
### MuxObject
Mux 功能是在一条 TCP 连接上分发多个 TCP 连接的数据。实现细节详见 [Mux.Cool](../../development/protocols/muxcool)。Mux 是为了减少 TCP 的握手延迟而设计,而非提高连接的吞吐量。使用 Mux 看视频、下载或者测速通常都有反效果。Mux 只需要在客户端启用,服务器端自动适配。
`MuxObject` 对应 `OutboundObject` 中的 `mux` 项。
```json
{
"enabled": false,
"concurrency": 8
}
```
> `enabled`: true | false
是否启用 Mux 转发请求,默认值 `false`
> `concurrency`: number
最大并发连接数。最小值 `1`,最大值 `1024`,默认值 `8`
这个数值表示了一个 TCP 连接上最多承载的 Mux 连接数量。比如设置 `concurrency=8` 时,当客户端发出了 8 个 TCP 请求Xray 只会发出一条实际的 TCP 连接,客户端的 8 个请求全部由这个 TCP 连接传输。
::: tip
填负数时,如 `-1`,不加载 mux 模块。
:::

View File

@ -0,0 +1,41 @@
# Outbounds 可用协议列表
> **这个章节包含了目前所有可用于 Outbounds 的协议及具体配置细节.**
## 协议列表
> [Blackhole](./blackhole.md)
Blackhole黑洞是一个出站数据协议它会阻碍所有数据的出站配合 [路由Routing](../routing.md) 一起使用,可以达到禁止访问某些网站的效果。
> [DNS](./dns.md)
DNS 是一个出站协议,主要用于拦截和转发 DNS 查询。此出站协议只能接收 DNS 流量(包含基于 UDP 和 TCP 协议的查询),其它类型的流量会导致错误。
> [Freedom](./freedom.md)
Freedom 是一个出站协议,可以用来向任意网络发送(正常的) TCP 或 UDP 数据。
> [HTTP](./http.md)
HTTP 协议
> [Socks](./socks.md)
标准 Socks 协议实现,兼容 [Socks 4](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)、Socks 4a 和 [Socks 5](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)。
> [VLESS](./vless.md)
VLESS 是一个无状态的轻量传输协议,可以作为 Xray 客户端和服务器之间的桥梁。
> [VMess](./vmess.md)
[VMess](../development/protocols/vmess.md) 是一个加密传输协议,可以作为 Xray 客户端和服务器之间的桥梁。
> [Trojan](./trojan.md)
[Trojan](https://trojan-gfw.github.io/trojan/protocol) 协议。
> [Shadowsocks](./shadowsocks.md)
[Shadowsocks](https://zh.wikipedia.org/wiki/Shadowsocks) 协议。

View File

@ -0,0 +1,34 @@
# Blackhole
Blackhole黑洞是一个出站数据协议它会阻碍所有数据的出站配合 [路由配置](../routing.md) 一起使用,可以达到禁止访问某些网站的效果。
## OutboundConfigurationObject
```json
{
"response": {
"type": "none"
}
}
```
> `response`: [ResponseObject](#responseobject)
配置黑洞的响应数据。
Blackhole 会在收到待转发数据之后,发送指定的响应数据,然后关闭连接,待转发的数据将被丢弃。
如不指定此项Blackhole 将直接关闭连接。
### ResponseObject
```json
{
"type": "none"
}
```
> `type`: "http" | "none"
`type``"none"`默认值Blackhole 将直接关闭连接。
`type``"http"`Blackhole 会发回一个简单的 HTTP 403 数据包,然后关闭连接。

View File

@ -0,0 +1,31 @@
# DNS
DNS 是一个出站协议,主要用于拦截和转发 DNS 查询。
此出站协议只能接收 DNS 流量(包含基于 UDP 和 TCP 协议的查询),其它类型的流量会导致错误。
在处理 DNS 查询时,此出站协议会将 IP 查询(即 A 和 AAAA转发给内置的 [DNS 服务器](../dns.md)。其它类型的查询流量将被转发至它们原本的目标地址。
## OutboundConfigurationObject
```json
{
"network": "tcp",
"address": "1.1.1.1",
"port": 53
}
```
> `network`: "tcp" | "udp"
修改 DNS 流量的传输层协议,可选的值有 `"tcp"``"udp"`。当不指定时,保持来源的传输方式不变。
> `address`: address
修改 DNS 服务器地址。当不指定时,保持来源中指定的地址不变。
> `port`: number
修改 DNS 服务器端口。当不指定时,保持来源中指定的端口不变。
## DNS 配置实例 <Badge text="WIP" type="warning"/>

View File

@ -0,0 +1,44 @@
# Freedom
Freedom 是一个出站协议,可以用来向任意网络发送(正常的) TCP 或 UDP 数据。
## OutboundConfigurationObject
```json
{
"domainStrategy": "AsIs",
"redirect": "127.0.0.1:3366",
"userLevel": 0
}
```
> `domainStrategy`: "AsIs" | "UseIP" | "UseIPv4" | "UseIPv6"
在目标地址为域名时, 配置相应的值, Freedom 的行为模式如下:
- `"AsIs"`: Freedom 通过系统 DNS 服务器解析获取 IP, 向此域名发出连接.
- `"UseIP"``"UseIPv4"``"UseIPv6"`: Xray 使用 [内置 DNS 服务器](../dns.md) 解析获取 IP, 向此域名发出连接.
默认值为 `"AsIs"`
::: tip TIP 1
当使用 `"UseIP"` 模式,并且 [出站连接配置](../outbound.md#outboundobject) 中指定了 `sendThrough`Freedom 会根据 `sendThrough` 的值自动判断所需的 IP 类型IPv4 或 IPv6。
:::
::: tip TIP 2
当使用 `"UseIPv4"``"UseIPv6"` 模式时Freedom 会只使用对应的 IPv4 或 IPv6 地址。当 `sendThrough` 指定了不匹配的本地地址时,将导致连接失败。
:::
> `redirect`: address_port
Freedom 会强制将所有数据发送到指定地址(而不是 inbound 指定的地址)。
其值为一个字符串,样例:`"127.0.0.1:80"``":1234"`
当地址不指定时,如 `":443"`Freedom 不会修改原先的目标地址。
当端口为 `0` 时,如 `"xray.com: 0"`Freedom 不会修改原先的端口。
> `userLevel`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
userLevel 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。

View File

@ -0,0 +1,82 @@
# HTTP
HTTP 协议。
::: danger
**http 协议没有对传输加密,不适宜经公网中传输,更容易成为被人用作攻击的肉鸡。**
:::
::: tip
`http` 只能代理 tcp 协议udp 系的协议均不能通过。
:::
## OutboundConfigurationObject
```json
{
"servers": [
{
"address": "192.168.108.1",
"port": 3128,
"users": [
{
"user": "my-username",
"pass": "my-password"
}
]
}
]
}
```
::: tip
目前 HTTP 协议 outbound 中 `streamSettings` 设置 `security``tlsSettings` 是生效的。
:::
> `servers`: \[ [ServerObject](#serverobject) \]
HTTP 服务器列表,其中每一项是一个服务器配置,若配置多个,循环使用 (RoundRobin)。
### ServerObject
```json
{
"address": "192.168.108.1",
"port": 3128,
"users": [
{
"user": "my-username",
"pass": "my-password"
}
]
}
```
> `address`: string
HTTP 代理服务器地址,必填。
> `port`: int
HTTP 代理服务器端口,必填。
> `user`: \[[AccountObject](#accountobject)\]
一个数组,数组中每个元素为一个用户帐号。默认值为空。
#### AccountObject
```json
{
"user": "my-username",
"pass": "my-password"
}
```
> `user`: string
用户名,字符串类型。必填。
> `pass`: string
密码,字符串类型。必填。

View File

@ -0,0 +1,92 @@
# Shadowsocks
[Shadowsocks](https://zh.wikipedia.org/wiki/Shadowsocks) 协议,兼容大部分其它版本的实现。
目前兼容性如下:
- 支持 TCP 和 UDP 数据包转发,其中 UDP 可选择性关闭;
- 推荐的加密方式:
- AES-256-GCM
- AES-128-GCM
- ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305
- none 或 plain
不推荐的加密方式:
- AES-256-CFB
- AES-128-CFB
- ChaCha20
- ChaCha20-IETF
::: danger
"none" 不加密方式下,服务器端不会验证 "password" 中的密码。为确保安全性, 一般需要加上 TLS 并在传输层使用安全配置,例如 WebSocket 配置较长的 path
:::
## OutboundConfigurationObject
```json
{
"servers": [
{
"email": "love@xray.com",
"address": "127.0.0.1",
"port": 1234,
"method": "加密方式",
"password": "密码",
"level": 0
}
]
}
```
> `servers`: \[[ServerObject](#serverobject)\]
一个数组,代表一组 Shadowsocks 服务端设置, 其中每一项是一个 [ServerObject](#serverobject)。
### ServerObject
```json
{
"email": "love@xray.com",
"address": "127.0.0.1",
"port": 1234,
"method": "加密方式",
"password": "密码",
"level": 0
}
```
> `email`: string
邮件地址,可选,用于标识用户
> `address`: address
Shadowsocks 服务端地址,支持 IPv4、IPv6 和域名。必填。
> `port`: number
Shadowsocks 服务端端口。必填。
> `method`: string
必填。
- 推荐的加密方式:
- AES-256-GCM
- AES-128-GCM
- ChaCha20-Poly1305 或称 ChaCha20-IETF-Poly1305
- none 或 plain
> `password`: string
必填。任意字符串。
Shadowsocks 协议不限制密码长度,但短密码会更可能被破解,建议使用 16 字符或更长的密码。
> `level`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
`level` 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。

View File

@ -0,0 +1,91 @@
# Socks
标准 Socks 协议实现,兼容 [Socks 4](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)、Socks 4a 和 [Socks 5](http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol)。
::: danger
**socks 协议没有对传输加密,不适宜经公网中传输**
:::
## OutboundConfigurationObject
```json
{
"servers": [
{
"address": "127.0.0.1",
"port": 1234,
"users": [
{
"user": "test user",
"pass": "test pass",
"level": 0
}
]
}
]
}
```
> `servers`: \[ [ServerObject](#serverobject) \]
Socks 服务器列表,其中每一项是一个服务器配置。
### ServerObject
```json
{
"address": "127.0.0.1",
"port": 1234,
"users": [
{
"user": "test user",
"pass": "test pass",
"level": 0
}
]
}
```
> `address`: address
服务器地址, 必填
::: tip
仅支持连接到 Socks 5 服务器。
:::
> `port`: number
服务器端口, 必填
> `users`: \[ [UserObject](#userobject) \]
一个数组表示的用户列表,数组中每个元素为一个用户配置。
当列表不为空时Socks 客户端会使用用户信息进行认证;如未指定,则不进行认证。
默认值为空。
#### UserObject
```json
{
"user": "test user",
"pass": "test pass",
"level": 0
}
```
> `user`: string
用户名,字符串类型。必填。
> `pass`: string
密码,字符串类型。必填。
> `level`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
userLevel 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。

View File

@ -0,0 +1,104 @@
# Trojan
[Trojan](https://trojan-gfw.github.io/trojan/protocol) 协议
::: danger
Trojan 被设计工作在正确配置的加密 TLS 隧道
:::
## OutboundConfigurationObject
```json
{
"servers": [
{
"address": "127.0.0.1",
"port": 1234,
"password": "password",
"email": "love@xray.com",
"flow": "xtls-rprx-direct",
"level": 0
}
]
}
```
> `servers`: \[ [ServerObject](#serverobject) \]
一个数组,其中每一项是一个 [ServerObject](#serverobject)。
### ServerObject
```json
{
"address": "127.0.0.1",
"port": 1234,
"password": "password",
"email": "love@xray.com",
"flow": "xtls-rprx-direct",
"level": 0
}
```
> `address`: address
服务端地址,支持 IPv4、IPv6 和域名。必填。
> `port`: number
服务端端口,通常与服务端监听的端口相同。
> `password`: string
密码. 必填,任意字符串。
> `email`: string
邮件地址,可选,用于标识用户
> `flow`: string
流控模式,用于选择 XTLS 的算法。
目前出站协议中有以下流控模式可选:
- `xtls-rprx-origin`:最初的流控模式。该模式纪念价值大于实际使用价值
- `xtls-rprx-origin-udp443`:同 `xtls-rprx-origin`, 但放行了目标为 443 端口的 UDP 流量
- `xtls-rprx-direct`:所有平台皆可使用的典型流控模式
- `xtls-rprx-direct-udp443`:同 `xtls-rprx-direct`, 但是放行了目标为 443 端口的 UDP 流量
- `xtls-rprx-splice`Linux 平台下最建议使用的流控模式
- `xtls-rprx-splice-udp443`:同 `xtls-rprx-splice`, 但是放行了目标为 443 端口的 UDP 流量
::: warning 注意
`flow` 被指定时,还需要将该出站协议的 `streamSettings.security` 一项指定为 `xtls``tlsSettings` 改为 `xtlsSettings`。详情请参考 [streamSettings](../transport.md#streamsettingsobject)。
:::
此外,目前 XTLS 仅支持 TCP、mKCP、DomainSocket 这三种传输方式。
<!-- prettier-ignore -->
::: tip 关于 xtls-rprx-\*-udp443 流控模式
启用了 Xray-core 的 XTLS 时,通往 UDP 443 端口的流量默认会被拦截(一般情况下为 QUIC这样应用就不会使用 QUIC 而会使用 TLSXTLS 才会真正生效。实际上QUIC 本身也不适合被代理,因为 QUIC 自带了 TCP 的功能, 它作为 UDP 流量在通过 Trojan 协议传输时,底层协议为 TCP就相当于两层 TCP 了。
若不需要拦截,请在客户端填写 `xtls-rprx-*-udp443`,服务端不变。
:::
::: tip 关于 Splice 模式
Splice 是 Linux Kernel 提供的函数,系统内核直接转发 TCP不再经过 Xray 的内存大大减少了数据拷贝、CPU 上下文切换的次数。
:::
Splice 模式的的使用限制:
- Linux 环境
- 入站协议为 `Dokodemo door``Socks``HTTP` 等纯净的 TCP 连接, 或其它使用了 XTLS 的入站协议
- 出站协议为 VLESS + XTLS 或 Trojan + XTLS
此外,使用 Splice 时网速显示会滞后,这是特性,不是 bug。
需要注意的是,使用 mKCP 协议时不会使用 Splice是的虽然没有报错但实际上根本没用到
> `level`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。

View File

@ -0,0 +1,142 @@
# VLESS
::: danger
目前 VLESS 没有自带加密,请用于可靠信道,如 TLS。
目前 VLESS 不支持分享。
:::
VLESS 是一个无状态的轻量传输协议,它分为入站和出站两部分,可以作为 Xray 客户端和服务器之间的桥梁。
与 [VMess](./vmess.md) 不同VLESS 不依赖于系统时间,认证方式同样为 UUID但不需要 alterId。
## OutboundConfigurationObject
```json
{
"vnext": [
{
"address": "example.com",
"port": 443,
"users": [
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"encryption": "none",
"flow": "xtls-rprx-direct",
"level": 0
}
]
}
]
}
```
> `vnext`: \[ [ServerObject](#serverobject) \]
一个数组, 表示 VLESS 服务器列表,包含一组指向服务端的配置, 其中每一项是一个服务器配置。
### ServerObject
```json
{
"address": "example.com",
"port": 443,
"users": [
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"encryption": "none",
"flow": "xtls-rprx-direct",
"level": 0
}
]
}
```
> `address`: address
服务端地址指向服务端支持域名、IPv4、IPv6。
> `port`: number
服务端端口,通常与服务端监听的端口相同。
> `users`: \[ [UserObject](#userobject) \]
数组, 一组服务端认可的用户列表, 其中每一项是一个用户配置
### UserObject
```json
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"encryption": "none",
"flow": "xtls-rprx-direct",
"level": 0
}
```
> `id`: string
VLESS 的用户 ID可以是任意小于 30 字节的字符串, 也可以是一个合法的 UUID.
自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写 id 来标识同一用户,即
- 写 `"id": "我爱🍉老师1314"`,
- 或写 `"id": "5783a3e7-e373-51cd-8642-c83782b807c5"` (此 UUID 是 `我爱🍉老师1314` 的 UUID 映射)
其映射标准在 [VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158)
你可以使用命令 `xray uuid -i "自定义字符串"` 生成自定义字符串所映射的的 UUID也可以使用命令 `xray uuid` 生成随机的 UUID。
> `encryption`: "none"
需要填 `"none"`,不能留空。
该要求是为了提醒使用者没有加密,也为了以后出加密方式时,防止使用者填错属性名或填错位置导致裸奔。
若未正确设置 encryption 的值,使用 Xray 或 -test 时会收到错误信息。
> `flow`: string
流控模式,用于选择 XTLS 的算法。
目前出站协议中有以下流控模式可选:
- `xtls-rprx-origin`:最初的流控模式。该模式纪念价值大于实际使用价值
- `xtls-rprx-origin-udp443`:同 `xtls-rprx-origin`, 但放行了目标为 443 端口的 UDP 流量
- `xtls-rprx-direct`:所有平台皆可使用的典型流控模式
- `xtls-rprx-direct-udp443`:同 `xtls-rprx-direct`, 但是放行了目标为 443 端口的 UDP 流量
- `xtls-rprx-splice`Linux 平台下最建议使用的流控模式
- `xtls-rprx-splice-udp443`:同 `xtls-rprx-splice`, 但是放行了目标为 443 端口的 UDP 流量
::: warning 注意
`flow` 被指定时,还需要将该出站协议的 `streamSettings.security` 一项指定为 `xtls``tlsSettings` 改为 `xtlsSettings`。详情请参考 [streamSettings](../transport.md#streamsettingsobject)。
此外,目前 XTLS 仅支持 TCP、mKCP、DomainSocket 这三种传输方式。
:::
<!-- prettier-ignore -->
::: tip 关于 xtls-rprx-*-udp443 流控模式
启用了 Xray-core 的 XTLS 时,通往 UDP 443 端口的流量默认会被拦截(一般情况下为 QUIC这样应用就不会使用 QUIC 而会使用 TLSXTLS 才会真正生效。实际上QUIC 本身也不适合被代理,因为 QUIC 自带了 TCP 的功能,它作为 UDP 流量在通过 VLESS 协议传输时,底层协议为 TCP就相当于两层 TCP 了。
若不需要拦截,请在客户端填写 `xtls-rprx-*-udp443`,服务端不变。
:::
::: tip 关于 Splice 模式
Splice 是 Linux Kernel 提供的函数,系统内核直接转发 TCP不再经过 Xray 的内存大大减少了数据拷贝、CPU 上下文切换的次数。
:::
Splice 模式的的使用限制:
- Linux 环境
- 入站协议为 `Dokodemo door``Socks``HTTP` 等纯净的 TCP 连接, 或其它使用了 XTLS 的入站协议
- 出站协议为 VLESS + XTLS 或 Trojan + XTLS
此外,使用 Splice 时网速显示会滞后,这是特性,不是 bug。
需要注意的是,使用 mKCP 协议时不会使用 Splice是的虽然没有报错但实际上根本没用到
> `level`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。

View File

@ -0,0 +1,124 @@
# VMess
[VMess](../../development/protocols/vmess.md) 是一个加密传输协议,通常作为 Xray 客户端和服务器之间的桥梁。
::: danger
VMess 依赖于系统时间,请确保使用 Xray 的系统 UTC 时间误差在 90 秒之内,时区无关。在 Linux 系统中可以安装`ntp`服务来自动同步系统时间。
:::
## OutboundConfigurationObject
```json
{
"vnext": [
{
"address": "127.0.0.1",
"port": 37192,
"users": [
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"alterId": 0,
"security": "auto",
"level": 0
}
]
}
]
}
```
> `vnext`\[ [ServerObject](#serverobject) \]
一个数组,包含一组的服务端配置.
其中每一项是一个服务端配置[ServerObject](#serverobject)。
### ServerObject
```json
{
"address": "127.0.0.1",
"port": 37192,
"users": []
}
```
> `address`: address
服务端地址,支持 IP 地址或者域名。
> `port`: number
服务端监听的端口号, 必填。
> `users`: \[ [UserObject](#userobject) \]
一个数组,代表一组服务端认可的用户.
其中每一项是一个用户[UserObject](#userobject)。
#### UserObject
```json
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
"alterId": 0,
"security": "auto",
"level": 0
}
```
> `id`string
Vmess 的用户 ID可以是任意小于 30 字节的字符串, 也可以是一个合法的 UUID.
自定义字符串和其映射的 UUID 是等价的, 这意味着你将可以这样在配置文件中写 id 来标识同一用户,即
- 写 `"id": "我爱🍉老师1314"`,
- 或写 `"id": "5783a3e7-e373-51cd-8642-c83782b807c5"` (此 UUID 是 `我爱🍉老师1314` 的 UUID 映射)
其映射标准在 [VLESS UUID 映射标准:将自定义字符串映射为一个 UUIDv5](https://github.com/XTLS/Xray-core/issues/158)
你可以使用命令 `xray uuid -i "自定义字符串"` 生成自定义字符串所映射的的 UUID, 也可以使用命令 `xray uuid` 生成随机的 UUID。
> `alterId`number
为了进一步防止被探测,一个用户可以在主 ID 的基础上,再额外生成多个 ID。这里只需要指定额外的 ID 的数量,推荐值为 0 代表启用 VMessAEAD。
最大值 65535。这个值不能超过服务器端所指定的值。
不指定的话,默认值是 0。
::: tip
客户端 AlterID 设置为 0 代表启用 VMessAEAD ;服务端为自动适配,可同时兼容启用和未开启 VMessAEAD 的客户端。
客户端可通过设置环境变量 `Xray_VMESS_AEAD_DISABLED=true` 强行禁用 VMessAEAD
:::
> `level`: number
用户等级,连接会使用这个用户等级对应的 [本地策略](../policy.md#levelpolicyobject)。
level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。 如不指定, 默认为 0。
> `security`: "aes-128-gcm" | "chacha20-poly1305" | "auto" | "none" | "zero"
加密方式,客户端将使用配置的加密方式发送数据,服务器端自动识别,无需配置。
- `"aes-128-gcm"`:推荐在 PC 上使用
- `"chacha20-poly1305"`:推荐在手机端使用
- `"auto"`:默认值,自动选择(运行框架为 AMD64、ARM64 或 s390x 时为 aes-128-gcm 加密方式,其他情况则为 Chacha20-Poly1305 加密方式)
- `"none"`:不加密
* `"zero"`:不加密,也不进行消息认证 (v1.4.0+)
::: tip
推荐使用`"auto"`加密方式,这样可以永久保证安全性和兼容性。
`"none"` 伪加密方式会计算并验证数据包的校验数据,由于认证算法没有硬件支持,在部分平台可能速度比有硬件加速的 `"aes-128-gcm"` 还慢。
`"zero"` 伪加密方式不会加密消息也不会计算数据的校验数据,因此理论上速度会高于其他任何加密方式。实际速度可能受到其他因素影响。
不推荐在未开启 TLS 加密并强制校验证书的情况下使用 `"none"` `"zero"` 伪加密方式。
如果使用 CDN 或其他会解密 TLS 的中转平台或网络环境建立连接,不建议使用 `"none"` `"zero"` 伪加密方式。
无论使用哪种加密方式, VMess 的包头都会受到加密和认证的保护。
:::

122
docs/en/config/policy.md Normal file
View File

@ -0,0 +1,122 @@
# 本地策略
本地策略可以设置不同的用户等级和对应的策略设置比如连接超时设置。Xray 处理的每一个连接都对应一个用户按照用户的等级level应用不同的策略。
## PolicyObject
`PolicyObject` 对应配置文件的 `policy` 项。
```json
{
"policy": {
"levels": {
"0": {
"handshake": 4,
"connIdle": 300,
"uplinkOnly": 2,
"downlinkOnly": 5,
"statsUserUplink": false,
"statsUserDownlink": false,
"bufferSize": 4
}
},
"system": {
"statsInboundUplink": false,
"statsInboundDownlink": false,
"statsOutboundUplink": false,
"statsOutboundDownlink": false
}
}
}
```
> `level`: map{string: [LevelPolicyObject](#levelpolicyobject)}
一组键值对每个键是一个字符串形式的数字JSON 的要求),比如 `"0"``"1"` 等,双引号不能省略,此数字对应用户等级。每一个值是一个 [LevelPolicyObject](#levelpolicyobject).
::: tip
每个入站出站代理现在都可以设置用户等级Xray 会根据实际的用户等级应用不同的本地策略。
:::
> `system`: [SystemPolicyObject](#systempolicyobject)
Xray 系统级别的策略
### LevelPolicyObject
```json
{
"handshake": 4,
"connIdle": 300,
"uplinkOnly": 2,
"downlinkOnly": 5,
"statsUserUplink": false,
"statsUserDownlink": false,
"bufferSize": 10240
}
```
> `handshake`: number
连接建立时的握手时间限制。单位为秒。默认值为 `4`。在入站代理处理一个新连接时,在握手阶段如果使用的时间超过这个时间,则中断该连接。
> `connIdle`: number
连接空闲的时间限制。单位为秒。默认值为 `300`。inbound/outbound 处理一个连接时,如果在 `connIdle` 时间内,没有任何数据被传输(包括上行和下行数据),则中断该连接。
> `uplinkOnly`: number
当连接下行线路关闭后的时间限制。单位为秒。默认值为 `2`。当服务器(如远端网站)关闭下行连接时,出站代理会在等待 `uplinkOnly` 时间后中断连接。
> `downlinkOnly`: number
当连接上行线路关闭后的时间限制。单位为秒。默认值为 `5`。当客户端(如浏览器)关闭上行连接时,入站代理会在等待 `downlinkOnly` 时间后中断连接。
::: tip
在 HTTP 浏览的场景中,可以将 `uplinkOnly``downlinkOnly` 设为 `0`,以提高连接关闭的效率。
:::
> `statsUserUplink`: true | false
当值为 `true` 时,开启当前等级的所有用户的上行流量统计。
> `statsUserDownlink`: true | false
当值为 `true` 时,开启当前等级的所有用户的下行流量统计。
> `bufferSize`: number
每个连接的内部缓存大小。单位为 kB。当值为 `0` 时,内部缓存被禁用。
默认值:
- 在 ARM、MIPS、MIPSLE 平台上,默认值为 `0`
- 在 ARM64、MIPS64、MIPS64LE 平台上,默认值为 `4`
- 在其它平台上,默认值为 `512`
### SystemPolicyObject
```json
{
"statsInboundUplink": false,
"statsInboundDownlink": false,
"statsOutboundUplink": false,
"statsOutboundDownlink": false
}
```
> `statsInboundUplink`: true | false
当值为 `true` 时,开启所有入站代理的上行流量统计。
> `statsInboundDownlink`: true | false
当值为 `true` 时,开启所有入站代理的下行流量统计。
> `statsOutboundUplink`: true | false
当值为 `true` 时,开启所有出站代理的上行流量统计。
> `statsOutboundDownlink`: true | false
当值为 `true` 时,开启所有出站代理的下行流量统计。

230
docs/en/config/reverse.md Normal file
View File

@ -0,0 +1,230 @@
# 反向代理
反向代理可以把服务器端的流量向客户端转发,即逆向流量转发。
反向代理的大致工作原理如下:
- 假设在主机 A 中有一个网页服务器,这台主机没有公网 IP无法在公网上直接访问。另有一台主机 B它可以由公网访问。现在我们需要把 B 作为入口,把流量从 B 转发到 A。
- 在主机 A 中配置 Xray称为`bridge`,在 B 中也配置 Xray称为 `portal`
- `bridge` 会向 `portal` 主动建立连接,此连接的目标地址可以自行设定。`portal` 会收到两种连接,一是由 `bridge` 发来的连接,二是公网用户发来的连接。`portal` 会自动将两类连接合并。于是 `bridge` 就可以收到公网流量了。
- `bridge` 在收到公网流量之后,会将其原封不动地发给主机 A 中的网页服务器。当然,这一步需要路由的协作。
- `bridge` 会根据流量的大小进行动态的负载均衡。
::: tip
反向代理默认已开启 [Mux](../../development/protocols/muxcool/),请不要在其用到的 outbound 上再次开启 Mux。
:::
::: warning
反向代理功能尚处于测试阶段,可能会有一些问题。
:::
## ReverseObject
`ReverseObject` 对应配置文件的 `reverse` 项。
```json
{
"reverse": {
"bridges": [
{
"tag": "bridge",
"domain": "test.xray.com"
}
],
"portals": [
{
"tag": "portal",
"domain": "test.xray.com"
}
]
}
}
```
> `bridges`: \[[BridgeObject](#bridgeobject)\]
数组,每一项表示一个 `bridge`。每个 `bridge` 的配置是一个 [BridgeObject](#bridgeobject)。
> `portals`: \[[PortalObject](#portalobject)\]
数组,每一项表示一个 `portal`。每个 `portal` 的配置是一个 [PortalObject](#bridgeobject)。
### BridgeObject
```json
{
"tag": "bridge",
"domain": "test.xray.com"
}
```
> `tag`: string
所有由 `bridge` 发出的连接,都会带有这个标识。可以在 [路由配置](./routing.md) 中使用 `inboundTag` 进行识别。
> `domain`: string
指定一个域名,`bridge``portal` 建立的连接,都会使用这个域名进行发送。
这个域名只作为 `bridge``portal` 的通信用途,不必真实存在。
### PortalObject
```json
{
"tag": "portal",
"domain": "test.xray.com"
}
```
> `tag`: string
`portal` 的标识。在 [路由配置](./routing.md) 中使用 `outboundTag` 将流量转发到这个 `portal`
> `domain`: string
一个域名。当 `portal` 接收到流量时,如果流量的目标域名是此域名,则 `portal` 认为当前连接上 `bridge` 发来的通信连接。而其它流量则会被当成需要转发的流量。`portal` 所做的工作就是把这两类连接进行识别并拼接。
::: tip
一个 Xray 既可以作为 `bridge`,也可以作为 `portal`,也可以同时两者,以适用于不同的场景需要。
:::
## 完整配置样例
::: tip
在运行过程中,建议先启用 `bridge`,再启用 `portal`
:::
### bridge 配置
`bridge` 通常需要两个 outbound一个用于连接 `portal`,另一个用于发送实际的流量。也就是说,你需要用路由区分两种流量。
反向代理配置:
```json
{
"bridges": [
{
"tag": "bridge",
"domain": "test.xray.com"
}
]
}
```
outbound:
```json
{
"tag": "out",
"protocol": "freedom",
"settings": {
"redirect": "127.0.0.1:80" // 将所有流量转发到网页服务器
}
}
```
```json
{
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "portal 的 IP 地址",
"port": 1024,
"users": [
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5"
}
]
}
]
},
"tag": "interconn"
}
```
路由配置:
```json
{
"rules": [
{
"type": "field",
"inboundTag": ["bridge"],
"domain": ["full:test.xray.com"],
"outboundTag": "interconn"
},
{
"type": "field",
"inboundTag": ["bridge"],
"outboundTag": "out"
}
]
}
```
### portal 配置
`portal` 通常需要两个 inbound一个用于接收 `bridge` 的连接,另一个用于接收实际的流量。同时你也需要用路由区分两种流量。
反向代理配置:
```json
{
"portals": [
{
"tag": "portal",
"domain": "test.xray.com" // 必须和 bridge 的配置一样
}
]
}
```
inbound:
```json
{
"tag": "external",
"port": 80,
"protocol": "dokodemo-door",
"settings": {
"address": "127.0.0.1",
"port": 80,
"network": "tcp"
}
}
```
```json
{
"port": 1024,
"tag": "interconn",
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "5783a3e7-e373-51cd-8642-c83782b807c5"
}
]
}
}
```
路由配置:
```json
{
"rules": [
{
"type": "field",
"inboundTag": ["external"],
"outboundTag": "portal"
},
{
"type": "field",
"inboundTag": ["interconn"],
"outboundTag": "portal"
}
]
}
```

205
docs/en/config/routing.md Normal file
View File

@ -0,0 +1,205 @@
# 路由
路由功能模块可以将入站数据按不同规则由不同的出站连接发出,以达到按需代理的目的。
如常见用法是分流国内外流量Xray 可以通过内部机制判断不同地区的流量,然后将它们发送到不同的出站代理。
## RoutingObject
`RoutingObject` 对应配置文件的 `routing` 项。
```json
{
"routing": {
"domainStrategy": "AsIs",
"rules": [],
"balancers": []
}
}
```
> `domainStrategy`: "AsIs" | "IPIfNonMatch" | "IPOnDemand"
域名解析策略,根据不同的设置使用不同的策略。
- `"AsIs"`:只使用域名进行路由选择。默认值。
- `"IPIfNonMatch"`:当域名没有匹配任何规则时,将域名解析成 IPA 记录或 AAAA 记录)再次进行匹配;
- 当一个域名有多个 A 记录时,会尝试匹配所有的 A 记录,直到其中一个与某个规则匹配为止;
- 解析后的 IP 仅在路由选择时起作用,转发的数据包中依然使用原始域名;
- `"IPOnDemand"`:当匹配时碰到任何基于 IP 的规则,将域名立即解析为 IP 进行匹配;
> `rules`: \[[RuleObject](#ruleobject)\]
对应一个数组,数组中每一项是一个规则。
对于每一个连接,路由将根据这些规则依次进行判断,当一个规则生效时,即将这个连接转发至它所指定的 `outboundTag``balancerTag`
::: tip
当没有匹配到任何规则时,流量默认由第一个 outbound 发出。
:::
> `balancers`: \[ [BalancerObject](#balancerobject) \]
一个数组,数组中每一项是一个负载均衡器的配置。
当一个规则指向一个负载均衡器时Xray 会通过此负载均衡器选出一个 outbound, 然后由它转发流量。
### RuleObject
```json
{
"type": "field",
"domain": ["baidu.com", "qq.com", "geosite:cn"],
"ip": ["0.0.0.0/8", "10.0.0.0/8", "fc00::/7", "fe80::/10", "geoip:cn"],
"port": "53,443,1000-2000",
"sourcePort": "53,443,1000-2000",
"network": "tcp",
"source": ["10.0.0.1"],
"user": ["love@xray.com"],
"inboundTag": ["tag-vmess"],
"protocol": ["http", "tls", "bittorrent"],
"attrs": "attrs[':method'] == 'GET'",
"outboundTag": "direct",
"balancerTag": "balancer"
}
```
::: danger
当多个属性同时指定时,这些属性需要**同时**满足,才可以使当前规则生效。
:::
> `type`: "field"
目前只支持`"field"`这一个选项。
> `domain`: \[string\]
一个数组,数组每一项是一个域名的匹配。有以下几种形式:
- 纯字符串:当此字符串匹配目标域名中任意部分,该规则生效。比如 "sina.com" 可以匹配 "sina.com"、"sina.com.cn" 和 "www.sina.com",但不匹配 "sina.cn"。
- 正则表达式:由 `"regexp:"` 开始,余下部分是一个正则表达式。当此正则表达式匹配目标域名时,该规则生效。例如 "regexp:\\\\.goo.\*\\\\.com\$" 匹配 "www.google.com" 或 "fonts.googleapis.com",但不匹配 "google.com"。
- 子域名(推荐):由 `"domain:"` 开始,余下部分是一个域名。当此域名是目标域名或其子域名时,该规则生效。例如 "domain:xray.com" 匹配 "www.xray.com"、"xray.com",但不匹配 "wxray.com"。
- 完整匹配:由 `"full:"` 开始,余下部分是一个域名。当此域名完整匹配目标域名时,该规则生效。例如 "full:xray.com" 匹配 "xray.com" 但不匹配 "www.xray.com"。
- 预定义域名列表:由 `"geosite:"` 开头,余下部分是一个名称,如 `geosite:google` 或者 `geosite:cn`。名称及域名列表参考 [预定义域名列表](#预定义域名列表)。
- 从文件中加载域名:形如 `"ext:file:tag"`,必须以 `ext:`(小写)开头,后面跟文件名和标签,文件存放在 [资源目录](./features/env.md#资源文件路径) 中,文件格式与 `geosite.dat` 相同,标签必须在文件中存在。
::: tip
`"ext:geoip.dat:cn"` 等价于 `"geoip:cn"`
:::
> `ip`: \[string\]
一个数组,数组内每一项代表一个 IP 范围。当某一项匹配目标 IP 时,此规则生效。有以下几种形式:
- IP形如 `"127.0.0.1"`
- [CIDR](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing):形如 `"10.0.0.0/8"`
- 预定义 IP 列表:此列表预置于每一个 Xray 的安装包中,文件名为 `geoip.dat`。使用方式形如 `"geoip:cn"`,必须以 `geoip:`(小写)开头,后面跟双字符国家代码,支持几乎所有可以上网的国家。
- 特殊值:`"geoip:private"`,包含所有私有地址,如 `127.0.0.1`
- 从文件中加载 IP形如 `"ext:file:tag"`,必须以 `ext:`(小写)开头,后面跟文件名和标签,文件存放在 [资源目录](./features/env.md#资源文件路径) 中,文件格式与 `geoip.dat` 相同标签必须在文件中存在。
> `port`number | string
目标端口范围,有三种形式:
- `"a-b"`a 和 b 均为正整数,且小于 65536。这个范围是一个前后闭合区间当目标端口落在此范围内时此规则生效。
- `a`a 为正整数,且小于 65536。当目标端口为 a 时,此规则生效。
- 以上两种形式的混合,以逗号 "," 分隔。形如:`"53,443,1000-2000"`
> `sourcePort`number | string
来源端口,有三种形式:
- `"a-b"`a 和 b 均为正整数,且小于 65536。这个范围是一个前后闭合区间当目标端口落在此范围内时此规则生效。
- `a`a 为正整数,且小于 65536。当目标端口为 a 时,此规则生效。
- 以上两种形式的混合,以逗号 "," 分隔。形如:`"53,443,1000-2000"`
> `network`: "tcp" | "udp" | "tcp,udp"
可选的值有 "tcp"、"udp" 或 "tcp,udp",当连接方式是指定的方式时,此规则生效。
> `source`: \[string\]
一个数组,数组内每一项代表一个 IP 范围,形式有 IP、CIDR、GeoIP 和从文件中加载 IP。当某一项匹配来源 IP 时,此规则生效。
> `user`: \[string\]
一个数组,数组内每一项是一个邮箱地址。当某一项匹配来源用户时,此规则生效。
> `inboundTag`: \[string\]
一个数组,数组内每一项是一个标识。当某一项匹配入站协议的标识时,此规则生效。
> `protocol`: \[ "http" | "tls" | "bittorrent" \]
一个数组,数组内每一项表示一种协议。当某一个协议匹配当前连接的协议类型时,此规则生效。
::: tip
必须开启入站代理中的 `sniffing` 选项, 才能嗅探出连接所使用的协议类型.
:::
> `attrs`: string
一段脚本,用于检测流量的属性值。当此脚本返回真值时,此规则生效。
脚本语言为 [Starlark](https://github.com/bazelbuild/starlark),它的语法是 Python 的子集。脚本接受一个全局变量 `attrs`,其中包含了流量相关的属性。
目前只有 http 入站代理会设置这一属性。
示例:
- 检测 HTTP GET`"attrs[':method'] == 'GET'"`
- 检测 HTTP Path`"attrs[':path'].startswith('/test')"`
- 检测 Content Type`"attrs['accept'].index('text/html') >= 0"`
> `outboundTag`: string
对应一个 outbound 的标识。
> `balancerTag`: string
对应一个 Balancer 的标识。
::: tip
`balancerTag``outboundTag` 须二选一。当同时指定时,`outboundTag` 生效。
:::
### BalancerObject
负载均衡器配置。当一个负载均衡器生效时,它会从指定的 outbound 中,按配置选出一个最合适的 outbound进行流量转发。
```json
{
"tag": "balancer",
"selector": []
}
```
> `tag`: string
此负载均衡器的标识,用于匹配 `RuleObject` 中的 `balancerTag`
> `selector`: \[ string \]
一个字符串数组,其中每一个字符串将用于和 outbound 标识的前缀匹配。在以下几个 outbound 标识中:`[ "a", "ab", "c", "ba" ]``"selector": ["a"]` 将匹配到 `[ "a", "ab" ]`
如果匹配到多个 outbound负载均衡器目前会从中随机选出一个作为最终的 outbound。
### 预定义域名列表
此列表预置于每一个 Xray 的安装包中,文件名为 `geosite.dat`。这个文件包含了一些常见的域名,使用方式:`geosite:filename`,如 `geosite:google` 表示对文件内符合 `google` 内包含的域名,进行路由筛选或 DNS 筛选。
常见的域名有:
- `category-ads`:包含了常见的广告域名。
- `category-ads-all`:包含了常见的广告域名,以及广告提供商的域名。
- `cn`:相当于 `geolocation-cn``tld-cn` 的合集。
- `apple`:包含了 Apple 旗下绝大部分域名。
- `google`:包含了 Google 旗下绝大部分域名。
- `microsoft`:包含了 Microsoft 旗下绝大部分域名。
- `facebook`:包含了 Facebook 旗下绝大部分域名。
- `twitter`:包含了 Twitter 旗下绝大部分域名。
- `telegram`:包含了 Telegram 旗下绝大部分域名。
- `geolocation-cn`:包含了常见的大陆站点域名。
- `geolocation-!cn`:包含了常见的非大陆站点域名,同时包含了 `tld-!cn`
- `tld-cn`:包含了 CNNIC 管理的用于中国大陆的顶级域名,如以 `.cn``.中国` 结尾的域名。
- `tld-!cn`:包含了非中国大陆使用的顶级域名,如以 `.hk`(香港)、`.tw`(台湾)、`.jp`(日本)、`.sg`(新加坡)、`.us`(美国)`.ca`(加拿大)等结尾的域名。

55
docs/en/config/stats.md Normal file
View File

@ -0,0 +1,55 @@
# 统计信息
用于配置 Xray 流量数据的统计。
## StatsObject
`StatsObject` 对应配置文件的 `stats` 项。
```json
{
"stats": {}
}
```
目前统计信息不需要任何参数,只要 `StatsObject` 项存在,内部的统计即会开启。
开启了统计以后, 只需在 [Policy](./policy.md) 中开启对应的项,就可以统计对应的数据。
## 获取统计信息
可以用 `xray api` 的相关命令获取统计信息.
目前已有的统计信息如下:
- 用户数据
- `user>>>[email]>>>traffic>>>uplink`
特定用户的上行流量,单位字节。
- `user>>>[email]>>>traffic>>>downlink`
特定用户的下行流量,单位字节。
::: tip
如果对应用户没有指定 Email则不会开启统计。
:::
- 全局数据
- `inbound>>>[tag]>>>traffic>>>uplink`
特定 inbound 的上行流量,单位字节。
- `inbound>>>[tag]>>>traffic>>>downlink`
特定 inbound 的下行流量,单位字节。
- `outbound>>>[tag]>>>traffic>>>uplink`
特定 outbound 的上行流量,单位字节。
- `outbound>>>[tag]>>>traffic>>>downlink`
特定 outbound 的下行流量,单位字节。

470
docs/en/config/transport.md Normal file
View File

@ -0,0 +1,470 @@
# 传输方式
传输方式transport是当前 Xray 节点和其它节点对接的方式。
传输方式指定了稳定的数据传输的方式。通常来说,一个网络连接的两端需要有对称的传输方式。比如一端用了 WebSocket那么另一个端也必须使用 WebSocket否则无法建立连接。
传输方式transport配置有两部分:
1. 全局配置([TransportObject](#transportobject)
2. 局部配置([StreamSettingsObject](#streamsettingsobject))。
- 局部配置时,可以指定每个单独的入站或出站用怎样的方式传输。
- 通常来说客户端和服务器对应的入站和出站需要使用同样的传输方式。当其配置指定了一种传输方式,但没有填写具体设置时,此传输方式会使用全局配置中的设置。
## TransportObject
`TransportObject` 对应配置文件的 `transport` 项。
```json
{
"transport": {
"tcpSettings": {},
"kcpSettings": {},
"wsSettings": {},
"httpSettings": {},
"quicSettings": {},
"dsSettings": {},
"grpcSettings": {}
}
}
```
> `tcpSettings`: [TcpObject](./transports/tcp.md)
针对 TCP 连接的配置。
> `kcpSettings`: [KcpObject](./transports/mkcp.md)
针对 mKCP 连接的配置。
> `wsSettings`: [WebSocketObject](./transports/websocket.md)
针对 WebSocket 连接的配置。
> `httpSettings`: [HttpObject](./transports/h2.md)
针对 HTTP/2 连接的配置。
> `quicSettings`: [QuicObject](./transports/quic.md)
针对 QUIC 连接的配置。
> `grpcSettings`: [GRPCObject](./transports/grpc.md)
针对 gRPC 连接的配置。
> `dsSettings`: [DomainSocketObject](./transports/domainsocket.md)
针对 Domain Socket 连接的配置。
## StreamSettingsObject
`StreamSettingsObject` 对应入站或出站中的 `streamSettings` 项。每一个入站或出站都可以分别配置不同的传输配置,都可以设置 `streamSettings` 来进行一些传输的配置。
```json
{
"network": "tcp",
"security": "none",
"tlsSettings": {},
"xtlsSettings": {},
"tcpSettings": {},
"kcpSettings": {},
"wsSettings": {},
"httpSettings": {},
"quicSettings": {},
"dsSettings": {},
"grpcSettings": {},
"sockopt": {
"mark": 0,
"tcpFastOpen": false,
"tproxy": "off",
"domainStrategy": "AsIs",
"dialerProxy": "",
"acceptProxyProtocol": false
}
}
```
> `network`: "tcp" | "kcp" | "ws" | "http" | "domainsocket" | "quic"
连接的数据流所使用的传输方式类型,默认值为 `"tcp"`
> `security`: "none" | "tls" | "xtls"
是否启用传输层加密,支持的选项有
- `"none"` 表示不加密(默认值)
- `"tls"` 表示使用 [TLS](https://en.wikipedia.org/wiki/base/transport_Layer_Security)。
- `"xtls"` 表示使用 [XTLS](./features/xtls.md)。
> `tlsSettings`: [TLSObject](#tlsobject)
TLS 配置。TLS 由 Golang 提供,通常情况下 TLS 协商的结果为使用 TLS 1.3,不支持 DTLS。
> `xtlsSettings`: [XTLSObject](#tlsobject)
XTLS 配置。XTLS 是 Xray 的原创黑科技, 也是使 Xray 性能一骑绝尘的核心动力。 XTLS 与 TLS 有相同的安全性, 配置方式也和 TLS 一致.
点击此处查看 [XTLS 的技术细节剖析](./features/xtls.md)
::: tip
TLS / XTLS 是目前最安全的传输加密方案, 且外部看来流量类型和正常上网具有一致性。 启用 XTLS 并且配置合适的 XTLS 流控模式, 可以在保持和 TLS 相同的安全性的前提下,
性能达到数倍甚至十几倍的提升。 当 `security` 的值从 `tls` 改为 `xtls` 时, 只需将 `tlsSettings` 修改成为 `xtlsSettings`
:::
> `tcpSettings`: [TcpObject](./transports/tcp.md)
当前连接的 TCP 配置,仅当此连接使用 TCP 时有效。配置内容与上面的全局配置相同。
> `kcpSettings`: [KcpObject](./transports/mkcp.md)
当前连接的 mKCP 配置,仅当此连接使用 mKCP 时有效。配置内容与上面的全局配置相同。
> `wsSettings`: [WebSocketObject](./transports/websocket.md)
当前连接的 WebSocket 配置,仅当此连接使用 WebSocket 时有效。配置内容与上面的全局配置相同。
> `httpSettings`: [HttpObject](./transports/h2.md)
当前连接的 HTTP/2 配置,仅当此连接使用 HTTP/2 时有效。配置内容与上面的全局配置相同。
> `quicSettings`: [QUICObject](./transports/quic.md)
当前连接的 QUIC 配置,仅当此连接使用 QUIC 时有效。配置内容与上面的全局配置相同。
> `grpcSettings`: [GRPCObject](./transports/grpc.md)
当前连接的 gRPC 配置,仅当此连接使用 gRPC 时有效。配置内容与上面的全局配置相同。
> `dsSettings`: [DomainSocketObject](./transports/domainsocket.md)
当前连接的 Domain socket 配置,仅当此连接使用 Domain socket 时有效。配置内容与上面的全局配置相同。
> `sockopt`: [SockoptObject](#sockoptobject)
透明代理相关的具体配置。
### TLSObject
```json
{
"serverName": "xray.com",
"allowInsecure": false,
"alpn": ["h2", "http/1.1"],
"minVersion": "1.2",
"maxVersion": "1.3",
"preferServerCipherSuites": true,
"cipherSuites": "此处填写你需要的加密套件名称,每个套件名称之间用:进行分隔",
"certificates": [],
"disableSystemRoot": false,
"enableSessionResumption": false,
"fingerprint": ""
}
```
> `serverName`: string
指定服务器端证书的域名,在连接由 IP 建立时有用。
当目标连接由域名指定时,比如在 Socks 入站接收到了域名,或者由 Sniffing 功能探测出了域名,这个域名会自动用于 `serverName`,无须手动配置。
> `alpn`: \[ string \]
一个字符串数组,指定了 TLS 握手时指定的 ALPN 数值。默认值为 `["h2", "http/1.1"]`
> `minVersion`: \[ string \]
minVersion 为可接受的最小 SSL/TLS 版本。
> `maxVersion`: \[ string \]
maxVersion 为可接受的最大 SSL/TLS 版本。
> `preferServerCipherSuites`: true | false
指示服务器选择客户端最喜欢的密码套件 或 服务器最优选的密码套件。
如果为 true 则为使用服务器的最优选的密码套件
> `cipherSuites`: \[ string \]
CipherSuites 用于配置受支持的密码套件列表, 每个套件名称之间用:进行分隔.
你可以在 [这里](https://golang.org/src/crypto/tls/cipher_suites.go#L500)或 [这里](https://golang.org/src/crypto/tls/cipher_suites.go#L44)
找到 golang 加密套件的名词和说明
::: danger
以上两项配置为非必要选项,正常情况下不影响安全性 在未配置的情况下 golang 根据设备自动选择. 若不熟悉, 请勿配置此选项, 填写不当引起的问题自行负责
:::
> `allowInsecure`: true | false
是否允许不安全连接(仅用于客户端)。默认值为 `false`
当值为 `true`Xray 不会检查远端主机所提供的 TLS 证书的有效性。
::: danger
出于安全性考虑,这个选项不应该在实际场景中选择 true否则可能遭受中间人攻击。
:::
> `disableSystemRoot`: true | false
是否禁用操作系统自带的 CA 证书。默认值为 `false`
当值为 `true`Xray 只会使用 `certificates` 中指定的证书进行 TLS 握手。当值为 `false`Xray 只会使用操作系统自带的 CA 证书进行 TLS 握手。
> `enableSessionResumption`: true | false
此参数的设置为 false 时, ClientHello 里没有 session_ticket 这个扩展。 通常来讲 go 语言程序的 ClientHello 里并没有用到这个扩展, 因此建议保持默认值。 默认值为 `false`
> `fingerprint` : "" | "chrome" | "firefox" | "safari" | "randomized"
此参数用于配置指定 `TLS Client Hello` 的指纹。当其值为空时表示不启用此功能。启用后Xray 将通过 uTLS 库 **模拟** `TLS` 指纹,或随机生成。
::: tip
此功能仅 **模拟** `TLS Client Hello` 的指纹,行为、其他指纹与 Golang 相同。如果你希望更加完整地模拟浏览器 `TLS`
指纹与行为,可以使用 [Browser Dialer](./transports/websocket.md#browser-dialer)。
:::
- `"chrome" | "firefox" | "safari"`: 模拟 Chrome / Firefox / Safari 的 TLS 指纹
- `"randomized"`: 使用随机指纹
> `certificates`: \[ [CertificateObject](#certificateobject) \]
证书列表,其中每一项表示一个证书(建议 fullchain
::: tip
如果要在 ssllibs 或者 myssl 获得 A/A+ 等级的评价,
请参考 [这里](https://github.com/XTLS/Xray-core/discussions/56#discussioncomment-215600).
:::
#### CertificateObject
```json
{
"ocspStapling": 3600,
"usage": "encipherment",
"certificateFile": "/path/to/certificate.crt",
"keyFile": "/path/to/key.key",
"certificate": [
"--BEGIN CERTIFICATE--",
"MIICwDCCAaigAwIBAgIRAO16JMdESAuHidFYJAR/7kAwDQYJKoZIhvcNAQELBQAw",
"ADAeFw0xODA0MTAxMzU1MTdaFw0xODA0MTAxNTU1MTdaMAAwggEiMA0GCSqGSIb3",
"DQEBAQUAA4IBDwAwggEKAoIBAQCs2PX0fFSCjOemmdm9UbOvcLctF94Ox4BpSfJ+",
"3lJHwZbvnOFuo56WhQJWrclKoImp/c9veL1J4Bbtam3sW3APkZVEK9UxRQ57HQuw",
"OzhV0FD20/0YELou85TwnkTw5l9GVCXT02NG+pGlYsFrxesUHpojdl8tIcn113M5",
"pypgDPVmPeeORRf7nseMC6GhvXYM4txJPyenohwegl8DZ6OE5FkSVR5wFQtAhbON",
"OAkIVVmw002K2J6pitPuJGOka9PxcCVWhko/W+JCGapcC7O74palwBUuXE1iH+Jp",
"noPjGp4qE2ognW3WH/sgQ+rvo20eXb9Um1steaYY8xlxgBsXAgMBAAGjNTAzMA4G",
"A1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAA",
"MA0GCSqGSIb3DQEBCwUAA4IBAQBUd9sGKYemzwPnxtw/vzkV8Q32NILEMlPVqeJU",
"7UxVgIODBV6A1b3tOUoktuhmgSSaQxjhYbFAVTD+LUglMUCxNbj56luBRlLLQWo+",
"9BUhC/ow393tLmqKcB59qNcwbZER6XT5POYwcaKM75QVqhCJVHJNb1zSEE7Co7iO",
"6wIan3lFyjBfYlBEz5vyRWQNIwKfdh5cK1yAu13xGENwmtlSTHiwbjBLXfk+0A/8",
"r/2s+sCYUkGZHhj8xY7bJ1zg0FRalP5LrqY+r6BckT1QPDIQKYy615j1LpOtwZe/",
"d4q7MD/dkzRDsch7t2cIjM/PYeMuzh87admSyL6hdtK0Nm/Q",
"--END CERTIFICATE--"
],
"key": [
"--BEGIN RSA PRIVATE KEY--",
"MIIEowIBAAKCAQEArNj19HxUgoznppnZvVGzr3C3LRfeDseAaUnyft5SR8GW75zh",
"bqOeloUCVq3JSqCJqf3Pb3i9SeAW7Wpt7FtwD5GVRCvVMUUOex0LsDs4VdBQ9tP9",
"GBC6LvOU8J5E8OZfRlQl09NjRvqRpWLBa8XrFB6aI3ZfLSHJ9ddzOacqYAz1Zj3n",
"jkUX+57HjAuhob12DOLcST8np6IcHoJfA2ejhORZElUecBULQIWzjTgJCFVZsNNN",
"itieqYrT7iRjpGvT8XAlVoZKP1viQhmqXAuzu+KWpcAVLlxNYh/iaZ6D4xqeKhNq",
"IJ1t1h/7IEPq76NtHl2/VJtbLXmmGPMZcYAbFwIDAQABAoIBAFCgG4phfGIxK9Uw",
"qrp+o9xQLYGhQnmOYb27OpwnRCYojSlT+mvLcqwvevnHsr9WxyA+PkZ3AYS2PLue",
"C4xW0pzQgdn8wENtPOX8lHkuBocw1rNsCwDwvIguIuliSjI8o3CAy+xVDFgNhWap",
"/CMzfQYziB7GlnrM6hH838iiy0dlv4I/HKk+3/YlSYQEvnFokTf7HxbDDmznkJTM",
"aPKZ5qbnV+4AcQfcLYJ8QE0ViJ8dVZ7RLwIf7+SG0b0bqloti4+oQXqGtiESUwEW",
"/Wzi7oyCbFJoPsFWp1P5+wD7jAGpAd9lPIwPahdr1wl6VwIx9W0XYjoZn71AEaw4",
"bK4xUXECgYEA3g2o9WqyrhYSax3pGEdvV2qN0VQhw7Xe+jyy98CELOO2DNbB9QNJ",
"8cSSU/PjkxQlgbOJc8DEprdMldN5xI/srlsbQWCj72wXxXnVnh991bI2clwt7oYi",
"pcGZwzCrJyFL+QaZmYzLxkxYl1tCiiuqLm+EkjxCWKTX/kKEFb6rtnMCgYEAx0WR",
"L8Uue3lXxhXRdBS5QRTBNklkSxtU+2yyXRpvFa7Qam+GghJs5RKfJ9lTvjfM/PxG",
"3vhuBliWQOKQbm1ZGLbgGBM505EOP7DikUmH/kzKxIeRo4l64mioKdDwK/4CZtS7",
"az0Lq3eS6bq11qL4mEdE6Gn/Y+sqB83GHZYju80CgYABFm4KbbBcW+1RKv9WSBtK",
"gVIagV/89moWLa/uuLmtApyEqZSfn5mAHqdc0+f8c2/Pl9KHh50u99zfKv8AsHfH",
"TtjuVAvZg10GcZdTQ/I41ruficYL0gpfZ3haVWWxNl+J47di4iapXPxeGWtVA+u8",
"eH1cvgDRMFWCgE7nUFzE8wKBgGndUomfZtdgGrp4ouLZk6W4ogD2MpsYNSixkXyW",
"64cIbV7uSvZVVZbJMtaXxb6bpIKOgBQ6xTEH5SMpenPAEgJoPVts816rhHdfwK5Q",
"8zetklegckYAZtFbqmM0xjOI6bu5rqwFLWr1xo33jF0wDYPQ8RHMJkruB1FIB8V2",
"GxvNAoGBAM4g2z8NTPMqX+8IBGkGgqmcYuRQxd3cs7LOSEjF9hPy1it2ZFe/yUKq",
"ePa2E8osffK5LBkFzhyQb0WrGC9ijM9E6rv10gyuNjlwXdFJcdqVamxwPUBtxRJR",
"cYTY2HRkJXDdtT0Bkc3josE6UUDvwMpO0CfAETQPto1tjNEDhQhT",
"--END RSA PRIVATE KEY--"
]
}
```
> `ocspStapling`: number
ocspStapling 检查更新时间间隔。 单位:秒
> `usage`: "encipherment" | "verify" | "issue"
证书用途,默认值为 `"encipherment"`
- `"encipherment"`:证书用于 TLS 认证和加密。
- `"verify"`:证书用于验证远端 TLS 的证书。当使用此项时,当前证书必须为 CA 证书。
- `"issue"`:证书用于签发其它证书。当使用此项时,当前证书必须为 CA 证书。
::: tip TIP 1
在 Windows 平台上可以将自签名的 CA 证书安装到系统中,即可验证远端 TLS 的证书。
:::
::: tip TIP 2
当有新的客户端请求时,假设所指定的 `serverName``"xray.com"`Xray 会先从证书列表中寻找可用于 `"xray.com"` 的证书,如果没有找到,则使用任一 `usage`
`"issue"` 的证书签发一个适用于 `"xray.com"` 的证书,有效期为一小时。并将新的证书加入证书列表,以供后续使用。
:::
::: tip TIP 3
`certificateFile``certificate` 同时指定时Xray 优先使用 `certificateFile``keyFile``key` 也一样。
:::
::: tip TIP 4
`usage``"verify"` 时,`keyFile``key` 可均为空。
:::
::: tip TIP 5
使用 `xray tls cert` 可以生成自签名的 CA 证书。
:::
::: tip TIP 6
如已经拥有一个域名, 可以使用工具便捷的获取免费第三方证书,如[acme.sh](https://github.com/acmesh-official/acme.sh)
:::
> `certificateFile`: string
证书文件路径,如使用 OpenSSL 生成,后缀名为 .crt。
> `certificate`: \[ string \]
一个字符串数组,表示证书内容,格式如样例所示。`certificate``certificateFile` 二者选一。
> `keyFile`: string
密钥文件路径,如使用 OpenSSL 生成,后缀名为 .key。目前暂不支持需要密码的 key 文件。
> `key`: \[ string \]
一个字符串数组,表示密钥内容,格式如样例如示。`key``keyFile` 二者选一。
### SockoptObject
```json
{
"mark": 0,
"tcpFastOpen": false,
"tproxy": "off",
"domainStrategy": "AsIs",
"dialerProxy": "",
"acceptProxyProtocol": false
}
```
> `mark`: number
一个整数。当其值非零时,在 ountbound 连接以此数值上标记 SO_MARK。
- 仅适用于 Linux 系统。
- 需要 CAP_NET_ADMIN 权限。
> `tcpFastOpen`: true | false | number
是否启用 [TCP Fast Open](https://zh.wikipedia.org/wiki/TCP%E5%BF%AB%E9%80%9F%E6%89%93%E5%BC%80)。
当其值为 `true``正整数`时,启用 TFO当其值为 `false``负数`时,强制关闭 TFO当此项不存在或为 `0` 时,使用系统默认设置。 可用于 inbound/outbound。
- 仅在以下版本(或更新版本)的操作系统中可用:
- Windows 10 (1607)
- Mac OS 10.11 / iOS 9
- Linux 3.16:需要通过内核参数 `net.ipv4.tcp_fastopen` 进行设定,此参数是一个 bitmap`0x1` 代表客户端允许启用,`0x2` 代表服务器允许启用;默认值为 `0x1`,如果服务器要启用
TFO请把此内核参数值设为 `0x3`
- FreeBSD 10.3 (Server) / 12.0 (Client):需要把内核参数 `net.inet.tcp.fastopen.server_enabled`
以及 `net.inet.tcp.fastopen.client_enabled` 设为 `1`
- 对于 Inbound此处所设定的`正整数`代表 [待处理的 TFO 连接请求数上限](https://tools.ietf.org/html/rfc7413#section-5.1) **注意并非所有操作系统都支持在此设定**
- Linux / FreeBSD此处的设定的`正整数`值代表上限,可接受的最大值为 2147483647`true` 时将取 `256`;注意在 Linux`net.core.somaxconn`
会限制此值的上限,如果超过了 `somaxconn`,请同时提高 `somaxconn`
- Mac OS此处为 `true``正整数`时,仅代表启用 TFO上限需要通过内核参数 `net.inet.tcp.fastopen_backlog` 单独设定。
- Windows此处为 `true``正整数`时,仅代表启用 TFO。
- 对于 Outbound设定为 `true``正整数`在任何操作系统都仅表示启用 TFO。
> `tproxy`: "redirect" | "tproxy" | "off"
是否开启透明代理(仅适用于 Linux
- `"redirect"`:使用 Redirect 模式的透明代理。支持所有基于 IPv4/6 的 TCP 和 UDP 连接。
- `"tproxy"`:使用 TProxy 模式的透明代理。支持所有基于 IPv4/6 的 TCP 和 UDP 连接。
- `"off"`:关闭透明代理。
透明代理需要 Root 或 `CAP\_NET\_ADMIN` 权限。
::: danger
当 [Dokodemo-door](./inbounds/dokodemo.md) 中指定了 `followRedirect``true`,且 Sockopt 设置中的`tproxy` 为空时Sockopt
设置中的`tproxy` 的值会被设为 `"redirect"`
:::
> `domainStrategy`: "AsIs" | "UseIP" | "UseIPv4" | "UseIPv6"
在之前的版本中,当 Xray 尝试使用域名建立系统连接时,域名的解析由系统完成,不受 Xray
控制。这导致了在 [非标准 Linux 环境中无法解析域名](https://github.com/v2ray/v2ray-core/issues/1909) 等问题。为此Xray 1.3.1 为 Sockopt 引入了 Freedom
中的 domainStrategy解决了此问题。
在目标地址为域名时, 配置相应的值, SystemDialer 的行为模式如下:
- `"AsIs"`: 通过系统 DNS 服务器解析获取 IP, 向此域名发出连接。
- `"UseIP"``"UseIPv4"``"UseIPv6"`: 使用[内置 DNS 服务器](./dns.md)解析获取 IP 后, 直接向此 IP 发出连接。
默认值为 `"AsIs"`
::: danger
启用了此功能后,不当的配置可能会导致死循环。
一句话版本:连接到服务器,需要等待 DNS 查询结果;完成 DNS 查询,需要连接到服务器。
> Tony: 先有鸡还是先有蛋?
详细解释:
1. 触发条件代理服务器proxy.com。内置 DNS 服务器,非 Local 模式。
2. Xray 尝试向 proxy.com 建立 TCP 连接 **前** ,通过内置 DNS 服务器查询 proxy.com。
3. 内置 DNS 服务器向 dns.com 建立连接,并发送查询,以获取 proxy.com 的 IP。
4. **不当的** 的路由规则,导致 proxy.com 代理了步骤 3 中发出的查询。
5. Xray 尝试向 proxy.com 建立另一个 TCP 连接。
6. 在建立连接前,通过内置 DNS 服务器查询 proxy.com。
7. 内置 DNS 服务器复用步骤 3 中的连接,发出查询。
8. 问题出现。步骤 3 中连接的建立,需要等待步骤 7 中的查询结果;步骤 7 完成查询,需要等待步骤 3 中的连接完全建立。
9. Good Game
解决方案:
- 改内置 DNS 服务器的分流。
- 用 Hosts。
- ~~如果你还是不知道解决方案,就别用这个功能了。~~
因此,**不建议** 经验不足的用户擅自使用此功能。
:::
> `dialerProxy`: ""
一个出站代理的标识。当值不为空时,将使用指定的 outbound 发出连接。 此选项可用于支持底层传输方式的链式转发。
::: danger
此选项与 PorxySettingsObject.Tag 不兼容
:::
> `acceptProxyProtocol`: true | false
仅用于 inbound指示是否接收 PROXY protocol。
[PROXY protocol](https://www.haproxy.org/download/2.2/doc/proxy-protocol.txt) 专用于传递请求的真实来源 IP 和端口,**若你不了解它,请先忽略该项**。
常见的反代软件(如 HAProxy、Nginx都可以配置发送它VLESS fallbacks xver 也可以发送它。
填写 `true` 时,最底层 TCP 连接建立后,请求方必须先发送 PROXY protocol v1 或 v2否则连接会被关闭。

View File

@ -0,0 +1,33 @@
# 传输方式列表
这个章节包含了目前所有的传输方式及相关的具体配置.
## 传输方式列表
> `tcpSettings`: [TcpObject](./tcp.md)
针对 TCP 连接的配置。
> `wsSettings`: [WebSocketObject](./websocket.md)
针对 WebSocket 连接的配置。
> `dsSettings`: [DomainSocketObject](./domainsocket.md)
针对 Domain Socket 连接的配置。
> `kcpSettings`: [KcpObject](./mkcp.md)
针对 mKCP 连接的配置。
> `httpSettings`: [HttpObject](./h2.md)
针对 HTTP/2 连接的配置。
> `quicSettings`: [QuicObject](./quic.md)
针对 QUIC 连接的配置。
> `grpcSettings`: [GRPCObject](./grpc.md)
针对 gRPC 连接的配置。

View File

@ -0,0 +1,43 @@
# Domain Socket
::: danger
推荐写到 [inbounds](../inbound.md) 的 `listen` 处,传输方式可选 TCP、WebSocket、HTTP/2.
未来这里的 DomainSocket 可能会被弃用。
:::
Domain Socket 使用标准的 Unix domain socket 来传输数据。
它的优势是使用了操作系统内建的传输通道,而不会占用网络缓存。
理论上相比起本地环回网络local loopback来说Domain socket 速度略快一些。
目前仅可用于支持 Unix domain socket 的平台,如 Linux 和 macOS。在 Windows 10 Build 17036 前不可用。
如果指定了 domain socket 作为传输方式,在入站出站代理中配置的端口和 IP 地址将会失效,所有的传输由 domain socket 取代。
## DomainSocketObject
`DomainSocketObject` 对应传输配置的 `dsSettings` 项。
```json
{
"path": "/path/to/ds/file",
"abstract": false,
"padding": false
}
```
> `path`: string
一个合法的文件路径。
::: danger
在运行 Xray 之前,这个文件必须不存在。
:::
> `abstract`: true | false
是否为 abstract domain socket默认值 `false`
> `padding`: true | false
abstract domain socket 是否带 padding默认值 `false`

View File

@ -0,0 +1,51 @@
# gRPC
基于 gRPC 的传输方式。
它基于 HTTP/2 协议,理论上可以通过其它支持 HTTP/2 的服务器(如 Nginx进行中转。
gRPCHTTP/2内置多路复用不建议使用 gRPC 与 HTTP/2 时启用 mux.cool。
::: warning ⚠⚠⚠
- gRPC 不支持指定 Host。请在出站代理地址中填写 **正确的域名** ,或在 `(x)tlsSettings` 中填写 `ServerName`,否则无法连接。
- gRPC 不支持回落到其他服务。
- gRPC 服务存在被主动探测的风险。建议使用 Caddy 或 Nginx 等反向代理工具,通过 Path 前置分流。
:::
::: tip
如果您使用 Caddy 或 Nginx 等反向代理,请注意下列事项:
- 请确定反向代理服务器开启了 HTTP/2
- 请使用 HTTP/2 或 h2c (Caddy)grpc_pass (Nginx) 连接到 Xray。
- 普通模式的 Path 为 `/${serviceName}/Tun`, Multi 模式为 `/${serviceName}/TunMulti`
:::
::: tip
如果你正在使用回落,请注意下列事项:
- 不建议回落到 gRPC存在被主动探测的风险。
- 请确认`h2` 位于 (x)tlsSettings.alpn 中的第一顺位,否则 gRPCHTTP/2可能无法完成 TLS 握手。
- gRPC 无法通过进行 Path 分流。
:::
## GRPCObject
`GRPCObject` 对应传输配置的 `grpcSettings` 项。
```json
{
"serviceName": "name",
"multiMode": false
}
```
> `serviceName`: string
一个字符串,指定服务名称,**类似于** HTTP/2 中的 Path。
客户端会使用此名称进行通信,服务端会验证服务名称是否匹配。
> `multiMode`: bool <Badge text="BETA" type="warning"/>
一个布尔值。表示是否启用 `multiMode`
这是一个 **实验性** 选项,可能不会被长期保留,也不保证跨版本兼容。此模式在 **测试环境中** 能够带来约 20% 的性能提升,实际效果因传输速率不同而不同。

View File

@ -0,0 +1,44 @@
# HTTP/2
基于 HTTP/2 的传输方式。
它完整按照 HTTP/2 标准实现,可以通过其它的 HTTP 服务器(如 Nginx进行中转。
由 HTTP/2 的建议,客户端和服务器必须同时开启 TLS 才可以正常使用这个传输方式。
HTTP/2 内置多路复用,不建议使用 HTTP/2 时启用 mux.cool。
::: tip
当前版本的 HTTP/2 的传输方式并不强制要求服务器端有 TLS 配置.
这使得可以在特殊用途的分流部署环境中,由外部网关组件完成 TLS 层对话Xray 作为后端应用,网关和 Xray 间使用称为 `h2c` 的明文 http/2 进行通讯。
:::
::: warning
⚠️ 如果你正在使用回落,请注意下列事项:
- 请确认 (x)tlsSettings.alpn 中包含 h2否则 HTTP/2 无法完成 TLS 握手。
- HTTP/2 无法通过进行 Path 分流,建议使用 SNI 分流。
:::
## HttpObject
`HttpObject` 对应传输配置的 `httpSettings` 项。
```json
{
"host": ["xray.com"],
"path": "/random/path"
}
```
> `host`: \[string\]
一个字符串数组,每一个元素是一个域名。
客户端会随机从列表中选出一个域名进行通信,服务器会验证域名是否在列表中。
> `path` string
HTTP 路径,由 `/` 开头, 客户端和服务器必须一致。
默认值为 `"/"`

View File

@ -0,0 +1,146 @@
# mKCP
mKCP 使用 UDP 来模拟 TCP 连接。
mKCP 牺牲带宽来降低延迟。传输同样的内容mKCP 一般比 TCP 消耗更多的流量。
::: tip
请确定主机上的防火墙配置正确
:::
## KcpObject
`KcpObject` 对应传输配置的 `kcpSettings` 项。
```json
{
"mtu": 1350,
"tti": 20,
"uplinkCapacity": 5,
"downlinkCapacity": 20,
"congestion": false,
"readBufferSize": 1,
"writeBufferSize": 1,
"header": {
"type": "none"
},
"seed": "Password"
}
```
> `mtu`: number
最大传输单元maximum transmission unit
请选择一个介于 576 - 1460 之间的值。
默认值为 `1350`
> `tti`: number
传输时间间隔transmission time interval单位毫秒msmKCP 将以这个时间频率发送数据。
请选译一个介于 10 - 100 之间的值。
默认值为 `50`
> `uplinkCapacity`: number
上行链路容量,即主机发出数据所用的最大带宽,单位 MB/s注意是 Byte 而非 bit。
可以设置为 0表示一个非常小的带宽。
默认值 `5`
> `downlinkCapacity`: number
下行链路容量,即主机接收数据所用的最大带宽,单位 MB/s注意是 Byte 而非 bit。
可以设置为 0表示一个非常小的带宽。
默认值 `20`
::: tip
`uplinkCapacity``downlinkCapacity` 决定了 mKCP 的传输速度。
以客户端发送数据为例,客户端的 `uplinkCapacity` 指定了发送数据的速度,而服务器端的 `downlinkCapacity` 指定了接收数据的速度。两者的值以较小的一个为准。
推荐把 `downlinkCapacity` 设置为一个较大的值,比如 100`uplinkCapacity` 设为实际的网络速度。当速度不够时,可以逐渐增加 `uplinkCapacity` 的值,直到带宽的两倍左右。
:::
> `congestion`: true | false
是否启用拥塞控制。
开启拥塞控制之后Xray 会自动监测网络质量,当丢包严重时,会自动降低吞吐量;当网络畅通时,也会适当增加吞吐量。
默认值为 `false`
> `readBufferSize`: number
单个连接的读取缓冲区大小,单位是 MB。
默认值为 `2`
> `writeBufferSize`: number
单个连接的写入缓冲区大小,单位是 MB。
默认值为 `2`
::: tip
`readBufferSize``writeBufferSize` 指定了单个连接所使用的内存大小。
在需要高速传输时,指定较大的 `readBufferSize``writeBufferSize` 会在一定程度上提高速度,但也会使用更多的内存。
在网速不超过 20MB/s 时,默认值 1MB 可以满足需求;超过之后,可以适当增加 `readBufferSize``writeBufferSize` 的值,然后手动平衡速度和内存的关系。
:::
> `header`: [HeaderObject](#headerobject)
数据包头部伪装设置
> `seed`: string
可选的混淆密码,使用 AES-128-GCM 算法混淆流量数据,客户端和服务端需要保持一致。
本混淆机制不能用于保证通信内容的安全,但可能可以对抗部分封锁。
> 目前测试环境下开启此设置后没有出现原版未混淆版本的封端口现象
### HeaderObject
```json
{
"type": "none"
}
```
> `type`: string
伪装类型,可选的值有:
- `"none"`:默认值,不进行伪装,发送的数据是没有特征的数据包。
- `"srtp"`:伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime
- `"utp"`:伪装成 uTP 数据包,会被识别为 BT 下载数据。
- `"wechat-video"`:伪装成微信视频通话的数据包。
- `"dtls"`:伪装成 DTLS 1.2 数据包。
- `"wireguard"`:伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)
## 鸣谢
- [@skywind3000](https://github.com/skywind3000) 发明并实现了 KCP 协议。
- [@xtaci](https://github.com/xtaci) 将 KCP 由 C 语言实现翻译成 Go。
- [@xiaokangwang](https://github.com/xiaokangwang) 测试 KCP 与 Xray 的整合并提交了最初的 PR。
## 对 KCP 协议的改进
### 更小的协议头
原生 KCP 协议使用了 24 字节的固定头部,而 mKCP 修改为数据包 18 字节确认ACK包 16 字节。更小的头部有助于躲避特征检查,并加快传输速度。
另外,原生 KCP 的单个确认包只能确认一个数据包已收到,也就是说当 KCP 需要确认 100 个数据已收到时,它会发出 24 \* 100 = 2400 字节的数据。其中包含了大量重复的头部数据造成带宽的浪费。mKCP 会对多个确认包进行压缩100 个确认包只需要 16 + 2 + 100 \* 4 = 418 字节,相当于原生的六分之一。
### 确认包重传
原生 KCP 协议的确认ACK包只发送一次如果确认包丢失则一定会导致数据重传造成不必要的带宽浪费。而 mKCP 会以一定的频率重发确认包,直到发送方确认为止。单个确认包的大小为 22 字节,相比起数据包的 1000 字节以上,重传确认包的代价要小得多。
### 连接状态控制
mKCP 可以有效地开启和关闭连接。当远程主机主动关闭连接时,连接会在两秒钟之内释放;当远程主机断线时,连接会在最多 30 秒内释放。
原生 KCP 不支持这个场景。

View File

@ -0,0 +1,74 @@
# QUIC
QUIC 全称 Quick UDP Internet Connection是由 Google 提出的使用 UDP 进行多路并发传输的协议。其主要优势是:
1. 减少了握手的延迟1-RTT 或 0-RTT
2. 多路复用,并且没有 TCP 的阻塞问题
3. 连接迁移,(主要是在客户端)当由 Wifi 转移到 4G 时,连接不会被断开。
QUIC 目前处于实验期,使用了正在标准化过程中的 IETF 实现,不能保证与最终版本的兼容性。
- 默认设定:
- 12 字节的 Connection ID
- 30 秒没有数据通过时自动断开连接 (可能会影响一些长连接的使用)
## QuicObject
`QuicObject` 对应传输配置的 `quicSettings` 项。
::: danger
对接的两端的配置必须完全一致,否则连接失败。
QUIC 强制要求开启 TLS在传输配置中没有开启 TLS 时Xray 会自行签发一个证书进行 TLS 通讯。
:::
```json
{
"security": "none",
"key": "",
"header": {
"type": "none"
}
}
```
> `security`: "none" | "aes-128-gcm" | "chacha20-poly1305"
加密方式。
此加密是对 QUIC 数据包的加密,加密后数据包无法被探测。
默认值为不加密。
> `key`: string
加密时所用的密钥。
可以是任意字符串。当 `security` 不为 `"none"` 时有效。
> `header`: [HeaderObject](#headerobject)
数据包头部伪装设置
### HeaderObject
```json
{
"type": "none"
}
```
> `type`: string
伪装类型,可选的值有:
- `"none"`:默认值,不进行伪装,发送的数据是没有特征的数据包。
- `"srtp"`:伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime
- `"utp"`:伪装成 uTP 数据包,会被识别为 BT 下载数据。
- `"wechat-video"`:伪装成微信视频通话的数据包。
- `"dtls"`:伪装成 DTLS 1.2 数据包。
- `"wireguard"`:伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)
::: tip
当加密和伪装都不启用时,数据包即为原始的 QUIC 数据包,可以与其它的 QUIC 工具对接。
为了避免被探测,建议加密或伪装至少开启一项。
:::

View File

@ -0,0 +1,148 @@
# TCP
TCP 传输模式是目前推荐使用的传输模式之一.
可以和各种协议有多种组合模式.
## TcpObject
`TcpObject` 对应传输配置的 `tcpSettings` 项。
```json
{
"acceptProxyProtocol": false,
"header": {
"type": "none"
}
}
```
> `acceptProxyProtocol`: true | false
仅用于 inbound指示是否接收 PROXY protocol。
[PROXY protocol](https://www.haproxy.org/download/2.2/doc/proxy-protocol.txt) 专用于传递请求的真实来源 IP 和端口,**若你不了解它,请先忽略该项**。
常见的反代软件(如 HAProxy、Nginx都可以配置发送它VLESS fallbacks xver 也可以发送它。
填写 `true` 时,最底层 TCP 连接建立后,请求方必须先发送 PROXY protocol v1 或 v2否则连接会被关闭。
默认值为 `false`
> `header`: [NoneHeaderObject](#noneheaderobject) | [HttpHeaderobject](#httpheaderobject)
数据包头部伪装设置,默认值为 `NoneHeaderObject`
::: tip
HTTP 伪装无法被其它 HTTP 服务器(如 Nginx分流但可以被 VLESS fallbacks path 分流。
:::
### NoneHeaderObject
不进行伪装
```json
{
"type": "none"
}
```
> `type`: "none"
指定不进行伪装
### HttpHeaderObject
HTTP 伪装配置必须在对应的入站出站连接上同时配置,且内容必须一致。
```json
{
"type": "http",
"request": {},
"response": {}
}
```
> `type`: "http"
指定进行 HTTP 伪装
> `request`: [HTTPRequestObject](#httprequestobject)
HTTP 请求
> `response`: [HTTPResponseObject](#httpresponseobject)
HTTP 响应
#### HTTPRequestObject
```json
{
"version": "1.1",
"method": "GET",
"path": ["/"],
"headers": {
"Host": ["www.baidu.com", "www.bing.com"],
"User-Agent": [
"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46"
],
"Accept-Encoding": ["gzip, deflate"],
"Connection": ["keep-alive"],
"Pragma": "no-cache"
}
}
```
> `version`: string
HTTP 版本,默认值为 `"1.1"`
> `method`: string
HTTP 方法,默认值为 `"GET"`
> `path`: \[ string \]
路径,一个字符串数组。默认值为 `["/"]`。当有多个值时,每次请求随机选择一个值。
> `headers`: map{ string, \[ string \]}
HTTP 头,一个键值对,每个键表示一个 HTTP 头的名称,对应的值是一个数组。
每次请求会附上所有的键,并随机选择一个对应的值。默认值见上方示例。
#### HTTPResponseObject
```json
{
"version": "1.1",
"status": "200",
"reason": "OK",
"headers": {
"Content-Type": ["application/octet-stream", "video/mpeg"],
"Transfer-Encoding": ["chunked"],
"Connection": ["keep-alive"],
"Pragma": "no-cache"
}
}
```
> `version`: string
HTTP 版本,默认值为 `"1.1"`
> `status`: string
HTTP 状态,默认值为 `"200"`
> `reason`: string
HTTP 状态说明,默认值为 `"OK"`
> `headers`: map {string, \[ string \]}
HTTP 头,一个键值对,每个键表示一个 HTTP 头的名称,对应的值是一个数组。
每次请求会附上所有的键,并随机选择一个对应的值。默认值见上方示例。

View File

@ -0,0 +1,85 @@
# WebSocket
使用标准的 WebSocket 来传输数据。
WebSocket 连接可以被其它 HTTP 服务器(如 Nginx分流也可以被 VLESS fallbacks path 分流。
::: tip
Websocket 会识别 HTTP 请求的 X-Forwarded-For 头来覆写流量的源地址,优先级高于 PROXY protocol。
:::
## WebSocketObject
`WebSocketObject` 对应传输配置的 `wsSettings` 项。
```json
{
"acceptProxyProtocol": false,
"path": "/",
"headers": {
"Host": "xray.com"
}
}
```
> `acceptProxyProtocol`: true | false
仅用于 inbound指示是否接收 PROXY protocol。
[PROXY protocol](https://www.haproxy.org/download/2.2/doc/proxy-protocol.txt) 专用于传递请求的真实来源 IP 和端口,**若你不了解它,请先忽略该项**。
常见的反代软件(如 HAProxy、Nginx都可以配置发送它VLESS fallbacks xver 也可以发送它。
填写 `true` 时,最底层 TCP 连接建立后,请求方必须先发送 PROXY protocol v1 或 v2否则连接会被关闭。
> `path` string
WebSocket 所使用的 HTTP 协议路径,默认值为 `"/"`
如果路径中包含 `ed` 参数,将会启用 `Early Data` 以降低延迟,其值为首包长度阈值。如果首包长度超过此值,就不会启用 `Early Data`。建议的值为 2048。
::: warning
`Early Data` 使用 `Sec-WebSocket-Protocol` 头承载数据。如果你遇到兼容性问题,可以尝试调低阈值。
:::
> `headers`: map \{string: string\}
自定义 HTTP 头,一个键值对,每个键表示一个 HTTP 头的名称,对应的值是字符串。
默认值为空。
## Browser Dialer <Badge text="BETA" type="warning"/>
### Background
[v2ray/discussion#754](https://github.com/v2ray/discussion/issues/754#issuecomment-647934994) 基于一年前的想法,原生 JS 实现了简洁的 WSS Browser Dialer真实浏览器的 TLS 指纹、行为特征。
不过 WSS 仍存在 ALPN 明显的问题,所以下一步是浏览器转发 HTTP/2、QUIC。
### Xray & JS
创造了一个非常简单、巧妙的通信机制:
- Xray 监听地址端口 A作为 HTTP 服务,浏览器访问 A加载网页中的 JS。
- JS 主动向 A 建立 WebSocket 连接成功后Xray 将连接发给 channel。
- 需要建立连接时Xray 从 channel 接收一个可用的连接,并发送目标 URL 和可选的 early data。
- JS 成功连接到目标后告知 Xray并继续用这个 conn 全双工双向转发数据,连接关闭行为同步。
- 连接使用后就会被关闭,但 JS 会确保始终有新空闲连接可用。
### Early data
根据浏览器的需求,对 early data 机制进行了如下调整:
- 服务端响应头会带有请求的 `Sec-WebSocket-Protocol`,这也初步混淆了 WSS 握手响应的长度特征。
- 用于浏览器的 early data 编码是 `base64.RawURLEncoding` 而不是 `StdEncoding`,服务端做了兼容。
- 此外,由于 [#375](https://github.com/XTLS/Xray-core/pull/375) 推荐 `?ed=2048`,这个 PR 顺便将服务端一处 `MaxHeaderBytes` 扩至了 4096。 ~~(虽然好像不改也没问题)~~
### Configuration <Badge text="v1.4.1" type="warning"/>
这是一个探索的过程,目前两边都是 Xray-core v1.4.1 时的配置方式:
- 准备一份可用的 WSS 配置,注意 address 必须填域名,若需要指定 IP请配置 DNS 或系统 hosts。
- 若浏览器的流量也会经过 Xray-core务必将这个域名设为直连否则会造成流量回环。
- 设置环境变量指定要监听的地址端口,比如 `XRAY_BROWSER_DIALER = 127.0.0.1:8080`
- 先运行 Xray-core再用任一浏览器访问上面指定的地址端口还可以 `F12``Console``Network`
- 浏览器会限制 WebSocket 连接数,所以建议开启 `Mux.Cool`

View File

@ -0,0 +1,45 @@
---
sidebar: auto
---
# 开发指南
## 编译文档
Xray 支持各种平台, 您可以在多种平台上自行进行交叉编译。
请点击[编译文档](./intro/compile.md)以查看具体编译相关内容。
## 设计思路
Xray 内核提供了一个平台,在其之上可以进二次开发。
这个章节阐述了 Xray 的设计目标和架构。
请点击[设计思路](./intro/design.md)以了解 Xray 的设计目标和架构。
## 开发规范
这个章节阐述了获取代码,进行开发,提交 PR 的流程中需要遵循的准则, 以及相关的编码规范。
请点击[开发规范](./intro/guide.md)查看 Xray 开发中应遵循的准则。
## 协议详解
Xray 用到了很多种协议, 您可以通过各种途径获得协议的详细描述。
### [mKCP 协议](./protocols/vless.md)
VLESS 是一个无状态的轻量传输协议,可以作为 Xray 客户端和服务器之间的桥梁。
### [VMess 协议](./protocols/vmess.md)
VMess 是一个加密传输协议,可以作为 Xray 客户端和服务器之间的桥梁。
### [Mux.Cool 协议](./protocols/muxcool.md)
Mux.Cool 协议是一个多路复用传输协议,用于在一条已建立的数据流中传输多个各自独立的数据流。
### [mKCP 协议](./protocols/mkcp.md)
mKCP 是流式传输协议,由 [KCP 协议](https://github.com/skywind3000/kcp)修改而来,可以按顺序传输任意的数据流。

View File

@ -0,0 +1,81 @@
# 编译文档
## 前序工作
Xray 使用 [Golang](https://golang.org/) 作为编程语言,你需要先安装最新版本 Golang 才能够编译。
::: tip TIP
安装 Golang: [golang.org/doc/install](https://golang.org/doc/install)
:::
> 如果你不幸使用 Windows, 请 **务必** 使用 Powershell
## 拉取 Xray 源代码
```bash
git clone https://github.com/XTLS/Xray-core.git
cd Xray-core && go mod download
```
> 如果你闲的没事干,可以试试 GitHub 官方工具: `gh repo clone XTLS/Xray-core`
注意:在无法正常访问 Google 的网络环境,依赖无法被正常拉取,需要先设置 `GOPROXY`
```bash
go env -w GOPROXY=https://goproxy.io,direct
```
## 构建二进制
:::warning
本小节的命令需要在 Xray 根目录内运行。
:::
### Windows(Powershell):
```powershell
$env:CGO_ENABLED=0
go build -o xray.exe -trimpath -ldflags "-s -w -buildid=" ./main
```
### macOS, Linux:
```bash
CGO_ENABLED=0 go build -o xray -trimpath -ldflags "-s -w -buildid=" ./main
```
运行以上命令会在目录下生成 xray 可执行文件。
::: tip
如果需要编译可以进行 debug 的程序,即可以用 dlv 附加到运行的程序进行调试, 请去掉 ldflags 中的 '-w -s' 选项.
-w 禁止生成 debug 信息。使用该选项后,将无法使用 gdb 进行调试。
-s 禁用符号表
PS:其实用 vscode 或其他 IDE 调试似乎更方便。
:::
## 交叉编译:
这里以在 Windows(Powershell) 环境中,编译到 Linux 服务器为例:
```powershell
$env:CGO_ENABLED=0
$env:GOOS="linux"
$env:GOARCH="amd64"
go build -o xray -trimpath -ldflags "-s -w -buildid=" ./main
```
上传到服务器后,记得在服务器终端内执行 `chmod +x xray`
::: tip
执行 `go tool dist list` 查看所有支持的系统与架构。
:::
## 可复现构建:
按照上述步骤,能够编译与 Release 中完全相同的二进制文件。
::: warning
请先确认您使用的 Golang 版本与编译 Release 的一致。
:::

View File

@ -0,0 +1,43 @@
# 设计目标
- Xray 内核提供了一个平台,支持必要的网络代理功能,在其之上可以进二次开发,以提供更好的用户体验;
- 以跨平台为首要原则,以减少二次开发的成本;
## 架构
![Architecture](./framework.png)
内核分为三层:应用层、代理层和传输层。
每一层内包含数个模块,模块间互相独立,同类型的模块可无缝替换。
### 应用层
应用层包含一些代理层中常用的功能,这些功能被抽象出来,以便在不同的代理模块中复用。
应用层的模块应为纯软件实现,与硬件或平台相关的技术无关。
重要模块列表:
- Dispatcher: 用于把入站代理所接收到的数据,传送给出站代理;
- Router: 路由模块,详见 [路由配置](../../config/routing.md)
- DNS: 内置的 DNS 服务器模块;
- Proxy Manager: 代理管理器;
### 代理层
代理层分为两部分入站代理Inbound Proxy和出站代理Outbound Proxy
两部分相互独立,入站代理不依赖于某个特定的出站代理,反之亦然。
#### 入站代理
- 实现 [proxy.Inbound](https://github.com/xtls/Xray-core/blob/main/proxy/proxy.go) 接口;
#### 出站代理
- 实现 [proxy.Outbound](https://github.com/xtls/Xray-core/blob/main/proxy/proxy.go) 接口;
### 传输层
传输层提供一些网络数据传输相关的工具模块。

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

View File

@ -0,0 +1,134 @@
# 开发规范
## 基本
### 版本控制
project X 的代码被托管在 github 上:
- xray 核心 [xray-core](https://github.com/XTLS/Xray-core)
- xray-flutter [xray-flutter](https://github.com/XTLS/Xray-flutter)
- 安装脚本 [Xray-install](https://github.com/XTLS/Xray-install)
- 数据文件 [Xray-rules-dat](https://github.com/XTLS/Xray-rules-dat)
- 配置模板 [Xray-examples](https://github.com/XTLS/Xray-examples)
- xray 文档 [XTLS.github.io](https://github.com/XTLS/XTLS.github.io)
您可以使用 [Git](https://git-scm.com/) 来获取代码.
### 分支Branch
本项目的主干分支为 main, main 分支也是发布时所使用的代码分支, 因此需要确保 master 在任一时刻都是可编译可使用的。
如果需要开发新的功能
- 请新开分支进行开发, 在开发完成并且经过充分测试后, 合并回主干分支.
- 新开分支如没有必要再存在时, 可以去除.
### 发布Release
<Badge text="WIP" type="warning"/>
- 建立尝鲜版本和稳定版本两个发布通道
- 临时版本, 主要用于特定情况的测试(比如从分支 build 的), 于 TG 群内/issue 回复等渠道 发布特定版本
- 尝鲜版本可以为 daily build , 用于尝鲜和获得即时反馈和再改进.
- 稳定版本为定时更新(比如周更), 合并稳定的修改并发布.
### 引用其它项目
- Golang
- 产品代码建议使用 Golang 标准库和 [golang.org/x/](https://pkg.go.dev/search?q=golang.org%2Fx) 下的库;
- 如需引用其它项目,请事先创建 issue 讨论;
- 其它
- 不违反双方的协议,且对项目有帮助的工具,都可以使用。
## 开发流程
### 写代码之前
发现任何问题,或对项目有任何想法,请创建 Issue 讨论以减少重复劳动和消耗在代码上的时间。
### 修改代码
- Golang
- 请参考 [Effective Go](https://golang.org/doc/effective_go.html)
- 每一次 push 之前,请运行:`go fmt ./...``go fmt -s -l -e -w $(find . -type f -name "*.go" ! -name "*.pb.go")`
- 每一次 push 之前,请确保测试通过:`go test ./...`
- 提交 pull request 之前,请确保新增代码有超过 70% 的代码覆盖率code coverage
- 其它
- 请注意代码的可读性。
### Pull Request
- 提交 PR 之前,请先运行 `git pull https://github.com/xray/xray-core.git` 以确保 merge 可顺利进行;
- 一个 PR 只做一件事,如有对多个 bug 的修复,请对每一个 bug 提交一个 PR
- 由于 Golang 的特殊需求Package pathGo 项目的 PR 流程和其它项目有所不同 ,建议流程如下:
1. 先 Fork 本项目,创建自己的 `github.com/your/Xray-core` 仓库;
2. 克隆自己的 Xray 仓库到本地:`git clone https://github.com/your/Xray-core.git`
3. 基于 `main` 分支创建新的分支;
4. 在自行创建的分支上作修改并提交修改(commit)
5. 在推送(push)修改完成的分支到自己的仓库前,先切换到 `main` 分支,运行 `git pull https://github.com/v2fly/Xray-core.git` 拉取最新的远端代码;
6. 如果上一步拉取得到了新的远端代码,则切换到之前自己创建的分支,运行 `git rebase master` 执行分支合并操作。如遇到文件冲突,则需要解决冲突;
7. 上一步处理完毕后,就可以把自己创建的分支推送到自己的仓库:`git push -u origin your-branch`
8. 最后,把自己仓库的新推送的分支往 `xtls/Xray-core``main` 分支发 PR 即可;
9. 请在 PR 的标题和正文中,完整表述此次 PR 解决的问题 / 新增的功能 / 代码所做的修改的用意等;
10. 耐心等待开发者的回应。
### 对代码的修改
#### 功能性问题
请提交至少一个测试用例Test Case来验证对现有功能的改动。
#### 性能相关
请提交必要的测试数据来证明现有代码的性能缺陷,或是新增代码的性能提升。
#### 新功能
- 如果新增功能对已有功能不影响,请提供可以开启/关闭的开关(如 flag并使新功能保持默认关闭的状态
- 大型新功能(比如增加一个新的协议)开发之前,请先提交一个 issue讨论完毕之后再进行开发。
#### 其它
视具体情况而定。
## Xray 编码规范
以下内容适用于 Xray 中的 Golang 代码。
### 代码结构
```
Xray-core
├── app // 应用模块
│ ├── router // 路由
├── common // 公用代码
├── proxy // 通讯协议
│ ├── blackhole
│ ├── dokodemo-door
│ ├── freedom
│ ├── socks
│ ├── vmess
├── transport // 传输模块
```
### 编码规范
基本与 Golang 官方所推荐做法一致,有一些例外。写在这里以方便大家熟悉 Golang。
#### 命名
- 文件和目录名尽量使用单个英文单词,比如 hello.go
- 如果实在没办法,则目录使用连接线/文件名使用下划线连接两个(或多个单词),比如 hello-world/hello_again.go
- 测试代码使用 \_test.go 结尾;
- 类型使用 Pascal 命名法,比如 ConnectionHandler
- 对缩写不强制小写,即 HTML 不必写成 Html
- 公开成员变量也使用 Pascal 命名法;
- 私有成员变量使用 [小驼峰式命名法](https://zh.wikipedia.org/wiki/%E9%A7%9D%E5%B3%B0%E5%BC%8F%E5%A4%A7%E5%B0%8F%E5%AF%AB) ,如 `privateAttribute`
- 为了方便重构,方法建议全部使用 Pascal 命名法;
- 完全私有的类型放入 `internal`
#### 内容组织
- 一个文件包含一个主要类型,及其相关的私有函数等;
- 测试相关的文件,如 Mock 等工具类,放入 testing 子目录。

View File

@ -0,0 +1,92 @@
# mKCP 协议
mKCP 是流式传输协议,由 [KCP 协议](https://github.com/skywind3000/kcp) 修改而来,可以按顺序传输任意的数据流。
## 版本
mKCP 没有版本号,不保证版本之间兼容性。
## 依赖
### 底层协议
mKCP 是一个基于 UDP 的协议,所有通讯使用 UDP 传输。
### 函数
- fnv: [FNV-1a](https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function) 哈希函数
- 输入参数为任意长度的字符串;
- 输入出一个 32 位无符号整数;
## 通讯过程
1. mKCP 将数据流拆成若干个数据包进行发送。一个数据流有一个唯一标识,用以区分不同的数据流。数据流中的每一个数据包都携带了同样的标识。
1. mKCP 没有握手过程,当收到一个数据包时,根据其携带的数据流的标识来判断是否为新的通话,或是正在进行中的通话。
1. 每一个数据包中包含若干个片段Segment片段分为三类数据Data、确认ACK、心跳Ping。每个片段需要单独处理。
## 数据格式
### 数据包
| 4 字节 | 2 字节 | L 字节 |
| ---------- | ---------- | -------- |
| 认证信息 A | 数据长度 L | 片段部分 |
其中:
- 认证信息 A = fnv(片段部分big endian
- 片段部分可能包含多个片段;
### 数据片段
| 2 字节 | 1 字节 | 1 字节 | 4 字节 | 4 字节 | 4 字节 | 2 字节 | Len 字节 |
| --------- | -------- | -------- | --------- | --------- | ---------------- | -------- | -------- |
| 标识 Conv | 指令 Cmd | 选项 Opt | 时间戳 Ts | 序列号 Sn | 未确认序列号 Una | 长度 Len | 数据 |
其中:
- 标识 Conv: mKCP 数据流的标识
- 指令 Cmd: 常量 0x01
- 选项 Opt: 可选的值有:
- 0x00: 空选项
- 0x01: 对方已发出所有数据
- 时间戳 Ts: 当前片段从远端发送出来时的时间big endian
- 序列号 Sn: 该数据片段时数据流中的位置,起始片段的序列号为 0之后每个新片段按顺序加 1
- 未确认序列号 Una: 远端主机正在发送的,且尚未收到确认的最小的 Sn
### 确认片段
| 2 字节 | 1 字节 | 1 字节 | 4 字节 | 4 字节 | 4 字节 | 2 字节 | Len \* 4 字节 |
| --------- | -------- | -------- | -------- | ----------------- | --------- | -------- | -------------- |
| 标识 Conv | 指令 Cmd | 选项 Opt | 窗口 Wnd | 下一接收序列号 Sn | 时间戳 Ts | 长度 Len | 已收到的序列号 |
其中:
- 标识 Conv: mKCP 数据流的标识
- 指令 Cmd: 常量 0x00
- 选项 Opt: 同上
- 窗口 Wnd: 远端主机可以接收的最大序列号
- 下一接收序列号 Sn: 远端主机未收到的数据片段中的最小序列号
- 时间戳 Ts: 远端主机最新收到的数据片段的时间戳,可用于计算延迟
- 已收到的序列号: 每个 4 字节,表示此序列号的数据已经确认收到
注释:
- 远程主机期待收到序列号 [Sn, Wnd) 范围内的数据
### 心跳片段
| 2 字节 | 1 字节 | 1 字节 | 4 字节 | 4 字节 | 4 字节 |
| --------- | -------- | -------- | ---------------- | ----------------- | -------- |
| 标识 Conv | 指令 Cmd | 选项 Opt | 未确认序列号 Una | 下一接收序列号 Sn | 延迟 Rto |
其中:
- 标识 Conv: mKCP 数据流的标识
- 指令 Cmd: 可选的值有
- 0x02: 远端主机强行终止会话
- 0x03: 正常心跳
- 选项 Opt: 同上
- 未确认序列号 Una: 同数据片段的 Una
- 下一接收序列号 Sn: 同确认片段的 Sn
- 延迟 Rto: 远端主机自己计算出的延迟

View File

@ -0,0 +1,116 @@
# Mux.Cool 协议
Mux.Cool 协议是一个多路复用传输协议,用于在一条已建立的数据流中传输多个各自独立的数据流。
## 版本
当前版本是 1 Beta。
## 依赖
### 底层协议
Mux.Cool 必须运行在一个已建立的可靠数据流之上。
## 通讯过程
一个 Mux.Cool 连接中可传输若干个子连接,每个子连接有一个独立的 ID 和状态。传输过程由帧Frame组成每一帧用于传输一个特定的子连接的数据。
### 客户端行为
当有连接需求时并且没有现有可用的连接时,客户端向服务器发起一个新连接,以下称为“主连接”。
1. 一个主连接可用于发送若干个子连接。客户端可自主决定主连接可承载的子连接数量。
1. 对于一个新的子连接,客户端必须发送状态`New`以通知服务器建立子连接,然后使用状态`Keep`来传送数据。
1. 当子连接结束时,客户端发送`End`状态来通知服务器关闭子连接。
1. 客户端可自行决定何时关闭主连接,但必须确定服务器也同时保持连接。
1. 客户端可使用 KeepAlive 状态来避免服务器关闭主连接。
### 服务器端行为
当服务器端接收到新的子连接时,服务器应当按正常的连接来处理。
1. 当收到状态`End`时,服务器端可以关闭对目标地址的上行连接。
1. 在服务器的响应中,必须使用与请求相同的 ID 来传输子连接的数据。
1. 服务器不能使用`New`状态。
1. 服务器可使用 KeepAlive 状态来避免客户端关闭主连接。
## 传输格式
Mux.Cool 使用对称传输格式,即客户端和服务器发送和接收相同格式的数据。
### 帧格式
| 2 字节 | L 字节 | X 字节 |
| ------------ | ------ | -------- |
| 元数据长度 L | 元数据 | 额外数据 |
### 元数据
元数据有若干种类型,由状态 S 来区分。所有类型的元数据都包含 ID 和 Opt 两项,其含义为:
- ID: 子连接的唯一标识
- Opt:
- D(0x01): 有额外数据
当选项 Opt(D) 开启时,额外数据格式如下:
| 2 字节 | L 字节 |
| ------ | ------ |
| 长度 L | 数据 |
### 新建子连接 (New)
| 2 字节 | 1 字节 | 1 字节 | 1 字节 | 2 字节 | 1 字节 | X 字节 |
| ------ | ------ | -------- | ---------- | ------ | ---------- | ------ |
| ID | 0x01 | 选项 Opt | 网络类型 N | 端口 | 地址类型 T | 地址 A |
其中:
- 网络类型 N
- 0x01TCP表示当前子连接的流量应当以 TCP 的方式发送至目标。
- 0x02UDP表示当前子连接的流量应当以 UDP 的方式发送至目标。
- 地址类型 T
- 0x01IPv4
- 0x02域名
- 0x03IPv6
- 地址 A
- 当 T = 0x01 时A 为 4 字节 IPv4 地址;
- 当 T = 0x02 时A 为 1 字节长度L + L 字节域名;
- 当 T = 0x03 时A 为 16 字节 IPv6 地址;
在新建子连接时,若 Opt(D) 开启,则这一帧所带的数据需要被发往目标主机。
### 保持子连接 (Keep)
| 2 字节 | 1 字节 | 1 字节 |
| ------ | ------ | -------- |
| ID | 0x02 | 选项 Opt |
在保持子连接时,若 Opt(D) 开启,则这一帧所带的数据需要被发往目标主机。
### 关闭子连接 (End)
| 2 字节 | 1 字节 | 1 字节 |
| ------ | ------ | -------- |
| ID | 0x03 | 选项 Opt |
在保持子连接时,若 Opt(D) 开启,则这一帧所带的数据需要被发往目标主机。
### 保持连接 (KeepAlive)
| 2 字节 | 1 字节 | 1 字节 |
| ------ | ------ | -------- |
| ID | 0x04 | 选项 Opt |
在保持连接时:
- 若 Opt(D) 开启,则这一帧所带的数据必须被丢弃。
- ID 可为随机值。
## 应用
Mux.Cool 协议与底层协议无关,理论上可以使用任何可靠的流式连接来传输 Mux.Cool 的协议数据。
在目标导向的协议如 Shadowsocks 和 VMess 协议中,连接建立时必须包含一个指定的地址。
为了保持兼容性Mux.Cool 协议指定地址为“v1.mux.cool”。即当主连接的目标地址与之匹配时则进行 Mux.Cool 方式的转发,否则按传统方式进行转发。

View File

@ -0,0 +1,5 @@
# VLESS 协议
VLESS 是一个无状态的轻量传输协议,可以作为 Xray 客户端和服务器之间的桥梁。
<Badge text="WIP" type="warning"/>

View File

@ -0,0 +1,175 @@
# VMess 协议
VMess 是一个加密传输协议,可以作为 Xray 客户端和服务器之间的桥梁。
## 版本
当前版本号为 1。
## 依赖
### 底层协议
VMess 是一个基于 TCP 的协议,所有数据使用 TCP 传输。
### 用户 ID
ID 等价于 [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier),是一个 16 字节长的随机数它的作用相当于一个令牌Token
一个 ID 形如de305d54-75b4-431b-adb2-eb6b9e546014几乎完全随机可以使用任何的 UUID 生成器来生成,比如[这个](https://www.uuidgenerator.net/)。
用户 ID 可在[配置文件](../../config)中指定。
### 函数
- MD5: [MD5 函数](https://en.wikipedia.org/wiki/MD5)
- 输入参数为任意长度的 byte 数组
- 输出为一个 16 byte 的数组
- HMAC: [HMAC 函数](https://en.wikipedia.org/wiki/Hash-based_message_authentication_code)
- 输入参数为:
- H散列函数
- K密钥任意长度的 byte 数组
- M消息任意长度的 byte 数组
- Shake: [SHA3-Shake128 函数](https://en.wikipedia.org/wiki/SHA-3)
- 输入参数为任意长度的字符串
- 输出为任意长度的字符串
## 通讯过程
VMess 是一个无状态协议,即客户端和服务器之间不需要握手即可直接传输数据,每一次数据传输对之前和之后的其它数据传输没有影响。
VMess 的客户端发起一次请求,服务器判断该请求是否来自一个合法的客户端。如验证通过,则转发该请求,并把获得的响应发回给客户端。
VMess 使用非对称格式,即客户端发出的请求和服务器端的响应使用了不同的格式。
## 客户端请求
| 16 字节 | X 字节 | 余下部分 |
| -------- | -------- | -------- |
| 认证信息 | 指令部分 | 数据部分 |
### 认证信息
认证信息是一个 16 字节的哈希hash它的计算方式如下
- H = MD5
- K = 用户 ID (16 字节)
- M = UTC 时间,精确到秒,取值为当前时间的前后 30 秒随机值(8 字节, Big Endian)
- Hash = HMAC(H, K, M)
### 指令部分
指令部分经过 AES-128-CFB 加密:
- KeyMD5(用户 ID + []byte('c48619fe-8f02-49e0-b9e9-edf763e17e21'))
- IVMD5(X + X + X + X)X = []byte(认证信息生成的时间) (8 字节, Big Endian)
| 1 字节 | 16 字节 | 16 字节 | 1 字节 | 1 字节 | 4 位 | 4 位 | 1 字节 | 1 字节 | 2 字节 | 1 字节 | N 字节 | P 字节 | 4 字节 |
| :--------: | :---------: | :----------: | :--------: | :------: | :----: | :----------: | :----: | :------: | :-------: | :--------: | :----: | :----: | :----: |
| 版本号 Ver | 数据加密 IV | 数据加密 Key | 响应认证 V | 选项 Opt | 余量 P | 加密方式 Sec | 保留 | 指令 Cmd | 端口 Port | 地址类型 T | 地址 A | 随机值 | 校验 F |
选项 Opt 细节:(当某一位为 1 时,表示该选项启用)
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: |
| X | X | X | X | X | M | R | S |
其中:
- 版本号 Ver始终为 1
- 数据加密 IV随机值
- 数据加密 Key随机值
- 响应认证 V随机值
- 选项 Opt
- S (0x01):标准格式的数据流(建议开启);
- R (0x02):客户端期待重用 TCP 连接Xray 2.23+ 弃用);
- 只有当 S 开启时,这一项才有效;
- M (0x04):开启元数据混淆(建议开启);
- 只有当 S 开启时,这一项才有效;
- 当其项开启时,客户端和服务器端需要分别构造两个 Shake 实例,分别为 RequestMask = Shake(请求数据 IV), ResponseMask = Shake(响应数据 IV)。
- X保留
- 余量 P在校验值之前加入 P 字节的随机值;
- 加密方式:指定数据部分的加密方式,可选的值有:
- 0x00AES-128-CFB
- 0x01不加密
- 0x02AES-128-GCM
- 0x03ChaCha20-Poly1305
- 指令 Cmd
- 0x01TCP 数据;
- 0x02UDP 数据;
- 端口 PortBig Endian 格式的整型端口号;
- 地址类型 T
- 0x01IPv4
- 0x02域名
- 0x03IPv6
- 地址 A
- 当 T = 0x01 时A 为 4 字节 IPv4 地址;
- 当 T = 0x02 时A 为 1 字节长度L + L 字节域名;
- 当 T = 0x03 时A 为 16 字节 IPv6 地址;
- 校验 F指令部分除 F 外所有内容的 FNV1a hash
### 数据部分
当 Opt(S) 开启时,数据部分使用此格式。实际的请求数据被分割为若干个小块,每个小块的格式如下。服务器校验完所有的小块之后,再按基本格式的方式进行转发。
| 2 字节 | L 字节 |
| :----: | :----: |
| 长度 L | 数据包 |
其中:
- 长度 LBig Endian 格式的整型,最大值为 2^14
- 当 Opt(M) 开启时L 的值 = 真实值 xor Mask。Mask = (RequestMask.NextByte() << 8) + RequestMask.NextByte()
- 数据包:由指定的加密方式加密过的数据包;
在传输结束之前,数据包中必须有实际数据,即除了长度和认证数据之外的数据。当传输结束时,客户端必须发送一个空的数据包,即 L = 0不加密 或认证数据长度(有加密),来表示传输结束。
按加密方式不同,数据包的格式如下:
- 不加密:
- L 字节:实际数据;
- AES-128-CFB整个数据部分使用 AES-128-CFB 加密
- 4 字节:实际数据的 FNV1a hash
- L - 4 字节:实际数据;
- AES-128-GCMKey 为指令部分的 KeyIV = count (2 字节) + IV (10 字节)。count 从 0 开始递增,每个数据包加 1IV 为 指令部分 IV 的第 3 至第 12 字节。
- L - 16 字节:实际数据;
- 16 字节GCM 认证信息
- ChaCha20-Poly1305Key = MD5(指令部分 Key) + MD5(MD5(指令部分 Key))IV = count (2 字节) + IV (10 字节)。count 从 0 开始递增,每个数据包加 1IV 为 指令部分 IV 的第 3 至第 12 字节。
- L - 16 字节:实际数据;
- 16 字节Poly1305 认证信息
## 服务器应答
应答头部数据使用 AES-128-CFB 加密IV 为 MD5(数据加密 IV)Key 为 MD5(数据加密 Key)。实际应答数据视加密设置不同而不同。
| 1 字节 | 1 字节 | 1 字节 | 1 字节 | M 字节 | 余下部分 |
| ---------- | -------- | -------- | ---------- | -------- | ------------ |
| 响应认证 V | 选项 Opt | 指令 Cmd | 指令长度 M | 指令内容 | 实际应答数据 |
其中:
- 响应认证 V必须和客户端请求中的响应认证 V 一致;
- 选项 Opt
- 0x01服务器端准备重用 TCP 连接Xray 2.23+ 弃用);
- 指令 Cmd
- 0x01动态端口指令
- 实际应答数据:
- 如果请求中的 Opt(S) 开启,则使用标准格式,否则使用基本格式。
- 格式均和请求数据相同。
- 当 Opt(M) 开启时,长度 L 的值 = 真实值 xor Mask。Mask = (ResponseMask.NextByte() << 8) + ResponseMask.NextByte()
### 动态端口指令
| 1 字节 | 2 字节 | 16 字节 | 2 字节 | 1 字节 | 1 字节 |
| ------ | --------- | ------- | ------- | -------- | ---------- |
| 保留 | 端口 Port | 用户 ID | AlterID | 用户等级 | 有效时间 T |
其中:
- 端口 PortBig Endian 格式的整型端口号;
- 有效时间 T分钟数
客户端在收到动态端口指令时,服务器已开放新的端口用于通信,这时客户端可以将数据发往新的端口。在 T 分钟之后,这个端口将失效,客户端必须重新使用主端口进行通信。
## 注释
- 为确保向前兼容性,所有保留字段的值必须为 0。

View File

@ -0,0 +1,51 @@
---
sidebar: auto
---
# 快速入门
> **这个章节将告诉您如何用最简单的方式获得 Xray并且开始使用 Xray。**
## 下载安装
Xray 支持各种平台,并且您可以从多种渠道和方式获得 Xray 的各种版本。
请点击 [如何下载安装 Xray](./install.md) 以获取 Xray
## 配置运行
下载并安装 Xray 后,只需对他进行配置即可使用。
请点击 [如何配置运行 Xray](./config.md) 以学习最简单的配置方式。
## 命令参数
Xray 有多种命令和参数可用,因此变得灵活和强大。
请点击 [Xray 的命令参数](./command.md) 查看 Xray 的更多命令和参数用法。
## 改进文档
如果你有兴趣,请点击 [使用文档](./document.md) 帮助我们改进文档,或者点击页面下方的 `帮助我们改善此页面!`
我们十分感谢每一位 Contributor 作出的贡献!是你们让 Project X 变得更加强大!
## 小小白白话文
给予新手指导的使用心得
请点击 [小小白白话文](./level-0/) 以进行查看。
## 入门技巧
具备了基础之后,你就可以通过 [入门技巧](./level-1/) 来探索更多的使用方式了。
## 进阶文档
给予进阶用户指导的使用技巧
点击 [进阶文档](./level-2/) 以进行查看
::: tip 感谢
非常感谢大家无私分享使用技巧和心得, 使得 Xray 日益强大。
:::

115
docs/en/document/command.md Normal file
View File

@ -0,0 +1,115 @@
# 命令参数
::: tip
Xray 使用 Go 风格的命令及参数
:::
## 获取基本命令
您可以运行 `xray help` 来获得所有 xray 最基础的用法, 以及可用的命令及说明.
```
Xray is a platform for building proxies.
Usage:
xray <command> [arguments]
The commands are:
run Run Xray with config, the default command
version Show current version of Xray
api Call an API in an Xray process
tls TLS tools
uuid Generate new UUIDs
Use "xray help <command>" for more information about a command.
```
### xray run
指定一个或多个配置文件,并运行。
使用方法:
```
xray run [-c config.json] [-confdir dir]
```
```
Run Xray with config, the default command.
The -config=file, -c=file flags set the config files for
Xray. Multiple assign is accepted.
The -confdir=dir flag sets a dir with multiple json config
The -format=json flag sets the format of config files.
Default "json".
The -test flag tells Xray to test config files only,
without launching the server
```
### xray version
输出 Xray 版本、 Golang 版本等信息。
使用方法:
```
xray version
```
### xray api
调用 Xray 的 gRPC API需要在配置文件中开启。
使用方法:
```
xray api <command> [arguments]
```
```
restartlogger Restart the logger
stats Get statistics
statsquery Query statistics
statssys Get system statistics
adi Add inbounds
ado Add outbounds
rmi Remove inbounds
rmo Remove outbounds
```
### xray tls
一些与 TLS 相关的工具。
使用方法:
```
xray tls <command> [arguments]
```
```
cert Generate TLS certificates
ping Ping the domain with TLS handshake
```
### xray uuid
生成 UUID。
使用方法:
```
xray uuid
```
::: tip
`-config`没有指定时Xray 将先后尝试从以下路径加载`config.json`:
- 工作目录Working Directory
- [环境变量](../config/features/env.md#资源文件路径)中`Xray.location.asset`所指定的路径
:::

View File

@ -0,0 +1,99 @@
# 配置运行
[下载并安装](./install) 了 Xray 之后,您需要对它进行一下配置。
为了演示,这里只介绍简单的配置方式.
如需配置更复杂的功能,请参考更详细的 [配置文件](../config/) 中相关说明。
## 服务端配置
你需要一台防火墙外的服务器,来运行服务器端的 Xray。配置如下
```json
{
"inbounds": [
{
"port": 10086, // 服务器监听端口
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811"
}
]
}
}
],
"outbounds": [
{
"protocol": "freedom"
}
]
}
```
服务器的配置中需要确保 `id` 和端口与客户端一致,就可以正常连接了。
## 客户端配置
在你的 PC或手机需要用以下配置运行 Xray
```json
{
"inbounds": [
{
"port": 1080, // SOCKS 代理端口,在浏览器中需配置代理并指向这个端口
"listen": "127.0.0.1",
"protocol": "socks",
"settings": {
"udp": true
}
}
],
"outbounds": [
{
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "server", // 服务器地址,请修改为你自己的服务器 ip 或域名
"port": 10086, // 服务器端口
"users": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811"
}
]
}
]
}
},
{
"protocol": "freedom",
"tag": "direct"
}
],
"routing": {
"domainStrategy": "IPOnDemand",
"rules": [
{
"type": "field",
"ip": ["geoip:private"],
"outboundTag": "direct"
}
]
}
}
```
上述配置唯一要更改的地方是你的服务器 IP配置中已注明。上述配置会把除局域网比如访问路由器以外的所有流量转发至你的服务器。
## 运行
- 在 Windows 和 macOS 中,配置文件通常是 Xray 同目录下的 `config.json` 文件。
- 直接运行 `Xray``Xray.exe` 即可。
- 在 Linux 中,配置文件通常位于 `/etc/xray/``/usr/local/etc/xray/` 目录下。
- 运行 `xray run -c /etc/xray/config.json`
- 或使用 systemd 等工具将 Xray 作为服务在后台运行。
更多详细的说明可以参考 [配置文档](../config/) 和 [使用心得](../documents/)。

View File

@ -0,0 +1,47 @@
# 为 Project X 的文档贡献
欢迎您为 Project X 的文档做出贡献,我们感谢每一位 Contributor 的贡献!是你们让 Xray 更加强大!
## 改进文档
Project X 的文档托管在 [GitHub](https://github.com/XTLS/Xray-docs-next) 上.
您可以通过以下步骤, 提交您对文档的改动:
1. 从 [project X 文档仓库](https://github.com/XTLS/Xray-docs-next) 打开仓库, 点击右上角的 fork, fork 一份文档仓库的镜像到您自己的 github 仓库.
2. 使用任何您喜欢的工具, 从您克隆的仓库获得文档的克隆, 如:
```
git clone https://github.com/XTLS/Xray-docs-next.git
```
3. 基于 main 分支创建新的分支, 如:
```
git checkout -b your-branch
```
4. 在新分支上做修改。
注:在修改时请注意遵循 [中文文案排版指北](https://github.com/sparanoid/chinese-copywriting-guidelines)
5. 修改完成后,请格式化您的更改。建议使用 Prettier
注:存在格式问题或不遵循中文文案排版指北的 PR将有可能被拒绝。
6. 提交修改,并推送到您的仓库中
```
git push -u origin your-branch
```
6. 打开 GitHub, 点击 'Pull request' 向 [project X 文档仓库](https://github.com/XTLS/Xray-docs-next) 提交 PR。
7. 请在 PR 的标题和正文中,概述此次 PR 新增/修改的内容等;
8. 等待回应, 如果 PR 被 merge, 您做的修改将直接呈现在 [Project X 文档网站](https://xtls.github.io)。
## 发现问题?
如果您发现文档出错,可以改进文档或提交一个 Issue。

View File

@ -0,0 +1,93 @@
# 下载安装
## 平台支持
Xray 在以下平台中可用:
- Windows 7 及之后版本x86 / amd64 / arm32
- macOS 10.10 Yosemite 及之后版本amd64
- Linux 2.6.23 及之后版本x86 / amd64 / arm / arm64 / mips64 / mips / ppc64 / s390x / riscv64
- 包括但不限于 Debian 7 / 8、Ubuntu 12.04 / 14.04 及后续版本、CentOS 7 / 8、Arch Linux 等;
- FreeBSD (x86 / amd64)
- OpenBSD (x86 / amd64)
- Dragonfly BSD (amd64)
## 下载 Xray
预编译的二进制 ZIP 格式压缩包可在 [Github Releases](https://github.com/xtls/Xray-core/releases) 中找到。
下载对应平台的压缩包,解压后即可使用。
## 验证安装包
Xray 提供两种验证方式:
- ZIP 压缩包的 SHA1 / SHA256 摘要
- 可复现构建:请参照 [编译 Xray](../development/intro/compile.md)
## Windows 安装方式
- 在 [Github Releases](https://github.com/xtls/Xray-core/releases) 下载适用于 Windows 平台的 ZIP 压缩包,解压后可得到可执行文件 `xray.exe`
,然后[通过命令行带参数运行](./command) 即可
- 通过 [Scoop](https://scoop.sh) 包管理器安装Xray 已经被添加到 [Mochi](https://github.com/Qv2ray/mochi)。
- 通过 [Chocolatey](https://chocolatey.org)
包管理器安装:[Xray](https://chocolatey.org/packages/xray/1.3.1),感谢 [Markson](https://chocolatey.org/profiles/markson_ho)
## macOS 安装方式
- 在 [Github Releases](https://github.com/xtls/Xray-core/releases) 下载适用于 macOS 平台的 ZIP 压缩包,解压后可得到可执行文件 `xray`
,然后[通过命令行带参数运行](./command.md) 即可
- 通过 [Homebrew](https://brew.sh) 包管理器安装:`brew install xray`
## Linux 安装方式
### 安装脚本
- Linux Script
- [Xray-install](https://github.com/XTLS/Xray-install)
* One Click
- [Xray-script](https://github.com/kirin10000/Xray-script)
- [ProxySU](https://github.com/proxysu/ProxySU)
- [Xray-agent](https://github.com/mack-a/Xray-agent)
* Magisk
- [Xray4Magisk](https://github.com/CerteKim/Xray4Magisk)
- [Xray_For_Magisk](https://github.com/E7KMbb/Xray_For_Magisk)
### Arch Linux
#### Arch User Repository
需要使用 [AUR helpers](https://wiki.archlinux.org/index.php/AUR_helpers),以 [yay](https://github.com/Jguer/yay)
为例,可通过 `yay -S xray` 安装。
#### Arch Linux CN
首先添加 [Arch Linux CN 仓库](https://www.archlinuxcn.org/archlinux-cn-repo-and-mirror/),然后在 root 用户下使用 `pacman -S xray` 安装。
### Linuxbrew
Linuxbrew 包管理器的使用方式与 Homebrew 一致:`brew install xray`
### Debian <Badge text="WIP" type="warning"/>
## Docker 安装方式
- [teddysun/xray](https://hub.docker.com/r/teddysun/xray)
- Xray-docker
### Docker image 的文件结构
- `/etc/xray/config.json`:配置文件
- `/usr/bin/xray`Xray 主程序
- `/usr/local/share/xray/geoip.dat`IP 数据文件
- `/usr/local/share/xray/geosite.dat`:域名数据文件
## 更多更多...
您可以点击 [传送至众多大佬集结区的任意门](../links.md) 获取更多资源
## FAQ <Badge text="WIP" type="warning"/>

View File

@ -0,0 +1,25 @@
# 小小白白话文
**这个章节是【从零开始】的基础课,新来的同学好好看好好学哦**
::: tip
Made with ❤️ by [@ricuhkaen](https://github.com/ricuhkaen)
:::
[【第 1 章】 前言罗嗦篇](./ch01-preface.md) - 机场还是自建?这是个问题
[【第 2 章】 原料准备篇](./ch02-preparation.md) - 工欲善其事,必先利其器
[【第 3 章】 远程登录篇](./ch03-ssh.md) - 一桥飞架南北,天堑变通途
[【第 4 章】 安全防护篇](./ch04-security.md) - 安全不注意,亲人两行泪
[【第 5 章】 网站建设篇](./ch05-webpage.md) - 秀出你的美
[【第 6 章】 证书管理篇](./ch06-certificates.md) - 领证的才是合法的
[【第 7 章】 Xray 服务器篇](./ch07-xray-server.md) - 终于等到你
[【第 8 章】 Xray 客户端篇](./ch08-xray-clients.md) - 新的开始
[【第 9 章】 附录](./ch09-appendix.md) - 考点都在这里

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

View File

@ -0,0 +1,96 @@
# 【第 1 章】 小小白白话文
## 1.1 这篇文档是写给谁的?
一句话:写给 **① 零基础** **② 希望学习自建 VPS** 的新人。
## 1.2 这篇文档不是写给谁的?
包括但不限于:各路大神大能、懒得自己折腾的小白、已经会折腾的高手、确定要用机场的土豪、确定要用一键脚本的逍遥派...... 总之只要有技术基础、或不愿不想自建的同学,您直接关闭本文即可,因为这篇文章大概是入不了您的法眼的,更可能会让您生一肚子闲气,那多划不来。
## 1.3 郑重声明及其他声明
郑重声明:
鄙人技术奇菜无比,故本文必然挂一漏万破绽百出。您若发现问题还请温柔提醒,莫要人参公鸡。
免责声明:
本文内容请您自行判断是否可信可靠可用,若您根据本文内容建立和使用 VPS 服务器时出了任何问题和不良结果,鄙人概不负责。
啰嗦声明:
基于本文【零基础用户】的目标受众,许多内容会尽力详尽说明,所以语言偏啰嗦,请做好心理准备。
## 1.4 为什么自建是个难题?
要回答这个问题,就需要稍微多说一点背景信息了。
一、科学上网这件事
科学上网这件事情,说来已经发展了近二十年(震惊!!!.jpg。最初自己稍微动动手即可改改 host、连一下 ssh、后来需要找一个网页代理再后来需要写一个私有协议(比如 Shadowsocks)等等。
随着 GFW 技术这十几年来不断的迭代升级,若要完成【自己动手科学上网】这个目标,需要做的事情已经包括但不限于:
- 了解 Linux 系统基本命令
- 了解网络传输协议
- 有技术和经济能力完成 VPS 购买及管理
- 有技术和经济能力完成域名购买及管理
- 有技术能力完成 TLS 证书申请 等等。
这就让【自建 VPS 科学上网】这个曾经简单的行为逐渐变成了令新人望而生畏的挑战。
二、零基础用户的无奈
零基础的非技术用户如果完成上面这一连串的操作势必要学习大量的知识但稍微搜索之后新人只怕会更加迷茫大量的信息散布在互联网的各个角落博客、问答网站、群组、论坛、GitHub、Telegram、YouTube 等等等等)。这些信息纷乱复杂、水平良莠不齐、甚至可能互相矛盾。基本上就是不把新人彻底弄晕誓不罢休。
面对这些杂乱无章的信息,新人突然就从【信息匮乏】变成了【信息过剩】。若是几番连蒙带猜的折腾以失败告终(大概率如此)的话,他的积极性势必大受挫折。在这个过程中,若他又恰好去了一些不太友好的地方去求助,恐怕还要雪上加霜的被嘲讽一番:“这么菜,用机场不就行了,瞎折腾什么啊!”、“先去学会 Linux 再回来问吧”。
这时候,大概也只有一声“呵呵”可以表达心情了。
## 1.5 “用机场不就行了?”
首先,我想反问一下那些冷嘲热讽的人:“用机场”真的就是万灵药吗?
其次,我认为“不懂”和“不想懂”是有本质区别的。态度恶劣的巨婴伸手党自然惹人厌烦,但真心自学却不得要领的人不该受到无端的白眼和歧视,也正是这种对新人不加区分的恶劣社区氛围促使我写下本文。那么闲话少说,我们来看看机场的优势与劣势究竟如何:
一、“机场“的优势
所谓“机场”,就是“线路提供商”。他负责完成 1.4 提到的那一串技术操作和管理,用户则付费获得使用权。所以,它的优点至少有:
1. **用户操作简单**:扫码操作、一键添加规则等
2. **线路选择多**:可解锁不同国家、地区的网络服务;比如 iplc 等专线服务、游戏加速服务等
3. **接入节点多**:所以抵抗节点封锁的能力强一些,封了一个就换下一个
二、“机场”的风险
“方便”这枚硬币的另一面就是“风险”,基于“机场”的技术特点和市场情况,它的风险至少有:
1. **“机场”可完全获得用户信息**:用户在网上的所有痕迹,都【必然】经过且【非常可能】长期存储在其服务器上,这些记录无法受到任何具备法律效力的用户隐私协议的约束(**窥视、记录你的一举一动**
2. **“机场”缺乏市场管理**:不可避免存在着以欺诈为目标的恶意商家(**主动跑路**
3. **“机场”面临监管压力**大机场相对有保障的同时也无法避免树大招风。2020 年间,已经有几个大机场停运、跑路的事件发生,用户的正常使用受到严重干扰(**被动跑路**
4. **“机场”技术水平难以确定**:线路质量良莠不齐,挂羊头卖狗肉的现象屡见不鲜(**速度慢、掉线多、连不上**
## 1.6 那么你到底要不要自建呢?
现在,你已经看到了机场的优势和风险,要用什么,就请各位充分思考并自行决定。毕竟,最适合你的方案才是最好的方案。
![It's Your Choice!](./ch01-img01-choice.png)
1. 如果决定使用机场的话,现在,你可以关闭本文了。
2. 如果你决定自建,那就请继续阅读后面的章节吧!!
总之,本文的目标就是成为零基础用户的知识起点,提供对每一步充分的讲解和演示,清清楚楚(甚至**婆婆妈妈、絮絮叨叨、啰啰嗦嗦**)的协助新人完成【**从输入第一条命令开始,完成 VPS 服务器部署,并成功在客户端完成科学上网**】的全程。并在这个过程中帮助新人逐步接触和熟悉 Linux 的基础操作,为之后的进一步自学打下基础。
## 1.7 题外啰嗦几句
1. 墙外的信息泥沙俱下,请务必学会理性、独立的思辨,不要随意站队,不要轻信猎奇的信息。
2. 衷心希望大家获得更顺畅的网络后,可以获取更新鲜的知识、更丰富的娱乐、接触更美好的世界、结交更多志同道合的朋友,但不要成为任何有不可告人目的之人的替罪羊。
3. 你的互联网身份依然是你的身份,绝对的匿名化是极为困难的,所以请务必遵守你个人所在地区和 IP 所在地区的相关法律法规。无论何时,自我保护都是最基本的底线。
## 1.8 你的进度
> ⬛⬜⬜⬜⬜⬜⬜⬜ 12.5%

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

View File

@ -0,0 +1,55 @@
# 【第 2 章】原料准备篇
这一章比较特殊,因为涉及到金钱交易行为,本文基于项目的中立立场,不做具体的推荐。我能做的,是告诉你需要准备哪些东西。
## 2.1 获取一台 VPS
你需要获取一台健康的、IP 没有被墙的 VPS并在管理后台做下面这些基础准备
1. 在 VPS 的后台安装 Debian 10 64bit 系统
2. 小本本记下 VPS 的 IP 地址(本文会用 `"100.200.300.400"` 来表示)
::: tip
这是一个故意写错的非法 IP请替换成你的真实 IP
:::
3. 小本本记下 VPS 的 SSH 远程登陆端口(Port)
4. 小本本记下 SSH 远程登录的用户名和密码
购买 VPS 是一个比较复杂的事情,建议先去学习一下相关知识,选择适合自己的经济能力和线路需求的即可。另外可以选择薅一些国际大厂的羊毛(比如甲骨文和谷歌提供的永久免费或限时免费的套餐)。总之,务必量力而行。
::: tip 说明
关于选择 Debian 10 作为操作系统,这里稍微多说一句:不管你在网上听说了什么,不管哪个大神告诉你 XXX 版的 Linux 更好、XXX 版的 Linux 更牛,这些 Linux 的派系之争**跟现在的你半毛钱关系也没有**!使用 Debian 10 足以让你的 VPS 服务器在安全、稳健运行的同时得到足够的优化(如 cloud 专用内核、及时的 bbr 支持等)。等你对 Linux 熟悉之后,再回头去尝试其他的 Linux 发行版也不迟。
:::
## 2.2 获取一个心仪的域名
你需要获取一个域名、并在 DNS 设置中添加一条 A 记录,指向你 VPS 的 IP 地址
1. 请选择靠谱的国际域名服务商。选择一些常见的域名后缀就行,注意不要用 `.cn` 后缀。
2. 在 DNS 设置中,添加一条指向你 VPS 的 IP 地址的 A 记录A 记录的名字可以随便起,本文会用 `"a-name"` 来表示。完整的域名则会用 `"二级域名.你的域名.com"` 或者 `"a-name.yourdomain.com"` 来表示)。效果如下图:
![添加A记录](./ch02-img01-a-name.png)
::: tip
这**不是**一个真实可用的网址,请替换成你的真实网址
:::
## 2.3 你本地电脑上需要安装的软件
1. SSH 远程登录工具
- Windows: [PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)
- macOS/Linux: Terminal
2. 远程文件拷贝工具
- Windows: [WinSCP](https://winscp.net/eng/index.php)
- macOS/Linux: Terminal
3. 靠谱的文本编辑器
- Windows/macOS/Linux: [VSCode](https://code.visualstudio.com)
## 2.4 你的进度
如果上面的原材料你都准备好了的话,你已经拿到了开启新世界大门的钥匙。那还等什么,让我们快点进入下一章,走进这扇门吧!
> ⬛⬛⬜⬜⬜⬜⬜⬜ 25%

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

View File

@ -0,0 +1,85 @@
# 【第 3 章】远程登录篇
## 3.1 远程登录 VPS (PuTTY)
首先,鉴于零基础人群中 Windows 的用户基数最大,所以本文以 Windows 为例进行展示。
其次,虽然 Windows 10 之后的 PowerShell 和 WSL 也可以达到很好的 SSH 操作体验。但是因为并非所有版本的 Windows 都有最新的组件,故本文还是以老牌的 PuTTY 为例,进行 SSH 远程登录的操作详解。(使用其他工具的话、在 SSH 登陆之后的操作都是一样的)
下面就跟我一步步操作吧。
1. 进入 PuTTY 的[官网](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html),选择适合你操作系统的版本下载。(本文以 64 位版本为例)
![下载PuTTY](./ch03-img01-putty-download.png)
2. 安装运行后,将会看到 PuTTY 的主界面。现在请拿出你上一章记东西的[小本本](./ch02-preparation.md#21-%E8%8E%B7%E5%8F%96%E4%B8%80%E5%8F%B0vps),在下图的对应位置填入你 VPS 的**IP 地址(VPS IP)**和**端口(VPS PORT)**。为了方便以后使用时不用重复输入,我们可以保存会话 (Saved Sessions),未来使用时只要按 Load 即可一键载入设置。
![设置PuTTY](./ch03-img02-putty-settings.png)
3. 我建议将 `Connection` 中的 `keepalive` 设置为 `60` 秒,防止你一段时间没有操作之后 SSH 自动断线。另外务必再次保存设置。
![防止频繁断线](./ch03-img03-putty-keepalive.png)
::: warning 注意
对 PuTTY 的任何设置更新都要再次手动保存 Session不然关闭后就会丢失
:::
4. 点击 Open 就会进入 SSH 连接窗口,对应下图输入用户名与密码,与你的 VPS 远程主机建立连接。(本文假设默认用户名是 `root`,另外,在 Linux 系统输入密码的时候,是不会出现 `******` 这种提示符的,这样可以避免密码长度泄漏,不是你的键盘坏掉了哦!)
![SSH远程登录](./ch03-img04-ssh-login.png)
## 3.2 成功登录 SSH初识命令行界面
1. 如果你的信息都填写正确,你将会看到类似下图的界面,说明已登录成功:
![初次登录VPS](./ch03-img05-ssh-login-success.png)
这个界面,就等于远程服务器的【桌面】,但它没有你熟悉的图标和鼠标,没有绚丽的色彩,有的只是简单文字,这就是【**命令行界面**】- `Command Line Interface`,或者缩写为 `CLI`
接下来的所有操作,都需要你像电影里的黑客一样,在这个命令行界面中完成。也许你会觉得陌生,但请相信我,使用命令行既不可怕,也不神秘。说到底,它只不过是把你习惯的鼠标操作变成了文字指令而已,**你说一句,它做一句**。
2. 现在,你可以稍微观察并熟悉一下命令行环境,这个界面其实已经告诉了你一些有用的信息了,比如系统内核版本(比如图内是 `4.19.37-5`)、上次登录时间及 IP 等。当然根据 VPS 的不同,你看到的界面可能会略有不同。
3. 请注意命令行最下面一行,闪动的光标左边,有一串字符。图中显示的是`root@vps-server:~#`,这一串要怎么理解呢?很简单:
- 现在的用户是 `root`
- `root` 所在的服务器是 `vps-server`
- `root` 现在所在的文件夹是 `~`
- `#` 之后是你可以输入命令的地方
前两个很直观,无需多说。第三个是关于 Linux 的文件夹系统,现在也不需要过于深入,你只需要知道,"`~`"就是【当前用户的大本营】。第四个,提示符`#`,你也不用管,只需要知道,未来文章中会写一些需要你输入的命令,都会以 "`#`" 或者 "`$`" 开头,提示你**后面**是你输入命令的地方。(所以你复制命令的时候,**只需要复制后面的内容**,不要复制提示符)
## 3.3 第一次更新 Linux 的软件!
1. 正如你的手机,无论安卓还是 iPhone为了 APP 及时更新(获取安全补丁和新功能),都会时不时从应用商店获得更新信息,并且提示你有多少个 APP 可更新。Linux 系统也有逻辑十分类似的更新机制。所以只要你会更新手机 APP就能学会更新 Linux 软件!
2. Linux 下,每个 APP 都叫做一个“包” package。管理 APP 的程序自然就叫做“包管理器”Package Manager。你可以通过它安装、更新、卸载各种软件、甚至更新 Linux 系统本身。Linux 下的包管理器非常强大,此处按下不表,现在你只需要知道 Debian 系统的包管理器叫做 `apt` 即可。接下来,我们就先使用 `apt` 做一次软件的全面更新,让你熟悉它的基本操作。
3. 小小白白 Linux 基础命令:
| 编号 | 命令名称 | 命令说明 |
| :------: | :-----------: | :----------: |
| `cmd-01` | `apt update` | 查询软件更新 |
| `cmd-02` | `apt upgrade` | 执行软件更新 |
4. 现在请输入第一条命令,获取更新信息
```shell
apt update
```
5. 然后请输入第二条命令,并在询问是否继续安装 `(Y/n)` 时输入 `y` 并回车确认,开始安装
```shell
apt upgrade
```
6. 完整流程演示如下:
![初次软件更新流程演示](./ch03-img06-apt-upgrade-full.gif)
## 3.4 你的进度
**恭喜你又迈出了坚实的一步!** 现在,你已经可以通过 SSH 来登录你的远程服务器了!那登录进去之后,除了升级软件之外,应该再做点什么呢?敬请进入下一章一探究竟吧!
> ⬛⬛⬛⬜⬜⬜⬜⬜ 37.5%

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 141 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 961 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

View File

@ -0,0 +1,329 @@
# 【第 4 章】安全防护篇
## 4.1 为什么要做安全防护
Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的网站、APP、服务、甚至线下基础设施都建立在 Linux 的基石之上,这背后牵涉到巨大的经济利益和商业价值,当然也就就意味着黑灰产有巨大的攻击动力。但是这些服务是如此重要、根本不允许出现重大的安全漏洞。于是无数的运维专业人员都在安全攻防的战场上拼搏努力,这才让大家能享受到基本稳定的现代化数字生活。
现在,你拥有了一台 VPS并且将会敞开他的数据访问渠道来达到流量转发的目标那就相当于你已经置身于安全攻防战场的第一线、直面所有风险。但与此同时新人由于知识和信息的不足看待安全问题是总是难免两极分化要么觉得轻如鸿毛和自己没有半点关系要么觉得重于泰山甚至惶惶不可终日。
- 对于前者,我的建议是:安全无小事,尽量多查一些安全方面的信息,免得自己真的受了损失才后悔莫及
- 对于后者,我的建议是:不用紧张,我们的服务器仍不具有太高的价值、一般不会吸引到高水平的攻击,需要面对的基本都是一些自动化脚本的恶意扫描和登录尝试,跟着本文做一些基础的防护即可
## 4.2 具体的风险到底是什么
就像我们在《远程登录篇》配置的一样任何人只需要知道【IP 地址】+【端口】+【用户名】+【密码】这四个要素,就能登录你的 VPS 服务器。那很显然,这四要素的安全就是我们要防护的底线。我们来逐一分析:
1. 【IP 地址】:恶意脚本会随机尝试和扫描 IP 段,可以简单认为是公开信息、无法隐藏
2. 【端口】:如果使用默认端口,那么【端口 = `22`
3. 【用户名】:如果使用默认用户,那么【用户名 = `root`
4. 【密码】:密码不存在默认值,一定是由 VPS 后台随机生成或由你自行设置的。也就是说,如果你的服务器都是默认设置,则四要素中的三个已经是已知的,那么你整个服务器的安全,就全部寄托在一串小小的密码上了。这时有几种情况:
- 如果你用了 VPS 管理后台随机生成密码,它一般包含随机的十几个大小写混杂的字母和符号,相对比较安全
- 如果你为了好记、把密码改成了类似`123456`这种超弱的密码,破解你的 VPS 服务器可谓不费吹灰之力
- 如果你为了好记、把密码改成了比较复杂、但在别的地方用过的密码,其实也并不安全。你要明白黑客手里有作弊器,比如说`密码表`,包含数万、数十万、数百万甚至更多曾经泄漏的真实密码)
5. 但你要明白,没有哪个黑客真的要坐在电脑前一次一次的尝试你的密码,全部的攻击尝试都是恶意脚本自动进行的,它会 24 小时不眠不休的工作。也许每天你酣睡之时,你的服务器都在经受着一轮又一轮的冲击。
一旦密码被成功撞破,意味着你的四要素全部被攻击者掌握,恶意脚本就会快速登录服务器、获取服务器的最高 `root` 控制权、安装部署它的恶意服务,然后就可以用你的服务器来 24 小时做各种坏事(比如挖矿、传播病毒、发送垃圾邮件、欺诈邮件、做 BT 中继、甚至暗网公众节点等等等等)。如果恶意脚本比较克制,其实可以做到相当的隐蔽性。而新人一般也不会去观察留意 VPS 的登录记录、进程变化、CPU 占用变化、流量变化等指标,你其实就很难发现自己被黑了。直到你的 VPS 服务商封禁你的账号、或者收到律师函为止。
6. 别忘了,你获得 VPS 时大概率需要使用真实的支付信息,你登录各种网站、社交平台时也会留下你的 IP 地址,这些都与你的身份有直接或者间接的关系。于是,**一旦这些坏事发生,它们就不可避免的与你产生了关联。**
## 4.3 我们要做的安全防护有哪些
基于上述分析,我们要做的,自然就是对【端口】、【用户名】、【密码】这三要素进行加强,来降低被攻破的风险:
1. 【端口】:将 SSH 远程登录端口修改为【非 22 端口】 4.4
2. 【用户名】:建立【非 root】的新用户、并禁用 root 用户 SSH 远程登录 4.5、4.6
3. 【密码】SSH 启用 RSA 密钥验证登录、同时禁用密码验证登录 4.7
记得按顺序来,别把自己锁在门外了。
## 4.4 将 SSH 远程登录端口修改为非 22 端口
现在,我们来解决【端口 = `22`】的问题。(注意:有些 VPS 服务商,默认的端口已经是非 22 端口,那么你可以忽略这一步,当然也可以跟着本文改成别的端口)
1. 小小白白 Linux 基础命令:
| 编号 | 命令名称 | 命令说明 |
| :------: | :-----------------: | :----------: |
| `cmd-03` | `nano` | 文本编辑器 |
| `cmd-04` | `systemctl restart` | 重启某个服务 |
2. 小小白白 Linux 基础配置文件
| 编号 | 配置文件位置 | 文件说明 |
| :-------: | :--------------------: | :------------------: |
| `conf-01` | `/etc/ssh/sshd_config` | SSH 远程登录程序设置 |
3. 我们要做的第一件事,当然就是【用`nano`这个文本编辑器打开`SSH远程登录程序设置`】,在 Windows 下,你会【找到文件并双击】,在 Linux 下该怎么办呢?仔细看看上面的命令说明,是不是就很简单了?没错,就是:
```shell
nano /etc/ssh/sshd_config
```
4. 文件打开后,你就进入了`nano`的界面,稍微观察一下,你会发现,它把重要的快捷键都显示在屏幕下方了(下图红框内),直接开卷考试、不用死记硬背,是不是很贴心呢?
![nano的界面](./ch04-img01-nano-ui.png)
5) 我们要做的第二件事,是【在打开的文件中找到`Port`这一项并修改它的端口】。Port 后面的数字就是 SSH 的端口,一般建议把它改成一个大于`1024`小于`65535`的整数(本文以`9753`为例)。请结合`nano`的快捷键,想一下该怎么操作呢?果然,你又说对了!就是:
- 使用 `ctrl+w` 进入搜索模式,然后输入 `Port 22` 并回车
- 删除 `22` 并改成 `9753`
- 说明:如果这一行开头有个`#`,证明这一行【不生效】(被注释掉了),你可像我一样在文件最后写一个不带`#`的,或者把`#`删掉就好。
::: warning
本文以`9753`为例,就意味着随着本文的发布,这个端口会变成一个不大不小的特征,也许会被攻击者优先尝试、也许被 GFW 干扰、阻断。所以我强烈建议你用一个自己想到的其他端口,毕竟,你有 6 万多个端口可以自由选择。
:::
6. 我们要做的第三件事,是【保存文件并退出】
- 如果第 3 步你有仔细观察,就会发现保存并不是常见的 `ctrl+s`
- 正确的快捷键:保存是 `ctrl+o` + `回车`,退出是 `ctrl+x`
7. 我们最后要做的事,是【重启 ssh 服务,使变更生效】
```shell
systemctl restart ssh
```
8. 完整流程演示如下:
![修改非22端口演示](./ch04-img02-sshd-conf-full.gif)
9. 修改 PuTTY 配置
现在新的端口已经生效,下次使用 PuTTY 登录时就要用`9753`了。所以现在请到 PuTTY 的设置中修改端口号码,然后保存 Session。嗯你应该知道去哪里改了吧如果不知道的话要重读前面的内容了哦
## 4.5 建立非 root 的新用户
第二步,我们来解决【用户名 = `root`】的问题。
首先你要理解, Linux 系统中的`root`,不仅仅是一个管理员账号那么简单。它是整个系统的【根基】、是系统的主宰、至高无上的神。一旦`root`账号出现安全问题,整个系统都只能任人鱼肉、无处可逃。那么就跟随我进行操作吧:
1. 小小白白 Linux 基础命令:
| 编号 | 命令名称 | 命令说明 |
| :------: | :-----------: | :--------------------------: |
| `cmd-05` | `adduser` | 给系统新增用户 |
| `cmd-06` | `apt install` | 安装某个软件 |
| `cmd-07` | `visudo` | 修改 sudo 权限设置专用编辑器 |
2. 我们要做的第一件事,是【新增一个用户并设定登录密码】,名字你可以随便起,我这里以`vpsadmin`为例:
```shell
adduser vpsadmin
```
执行命令后,根据提示操作即可。请务必设置一个用户密码(别忘记设置密码时你时看不到 `******` 的)。之后系统会询问你一些用户的附加信息,这些就可以无视,一路回车即可。
![建立新用户](./ch04-img03-adduser.png)
::: warning
本文以`vpsadmin`为例,就意味着随着本文的发布,这个用户名也会变成一个不大不小的特征,也许会被攻击者优先尝试。所以和端口一样,我强烈建议你用一个自己想到的其他用户名。
:::
3. 完整流程演示如下:
![建立新用户](./ch04-img04-adduser-full.gif)
4. 我们要做的第二件事,是【安装`sudo`功能】(`sudo` 就是在关键时刻,让普通账户临时获得 `root` 的神力,战力全开拯救世界)
```shell
apt update && apt install sudo
```
聪明的你大概已经发现,这一行命令其实是两个命令。前一半 `apt update` 你之前已经见过并且用过了,是去服务器刷新软件版本信息。后面的 `apt install`
就是这一次要用到的【安装命令】。两条连接在一起,就是让系统去【刷新可用的最新软件,然后安装最新版的`sudo`程序】。 `&&` 则是把两个命令连起来执行的意思。
5. 我们要做的第三件事,是【把`vpsadmin`用户加入`sudo`名单里,让他有资格借用`root`的神力】
```shell
visudo
```
`User Privilege Specification` 下加入一行 `vpsadmin ALL=(ALL) NOPASSWD: ALL` 即可。
::: warning
我要特别说明的是`NOPASSWD`这个设置,它的意思是`vpsadmin`用户临时使用`root`权限时,不用额外输入密码。**这与一般的安全建议相反**。我之所以如此推荐,是因为很多新人不顾危险坚持使用`root`账号就是因为用`root`时不用重复输入密码、觉得轻松。“两害相权取其轻”,我认为【直接用`root`用户的风险】大于【使用`sudo`
时不用输密码的风险】,所以做了以上的建议。
如果你希望遵守传统习惯、每次使用`sudo`时需要输入密码,那么这一行改成 `vpsadmin ALL=(ALL:ALL) ALL` 即可。
:::
6. 完整流程演示如下:
![建立新用户](./ch04-img05-sudo-full.gif)
## 4.6 禁用 root 用户 SSH 远程登录
1. 现在你已经逐渐熟悉 Linux 了,所以这次换你思考,我们要做的第一件事是什么呢?没错,还是【用`nano`编辑器打开`SSH远程登录程序设置`】,什么,你想不起来怎么操作了?那去复习一下上面的内容再回来吧!............ 正确答案:
```shell
nano /etc/ssh/sshd_config
```
2. 找到`PermitRootLogin Yes`这一项,然后把它后面的设定值改为`no`即可。还记得怎么操作吗?............ 正确答案:
- 使用 `ctrl+w` 进入搜索模式,然后输入 `PermitRootLogin` 并回车
- 删除 `yes` 并改成 `no`
3. 保存文件并退出。还记得怎么操作吗?............ 正确答案:
- 保存是 `ctrl+o`,然后 `回车` 确认
- 退出是 `ctrl+x`
4. 重启 ssh 服务,让变更生效。还记得............ 算了直接公布正确答案:
```shell
systemctl restart ssh
```
5. 完整流程演示如下:
![禁用root用户SSH远程登录](./ch04-img06-ssh-no-root-full.gif)
6. 下次通过 PuTTY 远程 SSH 登录的时候,`root`用户已无法连接,用户名就要换成`vpsadmin`了!方便起见,我们可以在 PuTTY 中把`vpsadmin`设置成默认登录用户名。(啰嗦君:别忘了保存 Session
![PuTTY设置默认用户名](./ch04-img07-putty-default-user.png)
## 4.7 使用 RSA 密钥登录并禁用密码登录
第三步,我们来解决【密码】可能被撞破的问题。
前面我说过,黑客并不是很蠢的用穷举法破解你的密码,而是会用一些比如“密码表”的作弊手段。除非你用的是随机生成的超长密码(比如借助 1Password或者 macOS 的 keychain 等密码管理工具),否则很容易中招。
超长随机密码虽然安全性有所提高,但是基本上无法记忆,手动输入也十分麻烦易错。为了解决这个困境,我们可以直接弃用【密码验证】方式,改用更安全的【密钥验证】。
所谓的【密钥验证】,就是生成【一对】相关联的密钥文件(公钥和私钥),然后把【公钥】上传到 VPS 备用。每次登录时SSH 会将【公钥】和【私钥】进行匹配,若验证是正确的【密钥对】,则验证通过。(换言之,你无需记忆和输入复杂的密码,只要保护好【私钥】这个文件不外泄即可)
::: warning
本文以 `RSA` 密钥举例,是因为 `RSA` 密钥在各种设备、各种 `SSH` 客户端中有广泛悠久的支持历史,且目前依然能提供够用的安全性。但它绝非唯一选择。
其他的常见密钥还有:
- `DSA` - 已经从数学层面被证明不安全,所以永远不要用它
- `ECDSA` - 密钥小安全性高,但其算法被指留有 NSA 的后门,如果你的 VPS 上有值得 NSA 关注的东西就不要用它
- `Ed25519` - 这是一个与 `ECDSA` 十分类似的算法,故具有相似的性能优势。同时其文档全部公开,所以普遍认为无后门
所以,如果你的设备和软件都支持的话,我建议优先选择 `Ed25519` 密钥。
:::
那我们现在就来配置【密钥验证】吧!
1. 运行`PuTTYgen` (PuTTY 密钥生成器)。位置是 `开始菜单` --> `所有程序` --> `PuTTY (64-bit)` --> `PuTTYgen`
1. 点击`Generate`开始生成(在界面空白处乱晃鼠标增加随机数)
![生成密钥](./ch04-img08-puttygen-save.png)
::: warning
本图中是以 `2048` 位的 `RSA` 密钥为例的。但实际上,如果要获得与 `EDCSA/Ed25519``256` 位密钥相同的安全性,你需要使用 `3072` 位的 `RSA` 密钥。(即右下角的数字改成 `3072`
:::
2. 你可以给私钥设置密码,增加一层安全性
3. 点击 `Save public key` 保存公钥,文件名为 `id_rsa.pub`
4. 点击 `Save private key` 保存私钥,文件名为 `id_rsa` (PuTTY 私钥自带`.ppk`后缀)
5. 最重要的,将上方红框内的内容,向下滚动全部复制出来并保存,文件名为 `authorized_keys`。(用 vscode 保存,默认会变成带`txt`后缀的文本文件,这没关系,之后上传 VPS 时我们会把后缀名去掉)
![保存密钥](./ch04-img09-puttygen-save-keys.png)
2. 将公钥上传至 VPS 的`vpsadmin`用户下
1. 这一步就需要用到之前准备的`WinSCP`了。
2. 去[官网](https://winscp.net/eng/index.php)下载并安装,会提示你导入 PuTTY 的设置,当然一键导入啦!
![一键导入Session](./ch04-img10-winscp-import-session.png)
3. 如果没有提示导入或者你已经提前安装好了,那按照下图进行配置即可
![WinSCP登录设置](./ch04-img11-winscp-ui.png)
4. WinSCP 左边的目录就是本地电脑上的文件夹和文件,请定位到密钥所在的文件夹
5. WinSCP 右边的目录则是 VPS 服务器上的文件夹和文件,默认就在 `/home/vpsadmin/` 文件夹,此时在请点击右下角 `X hidden` 来显示隐藏文件
![本地和远程文件夹](./ch04-img12-winscp-locations.png)
6. 在右边VPS 中)点击右键并新建文件夹,起名`.ssh` (注意有一个`.`
![在VPS中建立放置公钥的文件夹](./ch04-img13-winscp-newfolder-key.png)
7. 将【公钥】`authorized_keys`上传到`.ssh`文件夹内
![上传authorized_keys](./ch04-img14-winscp-upload-key.png)
8. 在上传时,将【公钥】从 `authorized_keys.txt` 改名为 `authorized_keys`(去掉`.txt`这个后缀名)
![确保没有任何后缀](./ch04-img15-winscp-rename-key.png)
9. 完整流程演示如下:
![WinSCP操作完整演示](./ch04-img16-winscp-full.gif)
3. 在 VPS 端设置 SSH 启用 RSA 密钥验证登录、同时禁用密码验证登录
1. 小小白白 Linux 基础命令:
| 编号 | 命令名称 | 命令说明 |
|:--:|:--:|:--:|
| `cmd-08` | `sudo` | 用`root`权限运行某个命令 |
| `cmd-09` | `chmod` | 修改目标文件/文件夹的权限 |
2. SSH 远程连接到 VPS 上PuTTY
3. 修改 `authorized_keys` 文件权限为 `600` (仅所有者可读可写)
```shell
chmod 600 ~/.ssh/authorized_keys
```
4. 修改 SSH 配置。这个我们已经用了很多次,但现在我们已经从无所不能的`root`变成了普通用户`vpsadmin`,此时的我们是没有权限直接编辑 SSH 配置的。这时候就需要使用`sudo`命令了:
```shell
sudo nano /etc/ssh/sshd_config
```
5. 找到(`ctrl+w`) `PasswordAuthentication` 改成 `no`
6. 找到(`ctrl+w`) `PubkeyAuthentication` 改成 `yes`,然后保存(`ctrl+o`)退出(`ctrl+x`)
7. 重启 SSH 服务。(啰嗦君:别忘了现在需要使用`sudo`来获得权限)
```shell
sudo systemctl restart ssh
```
8. 完整流程如下:
![SSH开启密钥验证并禁用密码验证](./ch04-img17-rsa-login-full.gif)
4. VPS 端已经设置好了公钥,现在要给 PuTTY 指定私钥位置供登录时使用(啰嗦君:别忘了保存 Session
![PuTTY指定私钥位置](./ch04-img18-putty-privatekey-location.png)
5. 至此,【密钥登录】已成功开启、【密码验证】已成功关闭、并且还给 PuTTY 保存了默认的登录用户名和私钥。未来使用 PuTTY 登录时,载入`VPS-SERVER`配置后,点击`Open`就可以一键登录了。
如果你给私钥设置了密码保护,登录时当然还需要输入这个密码才能使用密钥,如下图:
![输入私钥密码](./ch04-img19-putty-privatekey-passphrase.png)
6. 别忘了给`WinSCP`也做对应的密钥设置,否则之后想要传输文件时就无法登录了:
![WinSCP指定私钥位置](./ch04-img20-winscp-privatekey-location.png)
::: warning
任何需要借助 SSH 进行登录的软件都需要密钥验证了,软件过多,无法逐一展示,请根据你的需要自行设置好哦
:::
## 4.8 你的进度
到这里为止,你的 VPS 已经完成了【端口】、【用户名】、【密码】这三要素的基本安全保障,虽然远称不上固若金汤,但一般的恶意脚本应该已经无法对你造成伤害了!
现在我们终于有了一个安全的系统基础,下一章,我们就可以开始逐步安装配置 Xray 需要的基础设施了!(什么基础设施呢?一个网页,一张证书)
> ⬛⬛⬛⬛⬜⬜⬜⬜ 50%

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 KiB

View File

@ -0,0 +1,162 @@
# 【第 5 章】网站建设篇
## 5.1 为什么要做一个网站?
新人也许会迷惑,为什么科学上网还要建一个网站?我不会编程啊,是不是特别麻烦?
先回答第一个问题,建网站的原因有:
1. 申请合法的 TLS 证书(非常重要)
2. 提供合理的回落,防止主动探测攻击,提高安全性
3. 建设一个伪装站(如博客、私人网盘、多媒体网站、游戏网站等),直接访问时有合理的前台,使流量使用看上去更合理。
再回答第二个问题:
1. 本文作为演示,仅仅使用了一个最简单的【单文件 html 页面 + Nginx】来搭建以此完成上面的目标所以【非常简单】
2. 这个网站完全可以不仅仅是伪装,而是真的做大做强,这个复杂性就完全取决于你了
3. 对于“伪装”和“网站运营”这个目标,需要的就是各不相同、秀出真我,需要的同学可以自行搜索学习。这个内容已经完全偏离了科学上网,本文就不深入解析了。
## 5.2 登录 VPS、安装运行 Nginx
1. 这里用到的,都是之前已经详解过的命令,所以就不重复讲解了。看不懂的同学可以看看前面的章节哦。
```shell
sudo apt update && sudo apt install nginx
```
2. 完成后Nginx 已经自动运行。此时打开 Windows 上的浏览器并输入 `http://100.200.300.400:80`,若看到下图的界面就说明 Nginx 已经正常在运行了。
![Nginx默认界面](./ch05-img01-nginx-default-running.png)
## 5.3 创建一个最简单的网页
1. 小小白白 Linux 基础命令:
| 编号 | 命令名称 | 命令说明 |
|:--:|:--:|:--:|
| `cmd-10` | `mkdir` | 新建文件夹 |
| `cmd-11` | `systemctl reload` | 重新加载某个服务 |
2. 小小白白 Linux 基础配置文件:
| 编号 | 配置文件位置 | 文件说明 |
|:--:|:--:|:--:|
| `conf-02` | `/etc/nginx/nginx.conf` | Nginx 程序设置 |
3. 创建一个网站专用的文件夹`/home/vpsadmin/www/webpage/`并建立网页文件`index.html`
```shell
mkdir -p ~/www/webpage/ && nano ~/www/webpage/index.html
```
::: warning
如果你用的不是 `vpsadmin` 这个用户名,请务必理解这条命令中 `“~”` 符号的意义(这关系到【第 5 步】你要写的内容):
- 如果是 【非 `root` 用户】,`“~”` 就等价于 `/home/用户名`
- 如果是 【 `root` 用户】,`“~”` 就等价于 `/root`
:::
4. 把下面的内容完整的复制进去,然后保存(`ctrl+o`)退出(`ctrl+x`)
```html
<html lang="">
<!-- Text between angle brackets is an HTML tag and is not displayed.
Most tags, such as the HTML and /HTML tags that surround the contents of
a page, come in pairs; some tags, like HR, for a horizontal rule, stand
alone. Comments, such as the text you're reading, are not displayed when
the Web page is shown. The information between the HEAD and /HEAD tags is
not displayed. The information between the BODY and /BODY tags is displayed.-->
<head>
<title>Enter a title, displayed at the top of the window.</title>
</head>
<!-- The information between the BODY and /BODY tags is displayed.-->
<body>
<h1>Enter the main heading, usually the same as the title.</h1>
<p>Be <b>bold</b> in stating your key points. Put them in a list:</p>
<ul>
<li>The first item in your list</li>
<li>The second item; <i>italicize</i> key words</li>
</ul>
<p>Improve your image by including an image.</p>
<p>
<img src="https://i.imgur.com/SEBww.jpg" alt="A Great HTML Resource" />
</p>
<p>
Add a link to your favorite
<a href="https://www.dummies.com/">Web site</a>. Break up your page
with a horizontal rule or two.
</p>
<hr />
<p>
Finally, link to <a href="page2.html">another page</a> in your own Web
site.
</p>
<!-- And add a copyright notice.-->
<p>&#169; Wiley Publishing, 2011</p>
</body>
</html>
```
5. 修改 `nginx.conf` 并重启 `Nginx` 服务,将`80`端口的 http 访问定位到刚才建立的 `html` 页面上
1. 修改 `nginx.conf`
```shell
sudo nano /etc/nginx/nginx.conf
```
2. 将下面一段,添加在 `http{}` 内,然后保存(`ctrl+o`)退出(`ctrl+x`)。(记得将域名替换为之前准备好的、包含二级域名的真实域名)
```
server {
listen 80;
server_name 二级域名.你的域名.com;
root /home/vpsadmin/www/webpage;
index index.html;
}
```
::: warning 特别注意!
如我在【第 3 步】中的提示所说,请务必确保 `/home/vpsadmin/www/webpage` 改成你的实际文件路径。
:::
3. 让 `nginx` 重新载入配置使其生效
```shell
sudo systemctl reload nginx
```
4. 完整的设置流程如下:
![网页设置演示](./ch05-img02-nginx-conf-full.gif)
5. 此时如果你访问 `http://二级域名.你的域名.com`,你看到这样的页面则说明成功:
![http网页成功](./ch05-img03-nginx-http-running.png)
## 5.4 常见错误的说明
首先,如果你一路按照文章的说明来操作,并且足够细心,那肯定不会出错。所以,我并不打算修改本文的写法。
那为什么依然有很多同学卡在了这一步,网页怎么也打不开呢?基本上就是两个字:**粗心**。因为这里配置可能出现的问题只有两种,原因也只有两个。
一、两种问题:
- `nginx.conf` 里面的 `/home/vpsadmin/www/webpage` 这一条,与你的实际文件路径不符,`nginx` 找不到文件
- 路径正确,但 `nginx` 无权读取
二、两个原因:
- 使用了【非 `root` 用户】,但仍然直接拷贝文中的命令不加修改。(这基本就等于抄答案时把同学的名字一起抄过去了)
- 坚持使用【 `root` 用户】
碰到错误的同学就回过头仔细看一下【5.3】中【第 3 步】和【第 5-2 步】的说明吧。
::: warning
本文前期已经用了大量篇幅说明了使用【非 `root` 用户】对安全的重要性,全文也是基于此而写。所以,因使用【 `root` 用户】而导致的问题并不在本文的设计范围里。
但我相信,坚持使用【 `root` 用户】的同学应该是有主见、动手能力强、或者有一定 Linux 基础的同学。问题的症结我已经全部说明了,我相信你一定可以自行解决。
:::
## 5.5 你的进度
至此Xray 的第一个基础设施【网页】已经就位,我们马上就进入第二个基础设施【证书】吧!
> ⬛⬛⬛⬛⬛⬜⬜⬜ 62.5%

Some files were not shown because too many files have changed in this diff Show More