mirror of
https://github.com/XTLS/Xray-docs-next.git
synced 2025-08-22 11:28:34 +00:00
Try fix prettier format
This commit is contained in:
parent
ab2f511011
commit
f9761b7b84
@ -4,22 +4,22 @@ import { webpackBundler } from "@vuepress/bundler-webpack";
|
||||
import { UserConfig, defineUserConfig } from "vuepress/cli";
|
||||
import { searchPlugin } from "@vuepress/plugin-search";
|
||||
import markdownItFootnote from "markdown-it-footnote";
|
||||
import theme from './theme.js'
|
||||
import { registerComponentsPlugin } from '@vuepress/plugin-register-components'
|
||||
import process from 'node:process'
|
||||
import theme from "./theme.js";
|
||||
import { registerComponentsPlugin } from "@vuepress/plugin-register-components";
|
||||
import process from "node:process";
|
||||
// import { getDirname, path } from '@vuepress/utils'
|
||||
import { getDirname, path } from 'vuepress/utils'
|
||||
import { MermaidPlugin } from './plugins/mermaid/node/mermaid'
|
||||
import { getDirname, path } from "vuepress/utils";
|
||||
import { MermaidPlugin } from "./plugins/mermaid/node/mermaid";
|
||||
import i18nPlugin from "vuepress-plugin-i18n";
|
||||
|
||||
const __dirname = getDirname(import.meta.url)
|
||||
console.log('>>> __dirname -> ', __dirname)
|
||||
const __dirname = getDirname(import.meta.url);
|
||||
console.log(">>> __dirname -> ", __dirname);
|
||||
const isProduction = process.env.NODE_ENV === "production";
|
||||
const useVite = process.env.XRAY_DOCS_USE_VITE === "true";
|
||||
|
||||
console.log(
|
||||
"bundler:",
|
||||
isProduction && !useVite ? "@vuepress/webpack" : "@vuepress/vite"
|
||||
isProduction && !useVite ? "@vuepress/webpack" : "@vuepress/vite",
|
||||
);
|
||||
|
||||
export default defineUserConfig(<UserConfig>{
|
||||
@ -31,13 +31,13 @@ export default defineUserConfig(<UserConfig>{
|
||||
en: {
|
||||
lang: "en-US",
|
||||
untranslated: {
|
||||
title: "Untranslated"
|
||||
title: "Untranslated",
|
||||
},
|
||||
outdated: {
|
||||
title: "Outdated"
|
||||
}
|
||||
}
|
||||
}
|
||||
title: "Outdated",
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
searchPlugin({
|
||||
locales: {
|
||||
@ -47,7 +47,7 @@ export default defineUserConfig(<UserConfig>{
|
||||
},
|
||||
}),
|
||||
registerComponentsPlugin({
|
||||
componentsDir: path.resolve(__dirname, './theme/components'),
|
||||
componentsDir: path.resolve(__dirname, "./theme/components"),
|
||||
}),
|
||||
],
|
||||
base: "/",
|
||||
|
@ -1,3 +1,3 @@
|
||||
// export * from './head'
|
||||
export * from './navbar/index.js'
|
||||
export * from './sidebar/index.js'
|
||||
export * from "./navbar/index.js";
|
||||
export * from "./sidebar/index.js";
|
||||
|
@ -1,10 +1,10 @@
|
||||
import { NavbarConfig } from '@vuepress/theme-default'
|
||||
import { NavbarConfig } from "@vuepress/theme-default";
|
||||
|
||||
// TODO: translation
|
||||
export const navbarEn: NavbarConfig = [
|
||||
{ text: 'Homepage', link: '/en' },
|
||||
{ text: 'The Great Chronicles', link: '/en/about/news.md' },
|
||||
{ text: 'Config Reference', link: '/en/config/' },
|
||||
{ text: 'Developer Guide', link: '/en/development/' },
|
||||
{ text: 'Quick Start', link: '/en/document/' },
|
||||
]
|
||||
{ text: "Homepage", link: "/en" },
|
||||
{ text: "The Great Chronicles", link: "/en/about/news.md" },
|
||||
{ text: "Config Reference", link: "/en/config/" },
|
||||
{ text: "Developer Guide", link: "/en/development/" },
|
||||
{ text: "Quick Start", link: "/en/document/" },
|
||||
];
|
||||
|
@ -1,3 +1,3 @@
|
||||
export * from './en.js'
|
||||
export * from './zh.js'
|
||||
export * from './ru.js'
|
||||
export * from "./en.js";
|
||||
export * from "./zh.js";
|
||||
export * from "./ru.js";
|
||||
|
@ -1,9 +1,9 @@
|
||||
import { NavbarConfig } from '@vuepress/theme-default'
|
||||
import { NavbarConfig } from "@vuepress/theme-default";
|
||||
|
||||
export const navbarRu: NavbarConfig = [
|
||||
{ text: 'Главная', link: '/ru' },
|
||||
{ text: 'История сайта', link: '/ru/about/news.md' },
|
||||
{ text: 'Справочник по конфигурации', link: '/ru/config/' },
|
||||
{ text: 'Руководство разработчика', link: '/ru/development/' },
|
||||
{ text: 'Быстрый старт', link: '/ru/document/' },
|
||||
]
|
||||
{ text: "Главная", link: "/ru" },
|
||||
{ text: "История сайта", link: "/ru/about/news.md" },
|
||||
{ text: "Справочник по конфигурации", link: "/ru/config/" },
|
||||
{ text: "Руководство разработчика", link: "/ru/development/" },
|
||||
{ text: "Быстрый старт", link: "/ru/document/" },
|
||||
];
|
||||
|
@ -1,9 +1,9 @@
|
||||
import { NavbarConfig } from '@vuepress/theme-default'
|
||||
import { NavbarConfig } from "@vuepress/theme-default";
|
||||
|
||||
export const navbarZh: NavbarConfig = [
|
||||
{ text: '首页', link: '/' },
|
||||
{ text: '大史记', link: '/about/news.md' },
|
||||
{ text: '配置指南', link: '/config/' },
|
||||
{ text: '开发指南', link: '/development/' },
|
||||
{ text: '使用指南', link: '/document/' },
|
||||
]
|
||||
{ text: "首页", link: "/" },
|
||||
{ text: "大史记", link: "/about/news.md" },
|
||||
{ text: "配置指南", link: "/config/" },
|
||||
{ text: "开发指南", link: "/development/" },
|
||||
{ text: "使用指南", link: "/document/" },
|
||||
];
|
||||
|
@ -1,147 +1,147 @@
|
||||
import type { SidebarConfig } from '@vuepress/theme-default'
|
||||
import type { SidebarConfig } from "@vuepress/theme-default";
|
||||
|
||||
export const sidebarEn: SidebarConfig = {
|
||||
'/en/config/': [
|
||||
"/en/config/": [
|
||||
{
|
||||
text: 'feature',
|
||||
text: "feature",
|
||||
children: [
|
||||
'/en/config/features/xtls.md',
|
||||
'/en/config/features/fallback.md',
|
||||
'/en/config/features/browser_dialer.md',
|
||||
'/en/config/features/env.md',
|
||||
'/en/config/features/multiple.md',
|
||||
"/en/config/features/xtls.md",
|
||||
"/en/config/features/fallback.md",
|
||||
"/en/config/features/browser_dialer.md",
|
||||
"/en/config/features/env.md",
|
||||
"/en/config/features/multiple.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'config',
|
||||
text: "config",
|
||||
children: [
|
||||
'/en/config/README.md',
|
||||
'/en/config/log.md',
|
||||
'/en/config/api.md',
|
||||
'/en/config/dns.md',
|
||||
'/en/config/fakedns.md',
|
||||
'/en/config/inbound.md',
|
||||
'/en/config/outbound.md',
|
||||
'/en/config/policy.md',
|
||||
'/en/config/reverse.md',
|
||||
'/en/config/routing.md',
|
||||
'/en/config/stats.md',
|
||||
'/en/config/transport.md',
|
||||
'/en/config/metrics.md',
|
||||
'/en/config/observatory.md',
|
||||
"/en/config/README.md",
|
||||
"/en/config/log.md",
|
||||
"/en/config/api.md",
|
||||
"/en/config/dns.md",
|
||||
"/en/config/fakedns.md",
|
||||
"/en/config/inbound.md",
|
||||
"/en/config/outbound.md",
|
||||
"/en/config/policy.md",
|
||||
"/en/config/reverse.md",
|
||||
"/en/config/routing.md",
|
||||
"/en/config/stats.md",
|
||||
"/en/config/transport.md",
|
||||
"/en/config/metrics.md",
|
||||
"/en/config/observatory.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'inbound',
|
||||
text: "inbound",
|
||||
children: [
|
||||
'/en/config/inbounds/dokodemo.md',
|
||||
'/en/config/inbounds/http.md',
|
||||
'/en/config/inbounds/shadowsocks.md',
|
||||
'/en/config/inbounds/socks.md',
|
||||
'/en/config/inbounds/trojan.md',
|
||||
'/en/config/inbounds/vless.md',
|
||||
'/en/config/inbounds/vmess.md',
|
||||
'/en/config/inbounds/wireguard.md',
|
||||
"/en/config/inbounds/dokodemo.md",
|
||||
"/en/config/inbounds/http.md",
|
||||
"/en/config/inbounds/shadowsocks.md",
|
||||
"/en/config/inbounds/socks.md",
|
||||
"/en/config/inbounds/trojan.md",
|
||||
"/en/config/inbounds/vless.md",
|
||||
"/en/config/inbounds/vmess.md",
|
||||
"/en/config/inbounds/wireguard.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'outbound',
|
||||
text: "outbound",
|
||||
children: [
|
||||
'/en/config/outbounds/blackhole.md',
|
||||
'/en/config/outbounds/dns.md',
|
||||
'/en/config/outbounds/freedom.md',
|
||||
'/en/config/outbounds/http.md',
|
||||
'/en/config/outbounds/loopback.md',
|
||||
'/en/config/outbounds/shadowsocks.md',
|
||||
'/en/config/outbounds/socks.md',
|
||||
'/en/config/outbounds/trojan.md',
|
||||
'/en/config/outbounds/vless.md',
|
||||
'/en/config/outbounds/vmess.md',
|
||||
'/en/config/outbounds/wireguard.md',
|
||||
"/en/config/outbounds/blackhole.md",
|
||||
"/en/config/outbounds/dns.md",
|
||||
"/en/config/outbounds/freedom.md",
|
||||
"/en/config/outbounds/http.md",
|
||||
"/en/config/outbounds/loopback.md",
|
||||
"/en/config/outbounds/shadowsocks.md",
|
||||
"/en/config/outbounds/socks.md",
|
||||
"/en/config/outbounds/trojan.md",
|
||||
"/en/config/outbounds/vless.md",
|
||||
"/en/config/outbounds/vmess.md",
|
||||
"/en/config/outbounds/wireguard.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'transport',
|
||||
text: "transport",
|
||||
children: [
|
||||
'/en/config/transports/raw.md',
|
||||
'/en/config/transports/xhttp.md',
|
||||
'/en/config/transports/mkcp.md',
|
||||
'/en/config/transports/grpc.md',
|
||||
'/en/config/transports/websocket.md',
|
||||
'/en/config/transports/httpupgrade.md',
|
||||
"/en/config/transports/raw.md",
|
||||
"/en/config/transports/xhttp.md",
|
||||
"/en/config/transports/mkcp.md",
|
||||
"/en/config/transports/grpc.md",
|
||||
"/en/config/transports/websocket.md",
|
||||
"/en/config/transports/httpupgrade.md",
|
||||
],
|
||||
},
|
||||
],
|
||||
'/en/document/': [
|
||||
"/en/document/": [
|
||||
{
|
||||
text: 'Quick Start',
|
||||
text: "Quick Start",
|
||||
children: [
|
||||
'/en/document/README.md',
|
||||
'/en/document/install.md',
|
||||
'/en/document/config.md',
|
||||
'/en/document/command.md',
|
||||
'/en/document/document.md',
|
||||
]
|
||||
},
|
||||
{
|
||||
text: 'Beginner Tutorial',
|
||||
children: [
|
||||
'/en/document/level-0/README.md',
|
||||
'/en/document/level-0/ch01-preface.md',
|
||||
'/en/document/level-0/ch02-preparation.md',
|
||||
'/en/document/level-0/ch03-ssh.md',
|
||||
'/en/document/level-0/ch04-security.md',
|
||||
'/en/document/level-0/ch05-webpage.md',
|
||||
'/en/document/level-0/ch06-certificates.md',
|
||||
'/en/document/level-0/ch07-xray-server.md',
|
||||
'/en/document/level-0/ch08-xray-clients.md',
|
||||
'/en/document/level-0/ch09-appendix.md',
|
||||
]
|
||||
},
|
||||
{
|
||||
text: 'Getting Started Tips',
|
||||
children: [
|
||||
'/en/document/level-1/README.md',
|
||||
'/en/document/level-1/fallbacks-lv1.md',
|
||||
'/en/document/level-1/routing-lv1-part1.md',
|
||||
'/en/document/level-1/routing-lv1-part2.md',
|
||||
'/en/document/level-1/work.md',
|
||||
'/en/document/level-1/fallbacks-with-sni.md',
|
||||
]
|
||||
},
|
||||
{
|
||||
text: 'Advanced Documentation',
|
||||
children: [
|
||||
'/en/document/level-2/README.md',
|
||||
'/en/document/level-2/transparent_proxy/transparent_proxy.md',
|
||||
'/en/document/level-2/tproxy.md',
|
||||
'/en/document/level-2/tproxy_ipv4_and_ipv6.md',
|
||||
'/en/document/level-2/nginx_or_haproxy_tls_tunnel.md',
|
||||
'/en/document/level-2/iptables_gid.md',
|
||||
'/en/document/level-2/redirect.md',
|
||||
'/en/document/level-2/warp.md',
|
||||
'/en/document/level-2/traffic_stats.md',
|
||||
]
|
||||
}
|
||||
],
|
||||
'/en/development/': [
|
||||
{
|
||||
text: 'Developer Guide',
|
||||
children: [
|
||||
'/en/development/README.md',
|
||||
'/en/development/intro/compile.md',
|
||||
'/en/development/intro/design.md',
|
||||
'/en/development/intro/guide.md',
|
||||
"/en/document/README.md",
|
||||
"/en/document/install.md",
|
||||
"/en/document/config.md",
|
||||
"/en/document/command.md",
|
||||
"/en/document/document.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Protocol Details',
|
||||
text: "Beginner Tutorial",
|
||||
children: [
|
||||
'/en/development/protocols/vless.md',
|
||||
'/en/development/protocols/vmess.md',
|
||||
'/en/development/protocols/muxcool.md',
|
||||
'/en/development/protocols/mkcp.md',
|
||||
"/en/document/level-0/README.md",
|
||||
"/en/document/level-0/ch01-preface.md",
|
||||
"/en/document/level-0/ch02-preparation.md",
|
||||
"/en/document/level-0/ch03-ssh.md",
|
||||
"/en/document/level-0/ch04-security.md",
|
||||
"/en/document/level-0/ch05-webpage.md",
|
||||
"/en/document/level-0/ch06-certificates.md",
|
||||
"/en/document/level-0/ch07-xray-server.md",
|
||||
"/en/document/level-0/ch08-xray-clients.md",
|
||||
"/en/document/level-0/ch09-appendix.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Getting Started Tips",
|
||||
children: [
|
||||
"/en/document/level-1/README.md",
|
||||
"/en/document/level-1/fallbacks-lv1.md",
|
||||
"/en/document/level-1/routing-lv1-part1.md",
|
||||
"/en/document/level-1/routing-lv1-part2.md",
|
||||
"/en/document/level-1/work.md",
|
||||
"/en/document/level-1/fallbacks-with-sni.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Advanced Documentation",
|
||||
children: [
|
||||
"/en/document/level-2/README.md",
|
||||
"/en/document/level-2/transparent_proxy/transparent_proxy.md",
|
||||
"/en/document/level-2/tproxy.md",
|
||||
"/en/document/level-2/tproxy_ipv4_and_ipv6.md",
|
||||
"/en/document/level-2/nginx_or_haproxy_tls_tunnel.md",
|
||||
"/en/document/level-2/iptables_gid.md",
|
||||
"/en/document/level-2/redirect.md",
|
||||
"/en/document/level-2/warp.md",
|
||||
"/en/document/level-2/traffic_stats.md",
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
"/en/development/": [
|
||||
{
|
||||
text: "Developer Guide",
|
||||
children: [
|
||||
"/en/development/README.md",
|
||||
"/en/development/intro/compile.md",
|
||||
"/en/development/intro/design.md",
|
||||
"/en/development/intro/guide.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Protocol Details",
|
||||
children: [
|
||||
"/en/development/protocols/vless.md",
|
||||
"/en/development/protocols/vmess.md",
|
||||
"/en/development/protocols/muxcool.md",
|
||||
"/en/development/protocols/mkcp.md",
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
@ -1,3 +1,3 @@
|
||||
export * from './en.js'
|
||||
export * from './zh.js'
|
||||
export * from './ru.js'
|
||||
export * from "./en.js";
|
||||
export * from "./zh.js";
|
||||
export * from "./ru.js";
|
||||
|
@ -1,147 +1,147 @@
|
||||
import type { SidebarConfig } from '@vuepress/theme-default'
|
||||
import type { SidebarConfig } from "@vuepress/theme-default";
|
||||
|
||||
export const sidebarRu: SidebarConfig = {
|
||||
'/ru/config/': [
|
||||
"/ru/config/": [
|
||||
{
|
||||
text: 'Описание функций',
|
||||
text: "Описание функций",
|
||||
children: [
|
||||
'/ru/config/features/xtls.md',
|
||||
'/ru/config/features/fallback.md',
|
||||
'/ru/config/features/browser_dialer.md',
|
||||
'/ru/config/features/env.md',
|
||||
'/ru/config/features/multiple.md',
|
||||
"/ru/config/features/xtls.md",
|
||||
"/ru/config/features/fallback.md",
|
||||
"/ru/config/features/browser_dialer.md",
|
||||
"/ru/config/features/env.md",
|
||||
"/ru/config/features/multiple.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Базовая конфигурация',
|
||||
text: "Базовая конфигурация",
|
||||
children: [
|
||||
'/ru/config/README.md',
|
||||
'/ru/config/log.md',
|
||||
'/ru/config/api.md',
|
||||
'/ru/config/dns.md',
|
||||
'/ru/config/fakedns.md',
|
||||
'/ru/config/inbound.md',
|
||||
'/ru/config/outbound.md',
|
||||
'/ru/config/policy.md',
|
||||
'/ru/config/reverse.md',
|
||||
'/ru/config/routing.md',
|
||||
'/ru/config/stats.md',
|
||||
'/ru/config/transport.md',
|
||||
'/ru/config/metrics.md',
|
||||
'/ru/config/observatory.md',
|
||||
"/ru/config/README.md",
|
||||
"/ru/config/log.md",
|
||||
"/ru/config/api.md",
|
||||
"/ru/config/dns.md",
|
||||
"/ru/config/fakedns.md",
|
||||
"/ru/config/inbound.md",
|
||||
"/ru/config/outbound.md",
|
||||
"/ru/config/policy.md",
|
||||
"/ru/config/reverse.md",
|
||||
"/ru/config/routing.md",
|
||||
"/ru/config/stats.md",
|
||||
"/ru/config/transport.md",
|
||||
"/ru/config/metrics.md",
|
||||
"/ru/config/observatory.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Входящие подключения',
|
||||
text: "Входящие подключения",
|
||||
children: [
|
||||
'/ru/config/inbounds/dokodemo.md',
|
||||
'/ru/config/inbounds/http.md',
|
||||
'/ru/config/inbounds/shadowsocks.md',
|
||||
'/ru/config/inbounds/socks.md',
|
||||
'/ru/config/inbounds/trojan.md',
|
||||
'/ru/config/inbounds/vless.md',
|
||||
'/ru/config/inbounds/vmess.md',
|
||||
'/ru/config/inbounds/wireguard.md',
|
||||
"/ru/config/inbounds/dokodemo.md",
|
||||
"/ru/config/inbounds/http.md",
|
||||
"/ru/config/inbounds/shadowsocks.md",
|
||||
"/ru/config/inbounds/socks.md",
|
||||
"/ru/config/inbounds/trojan.md",
|
||||
"/ru/config/inbounds/vless.md",
|
||||
"/ru/config/inbounds/vmess.md",
|
||||
"/ru/config/inbounds/wireguard.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Исходящие подключения',
|
||||
text: "Исходящие подключения",
|
||||
children: [
|
||||
'/ru/config/outbounds/blackhole.md',
|
||||
'/ru/config/outbounds/dns.md',
|
||||
'/ru/config/outbounds/freedom.md',
|
||||
'/ru/config/outbounds/http.md',
|
||||
'/ru/config/outbounds/loopback.md',
|
||||
'/ru/config/outbounds/shadowsocks.md',
|
||||
'/ru/config/outbounds/socks.md',
|
||||
'/ru/config/outbounds/trojan.md',
|
||||
'/ru/config/outbounds/vless.md',
|
||||
'/ru/config/outbounds/vmess.md',
|
||||
'/ru/config/outbounds/wireguard.md',
|
||||
"/ru/config/outbounds/blackhole.md",
|
||||
"/ru/config/outbounds/dns.md",
|
||||
"/ru/config/outbounds/freedom.md",
|
||||
"/ru/config/outbounds/http.md",
|
||||
"/ru/config/outbounds/loopback.md",
|
||||
"/ru/config/outbounds/shadowsocks.md",
|
||||
"/ru/config/outbounds/socks.md",
|
||||
"/ru/config/outbounds/trojan.md",
|
||||
"/ru/config/outbounds/vless.md",
|
||||
"/ru/config/outbounds/vmess.md",
|
||||
"/ru/config/outbounds/wireguard.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Транспортный уровень',
|
||||
text: "Транспортный уровень",
|
||||
children: [
|
||||
'/ru/config/transports/raw.md',
|
||||
'/ru/config/transports/xhttp.md',
|
||||
'/ru/config/transports/mkcp.md',
|
||||
'/ru/config/transports/grpc.md',
|
||||
'/ru/config/transports/websocket.md',
|
||||
'/ru/config/transports/httpupgrade.md',
|
||||
"/ru/config/transports/raw.md",
|
||||
"/ru/config/transports/xhttp.md",
|
||||
"/ru/config/transports/mkcp.md",
|
||||
"/ru/config/transports/grpc.md",
|
||||
"/ru/config/transports/websocket.md",
|
||||
"/ru/config/transports/httpupgrade.md",
|
||||
],
|
||||
},
|
||||
],
|
||||
'/ru/document/': [
|
||||
"/ru/document/": [
|
||||
{
|
||||
text: 'Быстрый старт',
|
||||
text: "Быстрый старт",
|
||||
children: [
|
||||
'/ru/document/README.md',
|
||||
'/ru/document/install.md',
|
||||
'/ru/document/config.md',
|
||||
'/ru/document/command.md',
|
||||
'/ru/document/document.md',
|
||||
"/ru/document/README.md",
|
||||
"/ru/document/install.md",
|
||||
"/ru/document/config.md",
|
||||
"/ru/document/command.md",
|
||||
"/ru/document/document.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Простыми словами',
|
||||
text: "Простыми словами",
|
||||
children: [
|
||||
'/ru/document/level-0/README.md',
|
||||
'/ru/document/level-0/ch01-preface.md',
|
||||
'/ru/document/level-0/ch02-preparation.md',
|
||||
'/ru/document/level-0/ch03-ssh.md',
|
||||
'/ru/document/level-0/ch04-security.md',
|
||||
'/ru/document/level-0/ch05-webpage.md',
|
||||
'/ru/document/level-0/ch06-certificates.md',
|
||||
'/ru/document/level-0/ch07-xray-server.md',
|
||||
'/ru/document/level-0/ch08-xray-clients.md',
|
||||
'/ru/document/level-0/ch09-appendix.md',
|
||||
"/ru/document/level-0/README.md",
|
||||
"/ru/document/level-0/ch01-preface.md",
|
||||
"/ru/document/level-0/ch02-preparation.md",
|
||||
"/ru/document/level-0/ch03-ssh.md",
|
||||
"/ru/document/level-0/ch04-security.md",
|
||||
"/ru/document/level-0/ch05-webpage.md",
|
||||
"/ru/document/level-0/ch06-certificates.md",
|
||||
"/ru/document/level-0/ch07-xray-server.md",
|
||||
"/ru/document/level-0/ch08-xray-clients.md",
|
||||
"/ru/document/level-0/ch09-appendix.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Базовые навыки',
|
||||
text: "Базовые навыки",
|
||||
children: [
|
||||
'/ru/document/level-1/README.md',
|
||||
'/ru/document/level-1/fallbacks-lv1.md',
|
||||
'/ru/document/level-1/routing-lv1-part1.md',
|
||||
'/ru/document/level-1/routing-lv1-part2.md',
|
||||
'/ru/document/level-1/work.md',
|
||||
'/ru/document/level-1/fallbacks-with-sni.md',
|
||||
"/ru/document/level-1/README.md",
|
||||
"/ru/document/level-1/fallbacks-lv1.md",
|
||||
"/ru/document/level-1/routing-lv1-part1.md",
|
||||
"/ru/document/level-1/routing-lv1-part2.md",
|
||||
"/ru/document/level-1/work.md",
|
||||
"/ru/document/level-1/fallbacks-with-sni.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Продвинутые навыки',
|
||||
text: "Продвинутые навыки",
|
||||
children: [
|
||||
'/ru/document/level-2/README.md',
|
||||
'/ru/document/level-2/transparent_proxy/transparent_proxy.md',
|
||||
'/ru/document/level-2/tproxy.md',
|
||||
'/ru/document/level-2/tproxy_ipv4_and_ipv6.md',
|
||||
'/ru/document/level-2/nginx_or_haproxy_tls_tunnel.md',
|
||||
'/ru/document/level-2/iptables_gid.md',
|
||||
'/ru/document/level-2/redirect.md',
|
||||
'/ru/document/level-2/warp.md',
|
||||
'/ru/document/level-2/traffic_stats.md',
|
||||
],
|
||||
}
|
||||
],
|
||||
'/ru/development/': [
|
||||
{
|
||||
text: 'Руководство разработчика',
|
||||
children: [
|
||||
'/ru/development/README.md',
|
||||
'/ru/development/intro/compile.md',
|
||||
'/ru/development/intro/design.md',
|
||||
'/ru/development/intro/guide.md',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: 'Описание протоколов',
|
||||
children: [
|
||||
'/ru/development/protocols/vless.md',
|
||||
'/ru/development/protocols/vmess.md',
|
||||
'/ru/development/protocols/muxcool.md',
|
||||
'/ru/development/protocols/mkcp.md',
|
||||
"/ru/document/level-2/README.md",
|
||||
"/ru/document/level-2/transparent_proxy/transparent_proxy.md",
|
||||
"/ru/document/level-2/tproxy.md",
|
||||
"/ru/document/level-2/tproxy_ipv4_and_ipv6.md",
|
||||
"/ru/document/level-2/nginx_or_haproxy_tls_tunnel.md",
|
||||
"/ru/document/level-2/iptables_gid.md",
|
||||
"/ru/document/level-2/redirect.md",
|
||||
"/ru/document/level-2/warp.md",
|
||||
"/ru/document/level-2/traffic_stats.md",
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
"/ru/development/": [
|
||||
{
|
||||
text: "Руководство разработчика",
|
||||
children: [
|
||||
"/ru/development/README.md",
|
||||
"/ru/development/intro/compile.md",
|
||||
"/ru/development/intro/design.md",
|
||||
"/ru/development/intro/guide.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "Описание протоколов",
|
||||
children: [
|
||||
"/ru/development/protocols/vless.md",
|
||||
"/ru/development/protocols/vmess.md",
|
||||
"/ru/development/protocols/muxcool.md",
|
||||
"/ru/development/protocols/mkcp.md",
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
@ -1,147 +1,147 @@
|
||||
import type { SidebarConfig } from '@vuepress/theme-default'
|
||||
import type { SidebarConfig } from "@vuepress/theme-default";
|
||||
|
||||
export const sidebarZh: SidebarConfig = {
|
||||
'/config/': [
|
||||
"/config/": [
|
||||
{
|
||||
text: '特性详解',
|
||||
text: "特性详解",
|
||||
children: [
|
||||
'/config/features/xtls.md',
|
||||
'/config/features/fallback.md',
|
||||
'/config/features/browser_dialer.md',
|
||||
'/config/features/env.md',
|
||||
'/config/features/multiple.md',
|
||||
"/config/features/xtls.md",
|
||||
"/config/features/fallback.md",
|
||||
"/config/features/browser_dialer.md",
|
||||
"/config/features/env.md",
|
||||
"/config/features/multiple.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '基础配置',
|
||||
text: "基础配置",
|
||||
children: [
|
||||
'/config/README.md',
|
||||
'/config/log.md',
|
||||
'/config/api.md',
|
||||
'/config/dns.md',
|
||||
'/config/fakedns.md',
|
||||
'/config/inbound.md',
|
||||
'/config/outbound.md',
|
||||
'/config/policy.md',
|
||||
'/config/reverse.md',
|
||||
'/config/routing.md',
|
||||
'/config/stats.md',
|
||||
'/config/transport.md',
|
||||
'/config/metrics.md',
|
||||
'/config/observatory.md',
|
||||
"/config/README.md",
|
||||
"/config/log.md",
|
||||
"/config/api.md",
|
||||
"/config/dns.md",
|
||||
"/config/fakedns.md",
|
||||
"/config/inbound.md",
|
||||
"/config/outbound.md",
|
||||
"/config/policy.md",
|
||||
"/config/reverse.md",
|
||||
"/config/routing.md",
|
||||
"/config/stats.md",
|
||||
"/config/transport.md",
|
||||
"/config/metrics.md",
|
||||
"/config/observatory.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '入站代理',
|
||||
text: "入站代理",
|
||||
children: [
|
||||
'/config/inbounds/dokodemo.md',
|
||||
'/config/inbounds/http.md',
|
||||
'/config/inbounds/shadowsocks.md',
|
||||
'/config/inbounds/socks.md',
|
||||
'/config/inbounds/trojan.md',
|
||||
'/config/inbounds/vless.md',
|
||||
'/config/inbounds/vmess.md',
|
||||
'/config/inbounds/wireguard.md',
|
||||
"/config/inbounds/dokodemo.md",
|
||||
"/config/inbounds/http.md",
|
||||
"/config/inbounds/shadowsocks.md",
|
||||
"/config/inbounds/socks.md",
|
||||
"/config/inbounds/trojan.md",
|
||||
"/config/inbounds/vless.md",
|
||||
"/config/inbounds/vmess.md",
|
||||
"/config/inbounds/wireguard.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '出站代理',
|
||||
text: "出站代理",
|
||||
children: [
|
||||
'/config/outbounds/blackhole.md',
|
||||
'/config/outbounds/dns.md',
|
||||
'/config/outbounds/freedom.md',
|
||||
'/config/outbounds/http.md',
|
||||
'/config/outbounds/loopback.md',
|
||||
'/config/outbounds/shadowsocks.md',
|
||||
'/config/outbounds/socks.md',
|
||||
'/config/outbounds/trojan.md',
|
||||
'/config/outbounds/vless.md',
|
||||
'/config/outbounds/vmess.md',
|
||||
'/config/outbounds/wireguard.md',
|
||||
"/config/outbounds/blackhole.md",
|
||||
"/config/outbounds/dns.md",
|
||||
"/config/outbounds/freedom.md",
|
||||
"/config/outbounds/http.md",
|
||||
"/config/outbounds/loopback.md",
|
||||
"/config/outbounds/shadowsocks.md",
|
||||
"/config/outbounds/socks.md",
|
||||
"/config/outbounds/trojan.md",
|
||||
"/config/outbounds/vless.md",
|
||||
"/config/outbounds/vmess.md",
|
||||
"/config/outbounds/wireguard.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '底层传输',
|
||||
text: "底层传输",
|
||||
children: [
|
||||
'/config/transports/raw.md',
|
||||
'/config/transports/xhttp.md',
|
||||
'/config/transports/mkcp.md',
|
||||
'/config/transports/grpc.md',
|
||||
'/config/transports/websocket.md',
|
||||
'/config/transports/httpupgrade.md',
|
||||
"/config/transports/raw.md",
|
||||
"/config/transports/xhttp.md",
|
||||
"/config/transports/mkcp.md",
|
||||
"/config/transports/grpc.md",
|
||||
"/config/transports/websocket.md",
|
||||
"/config/transports/httpupgrade.md",
|
||||
],
|
||||
},
|
||||
],
|
||||
'/document/': [
|
||||
"/document/": [
|
||||
{
|
||||
text: '快速入门文档',
|
||||
text: "快速入门文档",
|
||||
children: [
|
||||
'/document/README.md',
|
||||
'/document/install.md',
|
||||
'/document/config.md',
|
||||
'/document/command.md',
|
||||
'/document/document.md',
|
||||
"/document/README.md",
|
||||
"/document/install.md",
|
||||
"/document/config.md",
|
||||
"/document/command.md",
|
||||
"/document/document.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '小小白白话文',
|
||||
text: "小小白白话文",
|
||||
children: [
|
||||
'/document/level-0/README.md',
|
||||
'/document/level-0/ch01-preface.md',
|
||||
'/document/level-0/ch02-preparation.md',
|
||||
'/document/level-0/ch03-ssh.md',
|
||||
'/document/level-0/ch04-security.md',
|
||||
'/document/level-0/ch05-webpage.md',
|
||||
'/document/level-0/ch06-certificates.md',
|
||||
'/document/level-0/ch07-xray-server.md',
|
||||
'/document/level-0/ch08-xray-clients.md',
|
||||
'/document/level-0/ch09-appendix.md',
|
||||
"/document/level-0/README.md",
|
||||
"/document/level-0/ch01-preface.md",
|
||||
"/document/level-0/ch02-preparation.md",
|
||||
"/document/level-0/ch03-ssh.md",
|
||||
"/document/level-0/ch04-security.md",
|
||||
"/document/level-0/ch05-webpage.md",
|
||||
"/document/level-0/ch06-certificates.md",
|
||||
"/document/level-0/ch07-xray-server.md",
|
||||
"/document/level-0/ch08-xray-clients.md",
|
||||
"/document/level-0/ch09-appendix.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '入门技巧',
|
||||
text: "入门技巧",
|
||||
children: [
|
||||
'/document/level-1/README.md',
|
||||
'/document/level-1/fallbacks-lv1.md',
|
||||
'/document/level-1/routing-lv1-part1.md',
|
||||
'/document/level-1/routing-lv1-part2.md',
|
||||
'/document/level-1/work.md',
|
||||
'/document/level-1/fallbacks-with-sni.md',
|
||||
"/document/level-1/README.md",
|
||||
"/document/level-1/fallbacks-lv1.md",
|
||||
"/document/level-1/routing-lv1-part1.md",
|
||||
"/document/level-1/routing-lv1-part2.md",
|
||||
"/document/level-1/work.md",
|
||||
"/document/level-1/fallbacks-with-sni.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '进阶技巧',
|
||||
text: "进阶技巧",
|
||||
children: [
|
||||
'/document/level-2/README.md',
|
||||
'/document/level-2/transparent_proxy/transparent_proxy.md',
|
||||
'/document/level-2/tproxy.md',
|
||||
'/document/level-2/tproxy_ipv4_and_ipv6.md',
|
||||
'/document/level-2/nginx_or_haproxy_tls_tunnel.md',
|
||||
'/document/level-2/iptables_gid.md',
|
||||
'/document/level-2/redirect.md',
|
||||
'/document/level-2/warp.md',
|
||||
'/document/level-2/traffic_stats.md',
|
||||
],
|
||||
}
|
||||
],
|
||||
'/development/': [
|
||||
{
|
||||
text: '开发指南',
|
||||
children: [
|
||||
'/development/README.md',
|
||||
'/development/intro/compile.md',
|
||||
'/development/intro/design.md',
|
||||
'/development/intro/guide.md',
|
||||
],
|
||||
},
|
||||
{
|
||||
text: '协议详解',
|
||||
children: [
|
||||
'/development/protocols/vless.md',
|
||||
'/development/protocols/vmess.md',
|
||||
'/development/protocols/muxcool.md',
|
||||
'/development/protocols/mkcp.md',
|
||||
"/document/level-2/README.md",
|
||||
"/document/level-2/transparent_proxy/transparent_proxy.md",
|
||||
"/document/level-2/tproxy.md",
|
||||
"/document/level-2/tproxy_ipv4_and_ipv6.md",
|
||||
"/document/level-2/nginx_or_haproxy_tls_tunnel.md",
|
||||
"/document/level-2/iptables_gid.md",
|
||||
"/document/level-2/redirect.md",
|
||||
"/document/level-2/warp.md",
|
||||
"/document/level-2/traffic_stats.md",
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
"/development/": [
|
||||
{
|
||||
text: "开发指南",
|
||||
children: [
|
||||
"/development/README.md",
|
||||
"/development/intro/compile.md",
|
||||
"/development/intro/design.md",
|
||||
"/development/intro/guide.md",
|
||||
],
|
||||
},
|
||||
{
|
||||
text: "协议详解",
|
||||
children: [
|
||||
"/development/protocols/vless.md",
|
||||
"/development/protocols/vmess.md",
|
||||
"/development/protocols/muxcool.md",
|
||||
"/development/protocols/mkcp.md",
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
@ -17,7 +17,8 @@ export const getMermaidContent = ({
|
||||
content,
|
||||
title = "",
|
||||
}: MermaidOptions): string => `\
|
||||
${title
|
||||
${
|
||||
title
|
||||
? `\
|
||||
---
|
||||
title: ${title}
|
||||
@ -25,20 +26,22 @@ title: ${title}
|
||||
|
||||
`
|
||||
: ""
|
||||
}\
|
||||
${diagram === "mermaid"
|
||||
}\
|
||||
${
|
||||
diagram === "mermaid"
|
||||
? ""
|
||||
: `\
|
||||
${diagram}
|
||||
`
|
||||
}\
|
||||
${diagram === "mermaid" || diagram === "sankey-beta"
|
||||
}\
|
||||
${
|
||||
diagram === "mermaid" || diagram === "sankey-beta"
|
||||
? content
|
||||
: content
|
||||
.split("\n")
|
||||
.map((line) => (line ? ` ${line}` : ""))
|
||||
.join("\n")
|
||||
}\
|
||||
}\
|
||||
`;
|
||||
|
||||
const getMermaid = (options: MermaidOptions, index: number): string =>
|
||||
|
@ -1,84 +1,91 @@
|
||||
import { defaultTheme } from '@vuepress/theme-default'
|
||||
import { defaultTheme } from "@vuepress/theme-default";
|
||||
// import { path, getDirname } from '@vuepress/utils'
|
||||
import { path, getDirname } from 'vuepress/utils'
|
||||
import process from 'node:process'
|
||||
import { navbarEn, navbarZh, navbarRu, sidebarEn, sidebarZh, sidebarRu } from './config/index.js'
|
||||
import { path, getDirname } from "vuepress/utils";
|
||||
import process from "node:process";
|
||||
import {
|
||||
navbarEn,
|
||||
navbarZh,
|
||||
navbarRu,
|
||||
sidebarEn,
|
||||
sidebarZh,
|
||||
sidebarRu,
|
||||
} from "./config/index.js";
|
||||
|
||||
let __dirname = getDirname(import.meta.url)
|
||||
const isProduction = process.env.NODE_ENV === 'production'
|
||||
let __dirname = getDirname(import.meta.url);
|
||||
const isProduction = process.env.NODE_ENV === "production";
|
||||
|
||||
export default defaultTheme({
|
||||
name: 'vuepress-theme-xray',
|
||||
name: "vuepress-theme-xray",
|
||||
smoothScroll: true,
|
||||
repo: 'xtls/xray-core',
|
||||
docsDir: 'docs',
|
||||
docsRepo: 'xtls/Xray-docs-next',
|
||||
docsBranch: 'main',
|
||||
repo: "xtls/xray-core",
|
||||
docsDir: "docs",
|
||||
docsRepo: "xtls/Xray-docs-next",
|
||||
docsBranch: "main",
|
||||
editLinks: true,
|
||||
enableToggle: true,
|
||||
locales: {
|
||||
'/': {
|
||||
"/": {
|
||||
navbar: navbarZh,
|
||||
sidebar: sidebarZh,
|
||||
repoLabel: '查看源码',
|
||||
editLinkText: '帮助我们改善此页面!',
|
||||
tip: '提示',
|
||||
warning: '注意',
|
||||
danger: '警告',
|
||||
lastUpdatedText: '最近更改',
|
||||
selectLanguageName: '简体中文',
|
||||
selectLanguageText: '🌏 简体中文 / Change language',
|
||||
selectLanguageAriaLabel: '简体中文 / Change language',
|
||||
docsDir: 'docs',
|
||||
backToHome: 'back to home',
|
||||
openInNewWindow: 'open in new tag',
|
||||
toggleColorMode: 'toggle color mode',
|
||||
toggleSidebar: 'toggle side bar',
|
||||
repoLabel: "查看源码",
|
||||
editLinkText: "帮助我们改善此页面!",
|
||||
tip: "提示",
|
||||
warning: "注意",
|
||||
danger: "警告",
|
||||
lastUpdatedText: "最近更改",
|
||||
selectLanguageName: "简体中文",
|
||||
selectLanguageText: "🌏 简体中文 / Change language",
|
||||
selectLanguageAriaLabel: "简体中文 / Change language",
|
||||
docsDir: "docs",
|
||||
backToHome: "back to home",
|
||||
openInNewWindow: "open in new tag",
|
||||
toggleColorMode: "toggle color mode",
|
||||
toggleSidebar: "toggle side bar",
|
||||
},
|
||||
'/en/': {
|
||||
"/en/": {
|
||||
// TODO: translation
|
||||
sidebar: sidebarEn,
|
||||
navbar: navbarEn,
|
||||
selectLanguageName: 'English (WIP)',
|
||||
selectLanguageText: '🌎 English / Change language',
|
||||
selectLanguageAriaLabel: 'English / Change language',
|
||||
editLinkText: 'Help us improve this page on GitHub!',
|
||||
lastUpdatedText: 'Last Updated',
|
||||
contributorsText: 'contributors',
|
||||
selectLanguageName: "English (WIP)",
|
||||
selectLanguageText: "🌎 English / Change language",
|
||||
selectLanguageAriaLabel: "English / Change language",
|
||||
editLinkText: "Help us improve this page on GitHub!",
|
||||
lastUpdatedText: "Last Updated",
|
||||
contributorsText: "contributors",
|
||||
// repoLabel: 'Source',
|
||||
tip: 'Tip',
|
||||
warning: 'Warning',
|
||||
danger: 'Danger',
|
||||
tip: "Tip",
|
||||
warning: "Warning",
|
||||
danger: "Danger",
|
||||
|
||||
// 404 page
|
||||
notFound: [
|
||||
'这里什么都没有',
|
||||
'我们怎么到这来了?',
|
||||
'这是一个 404 页面',
|
||||
'看起来我们进入了错误的链接',
|
||||
"这里什么都没有",
|
||||
"我们怎么到这来了?",
|
||||
"这是一个 404 页面",
|
||||
"看起来我们进入了错误的链接",
|
||||
],
|
||||
backToHome: 'back to home',
|
||||
openInNewWindow: 'open in new tag',
|
||||
toggleColorMode: 'toggle color mode',
|
||||
toggleSidebar: 'toggle side bar',
|
||||
backToHome: "back to home",
|
||||
openInNewWindow: "open in new tag",
|
||||
toggleColorMode: "toggle color mode",
|
||||
toggleSidebar: "toggle side bar",
|
||||
},
|
||||
'/ru/': {
|
||||
"/ru/": {
|
||||
navbar: navbarRu,
|
||||
sidebar: sidebarRu,
|
||||
repoLabel: 'Посмотреть исходный код',
|
||||
editLinkText: 'Помогите нам улучшить эту страницу!',
|
||||
tip: 'Подсказка',
|
||||
warning: 'Внимание',
|
||||
danger: 'Предупреждение',
|
||||
lastUpdatedText: 'Последние изменения',
|
||||
selectLanguageName: 'Русский',
|
||||
selectLanguageText: '🌍 Русский / Change language',
|
||||
selectLanguageAriaLabel: 'Русский / Change language',
|
||||
docsDir: 'docs',
|
||||
backToHome: 'На главную',
|
||||
openInNewWindow: 'Открыть в новой вкладке',
|
||||
toggleColorMode: 'Переключить цветовую схему',
|
||||
toggleSidebar: 'Переключить боковую панель',
|
||||
repoLabel: "Посмотреть исходный код",
|
||||
editLinkText: "Помогите нам улучшить эту страницу!",
|
||||
tip: "Подсказка",
|
||||
warning: "Внимание",
|
||||
danger: "Предупреждение",
|
||||
lastUpdatedText: "Последние изменения",
|
||||
selectLanguageName: "Русский",
|
||||
selectLanguageText: "🌍 Русский / Change language",
|
||||
selectLanguageAriaLabel: "Русский / Change language",
|
||||
docsDir: "docs",
|
||||
backToHome: "На главную",
|
||||
openInNewWindow: "Открыть в новой вкладке",
|
||||
toggleColorMode: "Переключить цветовую схему",
|
||||
toggleSidebar: "Переключить боковую панель",
|
||||
},
|
||||
// logo: '/logo.png',
|
||||
|
||||
@ -88,4 +95,4 @@ export default defaultTheme({
|
||||
git: isProduction,
|
||||
},
|
||||
},
|
||||
})
|
||||
});
|
||||
|
@ -14,7 +14,7 @@ import {
|
||||
watch,
|
||||
reactive,
|
||||
nextTick,
|
||||
toRef
|
||||
toRef,
|
||||
} from "vue";
|
||||
|
||||
import { getDarkmodeStatus } from "../../plugins/mermaid/helpers/darkmode.js";
|
||||
@ -43,18 +43,20 @@ export default defineComponent({
|
||||
startOnLoad: false,
|
||||
});
|
||||
|
||||
mermaid.default.render(chartID.value!, decodeURI(rawGraph.value!)).then(({ svg, bindFunctions }) => {
|
||||
mermaid.default
|
||||
.render(chartID.value!, decodeURI(rawGraph.value!))
|
||||
.then(({ svg, bindFunctions }) => {
|
||||
html.innerHtml = svg;
|
||||
});
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
isDarkmode.value = getDarkmodeStatus()
|
||||
nextTick(renderMermaid)
|
||||
})
|
||||
isDarkmode.value = getDarkmodeStatus();
|
||||
nextTick(renderMermaid);
|
||||
});
|
||||
|
||||
// watch darkmode change
|
||||
if (typeof document !== 'undefined') {
|
||||
if (typeof document !== "undefined") {
|
||||
useMutationObserver(
|
||||
document.documentElement,
|
||||
() => {
|
||||
@ -67,17 +69,14 @@ export default defineComponent({
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
watch(isDarkmode, () => renderMermaid());
|
||||
|
||||
return {
|
||||
tag: chartID,
|
||||
payload: html
|
||||
}
|
||||
|
||||
payload: html,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
||||
|
||||
|
@ -9,7 +9,6 @@ export const docsPlugin: Theme = (options, app) => {
|
||||
name: "xray-docs-theme",
|
||||
extends: "@vuepress/theme-default",
|
||||
clientAppEnhanceFiles: path.resolve(__dirname, "clientAppEnhance.ts"),
|
||||
|
||||
});
|
||||
};
|
||||
|
||||
|
@ -444,9 +444,9 @@ Shadowsocks-2022 是重新设计的全新协议:
|
||||
|
||||
现在一个以 Xray-core 为核心的开源、自由的 Android 客户端已经出现——[AnXray](https://github.com/XTLS/AnXray)!由 [@nekohasekai](https://github.com/nekohasekai) 维护。
|
||||
|
||||
- 支持众多协议、插件.
|
||||
- 首席视觉设计师 [@RPRX](https://github.com/RPRX) 设计了 X-style 的 logo、slogan,以及独一无二的 material 黑白主题。
|
||||
- APP 内还有个小彩蛋等你去发现。
|
||||
- 支持众多协议、插件.
|
||||
- 首席视觉设计师 [@RPRX](https://github.com/RPRX) 设计了 X-style 的 logo、slogan,以及独一无二的 material 黑白主题。
|
||||
- APP 内还有个小彩蛋等你去发现。
|
||||
|
||||
前两天从早到晚反复打磨细节,希望大家多多 Star、关注。
|
||||
|
||||
|
@ -19,7 +19,12 @@ API 接口配置提供了一些基于 [gRPC](https://grpc.io/)的 API 接口供
|
||||
"api": {
|
||||
"tag": "api",
|
||||
"listen": "127.0.0.1:8080",
|
||||
"services": ["HandlerService", "LoggerService", "StatsService", "RoutingService"]
|
||||
"services": [
|
||||
"HandlerService",
|
||||
"LoggerService",
|
||||
"StatsService",
|
||||
"RoutingService"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
@ -58,17 +58,13 @@ Xray 内置的 DNS 模块,主要有两大用途:
|
||||
},
|
||||
{
|
||||
"address": "https://8.8.8.8/dns-query",
|
||||
"domains": [
|
||||
"geosite:netflix"
|
||||
],
|
||||
"domains": ["geosite:netflix"],
|
||||
"skipFallback": true,
|
||||
"queryStrategy": "UseIPv4"
|
||||
},
|
||||
{
|
||||
"address": "https://1.1.1.1/dns-query",
|
||||
"domains": [
|
||||
"geosite:openai"
|
||||
],
|
||||
"domains": ["geosite:openai"],
|
||||
"skipFallback": true,
|
||||
"queryStrategy": "UseIPv6"
|
||||
},
|
||||
|
@ -9,14 +9,16 @@
|
||||
这个方法简洁的实现了真实的浏览器的 TLS 指纹、行为特征。最大程度抗检测与抗封锁。
|
||||
|
||||
不过目前的浏览器转发有以下缺点:
|
||||
* 用户需要手动开浏览器
|
||||
* 浏览器发出的连接必须直连 使用 tun 的用户需要特别注意容易形成死循环
|
||||
* 浏览器只能发出 HTTP 连接 所以目前仅支持 [WebSocket](../../transports/websocket.md) 与 [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113) 传输方式
|
||||
* 当浏览器从 `localhost:8080` 页面连接至代理服务端,需要考虑 [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)
|
||||
* 因为中间经过 JS 处理数据,会有一些性能损耗
|
||||
* 不能使用自定义 SNI 或者 Host,也就是说 `SNI == host == address`。自定义 HTTP 头以及其它 `tlsSettings` 项会被忽略
|
||||
|
||||
- 用户需要手动开浏览器
|
||||
- 浏览器发出的连接必须直连 使用 tun 的用户需要特别注意容易形成死循环
|
||||
- 浏览器只能发出 HTTP 连接 所以目前仅支持 [WebSocket](../../transports/websocket.md) 与 [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113) 传输方式
|
||||
- 当浏览器从 `localhost:8080` 页面连接至代理服务端,需要考虑 [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)
|
||||
- 因为中间经过 JS 处理数据,会有一些性能损耗
|
||||
- 不能使用自定义 SNI 或者 Host,也就是说 `SNI == host == address`。自定义 HTTP 头以及其它 `tlsSettings` 项会被忽略
|
||||
|
||||
## 配置方法
|
||||
|
||||
1. 准备一份 WebSocket 或 XHTTP 配置,注意 address 必须填域名,若需要指定 IP,请配置 DNS 或系统 hosts
|
||||
2. 使用环境变量启动 Xray `XRAY_BROWSER_DIALER=127.0.0.1:8080`。Windows 上命令为 `set XRAY_BROWSER_DIALER=127.0.0.1:8080` Linux 上命令为 `XRAY_BROWSER_DIALER=127.0.0.1:8080 ./xray -c config.json`
|
||||
3. 确保浏览器直连(或者在路由中将服务端地址直接由 `freedom` 发出),打开页面 `localhost:8080`,还可以 `F12` 看 `Console` 和 `Network`
|
||||
|
@ -14,10 +14,10 @@ User-space Wireguard 协议实现。
|
||||
"peers": [
|
||||
{
|
||||
"publicKey": "PUBLIC_KEY",
|
||||
"allowedIPs":[""]
|
||||
"allowedIPs": [""]
|
||||
}
|
||||
],
|
||||
"mtu": 1420, // optional, default 1420
|
||||
"mtu": 1420 // optional, default 1420
|
||||
}
|
||||
```
|
||||
|
||||
@ -44,7 +44,8 @@ Wireguard 底层 tun 的分片大小。
|
||||
- 16-byte authentication tag
|
||||
```
|
||||
|
||||
```N-byte encrypted data```即为我们需要的MTU的值,根据endpoint是IPv4还是IPv6,具体的值可以是1440(IPv4)或者1420(IPv6),如果处于特殊环境下再额外减掉即可(如家宽PPPoE额外-8)。
|
||||
`N-byte encrypted data`即为我们需要的MTU的值,根据endpoint是IPv4还是IPv6,具体的值可以是1440(IPv4)或者1420(IPv6),如果处于特殊环境下再额外减掉即可(如家宽PPPoE额外-8)。
|
||||
|
||||
</details>
|
||||
|
||||
> `peers`: \[ [Peers](#peers) \]
|
||||
|
@ -36,8 +36,9 @@ metrics 对应的出站代理 tag, 通过设置任意门入站+路由将任意
|
||||
访问 `http://127.0.0.1:11111/debug/vars`
|
||||
|
||||
包含的变量:
|
||||
* `stats` 包括所有的 inbound outbound user 数据
|
||||
* `observatory` 包含了 observatory 观测结果
|
||||
|
||||
- `stats` 包括所有的 inbound outbound user 数据
|
||||
- `observatory` 包含了 observatory 观测结果
|
||||
|
||||
例如在 [luci-app-xray](https://github.com/yichya/luci-app-xray) 你可以得到这样的输出 (省略了 cmdline 和 memstats 等标准expvar内容)
|
||||
|
||||
@ -130,6 +131,7 @@ metrics 对应的出站代理 tag, 通过设置任意门入站+路由将任意
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
为了得到更好的可视化输出, 可以使用 [Netdata](https://github.com/netdata/netdata) (with python.d plugin):
|
||||
@ -244,6 +246,7 @@ xray:
|
||||
id: udp
|
||||
expvar_type: int
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
你可以得到类似这样的结果:
|
||||
|
@ -3,11 +3,10 @@
|
||||
连接观测组件使用 HTTPing 的方式探测出站代理的连接状态。观测结果可以被其他组件使用,如负载均衡器。目前有 [observatory](#observatoryobject) (后台连接观测)和 [burstObservatory](#burstobservatoryobject) (并发连接观测)两种。按需选择其中之一就行。
|
||||
|
||||
## ObservatoryObject
|
||||
|
||||
```json
|
||||
{
|
||||
"subjectSelector":[
|
||||
"outbound"
|
||||
],
|
||||
"subjectSelector": ["outbound"],
|
||||
"probeUrl": "https://www.google.com/generate_204",
|
||||
"probeInterval": "10s",
|
||||
"enableConcurrency": false
|
||||
@ -32,11 +31,10 @@
|
||||
- `false` 逐个探测匹配的出站代理,每探测一个出站代理后暂停 `probeInterval` 设定的时间。
|
||||
|
||||
## BurstObservatoryObject
|
||||
|
||||
```json
|
||||
{
|
||||
"subjectSelector":[
|
||||
"outbound"
|
||||
],
|
||||
"subjectSelector": ["outbound"],
|
||||
"pingConfig": {}
|
||||
}
|
||||
```
|
||||
@ -47,8 +45,8 @@
|
||||
|
||||
> `pingConfig`: [PingConfigObject](#PingConfigObject)
|
||||
|
||||
|
||||
### PingConfigObject
|
||||
|
||||
```json
|
||||
{
|
||||
"destination": "https://connectivitycheck.gstatic.com/generate_204",
|
||||
|
@ -14,7 +14,7 @@ DNS 是一个出站协议,主要用于拦截和转发 DNS 查询。
|
||||
"address": "1.1.1.1",
|
||||
"port": 53,
|
||||
"nonIPQuery": "drop",
|
||||
"blockTypes":[]
|
||||
"blockTypes": []
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -14,13 +14,13 @@ Freedom 是一个出站协议,可以用来向任意网络发送(正常的)
|
||||
"length": "100-200",
|
||||
"interval": "10-20" // 单位ms
|
||||
},
|
||||
"noises":[
|
||||
"noises": [
|
||||
{
|
||||
"type":"base64",
|
||||
"packet":"7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=",
|
||||
"delay":"10-16"
|
||||
"type": "base64",
|
||||
"packet": "7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=",
|
||||
"delay": "10-16"
|
||||
}
|
||||
],
|
||||
],
|
||||
"proxyProtocol": 0
|
||||
}
|
||||
```
|
||||
|
@ -20,7 +20,7 @@ Loopback 是个出站数据协议,其作用为将经该出站传出的数据
|
||||
|
||||
如果需要将已经通过路由规则分流过的流量再由其它路由规则做更细致的分流,比如由同一组路由规则分流后的 TCP 流量和 UDP 要走不同的出站,则可以使用 `loopback` 出站完成。
|
||||
|
||||
``` json
|
||||
```json
|
||||
{
|
||||
"outbounds": [
|
||||
{
|
||||
@ -31,11 +31,11 @@ Loopback 是个出站数据协议,其作用为将经该出站传出的数据
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "tcp-output",
|
||||
"tag": "tcp-output"
|
||||
// protocol, settings, streamSettings 之类的设置
|
||||
},
|
||||
{
|
||||
"tag": "udp-output",
|
||||
"tag": "udp-output"
|
||||
// protocol, settings, streamSettings 之类的设置
|
||||
}
|
||||
],
|
||||
|
@ -118,4 +118,3 @@ level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。
|
||||
"AuthenticatedLength" 启用认证的数据包长度实验。此实验需要同时在客户端与服务器端同时开启,并运行相同版本的程序。
|
||||
|
||||
"NoTerminationSignal" 启用不发送断开连接标致实验。此实验可能会影响被代理的连接的稳定性。
|
||||
|
||||
|
@ -72,7 +72,8 @@ Wireguard 底层 tun 的MTU大小。
|
||||
- 16-byte authentication tag
|
||||
```
|
||||
|
||||
```N-byte encrypted data```即为我们需要的MTU的值,根据endpoint是IPv4还是IPv6,具体的值可以是1440(IPv4)或者1420(IPv6),如果处于特殊环境下再额外减掉即可(如家宽PPPoE额外-8)。
|
||||
`N-byte encrypted data`即为我们需要的MTU的值,根据endpoint是IPv4还是IPv6,具体的值可以是1440(IPv4)或者1420(IPv6),如果处于特殊环境下再额外减掉即可(如家宽PPPoE额外-8)。
|
||||
|
||||
</details>
|
||||
|
||||
> `reserved` \[ number \]
|
||||
|
@ -86,7 +86,7 @@ Xray 系统级别的策略
|
||||
当值为 `true` 时,开启当前等级的所有用户的下行流量统计。
|
||||
|
||||
> `statsUserOnline`: true | false
|
||||
当值为 `true` 时,开启当前等级的所有用户的在线数量统计。(在线标准:20秒内有过连接活动)
|
||||
> 当值为 `true` 时,开启当前等级的所有用户的在线数量统计。(在线标准:20秒内有过连接活动)
|
||||
|
||||
> `bufferSize`: number
|
||||
|
||||
|
@ -7,15 +7,18 @@
|
||||
反向代理的大致工作原理如下:
|
||||
|
||||
- 假设在主机 A 中有一个网页服务器,这台主机没有公网 IP,无法在公网上直接访问。另有一台主机 B,它可以由公网访问。现在我们需要把 B 作为入口,把流量从 B 转发到 A。
|
||||
|
||||
- 在主机 B 中配置 Xray,接收外部请求,所以称为 `portal` (门户)。
|
||||
- 在主机 A 中配置 Xray,负责将B的转发和网页服务器桥接起来,称为`bridge`。
|
||||
|
||||
- `bridge`
|
||||
|
||||
- `bridge` 会向 `portal` 主动建立连接以注册反向通道,此连接的目标地址(domain)可以自行设定。
|
||||
- `bridge` 在收到`portal`转发过来的公网流量之后,会将其原封不动地发给主机 A 中的网页服务器。当然,这一步需要路由模块的配置。
|
||||
- `bridge` 收到响应后,也会将响应原封不动地返回给`portal`。
|
||||
|
||||
- `portal`
|
||||
|
||||
- `portal` 收到请求且domain匹配,则说明是由 `bridge` 发来的响应数据,这条连接会用于建立反向通道。
|
||||
- `portal` 收到请求,domain不匹配,则说明是公网用户发来的连接,这种连接数据会转发给bridge.
|
||||
|
||||
@ -39,16 +42,16 @@
|
||||
"bridges": [
|
||||
{
|
||||
"tag": "bridge",
|
||||
"domain": "reverse-proxy.xray.internal"
|
||||
}
|
||||
"domain": "reverse-proxy.xray.internal",
|
||||
},
|
||||
],
|
||||
"portals": [
|
||||
{
|
||||
"tag": "portal",
|
||||
"domain": "reverse-proxy.xray.internal"
|
||||
}
|
||||
]
|
||||
}
|
||||
"domain": "reverse-proxy.xray.internal",
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
@ -65,7 +68,7 @@
|
||||
```jsonc
|
||||
{
|
||||
"tag": "bridge",
|
||||
"domain": "reverse-proxy.xray.internal"
|
||||
"domain": "reverse-proxy.xray.internal",
|
||||
}
|
||||
```
|
||||
|
||||
@ -83,7 +86,7 @@
|
||||
```jsonc
|
||||
{
|
||||
"tag": "portal",
|
||||
"domain": "reverse-proxy.xray.internal"
|
||||
"domain": "reverse-proxy.xray.internal",
|
||||
}
|
||||
```
|
||||
|
||||
@ -130,8 +133,8 @@ outbound:
|
||||
"tag": "out",
|
||||
"protocol": "freedom",
|
||||
"settings": {
|
||||
"redirect": "127.0.0.1:80"
|
||||
}
|
||||
"redirect": "127.0.0.1:80",
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
@ -146,13 +149,13 @@ outbound:
|
||||
"port": 1024,
|
||||
"users": [
|
||||
{
|
||||
"id": "5783a3e7-e373-51cd-8642-c83782b807c5"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
|
||||
},
|
||||
"tag": "interconn"
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
"tag": "interconn",
|
||||
}
|
||||
```
|
||||
|
||||
@ -167,16 +170,16 @@ outbound:
|
||||
"type": "field",
|
||||
"inboundTag": ["bridge"],
|
||||
"domain": ["full:reverse-proxy.xray.internal"],
|
||||
"outboundTag": "interconn"
|
||||
"outboundTag": "interconn",
|
||||
},
|
||||
{
|
||||
// 从 portal 过来的流量,也会从 bridge 出来,但是不带上面的domain
|
||||
// 则路由到 out,即转发给网页服务器
|
||||
"type": "field",
|
||||
"inboundTag": ["bridge"],
|
||||
"outboundTag": "out"
|
||||
}
|
||||
]
|
||||
"outboundTag": "out",
|
||||
},
|
||||
],
|
||||
}
|
||||
```
|
||||
|
||||
@ -208,8 +211,8 @@ inbound:
|
||||
"settings": {
|
||||
"address": "127.0.0.1",
|
||||
"port": 80,
|
||||
"network": "tcp"
|
||||
}
|
||||
"network": "tcp",
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
@ -222,10 +225,10 @@ inbound:
|
||||
"settings": {
|
||||
"clients": [
|
||||
{
|
||||
"id": "5783a3e7-e373-51cd-8642-c83782b807c5"
|
||||
}
|
||||
]
|
||||
}
|
||||
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
@ -239,7 +242,7 @@ inbound:
|
||||
// 则路由到 portal, 最终会转发给 bridge
|
||||
"type": "field",
|
||||
"inboundTag": ["external"],
|
||||
"outboundTag": "portal"
|
||||
"outboundTag": "portal",
|
||||
},
|
||||
{
|
||||
// 如果来自 interconn 入站,说明是来自 bridge 的尝试建立反向隧道请求,
|
||||
@ -247,8 +250,8 @@ inbound:
|
||||
// 注意:这里进入的请求会带上了前文配置的domain,所以 portal 能够区分两种被路由到 portal 的请求
|
||||
"type": "field",
|
||||
"inboundTag": ["interconn"],
|
||||
"outboundTag": "portal"
|
||||
}
|
||||
]
|
||||
"outboundTag": "portal",
|
||||
},
|
||||
],
|
||||
}
|
||||
```
|
||||
|
@ -239,12 +239,14 @@ Xray-core v1.8.7 或更高版本可省略该行。
|
||||
> `strategy`: [StrategyObject](#strategyobject)
|
||||
|
||||
#### StrategyObject
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "roundRobin",
|
||||
"settings": {}
|
||||
}
|
||||
```
|
||||
|
||||
> `type` : "random" | "roundRobin" | "leastPing" | "leastLoad"
|
||||
|
||||
- `random` 默认值。随机选择匹配到的出站代理。
|
||||
@ -264,11 +266,13 @@ Xray-core v1.8.7 或更高版本可省略该行。
|
||||
"maxRTT": "1s",
|
||||
"tolerance": 0.01,
|
||||
"baselines": ["1s"],
|
||||
"costs": [{
|
||||
"costs": [
|
||||
{
|
||||
"regexp": false,
|
||||
"match": "tag",
|
||||
"value": 0.5
|
||||
}]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
@ -304,7 +308,6 @@ Xray-core v1.8.7 或更高版本可省略该行。
|
||||
|
||||
权重值,值越大,对应节点越不易被选中。
|
||||
|
||||
|
||||
### 负载均衡配置示例
|
||||
|
||||
```json
|
||||
|
@ -103,7 +103,7 @@ Reality 是目前最安全的传输加密方案, 且外部看来流量类型和
|
||||
```json
|
||||
{
|
||||
"serverName": "xray.com",
|
||||
"serverNameToVerify":"",
|
||||
"serverNameToVerify": "",
|
||||
"rejectUnknownSni": false,
|
||||
"allowInsecure": false,
|
||||
"alpn": ["h2", "http/1.1"],
|
||||
@ -324,7 +324,7 @@ Reality 只是修改了TLS,客户端的实现只需要轻度修改完全随机
|
||||
|
||||
一般与target保持一致即可,实际的可选值为服务器所接受的任何SNI(依据 target 本身的配置有所不同),一个参考是所返回证书的 [SAN](https://zh.wikipedia.org/wiki/%E4%B8%BB%E9%A2%98%E5%A4%87%E7%94%A8%E5%90%8D%E7%A7%B0).
|
||||
|
||||
其中可包含空值 ```""``` 代表接受没有SNI的连接。
|
||||
其中可包含空值 `""` 代表接受没有SNI的连接。
|
||||
|
||||
> `privateKey` : string
|
||||
|
||||
@ -358,7 +358,7 @@ Reality 只是修改了TLS,客户端的实现只需要轻度修改完全随机
|
||||
|
||||
服务端 serverNames 之一。
|
||||
|
||||
当服务端 ```serverNames``` 中包含空值时,与 TLS 类似可以在客户端使用 ```"serverName": "0.0.0.0"``` 发起无SNI的连接。与TLS不同,REALITY使用这个功能并不需要开启也没有允许不安全选项。当使用此功能时请确保target在接受无SNI的连接时会返回默认证书。
|
||||
当服务端 `serverNames` 中包含空值时,与 TLS 类似可以在客户端使用 `"serverName": "0.0.0.0"` 发起无SNI的连接。与TLS不同,REALITY使用这个功能并不需要开启也没有允许不安全选项。当使用此功能时请确保target在接受无SNI的连接时会返回默认证书。
|
||||
|
||||
> `fingerprint` : string
|
||||
|
||||
@ -590,7 +590,6 @@ OCSP 装订更新,与证书热重载的时间间隔。 单位:秒。默认
|
||||
> "UseIP" | "UseIPv6v4" | "UseIPv6" | "UseIPv4v6" | "UseIPv4"<br>
|
||||
> "ForceIP" | "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4"
|
||||
|
||||
|
||||
在之前的版本中,当 Xray 尝试使用域名建立系统连接时,域名的解析由系统完成,不受 Xray
|
||||
控制。这导致了在 [非标准 Linux 环境中无法解析域名](https://github.com/v2ray/v2ray-core/issues/1909) 等问题。为此,Xray 1.3.1 为 Sockopt 引入了 Freedom
|
||||
中的 domainStrategy,解决了此问题。
|
||||
|
@ -36,15 +36,15 @@
|
||||
|
||||
HTTPUpgrade 所使用的 HTTP 协议路径,默认值为 `"/"`。
|
||||
|
||||
如果客户端路径中包含 `ed` 参数(如 ```/mypath?ed=2560```),将会启用 `Early Data` 以降低延迟,其值为首包长度阈值。如果首包长度超过此值,就不会启用 `Early Data`。建议的值为2560。
|
||||
如果客户端路径中包含 `ed` 参数(如 `/mypath?ed=2560`),将会启用 `Early Data` 以降低延迟,其值为首包长度阈值。如果首包长度超过此值,就不会启用 `Early Data`。建议的值为2560。
|
||||
|
||||
> `host`: string
|
||||
|
||||
HTTPUpgrade 的HTTP请求中所发送的host,默认值为空。若服务端值为空时,不验证客户端发送来的host值。
|
||||
|
||||
当在服务端指定该值,或在 ```headers``` 中指定host,将会校验与客户端请求host是否一致。
|
||||
当在服务端指定该值,或在 `headers` 中指定host,将会校验与客户端请求host是否一致。
|
||||
|
||||
客户端选择发送的host优先级 ```host``` > ```headers``` > ```address```
|
||||
客户端选择发送的host优先级 `host` > `headers` > `address`
|
||||
|
||||
> `headers`: map \{string: string\}
|
||||
|
||||
|
@ -42,15 +42,15 @@ Websocket 会识别 HTTP 请求的 X-Forwarded-For 头来覆写流量的源地
|
||||
|
||||
WebSocket 所使用的 HTTP 协议路径,默认值为 `"/"`。
|
||||
|
||||
如果客户端路径中包含 `ed` 参数(如 ```/mypath?ed=2560```),将会启用 `Early Data` 以降低延迟,在升级的同时使用 `Sec-WebSocket-Protocol` 头承载首包数据,其值为首包长度阈值。如果首包长度超过此值,就不会启用 `Early Data`。推荐值为 2560,最大值为8192,过大的值可能导致部分兼容问题,如果遇到兼容性问题,可以尝试调低阈值。
|
||||
如果客户端路径中包含 `ed` 参数(如 `/mypath?ed=2560`),将会启用 `Early Data` 以降低延迟,在升级的同时使用 `Sec-WebSocket-Protocol` 头承载首包数据,其值为首包长度阈值。如果首包长度超过此值,就不会启用 `Early Data`。推荐值为 2560,最大值为8192,过大的值可能导致部分兼容问题,如果遇到兼容性问题,可以尝试调低阈值。
|
||||
|
||||
> `host`: string
|
||||
|
||||
WebSocket 的HTTP请求中所发送的host,默认值为空。若服务端值为空时,不验证客户端发送来的host值。
|
||||
|
||||
当在服务端指定该值,或在 ```headers``` 中指定host,将会校验与客户端请求host是否一致。
|
||||
当在服务端指定该值,或在 `headers` 中指定host,将会校验与客户端请求host是否一致。
|
||||
|
||||
客户端选择发送的host优先级 ```host``` > ```headers``` > ```address```
|
||||
客户端选择发送的host优先级 `host` > `headers` > `address`
|
||||
|
||||
> `headers`: map \{string: string\}
|
||||
|
||||
|
@ -137,12 +137,14 @@ For end user
|
||||
一个表示可选范围的值,可以是以下几种写法
|
||||
|
||||
-包含在引号里的单独数字或范围
|
||||
- `""` (视为0) 注意部分字段完全不设置和设置为空可能是两种概念
|
||||
- `"114"`
|
||||
- `"114-514"`
|
||||
|
||||
- `""` (视为0) 注意部分字段完全不设置和设置为空可能是两种概念
|
||||
- `"114"`
|
||||
- `"114-514"`
|
||||
|
||||
-独立的int,这种情况下只能是单数字
|
||||
- `114`
|
||||
|
||||
- `114`
|
||||
|
||||
For dev
|
||||
|
||||
|
@ -55,6 +55,7 @@ without launching the server.
|
||||
|
||||
The -dump flag tells Xray to print the merged config.
|
||||
```
|
||||
|
||||
`-config=` / `-c=` 用于指定使用的配置文件的位置,支持多文件配置。
|
||||
`-confdir=` 用于指定一个包含多个配置文件的文件夹。
|
||||
`-format=` 用于指定使用的配置文件的格式。
|
||||
@ -117,6 +118,7 @@ The commands are:
|
||||
```
|
||||
|
||||
`pb` 子命令使用示例:
|
||||
|
||||
```bash
|
||||
# 用法:xray convert pb [-debug] [-type] [json file] [json file] ...
|
||||
|
||||
@ -134,6 +136,7 @@ xray help convert pb
|
||||
```
|
||||
|
||||
json 子命令使用示例:
|
||||
|
||||
```bash
|
||||
# 用法:xray convert json [-type] [stdin:] [typedMessage file]
|
||||
|
||||
@ -171,6 +174,7 @@ xray tls <command> [arguments]
|
||||
```
|
||||
|
||||
### xray uuid
|
||||
|
||||
生成 UUID。
|
||||
|
||||
使用方法:
|
||||
@ -180,6 +184,7 @@ xray uuid [-i "example"]
|
||||
```
|
||||
|
||||
### xray x25519
|
||||
|
||||
生成 x25519 密钥对。
|
||||
|
||||
使用方法:
|
||||
@ -189,6 +194,7 @@ xray x25519 [-i "(base64.RawURLEncoding)" --std-encoding ]
|
||||
```
|
||||
|
||||
### xray wg
|
||||
|
||||
生成 wireguard curve25519 密钥对。
|
||||
|
||||
使用方法:
|
||||
@ -203,5 +209,3 @@ xray wg [-i "(base64.StdEncoding)"]
|
||||
- 工作目录(Working Directory)
|
||||
- [环境变量](../config/features/env.md#资源文件路径)中 `Xray.location.asset` 所指定的路径
|
||||
:::
|
||||
|
||||
|
||||
|
@ -85,13 +85,14 @@
|
||||
"rules": [
|
||||
{
|
||||
"type": "field",
|
||||
"ip": ["geoip:private","geoip:cn"], // 绕过局域网和国内IP段
|
||||
"ip": ["geoip:private", "geoip:cn"], // 绕过局域网和国内IP段
|
||||
"outboundTag": "direct"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
上述配置唯一要更改的地方是你的服务器 IP 和用户 uuid,配置中已注明。上述配置会把除局域网(比如访问路由器)和国内IP段(比如访问bilibili、acfun)以外的所有流量转发至你的服务器。
|
||||
|
||||
## 运行
|
||||
|
@ -5,7 +5,7 @@
|
||||
Xray 在以下平台中可用:
|
||||
|
||||
- Windows 7 及之后版本(x86 / amd64 / arm32 / arm64);
|
||||
- Windows 7 中使用 1.8.4、1.8.6 的常规版本以及 1.8.18 以后的 ```win7``` 版本需要系统安装有 **KB4474419** 更新方可使用;推荐同时安装 KB4490628 以便联网后接受后续的操作系统安全更新。
|
||||
- Windows 7 中使用 1.8.4、1.8.6 的常规版本以及 1.8.18 以后的 `win7` 版本需要系统安装有 **KB4474419** 更新方可使用;推荐同时安装 KB4490628 以便联网后接受后续的操作系统安全更新。
|
||||
- macOS 10.10 Yosemite 及之后版本(amd64 / arm64);
|
||||
- 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 等;
|
||||
|
@ -85,9 +85,9 @@ Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的
|
||||
|
||||
- 如果第 3 步你有仔细观察,就会发现保存并不是常见的 `ctrl+s`。
|
||||
- 正确的快捷键:保存是 `ctrl+o` + `回车`,退出是 `ctrl+x`
|
||||
|
||||
- (部分操作系统) 新增一个防火墙规则,设置为新增的SSH端口, 否则实例重启后无法SSH登陆。
|
||||
- 如 Ubuntu 的 ufw
|
||||
|
||||
```shell
|
||||
sudo ufw allow 9753/tcp
|
||||
```
|
||||
|
@ -31,10 +31,13 @@
|
||||
3. 如果无法看到上述Nginx默认页面,可能是需要配置Debian系统上默认的防火墙组件Uncomplicated Firewall (UFW),以便启用 HTTP (80) 和 HTTPS (443) 端口流量。
|
||||
|
||||
a. 验证方法,输入:
|
||||
|
||||
```shell
|
||||
sudo ufw status
|
||||
```
|
||||
|
||||
b. 如果输出如下,表明80和433端口未开启,需要执行c步骤
|
||||
|
||||
```shell
|
||||
Status: active
|
||||
To Action From
|
||||
@ -42,11 +45,15 @@
|
||||
22/tcp ALLOW Anywhere
|
||||
22/tcp (v6) ALLOW Anywhere (v6)
|
||||
```
|
||||
|
||||
c. 启用UFW的Nginx 80 和 443 端口命令
|
||||
|
||||
```shell
|
||||
sudo ufw allow 'Nginx Full'
|
||||
```
|
||||
|
||||
d. 输入a中命令再次验证,如果输出如下,表示Nginx流量已经被防火墙放行,这样就应该可以看到前述第2点中的Nginx默认页面。
|
||||
|
||||
```shell
|
||||
Status: active
|
||||
To Action From
|
||||
@ -57,7 +64,6 @@
|
||||
Nginx Full (v6) ALLOW Anywhere (v6)
|
||||
```
|
||||
|
||||
|
||||
## 5.3 创建一个最简单的网页
|
||||
|
||||
1. 小小白白 Linux 基础命令:
|
||||
@ -130,7 +136,7 @@
|
||||
chmod -R a+r .
|
||||
```
|
||||
|
||||
6. 修改 `nginx.conf` 并重启 `Nginx` 服务,将`80`端口的 http 访问定位到刚才建立的 `html` 页面上
|
||||
5. 修改 `nginx.conf` 并重启 `Nginx` 服务,将`80`端口的 http 访问定位到刚才建立的 `html` 页面上
|
||||
|
||||
1. 修改 `nginx.conf` 。
|
||||
|
||||
|
@ -41,6 +41,7 @@ Endpoint = <EndpointIP>:<Port>
|
||||
```
|
||||
|
||||
在 `[Interface]` 下添加如下命令:
|
||||
|
||||
```ini
|
||||
Table = <table>
|
||||
### fwmark
|
||||
@ -59,13 +60,14 @@ PostDown = ip rule del oif %i lookup <table>
|
||||
PreUp = ip -6 rule add oif %i lookup <table>
|
||||
PostDown = ip -6 rule del oif %i lookup <table>
|
||||
```
|
||||
|
||||
::: tip
|
||||
|
||||
- 此配置文件融合了 `fwmark` / `sendThrough` / `sockopt.interface`,表示
|
||||
- 送入此设备 `%i` 的连接 / 送入此 `<IPv4/6>` 的连接 / `fwmark` 被标记为 `<mark>` 的连接
|
||||
- 将会使用 wireguard 进行转发
|
||||
- `%i` 是 wireguard 配置文件中的占位符,表示在启动时替换为这个设备的名称
|
||||
:::
|
||||
|
||||
:::
|
||||
|
||||
保存
|
||||
|
||||
@ -242,4 +244,5 @@ systemctl start wg-quick@wg0
|
||||
## 感谢
|
||||
|
||||
[XTLS/Xray-core](https://github.com/XTLS/Xray-core); [v2fly/v2ray-core](https://github.com/v2fly/v2ray-core); [WireGuard](https://www.wireguard.com/); [@p3terx](https://p3terx.com/); @w; @Hiram; @Luminous; @Ln; @JackChou;
|
||||
|
||||
<!--剩下几位大佬我实在找不到他们的地址或Github空间,请大家帮忙找吧-->
|
@ -91,6 +91,7 @@ Linux 使用`Netfilter`来管理网络,`Netfilter`模型如下:
|
||||
4. 能够手写客户端 json 文件配置,至少要能看懂
|
||||
|
||||
### 前期准备工作
|
||||
|
||||
::: warning
|
||||
在开始操作前,记得使用 `sysctl -w net.ipv4.ip_forward=1` 打开linux ipv4封包转发
|
||||
:::
|
||||
|
@ -15,7 +15,9 @@ Xray(1.6.5+)新加入了 WireGuard 出站,虽然增加的代码和依赖
|
||||
## 申请 Warp 账户
|
||||
|
||||
### 感谢 Cloudflare 推动自由的互联网,现在你可以免费使用 Warp 服务,连接的时候会根据出口自动选择最近的服务器
|
||||
|
||||
#### 方法 1:
|
||||
|
||||
1. 使用一台 vps,下载 [wgcf](https://github.com/ViRb3/wgcf/releases)
|
||||
2. 运行 `wgcf register` 生成 `wgcf-account.toml`
|
||||
3. 运行 `wgcf generate` 生成 `wgcf-profile.conf` 拷贝内容如下:
|
||||
@ -33,17 +35,22 @@ AllowedIPs = 0.0.0.0/0
|
||||
AllowedIPs = ::/0
|
||||
Endpoint = engage.cloudflareclient.com:2408
|
||||
```
|
||||
|
||||
#### 方法 2:
|
||||
|
||||
1. 使用 [warp-reg.sh](https://github.com/chise0713/warp-reg.sh),运行:
|
||||
|
||||
```
|
||||
bash -c "$(curl -L warp-reg.vercel.app)"
|
||||
```
|
||||
|
||||
- 输出
|
||||
|
||||
```json
|
||||
{
|
||||
"endpoint":{
|
||||
"endpoint": {
|
||||
"v4": "162.159.192.7",
|
||||
"v6": "[2606:4700:d0::a29f:c007]",
|
||||
"v6": "[2606:4700:d0::a29f:c007]"
|
||||
},
|
||||
"reserved_dec": [35, 74, 190],
|
||||
"reserved_hex": "0x234abe",
|
||||
@ -54,13 +61,19 @@ bash -c "$(curl -L warp-reg.vercel.app)"
|
||||
"v6": "2606:4700:110:81f3:2a5b:3cad:9d4:9ea6"
|
||||
}
|
||||
```
|
||||
|
||||
2. 拷贝输出的内容
|
||||
|
||||
#### 方法 3:
|
||||
|
||||
1. 使用[wgcf-cli](https://github.com/ArchiveNetwork/wgcf-cli),运行以下内容进行安装:
|
||||
|
||||
```
|
||||
bash -c "$(curl -L wgcf-cli.vercel.app)"
|
||||
```
|
||||
|
||||
2. 运行 `wgcf-cli register` 进行注册,输出:
|
||||
|
||||
```json
|
||||
❯ wgcf-cli register
|
||||
{
|
||||
@ -83,38 +96,33 @@ bash -c "$(curl -L wgcf-cli.vercel.app)"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- 完整文件将会保存到工作目录的 `wgcf.json` 内。
|
||||
|
||||
3. 运行 `wgcf-cli generate --xray` 来生成一个WireGurad出站,他会将内容保存到 `wgcf.xray.json` 内
|
||||
|
||||
- 示例文件:
|
||||
|
||||
```json
|
||||
{
|
||||
"protocol": "wireguard",
|
||||
"settings": {
|
||||
"secretKey": "6CRVRLgFwGajnikoVOPTDNZnDhx3EydhPsMgpxHfBCY=",
|
||||
"address": [
|
||||
"172.16.0.2/32",
|
||||
"2606:4700:110:857a:6a95:fe27:1870:2a9d/128"
|
||||
],
|
||||
"address": ["172.16.0.2/32", "2606:4700:110:857a:6a95:fe27:1870:2a9d/128"],
|
||||
"peers": [
|
||||
{
|
||||
"publicKey": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=",
|
||||
"allowedIPs": [
|
||||
"0.0.0.0/0",
|
||||
"::/0"
|
||||
],
|
||||
"allowedIPs": ["0.0.0.0/0", "::/0"],
|
||||
"endpoint": "162.159.192.1:2408"
|
||||
}
|
||||
],
|
||||
"reserved": [
|
||||
240,
|
||||
25,
|
||||
146
|
||||
],
|
||||
"reserved": [240, 25, 146],
|
||||
"mtu": 1280
|
||||
},
|
||||
"tag": "wireguard"
|
||||
}
|
||||
```
|
||||
|
||||
## 在服务端分流回国流量至 warp
|
||||
|
||||
在现有出站中新增一个 WireGurad 出站
|
||||
@ -131,7 +139,7 @@ bash -c "$(curl -L wgcf-cli.vercel.app)"
|
||||
"endpoint": "engage.cloudflareclient.com:2408"
|
||||
}
|
||||
],
|
||||
"reserved":[0, 0, 0] // 如果你有的话,粘贴reserved到这里
|
||||
"reserved": [0, 0, 0] // 如果你有的话,粘贴reserved到这里
|
||||
},
|
||||
"tag": "wireguard-1"
|
||||
}
|
||||
|
@ -165,6 +165,7 @@ Like WebSocket, HTTPUpgrade now also has 0-RTT.
|
||||
## 2024.3.11 <Badge>[v1.8.9](https://github.com/XTLS/Xray-core/releases/tag/v1.8.9)</Badge>
|
||||
|
||||
Added HTTPUpgrade transport, said to be lighter than WebSocket.
|
||||
|
||||
- Already added to the sharing link package.
|
||||
|
||||
## 2024.2.29
|
||||
@ -438,9 +439,9 @@ This is a maintenance release. Development continues…
|
||||
|
||||
Now, an open-source, free Android client based on Xray-core is available—[AnXray](https://github.com/XTLS/AnXray)! Maintained by [@nekohasekai](https://github.com/nekohasekai).
|
||||
|
||||
- Supports numerous protocols and plugins.
|
||||
- Chief visual designer [@RPRX](https://github.com/RPRX) designed an X-style logo, slogan, and a unique black-and-white material theme.
|
||||
- There's also a small Easter egg waiting to be discovered in the app.
|
||||
- Supports numerous protocols and plugins.
|
||||
- Chief visual designer [@RPRX](https://github.com/RPRX) designed an X-style logo, slogan, and a unique black-and-white material theme.
|
||||
- There's also a small Easter egg waiting to be discovered in the app.
|
||||
|
||||
Spent the last few days refining details from morning till night. We hope you'll star and follow the project.
|
||||
|
||||
|
@ -34,7 +34,6 @@ The IP and port that the API service listens on. This is an optional configurati
|
||||
|
||||
When you omit this item, you need to add inbounds and routing configurations according to the examples in the [relevant configurations below](#related-configuration).
|
||||
|
||||
|
||||
> `services`: [string]
|
||||
|
||||
List of enabled APIs, optional values can be found in [Supported API List](#supported-api-list).
|
||||
@ -84,7 +83,6 @@ Add api to basic configuration
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
## Supported API List
|
||||
|
||||
### HandlerService
|
||||
@ -102,11 +100,11 @@ APIs that modify the inbound and outbound proxies, with the following available
|
||||
|
||||
API for adding, deleting, and replacing routing rules and querying equalizer statistics. The available functions are as follows:
|
||||
|
||||
* `adrules` adds and replaces routing configuration
|
||||
* `rmrules` delete routing rules
|
||||
* `sib` Disconnect source IP
|
||||
* `bi` Query equalizer statistics
|
||||
* `bo` Forces the equalizer to select the specified outboundTag
|
||||
- `adrules` adds and replaces routing configuration
|
||||
- `rmrules` delete routing rules
|
||||
- `sib` Disconnect source IP
|
||||
- `bi` Query equalizer statistics
|
||||
- `bo` Forces the equalizer to select the specified outboundTag
|
||||
|
||||
You can use something like `./xray help api bi` to query the specific usage.
|
||||
|
||||
|
@ -61,17 +61,13 @@ If the domain name to be queried:
|
||||
},
|
||||
{
|
||||
"address": "https://1.1.1.1/dns-query",
|
||||
"domains": [
|
||||
"geosite:netflix"
|
||||
],
|
||||
"domains": ["geosite:netflix"],
|
||||
"skipFallback": true,
|
||||
"queryStrategy": "UseIPv4"
|
||||
},
|
||||
{
|
||||
"address": "https://1.1.1.1/dns-query",
|
||||
"domains": [
|
||||
"geosite:openai"
|
||||
],
|
||||
"domains": ["geosite:openai"],
|
||||
"skipFallback": true,
|
||||
"queryStrategy": "UseIPv6"
|
||||
},
|
||||
|
@ -12,12 +12,12 @@ The TLS fingerprinting behavior is perfect this way, and so it may be possible t
|
||||
|
||||
However, there are many drawbacks:
|
||||
|
||||
* The user has to launch a browser next to the Xray client just for opening the proxy connection.
|
||||
* The browser dialer must not be tunneled through the proxy itself, otherwise there is a loop. TUN users should be cautious.
|
||||
* The browser can only speak standard HTTP, which means that only [WebSocket](../../transports/websocket.md) and [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113) are supported
|
||||
* [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) needs to be considered when making requests from one website (`localhost:8080`) to another (`proxy.example.com:443`)
|
||||
* The browser tunnels your traffic using JavaScript, so there is a significant performance penalty (or, battery drain)
|
||||
* The configuration to be used with browser dialer cannot use custom SNI or host headers. `SNI == host == address`. Custom HTTP headers and `tlsSettings` are ignored entirely.
|
||||
- The user has to launch a browser next to the Xray client just for opening the proxy connection.
|
||||
- The browser dialer must not be tunneled through the proxy itself, otherwise there is a loop. TUN users should be cautious.
|
||||
- The browser can only speak standard HTTP, which means that only [WebSocket](../../transports/websocket.md) and [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113) are supported
|
||||
- [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) needs to be considered when making requests from one website (`localhost:8080`) to another (`proxy.example.com:443`)
|
||||
- The browser tunnels your traffic using JavaScript, so there is a significant performance penalty (or, battery drain)
|
||||
- The configuration to be used with browser dialer cannot use custom SNI or host headers. `SNI == host == address`. Custom HTTP headers and `tlsSettings` are ignored entirely.
|
||||
|
||||
## Configuration
|
||||
|
||||
|
@ -3,6 +3,7 @@
|
||||
The [Shadowsocks](https://en.wikipedia.org/wiki/Shadowsocks) protocol is compatible with most other implementations of Shadowsocks. The server supports TCP and UDP packet forwarding, with an option to selectively disable UDP.
|
||||
|
||||
### Supported Encryption Methods
|
||||
|
||||
The currently supported methods are following:
|
||||
|
||||
- Recommended encryption methods:
|
||||
@ -68,13 +69,15 @@ Required, any of the [supported methods](#supportedencryptionmethods)
|
||||
> `password`: string
|
||||
|
||||
Required. For **Shadowsocks 2022** a pre-shared `base64` random key similar to WireGuard's keys should be used as the password. The command
|
||||
|
||||
```sh
|
||||
openssl rand -base64 <length>
|
||||
```
|
||||
|
||||
could used to generate a key. The length of the required key for `shadowsocks-rust` implementation depends on the encryption method:
|
||||
|
||||
| Encryption Method | Key Length |
|
||||
| ----------------------------- | ---------: |
|
||||
| ------------------------------- | ---------: |
|
||||
| `2022-blake3-aes-128-gcm` | 16 |
|
||||
| `2022-blake3-aes-256-gcm` | 32 |
|
||||
| `2022-blake3-chacha20-poly1305` | 32 |
|
||||
@ -82,6 +85,7 @@ could used to generate a key. The length of the required key for `shadowsocks-ru
|
||||
In the `go-shadowsocks` implementation written in Golang, a 32-byte key always works.
|
||||
|
||||
For **any other encryption method** _any string_ could be used. There is no limitation on the password length, but shorter passwords are more susceptible to cracking. It is recommended to use a random-generated password of 16 characters or longer. The following example generates 40-characters length password:
|
||||
|
||||
```sh
|
||||
sudo strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 40 | tr -d '\n'; echo
|
||||
```
|
||||
|
@ -88,6 +88,4 @@ Currently, the following flow control modes are available for inbound protocols:
|
||||
- No `flow` or empty string: Use regular TLS proxy.
|
||||
- `xtls-rprx-vision`: Use the new XTLS mode, including inner-handshake random padding.
|
||||
|
||||
|
||||
|
||||
Additionally, XTLS currently only supports TCP+TLS/Reality.
|
||||
|
@ -14,11 +14,11 @@ User-space implementation of the Wireguard protocol.
|
||||
"peers": [
|
||||
{
|
||||
"publicKey": "PUBLIC_KEY",
|
||||
"allowedIPs":[""]
|
||||
"allowedIPs": [""]
|
||||
}
|
||||
],
|
||||
"kernelMode": true, // optional, default true if it's supported and permission is sufficient
|
||||
"mtu": 1420, // optional, default 1420
|
||||
"mtu": 1420 // optional, default 1420
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -51,13 +51,13 @@ The log level for error logs, indicating the information that needs to be record
|
||||
Log DNS queries made by built-in [DNS clients](./dns.md) to the access log. Example log record: `DOH//doh.server got answer: domain.com -> [ip1, ip2] 2.333ms`.
|
||||
|
||||
::: tip
|
||||
|
||||
1. Xray doesn't perform all DNS queries via its built-in clients. Therefore, enabling this option doesn't mean that all DNS queries performed by Xray will be logged.
|
||||
|
||||
2. DNS queries made by built-in [DNS clients](./dns.md) are also logged to the error log (with "Info" level) even if this option is disabled.
|
||||
3.
|
||||
4. FakeDNS client queries are never logged to the access log.
|
||||
:::
|
||||
|
||||
:::
|
||||
|
||||
> `maskAddress`: "quarter" | "half" | "full"
|
||||
|
||||
|
@ -55,8 +55,9 @@ Access `http://127.0.0.1:11111/debug/pprof/` or use go tool pprof to start profi
|
||||
Access `http://127.0.0.1:11111/debug/vars`
|
||||
|
||||
Variables exported include:
|
||||
* `stats` includes statistics about inbounds, outbounds and users
|
||||
* `observatory` includes observatory results
|
||||
|
||||
- `stats` includes statistics about inbounds, outbounds and users
|
||||
- `observatory` includes observatory results
|
||||
|
||||
for example with [luci-app-xray](https://github.com/yichya/luci-app-xray) you are likely to get a result like this (standard expvar things like `cmdline` and `memstats` are omitted)
|
||||
|
||||
@ -149,6 +150,7 @@ for example with [luci-app-xray](https://github.com/yichya/luci-app-xray) you ar
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
To get a better view of these numbers, [Netdata](https://github.com/netdata/netdata) (with python.d plugin) is a great option:
|
||||
@ -263,6 +265,7 @@ xray:
|
||||
id: udp
|
||||
expvar_type: int
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
And you will get a nice plot like this:
|
||||
@ -270,6 +273,7 @@ And you will get a nice plot like this:
|
||||

|
||||
|
||||
### Additional
|
||||
|
||||
Maybe reusing the empty object `stats` in config file is better than adding `metrics` here?
|
||||
|
||||
**Edit:** removed prometheus related things and added usage about expvars
|
||||
|
@ -8,11 +8,10 @@ components, such as load balancers. There are currently two options:
|
||||
You can choose one of them as needed.
|
||||
|
||||
## ObservatoryObject
|
||||
|
||||
```json
|
||||
{
|
||||
"subjectSelector":[
|
||||
"outbound"
|
||||
],
|
||||
"subjectSelector": ["outbound"],
|
||||
"probeUrl": "https://www.google.com/generate_204",
|
||||
"probeInterval": "10s",
|
||||
"enableConcurrency": false
|
||||
@ -37,11 +36,10 @@ The interval at which probes are initiated. The time format is a number followed
|
||||
- `false`: Probe each matching outbound proxy one by one, pausing for the time set by `probeInterval` after probing each one.
|
||||
|
||||
## BurstObservatoryObject
|
||||
|
||||
```json
|
||||
{
|
||||
"subjectSelector":[
|
||||
"outbound"
|
||||
],
|
||||
"subjectSelector": ["outbound"],
|
||||
"pingConfig": {}
|
||||
}
|
||||
```
|
||||
@ -52,8 +50,8 @@ An array of strings, where each string is used to match the prefix of outbound p
|
||||
|
||||
> `pingConfig`: [PingConfigObject](#PingConfigObject)
|
||||
|
||||
|
||||
### PingConfigObject
|
||||
|
||||
```json
|
||||
{
|
||||
"destination": "https://connectivitycheck.gstatic.com/generate_204",
|
||||
|
@ -14,23 +14,23 @@ Freedom is an outbound protocol that can be used to send (normal) TCP or UDP dat
|
||||
"length": "100-200",
|
||||
"interval": "10-20" // ms
|
||||
},
|
||||
"noises":[
|
||||
"noises": [
|
||||
{
|
||||
"type":"base64",
|
||||
"packet":"7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=",
|
||||
"delay":"10-16"
|
||||
"type": "base64",
|
||||
"packet": "7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=",
|
||||
"delay": "10-16"
|
||||
},
|
||||
{
|
||||
"type":"rand",
|
||||
"packet":"10-20",
|
||||
"delay":"10-16"
|
||||
"type": "rand",
|
||||
"packet": "10-20",
|
||||
"delay": "10-16"
|
||||
},
|
||||
{
|
||||
"type":"str",
|
||||
"packet":"hiGFW",
|
||||
"delay":"10-16"
|
||||
"type": "str",
|
||||
"packet": "hiGFW",
|
||||
"delay": "10-16"
|
||||
}
|
||||
],
|
||||
],
|
||||
"proxyProtocol": 0
|
||||
}
|
||||
```
|
||||
@ -76,7 +76,7 @@ A key-value map used to control TCP fragmentation,under some circumstances it
|
||||
|
||||
::: warning
|
||||
⚠️ "noise":{} is deptecated,only "noises":[{}] is supported in 24.9.16 and later
|
||||
:::
|
||||
:::
|
||||
|
||||
> `noises`: [ noiseObject ]
|
||||
|
||||
|
@ -20,15 +20,15 @@ This tag can be used as `inboundTag` in routing rules, all traffics going throug
|
||||
|
||||
If you need to do some more detailed routing for traffics that have been routed by routing rules, like splitting routed traffics to TCP traffics and UDP traffics and send them to different outbounds, this can be done with `loopback` outbound.
|
||||
|
||||
``` jsonc
|
||||
```jsonc
|
||||
{
|
||||
"outbounds": [
|
||||
{
|
||||
"protocol": "loopback",
|
||||
"tag": "need-to-split",
|
||||
"settings": {
|
||||
"inboundTag": "traffic-input" // This tag will be used as the inboundTag inside the RuleObject
|
||||
}
|
||||
"inboundTag": "traffic-input", // This tag will be used as the inboundTag inside the RuleObject
|
||||
},
|
||||
},
|
||||
{
|
||||
"tag": "tcp-output",
|
||||
@ -37,21 +37,21 @@ If you need to do some more detailed routing for traffics that have been routed
|
||||
{
|
||||
"tag": "udp-output",
|
||||
// protocol, settings, streamSettings etc.
|
||||
}
|
||||
},
|
||||
],
|
||||
"routing": {
|
||||
"rules": [
|
||||
{
|
||||
"inboundTag": ["traffic-input"], // tag set in the loopback outbound setting
|
||||
"network": "tcp",
|
||||
"outboundTag": "tcp-output"
|
||||
"outboundTag": "tcp-output",
|
||||
},
|
||||
{
|
||||
"inboundTag": ["traffic-input"], // tag set in the loopback outbound
|
||||
"network": "udp",
|
||||
"outboundTag": "udp-output"
|
||||
}
|
||||
]
|
||||
}
|
||||
"outboundTag": "udp-output",
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
```
|
||||
|
@ -69,7 +69,7 @@ If you do not write this parameter, or leave it blank, the default value is `"Fo
|
||||
When the destination address is a domain name, use the Xray-core [built-in DNS server](./dns.md) to get an IP (if no `"dns"` configuration is written, system DNS is used), and send a connection to this IP via wireguard.<br>
|
||||
|
||||
| domainStrategy | test-ipv6.com | bgp.he.net | chat.openai.com |
|
||||
| :--- | :---: | :---: | :---: |
|
||||
| :------------- | :---------------------: | :--------: | :-------------: |
|
||||
| ForceIPv6v4 | IPv6v4 | IPv6 | IPv6 |
|
||||
| ForceIPv6 | The website won't open. | IPv6 | IPv6 |
|
||||
| ForceIPv4v6 | IPv6v4 **1** | IPv4 | IPv4 |
|
||||
@ -80,6 +80,7 @@ When the destination address is a domain name, use the Xray-core [built-in DNS s
|
||||
**2:** The chances of prompting `You already have an IPv6 address, but your browser is less inclined to use it, which is more worrisome. `
|
||||
|
||||
**Note 1**:
|
||||
|
||||
- Conflicts with `"queryStrategy"` may cause the site to fail to open.
|
||||
- For example when `domainStrategy: "ForceIPv4"` is used, geosite:openai's site with `"queryStrategy": "UseIPv6"` will fail to open.
|
||||
|
||||
@ -101,6 +102,7 @@ When the destination address is a domain name, use the Xray-core [built-in DNS s
|
||||
```
|
||||
|
||||
**Note 2**:
|
||||
|
||||
- Xray-core v1.8.0 - v1.8.4 without `"domainStrategy"`.
|
||||
- When the destination address is a domain name, use the Xray-core built-in DNS server query to obtain the IP, using the value of `"queryStrategy"` in the `"dns"` configuration to control the IPv4 or IPv6 priority.
|
||||
- If the `"dns"` configuration is not written, the system DNS query is used to obtain IP, and the IPv4 or IPv6 priority is controlled by the system.
|
||||
|
@ -37,7 +37,7 @@ When `true`, the downstream must first send PROXY protocol version 1 or 2 after
|
||||
|
||||
HTTP path used by the HTTPUpgrade connection. Defaults to `"/"`.
|
||||
|
||||
If the `path` property include an `ed` query field (e.g. ```/mypath?ed=2560```), "early data" will be used to decrease latency, with the value defining the threshold of the first packet's size. If the size of the first packet exceeds the defined value, "early data" will not be applied. The recommended value is `2560`.
|
||||
If the `path` property include an `ed` query field (e.g. `/mypath?ed=2560`), "early data" will be used to decrease latency, with the value defining the threshold of the first packet's size. If the size of the first packet exceeds the defined value, "early data" will not be applied. The recommended value is `2560`.
|
||||
|
||||
> `host`: string
|
||||
|
||||
@ -45,7 +45,7 @@ HTTP Host sent by the HTTPUpgrade connection. Empty by default. If this value is
|
||||
|
||||
If the `Host` header has been defined on the server in any way, the server will validate if the `Host` header matches.
|
||||
|
||||
The current priority of the `Host` header sent by clients: ```host``` > ```headers``` > ```address```
|
||||
The current priority of the `Host` header sent by clients: `host` > `headers` > `address`
|
||||
|
||||
> `headers`: map \{string: string\}
|
||||
|
||||
|
@ -49,7 +49,7 @@ The `Host` header sent in HTTP requests. Defaults to an empty string. Servers wi
|
||||
|
||||
If the `Host` header has been defined on the server in any way, the server will validate if the `Host` header matches.
|
||||
|
||||
The current priority of the `Host` header sent by clients: ```host``` > ```headers``` > ```address```
|
||||
The current priority of the `Host` header sent by clients: `host` > `headers` > `address`
|
||||
|
||||
> `headers`: map \{string: string\}
|
||||
|
||||
|
@ -28,6 +28,7 @@ The commands are:
|
||||
Use "xray help <command>" for more information about a command.
|
||||
|
||||
```
|
||||
|
||||
### xray run
|
||||
|
||||
Specify one or more configuration files and run.
|
||||
@ -54,6 +55,7 @@ without launching the server
|
||||
|
||||
The -dump flag tells Xray to print the merged config.
|
||||
```
|
||||
|
||||
::: tip
|
||||
Except from the default JSON format, config can also use TOML and YAML. It will automatically recognized from file extensions when the `-format` flag is not set.
|
||||
:::
|
||||
@ -105,6 +107,7 @@ The commands are:
|
||||
```
|
||||
|
||||
Sub-command `pb`
|
||||
|
||||
```bash
|
||||
# Usage: xray convert pb [-debug] [-type] [json file] [json file] ...
|
||||
|
||||
@ -122,6 +125,7 @@ xray help convert pb
|
||||
```
|
||||
|
||||
Sub-command JSON
|
||||
|
||||
```bash
|
||||
# Usage: xray convert json [-type] [stdin:] [typedMessage file]
|
||||
|
||||
@ -169,6 +173,7 @@ xray uuid
|
||||
```
|
||||
|
||||
### xray x25519
|
||||
|
||||
Generate x25519 key pair。
|
||||
|
||||
Usage:
|
||||
@ -178,6 +183,7 @@ xray x25519 [-i "(base64.RawURLEncoding)" --std-encoding]
|
||||
```
|
||||
|
||||
### xray wg
|
||||
|
||||
Generate wireguard curve25519 key pair。
|
||||
|
||||
Usage:
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
- Xray is available on the following platforms:
|
||||
- Windows 7 and later (x86 / amd64 / arm32 / arm64);
|
||||
- If you need to use these version (1.8.18 and later marked with ```win7```, 1.8.6, 1.8.4) in Windows 7, operating system update **KB4474419** is required. For better Internet security, it is recommended to install KB4490628 to acquire later operating system updates from Windows Update.
|
||||
- If you need to use these version (1.8.18 and later marked with `win7`, 1.8.6, 1.8.4) in Windows 7, operating system update **KB4474419** is required. For better Internet security, it is recommended to install KB4490628 to acquire later operating system updates from Windows Update.
|
||||
- macOS 10.10 Yosemite and later (amd64 / arm64);
|
||||
- Linux 2.6.23 and later (x86 / amd64 / arm / arm64 / mips64 / mips / ppc64 / s390x / riscv64);
|
||||
- Including but not limited to Debian 7 / 8, Ubuntu 12.04 / 14.04 and subsequent versions, CentOS 7 / 8, Arch Linux, etc.;
|
||||
|
@ -57,6 +57,7 @@ First of all, I would like to respond to critics by asking a question: Is using
|
||||
Secondly, I believe that there is a fundamental difference between "not understanding" and "not wanting to understand". The bad attitude of some people who just want handouts is naturally annoying, but those who sincerely want to learn but don't know how should not be subject to unjustified contempt and discrimination. It is precisely this kind of bad community atmosphere that does not distinguish between newcomers that prompted me to write this article. So without further ado, let's take a look at the advantages and disadvantages of using an airport:
|
||||
|
||||
- Advantages of "Airports"
|
||||
|
||||
1. **Stability**: Airports usually feature multiple exit nodes, hence resistance to attempts at blocking these node, if one get block simply switch to another
|
||||
2. **Speed**: Airports typically make use of high capacity machines and high throughput network infrastructures, therefore you can expect a higher overall network speed
|
||||
3. **Safety**: Airports are generally have good security practices, such as encryption and firewalls to ensure the security of user data
|
||||
|
@ -30,7 +30,7 @@ When writing this article, the installation script had some minor bugs when usin
|
||||
1. Basic Linux commands for beginners:
|
||||
|
||||
| Number | Command name | Command description |
|
||||
| :------: | :------: | :------: |
|
||||
| :------: | :----------: | :-----------------: |
|
||||
| `cmd-14` | `rm` | delete |
|
||||
|
||||
2. Download the installation script:
|
||||
@ -94,7 +94,7 @@ chmod +r ~/xray_cert/xray.key
|
||||
1. Basic Linux commands for beginners:
|
||||
|
||||
| Number | Command name | Command description |
|
||||
| :------: | :----------: | :--------------------: |
|
||||
| :------: | :----------: | :------------------------------------: |
|
||||
| `cmd-15` | `crontab -e` | Edit the current user's scheduled task |
|
||||
|
||||
2. Create a script file (`xray-cert-renew.sh`)
|
||||
@ -194,7 +194,7 @@ First, you can refer to the [official VLESS configuration example](https://githu
|
||||
```
|
||||
|
||||
4. Copy all the files below and fill in the previously generated `UUID` into the 61st line `"id": "",`. (After filling in, it will look like `"id": "uuiduuid-uuid-uuid-uuid-uuiduuiduuid"`
|
||||
) This configuration file in this article adds my various verbose comments to help you understand the function of each configuration module.
|
||||
) This configuration file in this article adds my various verbose comments to help you understand the function of each configuration module.
|
||||
|
||||
```json
|
||||
// REFERENCE:
|
||||
@ -250,33 +250,41 @@ First, you can refer to the [official VLESS configuration example](https://githu
|
||||
},
|
||||
// 4* Inbound settings
|
||||
// 4.1 Here is only the simplest vless+xtls inbound, because this is the most powerful mode of Xray. If you need other, please add it according to the template.
|
||||
"inbounds": [{
|
||||
"inbounds": [
|
||||
{
|
||||
"port": 443,
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"clients": [{
|
||||
"clients": [
|
||||
{
|
||||
"id": "", // Fill in your UUID
|
||||
"flow": "xtls-rprx-vision",
|
||||
"level": 0,
|
||||
"email": "vpsadmin@yourdomain.com"
|
||||
}],
|
||||
}
|
||||
],
|
||||
"decryption": "none",
|
||||
"fallbacks": [{
|
||||
"fallbacks": [
|
||||
{
|
||||
"dest": 80 // Fall back to anti-detection proxy by default
|
||||
}]
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "tcp",
|
||||
"security": "tls",
|
||||
"tlsSettings": {
|
||||
"alpn": "http/1.1",
|
||||
"certificates": [{
|
||||
"certificates": [
|
||||
{
|
||||
"certificateFile": "/home/vpsadmin/xray_cert/xray.crt",
|
||||
"keyFile": "/home/vpsadmin/xray_cert/xray.key"
|
||||
}]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}],
|
||||
}
|
||||
],
|
||||
// 5*Outbound settings
|
||||
"outbounds": [
|
||||
// 5.1 The first outbound is the default rule, freedom is a direct connection to the outside (vps is already an external network, so it is a direct connection)
|
||||
@ -293,7 +301,7 @@ First, you can refer to the [official VLESS configuration example](https://githu
|
||||
}
|
||||
```
|
||||
|
||||
5) The complete process is demonstrated as follows:
|
||||
5. The complete process is demonstrated as follows:
|
||||

|
||||
|
||||
## 7.5 Start Xray service! ! (and check the service status)
|
||||
@ -469,21 +477,19 @@ If your line really has a very high packet loss rate, the only reliable solution
|
||||
8. Confirm that `BBR` is enabled
|
||||
|
||||
If you want to confirm whether `BBR` is enabled correctly, you can use the following command:
|
||||
```shell
|
||||
`shell
|
||||
lsmod | grep bbr
|
||||
```
|
||||
This should return the following result:
|
||||
```
|
||||
tcp_bbr
|
||||
```
|
||||
If you want to confirm whether the `fq` algorithm is enabled correctly, you can use the following command:
|
||||
```shell
|
||||
`
|
||||
This should return the following result:
|
||||
` tcp_bbr
|
||||
`
|
||||
If you want to confirm whether the `fq` algorithm is enabled correctly, you can use the following command:
|
||||
`shell
|
||||
lsmod | grep fq
|
||||
```
|
||||
This should return the following result:
|
||||
```
|
||||
sch_fq
|
||||
```
|
||||
`
|
||||
This should return the following result:
|
||||
` sch_fq
|
||||
`
|
||||
|
||||
## 7.8 Server Optimization 2: Enable HTTP to automatically redirect to HTTPS
|
||||
|
||||
|
@ -26,7 +26,6 @@ features:
|
||||
details: |
|
||||
Высоконастраиваемая система маршрутизации, отвечающая разнообразным требованиям использования и позволяющая максимально эффективно использовать производительность сети.
|
||||
|
||||
|
||||
- title: Полная совместимость
|
||||
details: |
|
||||
Полная совместимость с конфигурационными файлами и вызовами API v2ray-core.
|
||||
@ -101,5 +100,3 @@ footer: Лицензия CC-BY-SA 4.0 | Авторские права 2020-на
|
||||
### Динамика звезд на GitHub
|
||||
|
||||
[](https://starchart.cc/XTLS/Xray-core)
|
||||
|
||||
|
||||
|
@ -442,9 +442,9 @@ Shadowsocks-2022 — это новый протокол с переработа
|
||||
|
||||
Теперь появился открытый и бесплатный Android-клиент на основе Xray-core — [AnXray](https://github.com/XTLS/AnXray)! Поддерживается [@nekohasekai](https://github.com/nekohasekai).
|
||||
|
||||
- Поддержка множества протоколов, плагинов.
|
||||
- Главный визуальный дизайнер [@RPRX](https://github.com/RPRX) разработал логотип и слоган в X-стиле, а также уникальную материальную черно-белую тему.
|
||||
- В приложении есть небольшой сюрприз, который ждет вас.
|
||||
- Поддержка множества протоколов, плагинов.
|
||||
- Главный визуальный дизайнер [@RPRX](https://github.com/RPRX) разработал логотип и слоган в X-стиле, а также уникальную материальную черно-белую тему.
|
||||
- В приложении есть небольшой сюрприз, который ждет вас.
|
||||
|
||||
В последние два дня детали постоянно дорабатывались с утра до ночи, надеемся, что все добавят больше звезд и внимания.
|
||||
|
||||
@ -504,7 +504,7 @@ Shadowsocks-2022 — это новый протокол с переработа
|
||||
## 2021.3.3 <Badge>[1.3.1](https://github.com/XTLS/Xray-core/releases/tag/v1.3.1)</Badge>
|
||||
|
||||
- В этой версии используется Golang 1.16, который официально поддерживает Apple Silicon.
|
||||
- В то же время исправлена ошибка, которая могла вызвать панику. ~~Holmium_ считает, что это обман, нападение.~~
|
||||
- В то же время исправлена ошибка, которая могла вызвать панику. ~~Holmium\_ считает, что это обман, нападение.~~
|
||||
- Исправлено несколько устаревших проблем.
|
||||
|
||||
## 2021.2.14 <Badge>[1.3.0](https://github.com/XTLS/Xray-core/releases/tag/v1.3.0)</Badge>
|
||||
|
@ -90,5 +90,3 @@ lang: ru-RU
|
||||
> burstObservatory: [BurstObservatoryObject](./observatory.md#burstobservatoryobject)
|
||||
|
||||
Мониторинг параллельных подключений. Обнаружение состояния подключения исходящего прокси.
|
||||
|
||||
|
||||
|
@ -22,7 +22,12 @@
|
||||
"api": {
|
||||
"tag": "api",
|
||||
"listen": "127.0.0.1:8080",
|
||||
"services": ["HandlerService", "LoggerService", "StatsService", "RoutingService"]
|
||||
"services": [
|
||||
"HandlerService",
|
||||
"LoggerService",
|
||||
"StatsService",
|
||||
"RoutingService"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
@ -140,5 +145,3 @@ xray.app.stats.command.StatsService
|
||||
## Примеры вызова API
|
||||
|
||||
[Xray-API-documents](https://github.com/XTLS/Xray-API-documents) @crossfw
|
||||
|
||||
|
||||
|
@ -58,17 +58,13 @@ DNS-запросы, отправляемые встроенным DNS-серве
|
||||
},
|
||||
{
|
||||
"address": "https://8.8.8.8/dns-query",
|
||||
"domains": [
|
||||
"geosite:netflix"
|
||||
],
|
||||
"domains": ["geosite:netflix"],
|
||||
"skipFallback": true,
|
||||
"queryStrategy": "UseIPv4"
|
||||
},
|
||||
{
|
||||
"address": "https://1.1.1.1/dns-query",
|
||||
"domains": [
|
||||
"geosite:openai"
|
||||
],
|
||||
"domains": ["geosite:openai"],
|
||||
"skipFallback": true,
|
||||
"queryStrategy": "UseIPv6"
|
||||
},
|
||||
|
@ -196,7 +196,3 @@ FakeDNS будет использовать этот блок IP-адресов
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -12,12 +12,12 @@ Xray обычно использует uTLS для имитации поведе
|
||||
|
||||
Однако есть много недостатков:
|
||||
|
||||
* Пользователь должен запускать браузер рядом с клиентом Xray только для открытия прокси-соединения.
|
||||
* Browser Dialer не должен быть туннелирован через сам прокси, иначе возникнет петля. Пользователи TUN должны быть осторожны.
|
||||
* Браузер может работать только со стандартным HTTP, что означает, что поддерживаются только [WebSocket](../../transports/websocket.md) и [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113#discussioncomment-11468947).
|
||||
* [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) необходимо учитывать при выполнении запросов с одного веб-сайта (`localhost:8080`) на другой (`proxy.example.com:443`).
|
||||
* Браузер туннелирует ваш трафик с помощью JavaScript, поэтому наблюдается значительное снижение производительности (или разрядка аккумулятора).
|
||||
* Конфигурация, используемая с Browser Dialer, не может использовать собственные заголовки SNI или хоста. `SNI == host == address`. Пользовательские заголовки HTTP и `tlsSettings` игнорируются полностью.
|
||||
- Пользователь должен запускать браузер рядом с клиентом Xray только для открытия прокси-соединения.
|
||||
- Browser Dialer не должен быть туннелирован через сам прокси, иначе возникнет петля. Пользователи TUN должны быть осторожны.
|
||||
- Браузер может работать только со стандартным HTTP, что означает, что поддерживаются только [WebSocket](../../transports/websocket.md) и [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113#discussioncomment-11468947).
|
||||
- [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) необходимо учитывать при выполнении запросов с одного веб-сайта (`localhost:8080`) на другой (`proxy.example.com:443`).
|
||||
- Браузер туннелирует ваш трафик с помощью JavaScript, поэтому наблюдается значительное снижение производительности (или разрядка аккумулятора).
|
||||
- Конфигурация, используемая с Browser Dialer, не может использовать собственные заголовки SNI или хоста. `SNI == host == address`. Пользовательские заголовки HTTP и `tlsSettings` игнорируются полностью.
|
||||
|
||||
## Конфигурация
|
||||
|
||||
@ -51,4 +51,3 @@ Xray обычно использует uTLS для имитации поведе
|
||||
[XHTTP](https://github.com/XTLS/Xray-core/discussions/4113#discussioncomment-11468947) поддерживает QUIC, но также может использоваться собственный стек QUIC браузера. В Chrome это можно сделать через `chrome://flags`, в других браузерах он может быть уже включен или для него может потребоваться другой флаг.
|
||||
|
||||
В общем, `tlsSettings` полностью игнорируются при использовании Browser Dialer. Xray никак не контролирует, какую версию HTTP выбирает браузер.
|
||||
|
||||
|
@ -98,5 +98,3 @@ VLESS будет перенаправлять трафик с длиной пе
|
||||
- [Краткое описание функции Fallbacks](../../document/level-1/fallbacks-lv1)
|
||||
|
||||
## Теория Fallbacks <Badge text="В разработке" type="warning"/>
|
||||
|
||||
|
||||
|
@ -134,5 +134,3 @@ $ xray run -confdir /etc/xray/confs
|
||||
::: tip
|
||||
Вы можете использовать команду `xray run -confdir=./confs -dump` для просмотра объединенной конфигурации. Однако, поскольку ядро использует формат данных protobuf, формат вывода конфигурации для параметра `-dump` будет отличаться.
|
||||
:::
|
||||
|
||||
|
||||
|
@ -3,5 +3,3 @@
|
||||
> **XTLS - это оригинальная технология Xray, которая является ключевым фактором высокой производительности Xray.**
|
||||
|
||||
<Badge text="WIP" type="warning"/>
|
||||
|
||||
|
||||
|
@ -212,8 +212,3 @@ Xray будет использовать доменные имена, обнар
|
||||
Количество случайных портов.
|
||||
Минимальное значение - `1`, максимальное значение - треть от диапазона портов, указанного в `port`.
|
||||
Рекомендуемое значение - `3`.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -70,5 +70,3 @@
|
||||
> `pass`: string
|
||||
|
||||
Пароль, тип данных: строка. Обязательный параметр.
|
||||
|
||||
|
||||
|
@ -66,7 +66,7 @@
|
||||
Используйте команду `openssl rand -base64 <длина>` для генерации ключа, совместимого с shadowsocks-rust, длина зависит от используемого метода шифрования.
|
||||
|
||||
| Метод шифрования | Длина ключа |
|
||||
| ------------------------------------ | ----------: |
|
||||
| ----------------------------- | ----------: |
|
||||
| 2022-blake3-aes-128-gcm | 16 |
|
||||
| 2022-blake3-aes-256-gcm | 32 |
|
||||
| 2022-blake3-chacha20-poly1305 | 32 |
|
||||
@ -106,5 +106,3 @@
|
||||
Обратите внимание, что SS2022, в отличие от старого SS, не игнорирует `"password"` верхнего уровня, правильный способ записи пароля клиента: `ServerPassword:UserPassword`. Например: `"password": "114514:1919810"`
|
||||
|
||||
Остальные опции имеют то же значение, что и в InboundConfigurationObject.
|
||||
|
||||
|
||||
|
@ -55,7 +55,6 @@
|
||||
|
||||
**Предупреждение**: если на вашей машине настроено несколько IP-адресов, это может повлиять на работу [inbound](../inbound.md#inboundobject), когда для UDP используется `0.0.0.0`.
|
||||
|
||||
|
||||
> `userLevel`: number
|
||||
|
||||
Уровень пользователя. Подключение будет использовать [локальную политику](../policy.md#levelpolicyobject), соответствующую этому уровню пользователя.
|
||||
|
@ -68,7 +68,3 @@ Trojan в Xray имеет полную поддержку fallbacks, конфи
|
||||
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
|
||||
|
||||
Значение userLevel соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -103,5 +103,3 @@ VMess полагается на системное время. Убедитес
|
||||
Уровень пользователя, который будет использоваться соединением для определения соответствующей [локальной политики](../policy.md#levelpolicyobject).
|
||||
|
||||
Значение `level` соответствует значению `level` в [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.
|
||||
|
||||
|
||||
|
@ -14,7 +14,7 @@
|
||||
"peers": [
|
||||
{
|
||||
"publicKey": "PUBLIC_KEY",
|
||||
"allowedIPs":[""]
|
||||
"allowedIPs": [""]
|
||||
}
|
||||
],
|
||||
"mtu": 1420 // необязательно, по умолчанию 1420
|
||||
@ -44,7 +44,8 @@
|
||||
- 16 байт — аутентификационный тег
|
||||
```
|
||||
|
||||
```N байт — зашифрованные данные``` — это и есть значение MTU, которое зависит от того, используется ли IPv4 или IPv6. Значение может быть 1440 (IPv4) или 1420 (IPv6). В особых условиях значение может быть дополнительно уменьшено (например, для PPPoE — минус 8 байт).
|
||||
`N байт — зашифрованные данные` — это и есть значение MTU, которое зависит от того, используется ли IPv4 или IPv6. Значение может быть 1440 (IPv4) или 1420 (IPv6). В особых условиях значение может быть дополнительно уменьшено (например, для PPPoE — минус 8 байт).
|
||||
|
||||
</details>
|
||||
|
||||
> `peers`: \[ [Peers](#peers) \]
|
||||
|
@ -60,12 +60,13 @@ LogObject соответствует полю `log` в конфигурацио
|
||||
Записывать DNS-запросы, сделанные встроенными DNS-клиентами, в журнал доступа. Пример записи в журнале: DOH//doh.server got answer: domain.com -> [ip1, ip2] 2.333ms.
|
||||
|
||||
::: tip
|
||||
|
||||
1. Xray не выполняет все DNS-запросы через свои встроенные клиенты. Поэтому включение этой опции не означает, что все DNS-запросы, выполняемые Xray, будут записаны в журнал.
|
||||
|
||||
2. DNS-запросы, сделанные встроенными DNS-клиентами, также записываются в журнал ошибок (с уровнем "Info") даже если эта опция отключена.
|
||||
|
||||
3. Запросы клиента FakeDNS никогда не записываются в журнал доступа.
|
||||
:::
|
||||
:::
|
||||
|
||||
> `maskAddress`: "quarter" | "half" | "full"
|
||||
|
||||
|
@ -36,8 +36,9 @@
|
||||
Перейдите по адресу `http://127.0.0.1:11111/debug/vars`.
|
||||
|
||||
Содержит следующие переменные:
|
||||
* `stats`: включает все данные о входящих и исходящих соединениях, а также о пользователях.
|
||||
* `observatory`: содержит результаты наблюдений observatory.
|
||||
|
||||
- `stats`: включает все данные о входящих и исходящих соединениях, а также о пользователях.
|
||||
- `observatory`: содержит результаты наблюдений observatory.
|
||||
|
||||
Например, в [luci-app-xray](https://github.com/yichya/luci-app-xray) вы можете получить следующий вывод (стандартное содержимое expvar, такое как cmdline и memstats, опущено):
|
||||
|
||||
@ -130,6 +131,7 @@
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Для лучшей визуализации можно использовать [Netdata](https://github.com/netdata/netdata) (с плагином python.d):
|
||||
@ -244,6 +246,7 @@ xray:
|
||||
id: udp
|
||||
expvar_type: int
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Вы получите результат, подобный этому:
|
||||
|
@ -8,9 +8,7 @@
|
||||
|
||||
```json
|
||||
{
|
||||
"subjectSelector":[
|
||||
"outbound"
|
||||
],
|
||||
"subjectSelector": ["outbound"],
|
||||
"probeUrl": "https://www.google.com/generate_204",
|
||||
"probeInterval": "10s",
|
||||
"enableConcurrency": false
|
||||
@ -41,9 +39,7 @@ URL-адрес, используемый для проверки состоян
|
||||
|
||||
```json
|
||||
{
|
||||
"subjectSelector":[
|
||||
"outbound"
|
||||
],
|
||||
"subjectSelector": ["outbound"],
|
||||
"pingConfig": {}
|
||||
}
|
||||
```
|
||||
@ -55,7 +51,6 @@ URL-адрес, используемый для проверки состоян
|
||||
|
||||
> `pingConfig`: [PingConfigObject](#PingConfigObject)
|
||||
|
||||
|
||||
### PingConfigObject
|
||||
|
||||
```json
|
||||
@ -92,9 +87,3 @@ URL-адрес, используемый для проверки подключ
|
||||
|
||||
Время ожидания ответа при проверке.
|
||||
Формат такой же, как и у `interval`.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -158,10 +158,3 @@ Mux нужно включать только на клиенте, сервер
|
||||
- `skip` - не использовать Mux для трафика UDP/443.
|
||||
Будет использоваться исходный способ передачи UDP-трафика для данного протокола прокси.
|
||||
Например, `Shadowsocks` будет использовать нативный UDP, а `VLESS` будет использовать UoT.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -32,7 +32,3 @@ Blackhole отправит указанный ответ после получе
|
||||
Если `type` равен `"none"` (значение по умолчанию), Blackhole просто закроет соединение.
|
||||
|
||||
Если `type` равен `"http"`, Blackhole вернет простой пакет HTTP 403, а затем закроет соединение.
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -36,7 +36,7 @@ Freedom — это исходящий протокол, который можн
|
||||
- При использовании `"AsIs"`, Xray будет напрямую использовать приоритет подключений по умолчанию в Golang. По некоторым причинам, UDP-соединения, использующие доменное имя, игнорируют системные настройки приоритета IPv4.
|
||||
|
||||
- При указании других значений для разрешения будет использоваться [встроенный DNS-сервер](../dns.md) Xray-core. Если `DNSObject` не существует, будет использоваться системный DNS. Если имеется несколько подходящих IP-адресов, ядро случайным образом выберет один из них в качестве целевого IP-адреса.
|
||||
- `"IPv4"` означает попытку установить соединение, используя только IPv4, `"IPv4v6"` означает попытку соединения с использованием IPv4 или IPv6, но для доменов с двойным стеком будет использоваться IPv4. *(Если поменять местами v4 и v6, логика остается аналогичной)*
|
||||
- `"IPv4"` означает попытку установить соединение, используя только IPv4, `"IPv4v6"` означает попытку соединения с использованием IPv4 или IPv6, но для доменов с двойным стеком будет использоваться IPv4. _(Если поменять местами v4 и v6, логика остается аналогичной)_
|
||||
|
||||
- Если в настройках встроенного DNS указан `"queryStrategy"`, фактическое поведение будет объединено с этим параметром, и будут разрешаться только те типы IP, которые указаны в обоих параметрах. Например, `"queryStrategy": "UseIPv4"` и `"domainStrategy": "UseIP"` фактически эквивалентны `"domainStrategy": "UseIPv4"`.
|
||||
- При использовании параметров, начинающихся с `"Use"`, если результат разрешения не соответствует требованиям (например, доменное имя имеет только запись A, но используется `UseIPv6`), будет выполнен откат к `AsIs`.
|
||||
|
@ -88,6 +88,3 @@ HTTP-заголовки, пара "ключ-значение". Каждый кл
|
||||
> `pass`: string
|
||||
|
||||
Пароль, тип данных: строка. Обязательный параметр.
|
||||
|
||||
|
||||
|
||||
|
@ -20,7 +20,7 @@ Loopback - это исходящий протокол данных, которы
|
||||
|
||||
Если необходимо, чтобы трафик, уже разделенный по правилам маршрутизации, был перенаправлен другими правилами маршрутизации (например, трафик TCP и UDP, разделенный одними и теми же правилами маршрутизации, должен идти через разные исходящие соединения), можно использовать исходящее соединение `loopback`.
|
||||
|
||||
``` json
|
||||
```json
|
||||
{
|
||||
"outbounds": [
|
||||
{
|
||||
@ -31,11 +31,11 @@ Loopback - это исходящий протокол данных, которы
|
||||
}
|
||||
},
|
||||
{
|
||||
"tag": "tcp-output",
|
||||
"tag": "tcp-output"
|
||||
// Настройки protocol, settings, streamSettings и т. д.
|
||||
},
|
||||
{
|
||||
"tag": "udp-output",
|
||||
"tag": "udp-output"
|
||||
// Настройки protocol, settings, streamSettings и т. д.
|
||||
}
|
||||
],
|
||||
@ -55,5 +55,3 @@ Loopback - это исходящий протокол данных, которы
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
@ -102,7 +102,7 @@
|
||||
Используйте `openssl rand -base64 <длина>`, чтобы сгенерировать ключ, совместимый с shadowsocks-rust, длина зависит от используемого метода шифрования.
|
||||
|
||||
| Метод шифрования | Длина ключа |
|
||||
| ------------------------------------ | ----------: |
|
||||
| ----------------------------- | ----------: |
|
||||
| 2022-blake3-aes-128-gcm | 16 |
|
||||
| 2022-blake3-aes-256-gcm | 32 |
|
||||
| 2022-blake3-chacha20-poly1305 | 32 |
|
||||
@ -118,6 +118,3 @@
|
||||
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
|
||||
|
||||
Значение `level` соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.
|
||||
|
||||
|
||||
|
||||
|
@ -89,6 +89,3 @@
|
||||
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
|
||||
|
||||
Значение userLevel соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.
|
||||
|
||||
|
||||
|
||||
|
@ -6,7 +6,6 @@
|
||||
Trojan предназначен для работы в правильно настроенном зашифрованном TLS-туннеле.
|
||||
:::
|
||||
|
||||
|
||||
## OutboundConfigurationObject
|
||||
|
||||
```json
|
||||
@ -60,8 +59,3 @@ Trojan предназначен для работы в правильно нас
|
||||
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
|
||||
|
||||
Значение level соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -8,7 +8,6 @@ VLESS - это легкий транспортный протокол без с
|
||||
|
||||
В отличие от [VMess](./vmess.md), VLESS не зависит от системного времени, аутентификация также осуществляется с помощью UUID.
|
||||
|
||||
|
||||
## OutboundConfigurationObject
|
||||
|
||||
```json
|
||||
@ -135,5 +134,3 @@ Splice - это функция, предоставляемая ядром Linux,
|
||||
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
|
||||
|
||||
Значение level соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.
|
||||
|
||||
|
||||
|
@ -118,7 +118,3 @@ VMess полагается на системное время. Убедитес
|
||||
"AuthenticatedLength" включает эксперимент с аутентифицированной длиной пакета. Этот эксперимент необходимо включить одновременно на клиенте и сервере, а также запустить одну и ту же версию программы.
|
||||
|
||||
"NoTerminationSignal" включает эксперимент с отключением сигнала завершения соединения. Этот эксперимент может повлиять на стабильность проксируемого соединения.
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -72,7 +72,8 @@ MTU нижнего уровня tun в Wireguard.
|
||||
- 16 байт — аутентификационный тег
|
||||
```
|
||||
|
||||
```N байт — зашифрованные данные``` — это значение MTU. Для IPv4 оно равно 1440, для IPv6 — 1420. В особых условиях значение может быть уменьшено (например, для PPPoE — минус 8 байт).
|
||||
`N байт — зашифрованные данные` — это значение MTU. Для IPv4 оно равно 1440, для IPv6 — 1420. В особых условиях значение может быть уменьшено (например, для PPPoE — минус 8 байт).
|
||||
|
||||
</details>
|
||||
|
||||
> `reserved` \[ number \]
|
||||
|
@ -143,7 +143,3 @@ Xray будет применять различные локальные пол
|
||||
> `statsOutboundDownlink`: true | false
|
||||
|
||||
Если значение равно `true`, включить учет входящего трафика для всех исходящих подключений.
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -7,15 +7,18 @@
|
||||
Принцип работы обратного прокси примерно следующий:
|
||||
|
||||
- Предположим, на хосте A находится веб-сервер, у которого нет публичного IP-адреса и к которому нельзя получить прямой доступ из Интернета. Есть другой хост B с публичным IP-адресом. Нам нужно использовать B в качестве точки входа, перенаправляя трафик с B на A.
|
||||
|
||||
- На хосте B настраивается Xray для приема внешних запросов, поэтому он называется `portal` (портал).
|
||||
- На хосте A настраивается Xray, который отвечает за соединение переадресации от B с веб-сервером. Он называется `bridge` (мост).
|
||||
|
||||
- `bridge`
|
||||
|
||||
- `bridge` активно устанавливает соединение с `portal` для регистрации обратного канала. Целевой адрес (домен) этого соединения можно задать самостоятельно.
|
||||
- После получения трафика из Интернета, перенаправленного `portal`, `bridge` пересылает его без изменений на веб-сервер на хосте A. Конечно, для этого требуется настройка модуля маршрутизации.
|
||||
- После получения ответа `bridge` также возвращает его без изменений `portal`.
|
||||
|
||||
- `portal`
|
||||
|
||||
- Если `portal` получает запрос, и домен совпадает, это означает, что данные ответа пришли от `bridge`. Это соединение будет использовано для установления обратного канала.
|
||||
- Если `portal` получает запрос, и домен не совпадает, это означает, что соединение установлено пользователем из Интернета. Данные этого соединения будут перенаправлены на `bridge`.
|
||||
|
||||
@ -39,16 +42,16 @@
|
||||
"bridges": [
|
||||
{
|
||||
"tag": "bridge",
|
||||
"domain": "reverse-proxy.xray.internal"
|
||||
}
|
||||
"domain": "reverse-proxy.xray.internal",
|
||||
},
|
||||
],
|
||||
"portals": [
|
||||
{
|
||||
"tag": "portal",
|
||||
"domain": "reverse-proxy.xray.internal"
|
||||
}
|
||||
]
|
||||
}
|
||||
"domain": "reverse-proxy.xray.internal",
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
@ -65,7 +68,7 @@
|
||||
```jsonc
|
||||
{
|
||||
"tag": "bridge",
|
||||
"domain": "reverse-proxy.xray.internal"
|
||||
"domain": "reverse-proxy.xray.internal",
|
||||
}
|
||||
```
|
||||
|
||||
@ -83,7 +86,7 @@
|
||||
```jsonc
|
||||
{
|
||||
"tag": "portal",
|
||||
"domain": "reverse-proxy.xray.internal"
|
||||
"domain": "reverse-proxy.xray.internal",
|
||||
}
|
||||
```
|
||||
|
||||
@ -95,7 +98,6 @@
|
||||
|
||||
Домен. Когда `portal` получает трафик, если целевой домен трафика совпадает с этим доменом, `portal` считает, что текущее соединение является соединением связи, установленным `bridge`. Другой трафик будет рассматриваться как трафик, требующий пересылки. `portal` занимается идентификацией этих двух типов соединений и выполняет соответствующую пересылку.
|
||||
|
||||
|
||||
::: tip
|
||||
Один Xray может быть `bridge`, `portal` или одновременно и тем, и другим, чтобы соответствовать требованиям различных сценариев.
|
||||
:::
|
||||
@ -131,8 +133,8 @@ outbound:
|
||||
"tag": "out",
|
||||
"protocol": "freedom",
|
||||
"settings": {
|
||||
"redirect": "127.0.0.1:80"
|
||||
}
|
||||
"redirect": "127.0.0.1:80",
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
@ -147,13 +149,13 @@ outbound:
|
||||
"port": 1024,
|
||||
"users": [
|
||||
{
|
||||
"id": "5783a3e7-e373-51cd-8642-c83782b807c5"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
|
||||
},
|
||||
"tag": "interconn"
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
"tag": "interconn",
|
||||
}
|
||||
```
|
||||
|
||||
@ -169,16 +171,16 @@ outbound:
|
||||
"type": "field",
|
||||
"inboundTag": ["bridge"],
|
||||
"domain": ["full:reverse-proxy.xray.internal"],
|
||||
"outboundTag": "interconn"
|
||||
"outboundTag": "interconn",
|
||||
},
|
||||
{
|
||||
// Трафик от portal также будет выходить из bridge, но без указанного выше домена
|
||||
// маршрутизируем на out, то есть перенаправляем на веб-сервер
|
||||
"type": "field",
|
||||
"inboundTag": ["bridge"],
|
||||
"outboundTag": "out"
|
||||
}
|
||||
]
|
||||
"outboundTag": "out",
|
||||
},
|
||||
],
|
||||
}
|
||||
```
|
||||
|
||||
@ -210,8 +212,8 @@ inbound:
|
||||
"settings": {
|
||||
"address": "127.0.0.1",
|
||||
"port": 80,
|
||||
"network": "tcp"
|
||||
}
|
||||
"network": "tcp",
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
@ -224,10 +226,10 @@ inbound:
|
||||
"settings": {
|
||||
"clients": [
|
||||
{
|
||||
"id": "5783a3e7-e373-51cd-8642-c83782b807c5"
|
||||
}
|
||||
]
|
||||
}
|
||||
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
@ -241,7 +243,7 @@ inbound:
|
||||
// маршрутизируем на portal, который в конечном итоге перенаправит его на bridge
|
||||
"type": "field",
|
||||
"inboundTag": ["external"],
|
||||
"outboundTag": "portal"
|
||||
"outboundTag": "portal",
|
||||
},
|
||||
{
|
||||
// Если входящее соединение от interconn, значит, это запрос от bridge для установления обратного туннеля,
|
||||
@ -250,8 +252,8 @@ inbound:
|
||||
// маршрутизируемых на portal.
|
||||
"type": "field",
|
||||
"inboundTag": ["interconn"],
|
||||
"outboundTag": "portal"
|
||||
}
|
||||
]
|
||||
"outboundTag": "portal",
|
||||
},
|
||||
],
|
||||
}
|
||||
```
|
||||
|
@ -234,12 +234,14 @@ JSON-объект, где ключи и значения являются стр
|
||||
> `strategy`: [StrategyObject](#strategyobject)
|
||||
|
||||
#### StrategyObject
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "roundRobin",
|
||||
"settings": {}
|
||||
}
|
||||
```
|
||||
|
||||
> `type` : "random" | "roundRobin" | "leastPing" | "leastLoad"
|
||||
|
||||
- `random`: значение по умолчанию. Случайным образом выбирает соответствующий исходящий прокси.
|
||||
@ -250,6 +252,7 @@ JSON-объект, где ключи и значения являются стр
|
||||
> `settings`: [StrategySettingsObject](#strategysettingsobject)
|
||||
|
||||
##### StrategySettingsObject
|
||||
|
||||
Это необязательный параметр конфигурации, формат которого различается для разных стратегий балансировки нагрузки. В настоящее время этот параметр конфигурации можно добавить только для стратегии балансировки нагрузки `leastLoad`.
|
||||
|
||||
```json
|
||||
@ -258,11 +261,13 @@ JSON-объект, где ключи и значения являются стр
|
||||
"maxRTT": "1s",
|
||||
"tolerance": 0.01,
|
||||
"baselines": ["1s"],
|
||||
"costs": [{
|
||||
"costs": [
|
||||
{
|
||||
"regexp": false,
|
||||
"match": "tag",
|
||||
"value": 0.5
|
||||
}]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -5,7 +5,6 @@
|
||||
Транспорт определяет способ передачи данных. Обычно оба конца сетевого подключения должны использовать одинаковый транспорт.
|
||||
Например, если один конец использует WebSocket, то другой конец также должен использовать WebSocket, иначе соединение не будет установлено.
|
||||
|
||||
|
||||
## StreamSettingsObject
|
||||
|
||||
`StreamSettingsObject` соответствует элементу `streamSettings` во входящем или исходящем подключении. Для каждого входящего или исходящего подключения можно настроить различные параметры передачи, и можно использовать `streamSettings` для настройки некоторых параметров передачи.
|
||||
@ -106,7 +105,7 @@ Reality — это самое безопасное на данный момен
|
||||
```json
|
||||
{
|
||||
"serverName": "xray.com",
|
||||
"serverNameToVerify":"",
|
||||
"serverNameToVerify": "",
|
||||
"rejectUnknownSni": false,
|
||||
"allowInsecure": false,
|
||||
"alpn": ["h2", "http/1.1"],
|
||||
@ -216,7 +215,6 @@ Reality — это самое безопасное на данный момен
|
||||
|
||||
3. Использование имени переменной отпечатка uTLS, например, `"HelloRandomizedNoALPN"` `"HelloChrome_106_Shuffle"`. Полный список см. в [библиотеке uTLS](https://github.com/refraction-networking/utls/blob/master/u_common.go#L434).
|
||||
|
||||
|
||||
4. Отключение **эмуляции** отпечатка `TLS Client Hello`
|
||||
|
||||
::: danger
|
||||
@ -259,6 +257,7 @@ Reality — это самое безопасное на данный момен
|
||||
Если вам нужно получить оценку A/A+ в ssllibs или myssl,
|
||||
пожалуйста, обратитесь к [этому](https://github.com/XTLS/Xray-core/discussions/56#discussioncomment-215600).
|
||||
:::
|
||||
|
||||
> `curvePreferences`: \[ string \]
|
||||
|
||||
Массив строк, задающий предпочтительные кривые для выполнения ECDHE во время TLS-рукопожатия. Список поддерживаемых кривых приведён ниже (регистр не имеет значения):
|
||||
@ -333,7 +332,7 @@ Reality лишь модифицирует TLS, и для реализации н
|
||||
|
||||
Обычно он совпадает с `dest`, фактическое допустимое значение — это любой SNI, принимаемый сервером (в зависимости от конфигурации `dest`), в качестве справки можно использовать [SAN](https://ru.wikipedia.org/wiki/Subject_Alternative_Name) возвращаемого сертификата.
|
||||
|
||||
Может содержать пустое значение ```""```, что означает принятие соединений без SNI.
|
||||
Может содержать пустое значение `""`, что означает принятие соединений без SNI.
|
||||
|
||||
> `privateKey` : string
|
||||
|
||||
@ -367,7 +366,7 @@ Reality лишь модифицирует TLS, и для реализации н
|
||||
|
||||
Один из `serverNames` сервера.
|
||||
|
||||
Если `serverNames` сервера содержит пустое значение, то, как и в случае с TLS, клиент может использовать ```"serverName": "0.0.0.0"``` для установления соединения без SNI. В отличие от TLS, REALITY не требует и не имеет опции разрешения небезопасных соединений для этой функции. При использовании этой функции убедитесь, что `dest` возвращает сертификат по умолчанию при принятии соединений без SNI.
|
||||
Если `serverNames` сервера содержит пустое значение, то, как и в случае с TLS, клиент может использовать `"serverName": "0.0.0.0"` для установления соединения без SNI. В отличие от TLS, REALITY не требует и не имеет опции разрешения небезопасных соединений для этой функции. При использовании этой функции убедитесь, что `dest` возвращает сертификат по умолчанию при принятии соединений без SNI.
|
||||
|
||||
> `fingerprint` : string
|
||||
|
||||
@ -593,19 +592,18 @@ Reality лишь модифицирует TLS, и для реализации н
|
||||
> "UseIP" | "UseIPv6v4" | "UseIPv6" | "UseIPv4v6" | "UseIPv4"
|
||||
> "ForceIP" | "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4"
|
||||
|
||||
|
||||
В предыдущих версиях, когда Xray пытался установить системное соединение с использованием доменного имени, разрешение доменного имени выполнялось системой и не контролировалось Xray. Это приводило к таким проблемам, как [невозможность разрешить доменные имена в нестандартных средах Linux](https://github.com/v2ray/v2ray-core/issues/1909). Для решения этой проблемы в Xray 1.3.1 в Sockopt был добавлен параметр `domainStrategy` в разделе Freedom.
|
||||
|
||||
Значение по умолчанию: `"AsIs"`.
|
||||
|
||||
Если целевой адрес представлен доменным именем, можно настроить соответствующее значение. Поведение Freedom в зависимости от настройки следующее:
|
||||
|
||||
- При использовании `"AsIs"` Xray будет напрямую использовать встроенную функцию `Dial` из Go для установления соединения, с фиксированным приоритетом, заданным по умолчанию в RFC6724 (игнорируя такие настройки, как `gai.conf`). *(Простыми словами: IPv6 будет использоваться с приоритетом.)*
|
||||
- При использовании `"AsIs"` Xray будет напрямую использовать встроенную функцию `Dial` из Go для установления соединения, с фиксированным приоритетом, заданным по умолчанию в RFC6724 (игнорируя такие настройки, как `gai.conf`). _(Простыми словами: IPv6 будет использоваться с приоритетом.)_
|
||||
- При использовании другого значения будет применен [встроенный DNS-сервер](../dns.md) Xray-core для разрешения доменного имени.
|
||||
Если объект `DNSObject` отсутствует, будет использоваться системный DNS. Если существует несколько подходящих IP-адресов, ядро выберет один из них случайным образом.
|
||||
- `"IPv4"` означает попытку установить соединение, используя только IPv4,
|
||||
`"IPv4v6"` означает попытку соединения с использованием IPv4 или IPv6, но для доменов с двойным стеком будет использоваться IPv4.
|
||||
*(Если поменять местами v4 и v6, логика остается аналогичной)*
|
||||
_(Если поменять местами v4 и v6, логика остается аналогичной)_
|
||||
- Если во встроенном DNS установлен параметр `"queryStrategy"`, то фактическое поведение будет комбинацией с этим параметром, и будут разрешаться только типы IP-адресов, присутствующие в обоих параметрах. Например:
|
||||
`"queryStrategy": "UseIPv4"` и `"domainStrategy": "UseIP"` фактически эквивалентны `"domainStrategy": "UseIPv4"`.
|
||||
|
||||
@ -708,7 +706,6 @@ Reality лишь модифицирует TLS, и для реализации н
|
||||
|
||||
Указывает имя сетевого интерфейса для исходящего трафика. Поддерживается в Linux, iOS, macOS и Windows.
|
||||
|
||||
|
||||
> `V6Only`: true | false
|
||||
|
||||
Если установлено значение `true`, адрес `::` принимает только IPv6-соединения. Поддерживается только в Linux.
|
||||
@ -717,7 +714,6 @@ Reality лишь модифицирует TLS, и для реализации н
|
||||
|
||||
Объявленный размер окна ограничен этим значением. Ядро выберет максимальное значение между этим значением и SOCK_MIN_RCVBUF/2.
|
||||
|
||||
|
||||
> `tcpMptcp`: true | false
|
||||
|
||||
По умолчанию этот параметр имеет значение `false`. Установите его в `true`, чтобы включить [Multipath TCP](https://en.wikipedia.org/wiki/Multipath_TCP).
|
||||
@ -742,7 +738,7 @@ Reality лишь модифицирует TLS, и для реализации н
|
||||
`AddressOnly`: Сброс только адреса.
|
||||
`PortAndAddress`: Сброс адреса и порта.
|
||||
|
||||
Важно! Данная настройка применяется *до* этапа выбора стратегии разрешения доменов (`domainStrategy`) в `sockopt`. После сброса адреса продолжает действовать `domainStrategy` (если она активна), но *после* того, как `domainStrategy` в `Freedom` уже отработала. Если в `Freedom` настроено явное разрешение в IP-адрес, данная опция не оказывает никакого эффекта.
|
||||
Важно! Данная настройка применяется _до_ этапа выбора стратегии разрешения доменов (`domainStrategy`) в `sockopt`. После сброса адреса продолжает действовать `domainStrategy` (если она активна), но _после_ того, как `domainStrategy` в `Freedom` уже отработала. Если в `Freedom` настроено явное разрешение в IP-адрес, данная опция не оказывает никакого эффекта.
|
||||
|
||||
PS: Если трафик домена, например, обычный веб-трафик, маршрутизируется через `Freedom` с установленной стратегией `AsIs`, то при активации этой опции будет предпринята попытка разрешить домен и сбросить адрес/порт в соответствии с полученными данными. Например, ядро Xray попытается запросить SRV-запись для `google.com` и перенаправить трафик, опираясь на информацию из этой записи.
|
||||
|
||||
|
@ -127,5 +127,3 @@ gRPC (HTTP/2) имеет встроенное мультиплексирован
|
||||
::: tip
|
||||
При использовании CDN Cloudflare можно установить значение `65536` или выше, чтобы отключить механизм динамического окна, что предотвратит отправку непредвиденных кадров h2 GOAWAY CDN Cloudflare для закрытия существующего соединения.
|
||||
:::
|
||||
|
||||
|
||||
|
@ -37,7 +37,7 @@
|
||||
|
||||
HTTP-путь, используемый HTTPUpgrade, по умолчанию `"/"`.
|
||||
|
||||
Если в пути клиента содержится параметр `ed` (например, ```/mypath?ed=2560```), будет активирована функция `Early Data` для уменьшения задержки, ее значение - порог длины первого пакета. Если длина первого пакета превышает это значение, `Early Data` не будет активирована. Рекомендуемое значение - 2560.
|
||||
Если в пути клиента содержится параметр `ed` (например, `/mypath?ed=2560`), будет активирована функция `Early Data` для уменьшения задержки, ее значение - порог длины первого пакета. Если длина первого пакета превышает это значение, `Early Data` не будет активирована. Рекомендуемое значение - 2560.
|
||||
|
||||
> `host`: string
|
||||
|
||||
@ -52,6 +52,3 @@ HTTP-путь, используемый HTTPUpgrade, по умолчанию `"/
|
||||
Пользовательские HTTP-заголовки, пара ключ-значение, где каждый ключ представляет имя HTTP-заголовка, а соответствующее значение - строка.
|
||||
|
||||
По умолчанию пустое.
|
||||
|
||||
|
||||
|
||||
|
@ -146,7 +146,7 @@ mKCP жертвует пропускной способностью ради у
|
||||
|
||||
Протокол KCP использует заголовок размером 24 байта, а mKCP уменьшил его до 18 байт для пакета данных и 16 байт для пакета подтверждения. Более компактный заголовок помогает избежать обнаружения по признакам и ускоряет передачу данных.
|
||||
|
||||
Кроме того, в оригинальном KCP каждый пакет подтверждения может подтвердить только один пакет данных, то есть, если KCP нужно подтвердить получение 100 пакетов данных, он отправит 24 * 100 = 2400 байт данных. В этом случае многократно повторяются заголовки, что приводит к ненужному расходу полосы пропускания. mKCP сжимает несколько пакетов подтверждения, 100 пакетов подтверждения занимают всего 16 + 2 + 100 * 4 = 418 байт, что в шесть раз меньше, чем в оригинальном KCP.
|
||||
Кроме того, в оригинальном KCP каждый пакет подтверждения может подтвердить только один пакет данных, то есть, если KCP нужно подтвердить получение 100 пакетов данных, он отправит 24 _ 100 = 2400 байт данных. В этом случае многократно повторяются заголовки, что приводит к ненужному расходу полосы пропускания. mKCP сжимает несколько пакетов подтверждения, 100 пакетов подтверждения занимают всего 16 + 2 + 100 _ 4 = 418 байт, что в шесть раз меньше, чем в оригинальном KCP.
|
||||
|
||||
### Передача пакетов подтверждения
|
||||
|
||||
@ -157,6 +157,3 @@ mKCP жертвует пропускной способностью ради у
|
||||
mKCP может эффективно управлять состоянием соединения. Когда удаленный хост инициализирует закрытие соединения, соединение будет закрыто в течение двух секунд; когда удаленный хост теряет соединение, соединение будет закрыто в течение максимум 30 секунд.
|
||||
|
||||
Оригинальный KCP не поддерживает этот сценарий.
|
||||
|
||||
|
||||
|
||||
|
@ -42,7 +42,7 @@ WebSocket распознает заголовок X-Forwarded-For в HTTP-зап
|
||||
|
||||
Путь, используемый WebSocket в HTTP-протоколе, значение по умолчанию — `"/"`.
|
||||
|
||||
Если в пути клиента есть параметр `ed` (например, ```/mypath?ed=2560```), будет активирован `Early Data` для уменьшения задержки.
|
||||
Если в пути клиента есть параметр `ed` (например, `/mypath?ed=2560`), будет активирован `Early Data` для уменьшения задержки.
|
||||
|
||||
> `host`: string
|
||||
|
||||
@ -57,6 +57,7 @@ WebSocket распознает заголовок X-Forwarded-For в HTTP-зап
|
||||
Пользовательские HTTP-заголовки, пары ключ-значение, где каждый ключ представляет имя HTTP-заголовка, а соответствующее значение является строкой.
|
||||
|
||||
Значение по умолчанию: пустое.
|
||||
|
||||
> `heartbeatPeriod`: int
|
||||
|
||||
Задает интервал времени для отправки Ping-сообщений с целью поддержания соединения. Если не указано или указано значение 0, Ping-сообщения не отправляются (по умолчанию используется текущее поведение).
|
||||
|
@ -39,5 +39,3 @@ VMess - это зашифрованный транспортный проток
|
||||
### [Протокол mKCP](./protocols/mkcp.md)
|
||||
|
||||
mKCP - это потоковый транспортный протокол, основанный на [протоколе KCP](https://github.com/skywind3000/kcp), который может передавать любые потоки данных по порядку.
|
||||
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user