1
0
mirror of https://github.com/XTLS/Xray-docs-next.git synced 2025-08-22 19:38:36 +00:00

Try fix prettier format

This commit is contained in:
yuhan6665 2025-04-09 22:39:12 -04:00
parent ab2f511011
commit f9761b7b84
144 changed files with 6723 additions and 4280 deletions

View File

@ -4,22 +4,22 @@ import { webpackBundler } from "@vuepress/bundler-webpack";
import { UserConfig, defineUserConfig } from "vuepress/cli"; import { UserConfig, defineUserConfig } from "vuepress/cli";
import { searchPlugin } from "@vuepress/plugin-search"; import { searchPlugin } from "@vuepress/plugin-search";
import markdownItFootnote from "markdown-it-footnote"; import markdownItFootnote from "markdown-it-footnote";
import theme from './theme.js' import theme from "./theme.js";
import { registerComponentsPlugin } from '@vuepress/plugin-register-components' import { registerComponentsPlugin } from "@vuepress/plugin-register-components";
import process from 'node:process' import process from "node:process";
// import { getDirname, path } from '@vuepress/utils' // import { getDirname, path } from '@vuepress/utils'
import { getDirname, path } from 'vuepress/utils' import { getDirname, path } from "vuepress/utils";
import { MermaidPlugin } from './plugins/mermaid/node/mermaid' import { MermaidPlugin } from "./plugins/mermaid/node/mermaid";
import i18nPlugin from "vuepress-plugin-i18n"; import i18nPlugin from "vuepress-plugin-i18n";
const __dirname = getDirname(import.meta.url) const __dirname = getDirname(import.meta.url);
console.log('>>> __dirname -> ', __dirname) console.log(">>> __dirname -> ", __dirname);
const isProduction = process.env.NODE_ENV === "production"; const isProduction = process.env.NODE_ENV === "production";
const useVite = process.env.XRAY_DOCS_USE_VITE === "true"; const useVite = process.env.XRAY_DOCS_USE_VITE === "true";
console.log( console.log(
"bundler:", "bundler:",
isProduction && !useVite ? "@vuepress/webpack" : "@vuepress/vite" isProduction && !useVite ? "@vuepress/webpack" : "@vuepress/vite",
); );
export default defineUserConfig(<UserConfig>{ export default defineUserConfig(<UserConfig>{
@ -31,13 +31,13 @@ export default defineUserConfig(<UserConfig>{
en: { en: {
lang: "en-US", lang: "en-US",
untranslated: { untranslated: {
title: "Untranslated" title: "Untranslated",
}, },
outdated: { outdated: {
title: "Outdated" title: "Outdated",
} },
} },
} },
}), }),
searchPlugin({ searchPlugin({
locales: { locales: {
@ -47,7 +47,7 @@ export default defineUserConfig(<UserConfig>{
}, },
}), }),
registerComponentsPlugin({ registerComponentsPlugin({
componentsDir: path.resolve(__dirname, './theme/components'), componentsDir: path.resolve(__dirname, "./theme/components"),
}), }),
], ],
base: "/", base: "/",

View File

@ -1,3 +1,3 @@
// export * from './head' // export * from './head'
export * from './navbar/index.js' export * from "./navbar/index.js";
export * from './sidebar/index.js' export * from "./sidebar/index.js";

View File

@ -1,10 +1,10 @@
import { NavbarConfig } from '@vuepress/theme-default' import { NavbarConfig } from "@vuepress/theme-default";
// TODO: translation // TODO: translation
export const navbarEn: NavbarConfig = [ export const navbarEn: NavbarConfig = [
{ text: 'Homepage', link: '/en' }, { text: "Homepage", link: "/en" },
{ text: 'The Great Chronicles', link: '/en/about/news.md' }, { text: "The Great Chronicles", link: "/en/about/news.md" },
{ text: 'Config Reference', link: '/en/config/' }, { text: "Config Reference", link: "/en/config/" },
{ text: 'Developer Guide', link: '/en/development/' }, { text: "Developer Guide", link: "/en/development/" },
{ text: 'Quick Start', link: '/en/document/' }, { text: "Quick Start", link: "/en/document/" },
] ];

View File

@ -1,3 +1,3 @@
export * from './en.js' export * from "./en.js";
export * from './zh.js' export * from "./zh.js";
export * from './ru.js' export * from "./ru.js";

View File

@ -1,9 +1,9 @@
import { NavbarConfig } from '@vuepress/theme-default' import { NavbarConfig } from "@vuepress/theme-default";
export const navbarRu: NavbarConfig = [ export const navbarRu: NavbarConfig = [
{ text: 'Главная', link: '/ru' }, { text: "Главная", link: "/ru" },
{ text: 'История сайта', link: '/ru/about/news.md' }, { text: "История сайта", link: "/ru/about/news.md" },
{ text: 'Справочник по конфигурации', link: '/ru/config/' }, { text: "Справочник по конфигурации", link: "/ru/config/" },
{ text: 'Руководство разработчика', link: '/ru/development/' }, { text: "Руководство разработчика", link: "/ru/development/" },
{ text: 'Быстрый старт', link: '/ru/document/' }, { text: "Быстрый старт", link: "/ru/document/" },
] ];

View File

@ -1,9 +1,9 @@
import { NavbarConfig } from '@vuepress/theme-default' import { NavbarConfig } from "@vuepress/theme-default";
export const navbarZh: NavbarConfig = [ export const navbarZh: NavbarConfig = [
{ text: '首页', link: '/' }, { text: "首页", link: "/" },
{ text: '大史记', link: '/about/news.md' }, { text: "大史记", link: "/about/news.md" },
{ text: '配置指南', link: '/config/' }, { text: "配置指南", link: "/config/" },
{ text: '开发指南', link: '/development/' }, { text: "开发指南", link: "/development/" },
{ text: '使用指南', link: '/document/' }, { text: "使用指南", link: "/document/" },
] ];

View File

@ -1,147 +1,147 @@
import type { SidebarConfig } from '@vuepress/theme-default' import type { SidebarConfig } from "@vuepress/theme-default";
export const sidebarEn: SidebarConfig = { export const sidebarEn: SidebarConfig = {
'/en/config/': [ "/en/config/": [
{ {
text: 'feature', text: "feature",
children: [ children: [
'/en/config/features/xtls.md', "/en/config/features/xtls.md",
'/en/config/features/fallback.md', "/en/config/features/fallback.md",
'/en/config/features/browser_dialer.md', "/en/config/features/browser_dialer.md",
'/en/config/features/env.md', "/en/config/features/env.md",
'/en/config/features/multiple.md', "/en/config/features/multiple.md",
], ],
}, },
{ {
text: 'config', text: "config",
children: [ children: [
'/en/config/README.md', "/en/config/README.md",
'/en/config/log.md', "/en/config/log.md",
'/en/config/api.md', "/en/config/api.md",
'/en/config/dns.md', "/en/config/dns.md",
'/en/config/fakedns.md', "/en/config/fakedns.md",
'/en/config/inbound.md', "/en/config/inbound.md",
'/en/config/outbound.md', "/en/config/outbound.md",
'/en/config/policy.md', "/en/config/policy.md",
'/en/config/reverse.md', "/en/config/reverse.md",
'/en/config/routing.md', "/en/config/routing.md",
'/en/config/stats.md', "/en/config/stats.md",
'/en/config/transport.md', "/en/config/transport.md",
'/en/config/metrics.md', "/en/config/metrics.md",
'/en/config/observatory.md', "/en/config/observatory.md",
], ],
}, },
{ {
text: 'inbound', text: "inbound",
children: [ children: [
'/en/config/inbounds/dokodemo.md', "/en/config/inbounds/dokodemo.md",
'/en/config/inbounds/http.md', "/en/config/inbounds/http.md",
'/en/config/inbounds/shadowsocks.md', "/en/config/inbounds/shadowsocks.md",
'/en/config/inbounds/socks.md', "/en/config/inbounds/socks.md",
'/en/config/inbounds/trojan.md', "/en/config/inbounds/trojan.md",
'/en/config/inbounds/vless.md', "/en/config/inbounds/vless.md",
'/en/config/inbounds/vmess.md', "/en/config/inbounds/vmess.md",
'/en/config/inbounds/wireguard.md', "/en/config/inbounds/wireguard.md",
], ],
}, },
{ {
text: 'outbound', text: "outbound",
children: [ children: [
'/en/config/outbounds/blackhole.md', "/en/config/outbounds/blackhole.md",
'/en/config/outbounds/dns.md', "/en/config/outbounds/dns.md",
'/en/config/outbounds/freedom.md', "/en/config/outbounds/freedom.md",
'/en/config/outbounds/http.md', "/en/config/outbounds/http.md",
'/en/config/outbounds/loopback.md', "/en/config/outbounds/loopback.md",
'/en/config/outbounds/shadowsocks.md', "/en/config/outbounds/shadowsocks.md",
'/en/config/outbounds/socks.md', "/en/config/outbounds/socks.md",
'/en/config/outbounds/trojan.md', "/en/config/outbounds/trojan.md",
'/en/config/outbounds/vless.md', "/en/config/outbounds/vless.md",
'/en/config/outbounds/vmess.md', "/en/config/outbounds/vmess.md",
'/en/config/outbounds/wireguard.md', "/en/config/outbounds/wireguard.md",
], ],
}, },
{ {
text: 'transport', text: "transport",
children: [ children: [
'/en/config/transports/raw.md', "/en/config/transports/raw.md",
'/en/config/transports/xhttp.md', "/en/config/transports/xhttp.md",
'/en/config/transports/mkcp.md', "/en/config/transports/mkcp.md",
'/en/config/transports/grpc.md', "/en/config/transports/grpc.md",
'/en/config/transports/websocket.md', "/en/config/transports/websocket.md",
'/en/config/transports/httpupgrade.md', "/en/config/transports/httpupgrade.md",
], ],
}, },
], ],
'/en/document/': [ "/en/document/": [
{ {
text: 'Quick Start', text: "Quick Start",
children: [ children: [
'/en/document/README.md', "/en/document/README.md",
'/en/document/install.md', "/en/document/install.md",
'/en/document/config.md', "/en/document/config.md",
'/en/document/command.md', "/en/document/command.md",
'/en/document/document.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',
], ],
}, },
{ {
text: 'Protocol Details', text: "Beginner Tutorial",
children: [ children: [
'/en/development/protocols/vless.md', "/en/document/level-0/README.md",
'/en/development/protocols/vmess.md', "/en/document/level-0/ch01-preface.md",
'/en/development/protocols/muxcool.md', "/en/document/level-0/ch02-preparation.md",
'/en/development/protocols/mkcp.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",
],
},
],
};

View File

@ -1,3 +1,3 @@
export * from './en.js' export * from "./en.js";
export * from './zh.js' export * from "./zh.js";
export * from './ru.js' export * from "./ru.js";

View File

@ -1,147 +1,147 @@
import type { SidebarConfig } from '@vuepress/theme-default' import type { SidebarConfig } from "@vuepress/theme-default";
export const sidebarRu: SidebarConfig = { export const sidebarRu: SidebarConfig = {
'/ru/config/': [ "/ru/config/": [
{ {
text: 'Описание функций', text: "Описание функций",
children: [ children: [
'/ru/config/features/xtls.md', "/ru/config/features/xtls.md",
'/ru/config/features/fallback.md', "/ru/config/features/fallback.md",
'/ru/config/features/browser_dialer.md', "/ru/config/features/browser_dialer.md",
'/ru/config/features/env.md', "/ru/config/features/env.md",
'/ru/config/features/multiple.md', "/ru/config/features/multiple.md",
], ],
}, },
{ {
text: 'Базовая конфигурация', text: "Базовая конфигурация",
children: [ children: [
'/ru/config/README.md', "/ru/config/README.md",
'/ru/config/log.md', "/ru/config/log.md",
'/ru/config/api.md', "/ru/config/api.md",
'/ru/config/dns.md', "/ru/config/dns.md",
'/ru/config/fakedns.md', "/ru/config/fakedns.md",
'/ru/config/inbound.md', "/ru/config/inbound.md",
'/ru/config/outbound.md', "/ru/config/outbound.md",
'/ru/config/policy.md', "/ru/config/policy.md",
'/ru/config/reverse.md', "/ru/config/reverse.md",
'/ru/config/routing.md', "/ru/config/routing.md",
'/ru/config/stats.md', "/ru/config/stats.md",
'/ru/config/transport.md', "/ru/config/transport.md",
'/ru/config/metrics.md', "/ru/config/metrics.md",
'/ru/config/observatory.md', "/ru/config/observatory.md",
], ],
}, },
{ {
text: 'Входящие подключения', text: "Входящие подключения",
children: [ children: [
'/ru/config/inbounds/dokodemo.md', "/ru/config/inbounds/dokodemo.md",
'/ru/config/inbounds/http.md', "/ru/config/inbounds/http.md",
'/ru/config/inbounds/shadowsocks.md', "/ru/config/inbounds/shadowsocks.md",
'/ru/config/inbounds/socks.md', "/ru/config/inbounds/socks.md",
'/ru/config/inbounds/trojan.md', "/ru/config/inbounds/trojan.md",
'/ru/config/inbounds/vless.md', "/ru/config/inbounds/vless.md",
'/ru/config/inbounds/vmess.md', "/ru/config/inbounds/vmess.md",
'/ru/config/inbounds/wireguard.md', "/ru/config/inbounds/wireguard.md",
], ],
}, },
{ {
text: 'Исходящие подключения', text: "Исходящие подключения",
children: [ children: [
'/ru/config/outbounds/blackhole.md', "/ru/config/outbounds/blackhole.md",
'/ru/config/outbounds/dns.md', "/ru/config/outbounds/dns.md",
'/ru/config/outbounds/freedom.md', "/ru/config/outbounds/freedom.md",
'/ru/config/outbounds/http.md', "/ru/config/outbounds/http.md",
'/ru/config/outbounds/loopback.md', "/ru/config/outbounds/loopback.md",
'/ru/config/outbounds/shadowsocks.md', "/ru/config/outbounds/shadowsocks.md",
'/ru/config/outbounds/socks.md', "/ru/config/outbounds/socks.md",
'/ru/config/outbounds/trojan.md', "/ru/config/outbounds/trojan.md",
'/ru/config/outbounds/vless.md', "/ru/config/outbounds/vless.md",
'/ru/config/outbounds/vmess.md', "/ru/config/outbounds/vmess.md",
'/ru/config/outbounds/wireguard.md', "/ru/config/outbounds/wireguard.md",
], ],
}, },
{ {
text: 'Транспортный уровень', text: "Транспортный уровень",
children: [ children: [
'/ru/config/transports/raw.md', "/ru/config/transports/raw.md",
'/ru/config/transports/xhttp.md', "/ru/config/transports/xhttp.md",
'/ru/config/transports/mkcp.md', "/ru/config/transports/mkcp.md",
'/ru/config/transports/grpc.md', "/ru/config/transports/grpc.md",
'/ru/config/transports/websocket.md', "/ru/config/transports/websocket.md",
'/ru/config/transports/httpupgrade.md', "/ru/config/transports/httpupgrade.md",
], ],
}, },
], ],
'/ru/document/': [ "/ru/document/": [
{ {
text: 'Быстрый старт', text: "Быстрый старт",
children: [ children: [
'/ru/document/README.md', "/ru/document/README.md",
'/ru/document/install.md', "/ru/document/install.md",
'/ru/document/config.md', "/ru/document/config.md",
'/ru/document/command.md', "/ru/document/command.md",
'/ru/document/document.md', "/ru/document/document.md",
], ],
}, },
{ {
text: 'Простыми словами', text: "Простыми словами",
children: [ children: [
'/ru/document/level-0/README.md', "/ru/document/level-0/README.md",
'/ru/document/level-0/ch01-preface.md', "/ru/document/level-0/ch01-preface.md",
'/ru/document/level-0/ch02-preparation.md', "/ru/document/level-0/ch02-preparation.md",
'/ru/document/level-0/ch03-ssh.md', "/ru/document/level-0/ch03-ssh.md",
'/ru/document/level-0/ch04-security.md', "/ru/document/level-0/ch04-security.md",
'/ru/document/level-0/ch05-webpage.md', "/ru/document/level-0/ch05-webpage.md",
'/ru/document/level-0/ch06-certificates.md', "/ru/document/level-0/ch06-certificates.md",
'/ru/document/level-0/ch07-xray-server.md', "/ru/document/level-0/ch07-xray-server.md",
'/ru/document/level-0/ch08-xray-clients.md', "/ru/document/level-0/ch08-xray-clients.md",
'/ru/document/level-0/ch09-appendix.md', "/ru/document/level-0/ch09-appendix.md",
], ],
}, },
{ {
text: 'Базовые навыки', text: "Базовые навыки",
children: [ children: [
'/ru/document/level-1/README.md', "/ru/document/level-1/README.md",
'/ru/document/level-1/fallbacks-lv1.md', "/ru/document/level-1/fallbacks-lv1.md",
'/ru/document/level-1/routing-lv1-part1.md', "/ru/document/level-1/routing-lv1-part1.md",
'/ru/document/level-1/routing-lv1-part2.md', "/ru/document/level-1/routing-lv1-part2.md",
'/ru/document/level-1/work.md', "/ru/document/level-1/work.md",
'/ru/document/level-1/fallbacks-with-sni.md', "/ru/document/level-1/fallbacks-with-sni.md",
], ],
}, },
{ {
text: 'Продвинутые навыки', text: "Продвинутые навыки",
children: [ children: [
'/ru/document/level-2/README.md', "/ru/document/level-2/README.md",
'/ru/document/level-2/transparent_proxy/transparent_proxy.md', "/ru/document/level-2/transparent_proxy/transparent_proxy.md",
'/ru/document/level-2/tproxy.md', "/ru/document/level-2/tproxy.md",
'/ru/document/level-2/tproxy_ipv4_and_ipv6.md', "/ru/document/level-2/tproxy_ipv4_and_ipv6.md",
'/ru/document/level-2/nginx_or_haproxy_tls_tunnel.md', "/ru/document/level-2/nginx_or_haproxy_tls_tunnel.md",
'/ru/document/level-2/iptables_gid.md', "/ru/document/level-2/iptables_gid.md",
'/ru/document/level-2/redirect.md', "/ru/document/level-2/redirect.md",
'/ru/document/level-2/warp.md', "/ru/document/level-2/warp.md",
'/ru/document/level-2/traffic_stats.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/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",
],
},
],
};

View File

@ -1,147 +1,147 @@
import type { SidebarConfig } from '@vuepress/theme-default' import type { SidebarConfig } from "@vuepress/theme-default";
export const sidebarZh: SidebarConfig = { export const sidebarZh: SidebarConfig = {
'/config/': [ "/config/": [
{ {
text: '特性详解', text: "特性详解",
children: [ children: [
'/config/features/xtls.md', "/config/features/xtls.md",
'/config/features/fallback.md', "/config/features/fallback.md",
'/config/features/browser_dialer.md', "/config/features/browser_dialer.md",
'/config/features/env.md', "/config/features/env.md",
'/config/features/multiple.md', "/config/features/multiple.md",
], ],
}, },
{ {
text: '基础配置', text: "基础配置",
children: [ children: [
'/config/README.md', "/config/README.md",
'/config/log.md', "/config/log.md",
'/config/api.md', "/config/api.md",
'/config/dns.md', "/config/dns.md",
'/config/fakedns.md', "/config/fakedns.md",
'/config/inbound.md', "/config/inbound.md",
'/config/outbound.md', "/config/outbound.md",
'/config/policy.md', "/config/policy.md",
'/config/reverse.md', "/config/reverse.md",
'/config/routing.md', "/config/routing.md",
'/config/stats.md', "/config/stats.md",
'/config/transport.md', "/config/transport.md",
'/config/metrics.md', "/config/metrics.md",
'/config/observatory.md', "/config/observatory.md",
], ],
}, },
{ {
text: '入站代理', text: "入站代理",
children: [ children: [
'/config/inbounds/dokodemo.md', "/config/inbounds/dokodemo.md",
'/config/inbounds/http.md', "/config/inbounds/http.md",
'/config/inbounds/shadowsocks.md', "/config/inbounds/shadowsocks.md",
'/config/inbounds/socks.md', "/config/inbounds/socks.md",
'/config/inbounds/trojan.md', "/config/inbounds/trojan.md",
'/config/inbounds/vless.md', "/config/inbounds/vless.md",
'/config/inbounds/vmess.md', "/config/inbounds/vmess.md",
'/config/inbounds/wireguard.md', "/config/inbounds/wireguard.md",
], ],
}, },
{ {
text: '出站代理', text: "出站代理",
children: [ children: [
'/config/outbounds/blackhole.md', "/config/outbounds/blackhole.md",
'/config/outbounds/dns.md', "/config/outbounds/dns.md",
'/config/outbounds/freedom.md', "/config/outbounds/freedom.md",
'/config/outbounds/http.md', "/config/outbounds/http.md",
'/config/outbounds/loopback.md', "/config/outbounds/loopback.md",
'/config/outbounds/shadowsocks.md', "/config/outbounds/shadowsocks.md",
'/config/outbounds/socks.md', "/config/outbounds/socks.md",
'/config/outbounds/trojan.md', "/config/outbounds/trojan.md",
'/config/outbounds/vless.md', "/config/outbounds/vless.md",
'/config/outbounds/vmess.md', "/config/outbounds/vmess.md",
'/config/outbounds/wireguard.md', "/config/outbounds/wireguard.md",
], ],
}, },
{ {
text: '底层传输', text: "底层传输",
children: [ children: [
'/config/transports/raw.md', "/config/transports/raw.md",
'/config/transports/xhttp.md', "/config/transports/xhttp.md",
'/config/transports/mkcp.md', "/config/transports/mkcp.md",
'/config/transports/grpc.md', "/config/transports/grpc.md",
'/config/transports/websocket.md', "/config/transports/websocket.md",
'/config/transports/httpupgrade.md', "/config/transports/httpupgrade.md",
], ],
}, },
], ],
'/document/': [ "/document/": [
{ {
text: '快速入门文档', text: "快速入门文档",
children: [ children: [
'/document/README.md', "/document/README.md",
'/document/install.md', "/document/install.md",
'/document/config.md', "/document/config.md",
'/document/command.md', "/document/command.md",
'/document/document.md', "/document/document.md",
], ],
}, },
{ {
text: '小小白白话文', text: "小小白白话文",
children: [ children: [
'/document/level-0/README.md', "/document/level-0/README.md",
'/document/level-0/ch01-preface.md', "/document/level-0/ch01-preface.md",
'/document/level-0/ch02-preparation.md', "/document/level-0/ch02-preparation.md",
'/document/level-0/ch03-ssh.md', "/document/level-0/ch03-ssh.md",
'/document/level-0/ch04-security.md', "/document/level-0/ch04-security.md",
'/document/level-0/ch05-webpage.md', "/document/level-0/ch05-webpage.md",
'/document/level-0/ch06-certificates.md', "/document/level-0/ch06-certificates.md",
'/document/level-0/ch07-xray-server.md', "/document/level-0/ch07-xray-server.md",
'/document/level-0/ch08-xray-clients.md', "/document/level-0/ch08-xray-clients.md",
'/document/level-0/ch09-appendix.md', "/document/level-0/ch09-appendix.md",
], ],
}, },
{ {
text: '入门技巧', text: "入门技巧",
children: [ children: [
'/document/level-1/README.md', "/document/level-1/README.md",
'/document/level-1/fallbacks-lv1.md', "/document/level-1/fallbacks-lv1.md",
'/document/level-1/routing-lv1-part1.md', "/document/level-1/routing-lv1-part1.md",
'/document/level-1/routing-lv1-part2.md', "/document/level-1/routing-lv1-part2.md",
'/document/level-1/work.md', "/document/level-1/work.md",
'/document/level-1/fallbacks-with-sni.md', "/document/level-1/fallbacks-with-sni.md",
], ],
}, },
{ {
text: '进阶技巧', text: "进阶技巧",
children: [ children: [
'/document/level-2/README.md', "/document/level-2/README.md",
'/document/level-2/transparent_proxy/transparent_proxy.md', "/document/level-2/transparent_proxy/transparent_proxy.md",
'/document/level-2/tproxy.md', "/document/level-2/tproxy.md",
'/document/level-2/tproxy_ipv4_and_ipv6.md', "/document/level-2/tproxy_ipv4_and_ipv6.md",
'/document/level-2/nginx_or_haproxy_tls_tunnel.md', "/document/level-2/nginx_or_haproxy_tls_tunnel.md",
'/document/level-2/iptables_gid.md', "/document/level-2/iptables_gid.md",
'/document/level-2/redirect.md', "/document/level-2/redirect.md",
'/document/level-2/warp.md', "/document/level-2/warp.md",
'/document/level-2/traffic_stats.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',
], ],
}, },
], ],
} "/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",
],
},
],
};

View File

@ -17,7 +17,8 @@ export const getMermaidContent = ({
content, content,
title = "", title = "",
}: MermaidOptions): string => `\ }: MermaidOptions): string => `\
${title ${
title
? `\ ? `\
--- ---
title: ${title} title: ${title}
@ -25,20 +26,22 @@ title: ${title}
` `
: "" : ""
}\ }\
${diagram === "mermaid" ${
diagram === "mermaid"
? "" ? ""
: `\ : `\
${diagram} ${diagram}
` `
}\ }\
${diagram === "mermaid" || diagram === "sankey-beta" ${
diagram === "mermaid" || diagram === "sankey-beta"
? content ? content
: content : content
.split("\n") .split("\n")
.map((line) => (line ? ` ${line}` : "")) .map((line) => (line ? ` ${line}` : ""))
.join("\n") .join("\n")
}\ }\
`; `;
const getMermaid = (options: MermaidOptions, index: number): string => const getMermaid = (options: MermaidOptions, index: number): string =>

View File

@ -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 { path, getDirname } from 'vuepress/utils' import { path, getDirname } from "vuepress/utils";
import process from 'node:process' import process from "node:process";
import { navbarEn, navbarZh, navbarRu, sidebarEn, sidebarZh, sidebarRu } from './config/index.js' import {
navbarEn,
navbarZh,
navbarRu,
sidebarEn,
sidebarZh,
sidebarRu,
} from "./config/index.js";
let __dirname = getDirname(import.meta.url) let __dirname = getDirname(import.meta.url);
const isProduction = process.env.NODE_ENV === 'production' const isProduction = process.env.NODE_ENV === "production";
export default defaultTheme({ export default defaultTheme({
name: 'vuepress-theme-xray', name: "vuepress-theme-xray",
smoothScroll: true, smoothScroll: true,
repo: 'xtls/xray-core', repo: "xtls/xray-core",
docsDir: 'docs', docsDir: "docs",
docsRepo: 'xtls/Xray-docs-next', docsRepo: "xtls/Xray-docs-next",
docsBranch: 'main', docsBranch: "main",
editLinks: true, editLinks: true,
enableToggle: true, enableToggle: true,
locales: { locales: {
'/': { "/": {
navbar: navbarZh, navbar: navbarZh,
sidebar: sidebarZh, sidebar: sidebarZh,
repoLabel: '查看源码', repoLabel: "查看源码",
editLinkText: '帮助我们改善此页面!', editLinkText: "帮助我们改善此页面!",
tip: '提示', tip: "提示",
warning: '注意', warning: "注意",
danger: '警告', danger: "警告",
lastUpdatedText: '最近更改', lastUpdatedText: "最近更改",
selectLanguageName: '简体中文', selectLanguageName: "简体中文",
selectLanguageText: '🌏 简体中文 / Change language', selectLanguageText: "🌏 简体中文 / Change language",
selectLanguageAriaLabel: '简体中文 / Change language', selectLanguageAriaLabel: "简体中文 / Change language",
docsDir: 'docs', docsDir: "docs",
backToHome: 'back to home', backToHome: "back to home",
openInNewWindow: 'open in new tag', openInNewWindow: "open in new tag",
toggleColorMode: 'toggle color mode', toggleColorMode: "toggle color mode",
toggleSidebar: 'toggle side bar', toggleSidebar: "toggle side bar",
}, },
'/en/': { "/en/": {
// TODO: translation // TODO: translation
sidebar: sidebarEn, sidebar: sidebarEn,
navbar: navbarEn, navbar: navbarEn,
selectLanguageName: 'English (WIP)', selectLanguageName: "English (WIP)",
selectLanguageText: '🌎 English / Change language', selectLanguageText: "🌎 English / Change language",
selectLanguageAriaLabel: 'English / Change language', selectLanguageAriaLabel: "English / Change language",
editLinkText: 'Help us improve this page on GitHub', editLinkText: "Help us improve this page on GitHub",
lastUpdatedText: 'Last Updated', lastUpdatedText: "Last Updated",
contributorsText: 'contributors', contributorsText: "contributors",
// repoLabel: 'Source', // repoLabel: 'Source',
tip: 'Tip', tip: "Tip",
warning: 'Warning', warning: "Warning",
danger: 'Danger', danger: "Danger",
// 404 page // 404 page
notFound: [ notFound: [
'这里什么都没有', "这里什么都没有",
'我们怎么到这来了?', "我们怎么到这来了?",
'这是一个 404 页面', "这是一个 404 页面",
'看起来我们进入了错误的链接', "看起来我们进入了错误的链接",
], ],
backToHome: 'back to home', backToHome: "back to home",
openInNewWindow: 'open in new tag', openInNewWindow: "open in new tag",
toggleColorMode: 'toggle color mode', toggleColorMode: "toggle color mode",
toggleSidebar: 'toggle side bar', toggleSidebar: "toggle side bar",
}, },
'/ru/': { "/ru/": {
navbar: navbarRu, navbar: navbarRu,
sidebar: sidebarRu, sidebar: sidebarRu,
repoLabel: 'Посмотреть исходный код', repoLabel: "Посмотреть исходный код",
editLinkText: 'Помогите нам улучшить эту страницу!', editLinkText: "Помогите нам улучшить эту страницу!",
tip: 'Подсказка', tip: "Подсказка",
warning: 'Внимание', warning: "Внимание",
danger: 'Предупреждение', danger: "Предупреждение",
lastUpdatedText: 'Последние изменения', lastUpdatedText: "Последние изменения",
selectLanguageName: 'Русский', selectLanguageName: "Русский",
selectLanguageText: '🌍 Русский / Change language', selectLanguageText: "🌍 Русский / Change language",
selectLanguageAriaLabel: 'Русский / Change language', selectLanguageAriaLabel: "Русский / Change language",
docsDir: 'docs', docsDir: "docs",
backToHome: 'На главную', backToHome: "На главную",
openInNewWindow: 'Открыть в новой вкладке', openInNewWindow: "Открыть в новой вкладке",
toggleColorMode: 'Переключить цветовую схему', toggleColorMode: "Переключить цветовую схему",
toggleSidebar: 'Переключить боковую панель', toggleSidebar: "Переключить боковую панель",
}, },
// logo: '/logo.png', // logo: '/logo.png',
@ -88,4 +95,4 @@ export default defaultTheme({
git: isProduction, git: isProduction,
}, },
}, },
}) });

View File

@ -14,7 +14,7 @@ import {
watch, watch,
reactive, reactive,
nextTick, nextTick,
toRef toRef,
} from "vue"; } from "vue";
import { getDarkmodeStatus } from "../../plugins/mermaid/helpers/darkmode.js"; import { getDarkmodeStatus } from "../../plugins/mermaid/helpers/darkmode.js";
@ -43,18 +43,20 @@ export default defineComponent({
startOnLoad: false, 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; html.innerHtml = svg;
}); });
}; };
onMounted(() => { onMounted(() => {
isDarkmode.value = getDarkmodeStatus() isDarkmode.value = getDarkmodeStatus();
nextTick(renderMermaid) nextTick(renderMermaid);
}) });
// watch darkmode change // watch darkmode change
if (typeof document !== 'undefined') { if (typeof document !== "undefined") {
useMutationObserver( useMutationObserver(
document.documentElement, document.documentElement,
() => { () => {
@ -67,17 +69,14 @@ export default defineComponent({
); );
} }
watch(isDarkmode, () => renderMermaid()); watch(isDarkmode, () => renderMermaid());
return { return {
tag: chartID, tag: chartID,
payload: html payload: html,
} };
}, },
}); });
</script> </script>
<style scoped></style> <style scoped></style>

View File

@ -9,7 +9,6 @@ export const docsPlugin: Theme = (options, app) => {
name: "xray-docs-theme", name: "xray-docs-theme",
extends: "@vuepress/theme-default", extends: "@vuepress/theme-default",
clientAppEnhanceFiles: path.resolve(__dirname, "clientAppEnhance.ts"), clientAppEnhanceFiles: path.resolve(__dirname, "clientAppEnhance.ts"),
}); });
}; };

View File

@ -444,9 +444,9 @@ Shadowsocks-2022 是重新设计的全新协议:
现在一个以 Xray-core 为核心的开源、自由的 Android 客户端已经出现——[AnXray](https://github.com/XTLS/AnXray)!由 [@nekohasekai](https://github.com/nekohasekai) 维护。 现在一个以 Xray-core 为核心的开源、自由的 Android 客户端已经出现——[AnXray](https://github.com/XTLS/AnXray)!由 [@nekohasekai](https://github.com/nekohasekai) 维护。
- 支持众多协议、插件. - 支持众多协议、插件.
- 首席视觉设计师 [@RPRX](https://github.com/RPRX) 设计了 X-style 的 logo、slogan以及独一无二的 material 黑白主题。 - 首席视觉设计师 [@RPRX](https://github.com/RPRX) 设计了 X-style 的 logo、slogan以及独一无二的 material 黑白主题。
- APP 内还有个小彩蛋等你去发现。 - APP 内还有个小彩蛋等你去发现。
前两天从早到晚反复打磨细节,希望大家多多 Star、关注。 前两天从早到晚反复打磨细节,希望大家多多 Star、关注。

View File

@ -19,7 +19,12 @@ API 接口配置提供了一些基于 [gRPC](https://grpc.io/)的 API 接口供
"api": { "api": {
"tag": "api", "tag": "api",
"listen": "127.0.0.1:8080", "listen": "127.0.0.1:8080",
"services": ["HandlerService", "LoggerService", "StatsService", "RoutingService"] "services": [
"HandlerService",
"LoggerService",
"StatsService",
"RoutingService"
]
} }
} }
``` ```

View File

@ -58,17 +58,13 @@ Xray 内置的 DNS 模块,主要有两大用途:
}, },
{ {
"address": "https://8.8.8.8/dns-query", "address": "https://8.8.8.8/dns-query",
"domains": [ "domains": ["geosite:netflix"],
"geosite:netflix"
],
"skipFallback": true, "skipFallback": true,
"queryStrategy": "UseIPv4" "queryStrategy": "UseIPv4"
}, },
{ {
"address": "https://1.1.1.1/dns-query", "address": "https://1.1.1.1/dns-query",
"domains": [ "domains": ["geosite:openai"],
"geosite:openai"
],
"skipFallback": true, "skipFallback": true,
"queryStrategy": "UseIPv6" "queryStrategy": "UseIPv6"
}, },

View File

@ -9,14 +9,16 @@
这个方法简洁的实现了真实的浏览器的 TLS 指纹、行为特征。最大程度抗检测与抗封锁。 这个方法简洁的实现了真实的浏览器的 TLS 指纹、行为特征。最大程度抗检测与抗封锁。
不过目前的浏览器转发有以下缺点: 不过目前的浏览器转发有以下缺点:
* 用户需要手动开浏览器
* 浏览器发出的连接必须直连 使用 tun 的用户需要特别注意容易形成死循环 - 用户需要手动开浏览器
* 浏览器只能发出 HTTP 连接 所以目前仅支持 [WebSocket](../../transports/websocket.md) 与 [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113) 传输方式 - 浏览器发出的连接必须直连 使用 tun 的用户需要特别注意容易形成死循环
* 当浏览器从 `localhost:8080` 页面连接至代理服务端,需要考虑 [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) - 浏览器只能发出 HTTP 连接 所以目前仅支持 [WebSocket](../../transports/websocket.md) 与 [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113) 传输方式
* 因为中间经过 JS 处理数据,会有一些性能损耗 - 当浏览器从 `localhost:8080` 页面连接至代理服务端,需要考虑 [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)
* 不能使用自定义 SNI 或者 Host也就是说 `SNI == host == address`。自定义 HTTP 头以及其它 `tlsSettings` 项会被忽略 - 因为中间经过 JS 处理数据,会有一些性能损耗
- 不能使用自定义 SNI 或者 Host也就是说 `SNI == host == address`。自定义 HTTP 头以及其它 `tlsSettings` 项会被忽略
## 配置方法 ## 配置方法
1. 准备一份 WebSocket 或 XHTTP 配置,注意 address 必须填域名,若需要指定 IP请配置 DNS 或系统 hosts 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` 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` 3. 确保浏览器直连(或者在路由中将服务端地址直接由 `freedom` 发出),打开页面 `localhost:8080`,还可以 `F12``Console``Network`

View File

@ -14,10 +14,10 @@ User-space Wireguard 协议实现。
"peers": [ "peers": [
{ {
"publicKey": "PUBLIC_KEY", "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 - 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> </details>
> `peers`: \[ [Peers](#peers) \] > `peers`: \[ [Peers](#peers) \]

View File

@ -36,8 +36,9 @@ metrics 对应的出站代理 tag, 通过设置任意门入站+路由将任意
访问 `http://127.0.0.1:11111/debug/vars` 访问 `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内容) 例如在 [luci-app-xray](https://github.com/yichya/luci-app-xray) 你可以得到这样的输出 (省略了 cmdline 和 memstats 等标准expvar内容)
@ -130,6 +131,7 @@ metrics 对应的出站代理 tag, 通过设置任意门入站+路由将任意
} }
} }
``` ```
</details> </details>
为了得到更好的可视化输出, 可以使用 [Netdata](https://github.com/netdata/netdata) (with python.d plugin): 为了得到更好的可视化输出, 可以使用 [Netdata](https://github.com/netdata/netdata) (with python.d plugin):
@ -244,6 +246,7 @@ xray:
id: udp id: udp
expvar_type: int expvar_type: int
``` ```
</details> </details>
你可以得到类似这样的结果: 你可以得到类似这样的结果:

View File

@ -3,11 +3,10 @@
连接观测组件使用 HTTPing 的方式探测出站代理的连接状态。观测结果可以被其他组件使用,如负载均衡器。目前有 [observatory](#observatoryobject) (后台连接观测)和 [burstObservatory](#burstobservatoryobject) (并发连接观测)两种。按需选择其中之一就行。 连接观测组件使用 HTTPing 的方式探测出站代理的连接状态。观测结果可以被其他组件使用,如负载均衡器。目前有 [observatory](#observatoryobject) (后台连接观测)和 [burstObservatory](#burstobservatoryobject) (并发连接观测)两种。按需选择其中之一就行。
## ObservatoryObject ## ObservatoryObject
```json ```json
{ {
"subjectSelector":[ "subjectSelector": ["outbound"],
"outbound"
],
"probeUrl": "https://www.google.com/generate_204", "probeUrl": "https://www.google.com/generate_204",
"probeInterval": "10s", "probeInterval": "10s",
"enableConcurrency": false "enableConcurrency": false
@ -32,11 +31,10 @@
- `false` 逐个探测匹配的出站代理,每探测一个出站代理后暂停 `probeInterval` 设定的时间。 - `false` 逐个探测匹配的出站代理,每探测一个出站代理后暂停 `probeInterval` 设定的时间。
## BurstObservatoryObject ## BurstObservatoryObject
```json ```json
{ {
"subjectSelector":[ "subjectSelector": ["outbound"],
"outbound"
],
"pingConfig": {} "pingConfig": {}
} }
``` ```
@ -47,8 +45,8 @@
> `pingConfig`: [PingConfigObject](#PingConfigObject) > `pingConfig`: [PingConfigObject](#PingConfigObject)
### PingConfigObject ### PingConfigObject
```json ```json
{ {
"destination": "https://connectivitycheck.gstatic.com/generate_204", "destination": "https://connectivitycheck.gstatic.com/generate_204",

View File

@ -14,7 +14,7 @@ DNS 是一个出站协议,主要用于拦截和转发 DNS 查询。
"address": "1.1.1.1", "address": "1.1.1.1",
"port": 53, "port": 53,
"nonIPQuery": "drop", "nonIPQuery": "drop",
"blockTypes":[] "blockTypes": []
} }
``` ```

View File

@ -14,13 +14,13 @@ Freedom 是一个出站协议,可以用来向任意网络发送(正常的)
"length": "100-200", "length": "100-200",
"interval": "10-20" // 单位ms "interval": "10-20" // 单位ms
}, },
"noises":[ "noises": [
{ {
"type":"base64", "type": "base64",
"packet":"7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=", "packet": "7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=",
"delay":"10-16" "delay": "10-16"
} }
], ],
"proxyProtocol": 0 "proxyProtocol": 0
} }
``` ```

View File

@ -20,7 +20,7 @@ Loopback 是个出站数据协议,其作用为将经该出站传出的数据
如果需要将已经通过路由规则分流过的流量再由其它路由规则做更细致的分流,比如由同一组路由规则分流后的 TCP 流量和 UDP 要走不同的出站,则可以使用 `loopback` 出站完成。 如果需要将已经通过路由规则分流过的流量再由其它路由规则做更细致的分流,比如由同一组路由规则分流后的 TCP 流量和 UDP 要走不同的出站,则可以使用 `loopback` 出站完成。
``` json ```json
{ {
"outbounds": [ "outbounds": [
{ {
@ -31,11 +31,11 @@ Loopback 是个出站数据协议,其作用为将经该出站传出的数据
} }
}, },
{ {
"tag": "tcp-output", "tag": "tcp-output"
// protocol, settings, streamSettings 之类的设置 // protocol, settings, streamSettings 之类的设置
}, },
{ {
"tag": "udp-output", "tag": "udp-output"
// protocol, settings, streamSettings 之类的设置 // protocol, settings, streamSettings 之类的设置
} }
], ],

View File

@ -118,4 +118,3 @@ level 的值, 对应 [policy](../policy.md#policyobject) 中 `level` 的值。
"AuthenticatedLength" 启用认证的数据包长度实验。此实验需要同时在客户端与服务器端同时开启,并运行相同版本的程序。 "AuthenticatedLength" 启用认证的数据包长度实验。此实验需要同时在客户端与服务器端同时开启,并运行相同版本的程序。
"NoTerminationSignal" 启用不发送断开连接标致实验。此实验可能会影响被代理的连接的稳定性。 "NoTerminationSignal" 启用不发送断开连接标致实验。此实验可能会影响被代理的连接的稳定性。

View File

@ -72,7 +72,8 @@ Wireguard 底层 tun 的MTU大小。
- 16-byte authentication tag - 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> </details>
> `reserved` \[ number \] > `reserved` \[ number \]

View File

@ -86,7 +86,7 @@ Xray 系统级别的策略
当值为 `true` 时,开启当前等级的所有用户的下行流量统计。 当值为 `true` 时,开启当前等级的所有用户的下行流量统计。
> `statsUserOnline`: true | false > `statsUserOnline`: true | false
当值为 `true` 时,开启当前等级的所有用户的在线数量统计。(在线标准20秒内有过连接活动) > 当值为 `true` 时,开启当前等级的所有用户的在线数量统计。(在线标准20秒内有过连接活动)
> `bufferSize`: number > `bufferSize`: number

View File

@ -7,15 +7,18 @@
反向代理的大致工作原理如下: 反向代理的大致工作原理如下:
- 假设在主机 A 中有一个网页服务器,这台主机没有公网 IP无法在公网上直接访问。另有一台主机 B它可以由公网访问。现在我们需要把 B 作为入口,把流量从 B 转发到 A。 - 假设在主机 A 中有一个网页服务器,这台主机没有公网 IP无法在公网上直接访问。另有一台主机 B它可以由公网访问。现在我们需要把 B 作为入口,把流量从 B 转发到 A。
- 在主机 B 中配置 Xray接收外部请求所以称为 `portal` (门户)。 - 在主机 B 中配置 Xray接收外部请求所以称为 `portal` (门户)。
- 在主机 A 中配置 Xray负责将B的转发和网页服务器桥接起来称为`bridge`。 - 在主机 A 中配置 Xray负责将B的转发和网页服务器桥接起来称为`bridge`。
- `bridge` - `bridge`
- `bridge` 会向 `portal` 主动建立连接以注册反向通道此连接的目标地址domain可以自行设定。 - `bridge` 会向 `portal` 主动建立连接以注册反向通道此连接的目标地址domain可以自行设定。
- `bridge` 在收到`portal`转发过来的公网流量之后,会将其原封不动地发给主机 A 中的网页服务器。当然,这一步需要路由模块的配置。 - `bridge` 在收到`portal`转发过来的公网流量之后,会将其原封不动地发给主机 A 中的网页服务器。当然,这一步需要路由模块的配置。
- `bridge` 收到响应后,也会将响应原封不动地返回给`portal`。 - `bridge` 收到响应后,也会将响应原封不动地返回给`portal`。
- `portal` - `portal`
- `portal` 收到请求且domain匹配则说明是由 `bridge` 发来的响应数据,这条连接会用于建立反向通道。 - `portal` 收到请求且domain匹配则说明是由 `bridge` 发来的响应数据,这条连接会用于建立反向通道。
- `portal` 收到请求domain不匹配则说明是公网用户发来的连接这种连接数据会转发给bridge. - `portal` 收到请求domain不匹配则说明是公网用户发来的连接这种连接数据会转发给bridge.
@ -39,16 +42,16 @@
"bridges": [ "bridges": [
{ {
"tag": "bridge", "tag": "bridge",
"domain": "reverse-proxy.xray.internal" "domain": "reverse-proxy.xray.internal",
} },
], ],
"portals": [ "portals": [
{ {
"tag": "portal", "tag": "portal",
"domain": "reverse-proxy.xray.internal" "domain": "reverse-proxy.xray.internal",
} },
] ],
} },
} }
``` ```
@ -65,7 +68,7 @@
```jsonc ```jsonc
{ {
"tag": "bridge", "tag": "bridge",
"domain": "reverse-proxy.xray.internal" "domain": "reverse-proxy.xray.internal",
} }
``` ```
@ -83,7 +86,7 @@
```jsonc ```jsonc
{ {
"tag": "portal", "tag": "portal",
"domain": "reverse-proxy.xray.internal" "domain": "reverse-proxy.xray.internal",
} }
``` ```
@ -130,8 +133,8 @@ outbound:
"tag": "out", "tag": "out",
"protocol": "freedom", "protocol": "freedom",
"settings": { "settings": {
"redirect": "127.0.0.1:80" "redirect": "127.0.0.1:80",
} },
} }
``` ```
@ -146,13 +149,13 @@ outbound:
"port": 1024, "port": 1024,
"users": [ "users": [
{ {
"id": "5783a3e7-e373-51cd-8642-c83782b807c5" "id": "5783a3e7-e373-51cd-8642-c83782b807c5",
}
]
}
]
}, },
"tag": "interconn" ],
},
],
},
"tag": "interconn",
} }
``` ```
@ -167,16 +170,16 @@ outbound:
"type": "field", "type": "field",
"inboundTag": ["bridge"], "inboundTag": ["bridge"],
"domain": ["full:reverse-proxy.xray.internal"], "domain": ["full:reverse-proxy.xray.internal"],
"outboundTag": "interconn" "outboundTag": "interconn",
}, },
{ {
// 从 portal 过来的流量,也会从 bridge 出来但是不带上面的domain // 从 portal 过来的流量,也会从 bridge 出来但是不带上面的domain
// 则路由到 out即转发给网页服务器 // 则路由到 out即转发给网页服务器
"type": "field", "type": "field",
"inboundTag": ["bridge"], "inboundTag": ["bridge"],
"outboundTag": "out" "outboundTag": "out",
} },
] ],
} }
``` ```
@ -208,8 +211,8 @@ inbound:
"settings": { "settings": {
"address": "127.0.0.1", "address": "127.0.0.1",
"port": 80, "port": 80,
"network": "tcp" "network": "tcp",
} },
} }
``` ```
@ -222,10 +225,10 @@ inbound:
"settings": { "settings": {
"clients": [ "clients": [
{ {
"id": "5783a3e7-e373-51cd-8642-c83782b807c5" "id": "5783a3e7-e373-51cd-8642-c83782b807c5",
} },
] ],
} },
} }
``` ```
@ -239,7 +242,7 @@ inbound:
// 则路由到 portal, 最终会转发给 bridge // 则路由到 portal, 最终会转发给 bridge
"type": "field", "type": "field",
"inboundTag": ["external"], "inboundTag": ["external"],
"outboundTag": "portal" "outboundTag": "portal",
}, },
{ {
// 如果来自 interconn 入站,说明是来自 bridge 的尝试建立反向隧道请求, // 如果来自 interconn 入站,说明是来自 bridge 的尝试建立反向隧道请求,
@ -247,8 +250,8 @@ inbound:
// 注意这里进入的请求会带上了前文配置的domain所以 portal 能够区分两种被路由到 portal 的请求 // 注意这里进入的请求会带上了前文配置的domain所以 portal 能够区分两种被路由到 portal 的请求
"type": "field", "type": "field",
"inboundTag": ["interconn"], "inboundTag": ["interconn"],
"outboundTag": "portal" "outboundTag": "portal",
} },
] ],
} }
``` ```

View File

@ -239,12 +239,14 @@ Xray-core v1.8.7 或更高版本可省略该行。
> `strategy`: [StrategyObject](#strategyobject) > `strategy`: [StrategyObject](#strategyobject)
#### StrategyObject #### StrategyObject
```json ```json
{ {
"type": "roundRobin", "type": "roundRobin",
"settings": {} "settings": {}
} }
``` ```
> `type` : "random" | "roundRobin" | "leastPing" | "leastLoad" > `type` : "random" | "roundRobin" | "leastPing" | "leastLoad"
- `random` 默认值。随机选择匹配到的出站代理。 - `random` 默认值。随机选择匹配到的出站代理。
@ -264,11 +266,13 @@ Xray-core v1.8.7 或更高版本可省略该行。
"maxRTT": "1s", "maxRTT": "1s",
"tolerance": 0.01, "tolerance": 0.01,
"baselines": ["1s"], "baselines": ["1s"],
"costs": [{ "costs": [
{
"regexp": false, "regexp": false,
"match": "tag", "match": "tag",
"value": 0.5 "value": 0.5
}] }
]
} }
``` ```
@ -304,7 +308,6 @@ Xray-core v1.8.7 或更高版本可省略该行。
权重值,值越大,对应节点越不易被选中。 权重值,值越大,对应节点越不易被选中。
### 负载均衡配置示例 ### 负载均衡配置示例
```json ```json

View File

@ -103,7 +103,7 @@ Reality 是目前最安全的传输加密方案, 且外部看来流量类型和
```json ```json
{ {
"serverName": "xray.com", "serverName": "xray.com",
"serverNameToVerify":"", "serverNameToVerify": "",
"rejectUnknownSni": false, "rejectUnknownSni": false,
"allowInsecure": false, "allowInsecure": false,
"alpn": ["h2", "http/1.1"], "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). 一般与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 > `privateKey` : string
@ -358,7 +358,7 @@ Reality 只是修改了TLS客户端的实现只需要轻度修改完全随机
服务端 serverNames 之一。 服务端 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 > `fingerprint` : string
@ -590,7 +590,6 @@ OCSP 装订更新,与证书热重载的时间间隔。 单位:秒。默认
> "UseIP" | "UseIPv6v4" | "UseIPv6" | "UseIPv4v6" | "UseIPv4"<br> > "UseIP" | "UseIPv6v4" | "UseIPv6" | "UseIPv4v6" | "UseIPv4"<br>
> "ForceIP" | "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4" > "ForceIP" | "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4"
在之前的版本中,当 Xray 尝试使用域名建立系统连接时,域名的解析由系统完成,不受 Xray 在之前的版本中,当 Xray 尝试使用域名建立系统连接时,域名的解析由系统完成,不受 Xray
控制。这导致了在 [非标准 Linux 环境中无法解析域名](https://github.com/v2ray/v2ray-core/issues/1909) 等问题。为此Xray 1.3.1 为 Sockopt 引入了 Freedom 控制。这导致了在 [非标准 Linux 环境中无法解析域名](https://github.com/v2ray/v2ray-core/issues/1909) 等问题。为此Xray 1.3.1 为 Sockopt 引入了 Freedom
中的 domainStrategy解决了此问题。 中的 domainStrategy解决了此问题。

View File

@ -36,15 +36,15 @@
HTTPUpgrade 所使用的 HTTP 协议路径,默认值为 `"/"` HTTPUpgrade 所使用的 HTTP 协议路径,默认值为 `"/"`
如果客户端路径中包含 `ed` 参数(如 ```/mypath?ed=2560```),将会启用 `Early Data` 以降低延迟,其值为首包长度阈值。如果首包长度超过此值,就不会启用 `Early Data`。建议的值为2560。 如果客户端路径中包含 `ed` 参数(如 `/mypath?ed=2560`),将会启用 `Early Data` 以降低延迟,其值为首包长度阈值。如果首包长度超过此值,就不会启用 `Early Data`。建议的值为2560。
> `host`: string > `host`: string
HTTPUpgrade 的HTTP请求中所发送的host默认值为空。若服务端值为空时不验证客户端发送来的host值。 HTTPUpgrade 的HTTP请求中所发送的host默认值为空。若服务端值为空时不验证客户端发送来的host值。
当在服务端指定该值,或在 ```headers``` 中指定host将会校验与客户端请求host是否一致。 当在服务端指定该值,或在 `headers` 中指定host将会校验与客户端请求host是否一致。
客户端选择发送的host优先级 ```host``` > ```headers``` > ```address``` 客户端选择发送的host优先级 `host` > `headers` > `address`
> `headers`: map \{string: string\} > `headers`: map \{string: string\}

View File

@ -42,15 +42,15 @@ Websocket 会识别 HTTP 请求的 X-Forwarded-For 头来覆写流量的源地
WebSocket 所使用的 HTTP 协议路径,默认值为 `"/"` 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 > `host`: string
WebSocket 的HTTP请求中所发送的host默认值为空。若服务端值为空时不验证客户端发送来的host值。 WebSocket 的HTTP请求中所发送的host默认值为空。若服务端值为空时不验证客户端发送来的host值。
当在服务端指定该值,或在 ```headers``` 中指定host将会校验与客户端请求host是否一致。 当在服务端指定该值,或在 `headers` 中指定host将会校验与客户端请求host是否一致。
客户端选择发送的host优先级 ```host``` > ```headers``` > ```address``` 客户端选择发送的host优先级 `host` > `headers` > `address`
> `headers`: map \{string: string\} > `headers`: map \{string: string\}

View File

@ -137,12 +137,14 @@ For end user
一个表示可选范围的值,可以是以下几种写法 一个表示可选范围的值,可以是以下几种写法
-包含在引号里的单独数字或范围 -包含在引号里的单独数字或范围
- `""` (视为0) 注意部分字段完全不设置和设置为空可能是两种概念
- `"114"` - `""` (视为0) 注意部分字段完全不设置和设置为空可能是两种概念
- `"114-514"` - `"114"`
- `"114-514"`
-独立的int这种情况下只能是单数字 -独立的int这种情况下只能是单数字
- `114`
- `114`
For dev For dev

View File

@ -55,6 +55,7 @@ without launching the server.
The -dump flag tells Xray to print the merged config. The -dump flag tells Xray to print the merged config.
``` ```
`-config=` / `-c=` 用于指定使用的配置文件的位置,支持多文件配置。 `-config=` / `-c=` 用于指定使用的配置文件的位置,支持多文件配置。
`-confdir=` 用于指定一个包含多个配置文件的文件夹。 `-confdir=` 用于指定一个包含多个配置文件的文件夹。
`-format=` 用于指定使用的配置文件的格式。 `-format=` 用于指定使用的配置文件的格式。
@ -117,6 +118,7 @@ The commands are:
``` ```
`pb` 子命令使用示例: `pb` 子命令使用示例:
```bash ```bash
# 用法xray convert pb [-debug] [-type] [json file] [json file] ... # 用法xray convert pb [-debug] [-type] [json file] [json file] ...
@ -134,6 +136,7 @@ xray help convert pb
``` ```
json 子命令使用示例: json 子命令使用示例:
```bash ```bash
# 用法xray convert json [-type] [stdin:] [typedMessage file] # 用法xray convert json [-type] [stdin:] [typedMessage file]
@ -171,6 +174,7 @@ xray tls <command> [arguments]
``` ```
### xray uuid ### xray uuid
生成 UUID。 生成 UUID。
使用方法: 使用方法:
@ -180,6 +184,7 @@ xray uuid [-i "example"]
``` ```
### xray x25519 ### xray x25519
生成 x25519 密钥对。 生成 x25519 密钥对。
使用方法: 使用方法:
@ -189,6 +194,7 @@ xray x25519 [-i "(base64.RawURLEncoding)" --std-encoding ]
``` ```
### xray wg ### xray wg
生成 wireguard curve25519 密钥对。 生成 wireguard curve25519 密钥对。
使用方法: 使用方法:
@ -203,5 +209,3 @@ xray wg [-i "(base64.StdEncoding)"]
- 工作目录Working Directory - 工作目录Working Directory
- [环境变量](../config/features/env.md#资源文件路径)中 `Xray.location.asset` 所指定的路径 - [环境变量](../config/features/env.md#资源文件路径)中 `Xray.location.asset` 所指定的路径
::: :::

View File

@ -85,13 +85,14 @@
"rules": [ "rules": [
{ {
"type": "field", "type": "field",
"ip": ["geoip:private","geoip:cn"], // 绕过局域网和国内IP段 "ip": ["geoip:private", "geoip:cn"], // 绕过局域网和国内IP段
"outboundTag": "direct" "outboundTag": "direct"
} }
] ]
} }
} }
``` ```
上述配置唯一要更改的地方是你的服务器 IP 和用户 uuid配置中已注明。上述配置会把除局域网比如访问路由器和国内IP段比如访问bilibili、acfun以外的所有流量转发至你的服务器。 上述配置唯一要更改的地方是你的服务器 IP 和用户 uuid配置中已注明。上述配置会把除局域网比如访问路由器和国内IP段比如访问bilibili、acfun以外的所有流量转发至你的服务器。
## 运行 ## 运行

View File

@ -5,7 +5,7 @@
Xray 在以下平台中可用: Xray 在以下平台中可用:
- Windows 7 及之后版本x86 / amd64 / arm32 / arm64 - 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 - macOS 10.10 Yosemite 及之后版本amd64 / arm64
- Linux 2.6.23 及之后版本x86 / amd64 / arm / arm64 / mips64 / mips / ppc64 / s390x / riscv64 - 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 等; - 包括但不限于 Debian 7 / 8、Ubuntu 12.04 / 14.04 及后续版本、CentOS 7 / 8、Arch Linux 等;

View File

@ -85,9 +85,9 @@ Linux 服务器的安全防护是一个纷繁复杂的巨大课题。无数的
- 如果第 3 步你有仔细观察,就会发现保存并不是常见的 `ctrl+s` - 如果第 3 步你有仔细观察,就会发现保存并不是常见的 `ctrl+s`
- 正确的快捷键:保存是 `ctrl+o` + `回车`,退出是 `ctrl+x` - 正确的快捷键:保存是 `ctrl+o` + `回车`,退出是 `ctrl+x`
- (部分操作系统) 新增一个防火墙规则设置为新增的SSH端口, 否则实例重启后无法SSH登陆。 - (部分操作系统) 新增一个防火墙规则设置为新增的SSH端口, 否则实例重启后无法SSH登陆。
- 如 Ubuntu 的 ufw - 如 Ubuntu 的 ufw
```shell ```shell
sudo ufw allow 9753/tcp sudo ufw allow 9753/tcp
``` ```

View File

@ -31,10 +31,13 @@
3. 如果无法看到上述Nginx默认页面可能是需要配置Debian系统上默认的防火墙组件Uncomplicated Firewall (UFW),以便启用 HTTP (80) 和 HTTPS (443) 端口流量。 3. 如果无法看到上述Nginx默认页面可能是需要配置Debian系统上默认的防火墙组件Uncomplicated Firewall (UFW),以便启用 HTTP (80) 和 HTTPS (443) 端口流量。
a. 验证方法,输入: a. 验证方法,输入:
```shell ```shell
sudo ufw status sudo ufw status
``` ```
b. 如果输出如下表明80和433端口未开启需要执行c步骤 b. 如果输出如下表明80和433端口未开启需要执行c步骤
```shell ```shell
Status: active Status: active
To Action From To Action From
@ -42,11 +45,15 @@
22/tcp ALLOW Anywhere 22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6) 22/tcp (v6) ALLOW Anywhere (v6)
``` ```
c. 启用UFW的Nginx 80 和 443 端口命令 c. 启用UFW的Nginx 80 和 443 端口命令
```shell ```shell
sudo ufw allow 'Nginx Full' sudo ufw allow 'Nginx Full'
``` ```
d. 输入a中命令再次验证如果输出如下表示Nginx流量已经被防火墙放行这样就应该可以看到前述第2点中的Nginx默认页面。 d. 输入a中命令再次验证如果输出如下表示Nginx流量已经被防火墙放行这样就应该可以看到前述第2点中的Nginx默认页面。
```shell ```shell
Status: active Status: active
To Action From To Action From
@ -57,7 +64,6 @@
Nginx Full (v6) ALLOW Anywhere (v6) Nginx Full (v6) ALLOW Anywhere (v6)
``` ```
## 5.3 创建一个最简单的网页 ## 5.3 创建一个最简单的网页
1. 小小白白 Linux 基础命令: 1. 小小白白 Linux 基础命令:
@ -130,7 +136,7 @@
chmod -R a+r . chmod -R a+r .
``` ```
6. 修改 `nginx.conf` 并重启 `Nginx` 服务,将`80`端口的 http 访问定位到刚才建立的 `html` 页面上 5. 修改 `nginx.conf` 并重启 `Nginx` 服务,将`80`端口的 http 访问定位到刚才建立的 `html` 页面上
1. 修改 `nginx.conf` 1. 修改 `nginx.conf`

View File

@ -41,6 +41,7 @@ Endpoint = <EndpointIP>:<Port>
``` ```
`[Interface]` 下添加如下命令: `[Interface]` 下添加如下命令:
```ini ```ini
Table = <table> Table = <table>
### fwmark ### fwmark
@ -59,13 +60,14 @@ PostDown = ip rule del oif %i lookup <table>
PreUp = ip -6 rule add oif %i lookup <table> PreUp = ip -6 rule add oif %i lookup <table>
PostDown = ip -6 rule del oif %i lookup <table> PostDown = ip -6 rule del oif %i lookup <table>
``` ```
::: tip ::: tip
- 此配置文件融合了 `fwmark` / `sendThrough` / `sockopt.interface`,表示 - 此配置文件融合了 `fwmark` / `sendThrough` / `sockopt.interface`,表示
- 送入此设备 `%i` 的连接 / 送入此 `<IPv4/6>` 的连接 / `fwmark` 被标记为 `<mark>` 的连接 - 送入此设备 `%i` 的连接 / 送入此 `<IPv4/6>` 的连接 / `fwmark` 被标记为 `<mark>` 的连接
- 将会使用 wireguard 进行转发 - 将会使用 wireguard 进行转发
- `%i` 是 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; [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空间请大家帮忙找吧--> <!--剩下几位大佬我实在找不到他们的地址或Github空间请大家帮忙找吧-->

View File

@ -91,6 +91,7 @@ Linux 使用`Netfilter`来管理网络,`Netfilter`模型如下:
4. 能够手写客户端 json 文件配置,至少要能看懂 4. 能够手写客户端 json 文件配置,至少要能看懂
### 前期准备工作 ### 前期准备工作
::: warning ::: warning
在开始操作前,记得使用 `sysctl -w net.ipv4.ip_forward=1` 打开linux ipv4封包转发 在开始操作前,记得使用 `sysctl -w net.ipv4.ip_forward=1` 打开linux ipv4封包转发
::: :::

View File

@ -15,7 +15,9 @@ Xray1.6.5+)新加入了 WireGuard 出站,虽然增加的代码和依赖
## 申请 Warp 账户 ## 申请 Warp 账户
### 感谢 Cloudflare 推动自由的互联网,现在你可以免费使用 Warp 服务,连接的时候会根据出口自动选择最近的服务器 ### 感谢 Cloudflare 推动自由的互联网,现在你可以免费使用 Warp 服务,连接的时候会根据出口自动选择最近的服务器
#### 方法 1 #### 方法 1
1. 使用一台 vps下载 [wgcf](https://github.com/ViRb3/wgcf/releases) 1. 使用一台 vps下载 [wgcf](https://github.com/ViRb3/wgcf/releases)
2. 运行 `wgcf register` 生成 `wgcf-account.toml` 2. 运行 `wgcf register` 生成 `wgcf-account.toml`
3. 运行 `wgcf generate` 生成 `wgcf-profile.conf` 拷贝内容如下: 3. 运行 `wgcf generate` 生成 `wgcf-profile.conf` 拷贝内容如下:
@ -33,17 +35,22 @@ AllowedIPs = 0.0.0.0/0
AllowedIPs = ::/0 AllowedIPs = ::/0
Endpoint = engage.cloudflareclient.com:2408 Endpoint = engage.cloudflareclient.com:2408
``` ```
#### 方法 2 #### 方法 2
1. 使用 [warp-reg.sh](https://github.com/chise0713/warp-reg.sh),运行: 1. 使用 [warp-reg.sh](https://github.com/chise0713/warp-reg.sh),运行:
``` ```
bash -c "$(curl -L warp-reg.vercel.app)" bash -c "$(curl -L warp-reg.vercel.app)"
``` ```
- 输出 - 输出
```json ```json
{ {
"endpoint":{ "endpoint": {
"v4": "162.159.192.7", "v4": "162.159.192.7",
"v6": "[2606:4700:d0::a29f:c007]", "v6": "[2606:4700:d0::a29f:c007]"
}, },
"reserved_dec": [35, 74, 190], "reserved_dec": [35, 74, 190],
"reserved_hex": "0x234abe", "reserved_hex": "0x234abe",
@ -54,13 +61,19 @@ bash -c "$(curl -L warp-reg.vercel.app)"
"v6": "2606:4700:110:81f3:2a5b:3cad:9d4:9ea6" "v6": "2606:4700:110:81f3:2a5b:3cad:9d4:9ea6"
} }
``` ```
2. 拷贝输出的内容 2. 拷贝输出的内容
#### 方法 3 #### 方法 3
1. 使用[wgcf-cli](https://github.com/ArchiveNetwork/wgcf-cli),运行以下内容进行安装: 1. 使用[wgcf-cli](https://github.com/ArchiveNetwork/wgcf-cli),运行以下内容进行安装:
``` ```
bash -c "$(curl -L wgcf-cli.vercel.app)" bash -c "$(curl -L wgcf-cli.vercel.app)"
``` ```
2. 运行 `wgcf-cli register` 进行注册,输出: 2. 运行 `wgcf-cli register` 进行注册,输出:
```json ```json
wgcf-cli register wgcf-cli register
{ {
@ -83,38 +96,33 @@ bash -c "$(curl -L wgcf-cli.vercel.app)"
} }
} }
``` ```
- 完整文件将会保存到工作目录的 `wgcf.json` 内。 - 完整文件将会保存到工作目录的 `wgcf.json` 内。
3. 运行 `wgcf-cli generate --xray` 来生成一个WireGurad出站他会将内容保存到 `wgcf.xray.json` 3. 运行 `wgcf-cli generate --xray` 来生成一个WireGurad出站他会将内容保存到 `wgcf.xray.json`
- 示例文件: - 示例文件:
```json ```json
{ {
"protocol": "wireguard", "protocol": "wireguard",
"settings": { "settings": {
"secretKey": "6CRVRLgFwGajnikoVOPTDNZnDhx3EydhPsMgpxHfBCY=", "secretKey": "6CRVRLgFwGajnikoVOPTDNZnDhx3EydhPsMgpxHfBCY=",
"address": [ "address": ["172.16.0.2/32", "2606:4700:110:857a:6a95:fe27:1870:2a9d/128"],
"172.16.0.2/32",
"2606:4700:110:857a:6a95:fe27:1870:2a9d/128"
],
"peers": [ "peers": [
{ {
"publicKey": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=", "publicKey": "bmXOC+F1FxEMF9dyiK2H5/1SUtzH0JuVo51h2wPfgyo=",
"allowedIPs": [ "allowedIPs": ["0.0.0.0/0", "::/0"],
"0.0.0.0/0",
"::/0"
],
"endpoint": "162.159.192.1:2408" "endpoint": "162.159.192.1:2408"
} }
], ],
"reserved": [ "reserved": [240, 25, 146],
240,
25,
146
],
"mtu": 1280 "mtu": 1280
}, },
"tag": "wireguard" "tag": "wireguard"
} }
``` ```
## 在服务端分流回国流量至 warp ## 在服务端分流回国流量至 warp
在现有出站中新增一个 WireGurad 出站 在现有出站中新增一个 WireGurad 出站
@ -131,7 +139,7 @@ bash -c "$(curl -L wgcf-cli.vercel.app)"
"endpoint": "engage.cloudflareclient.com:2408" "endpoint": "engage.cloudflareclient.com:2408"
} }
], ],
"reserved":[0, 0, 0] // 如果你有的话粘贴reserved到这里 "reserved": [0, 0, 0] // 如果你有的话粘贴reserved到这里
}, },
"tag": "wireguard-1" "tag": "wireguard-1"
} }

View File

@ -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> ## 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. Added HTTPUpgrade transport, said to be lighter than WebSocket.
- Already added to the sharing link package. - Already added to the sharing link package.
## 2024.2.29 ## 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). 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. - 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. - 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. - 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. Spent the last few days refining details from morning till night. We hope you'll star and follow the project.

View File

@ -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). 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] > `services`: [string]
List of enabled APIs, optional values can be found in [Supported API List](#supported-api-list). 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 ## Supported API List
### HandlerService ### 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: API for adding, deleting, and replacing routing rules and querying equalizer statistics. The available functions are as follows:
* `adrules` adds and replaces routing configuration - `adrules` adds and replaces routing configuration
* `rmrules` delete routing rules - `rmrules` delete routing rules
* `sib` Disconnect source IP - `sib` Disconnect source IP
* `bi` Query equalizer statistics - `bi` Query equalizer statistics
* `bo` Forces the equalizer to select the specified outboundTag - `bo` Forces the equalizer to select the specified outboundTag
You can use something like `./xray help api bi` to query the specific usage. You can use something like `./xray help api bi` to query the specific usage.

View File

@ -61,17 +61,13 @@ If the domain name to be queried:
}, },
{ {
"address": "https://1.1.1.1/dns-query", "address": "https://1.1.1.1/dns-query",
"domains": [ "domains": ["geosite:netflix"],
"geosite:netflix"
],
"skipFallback": true, "skipFallback": true,
"queryStrategy": "UseIPv4" "queryStrategy": "UseIPv4"
}, },
{ {
"address": "https://1.1.1.1/dns-query", "address": "https://1.1.1.1/dns-query",
"domains": [ "domains": ["geosite:openai"],
"geosite:openai"
],
"skipFallback": true, "skipFallback": true,
"queryStrategy": "UseIPv6" "queryStrategy": "UseIPv6"
}, },

View File

@ -12,12 +12,12 @@ The TLS fingerprinting behavior is perfect this way, and so it may be possible t
However, there are many drawbacks: However, there are many drawbacks:
* The user has to launch a browser next to the Xray client just for opening the proxy connection. - 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 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 - 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`) - [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 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 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 ## Configuration

View File

@ -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. 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 ### Supported Encryption Methods
The currently supported methods are following: The currently supported methods are following:
- Recommended encryption methods: - Recommended encryption methods:
@ -68,13 +69,15 @@ Required, any of the [supported methods](#supportedencryptionmethods)
> `password`: string > `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 Required. For **Shadowsocks 2022** a pre-shared `base64` random key similar to WireGuard's keys should be used as the password. The command
```sh ```sh
openssl rand -base64 <length> 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: 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 | | Encryption Method | Key Length |
| ----------------------------- | ---------: | | ------------------------------- | ---------: |
| `2022-blake3-aes-128-gcm` | 16 | | `2022-blake3-aes-128-gcm` | 16 |
| `2022-blake3-aes-256-gcm` | 32 | | `2022-blake3-aes-256-gcm` | 32 |
| `2022-blake3-chacha20-poly1305` | 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. 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: 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 ```sh
sudo strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 40 | tr -d '\n'; echo sudo strings /dev/urandom | grep -o '[[:alnum:]]' | head -n 40 | tr -d '\n'; echo
``` ```

View File

@ -88,6 +88,4 @@ Currently, the following flow control modes are available for inbound protocols:
- No `flow` or empty string: Use regular TLS proxy. - No `flow` or empty string: Use regular TLS proxy.
- `xtls-rprx-vision`: Use the new XTLS mode, including inner-handshake random padding. - `xtls-rprx-vision`: Use the new XTLS mode, including inner-handshake random padding.
Additionally, XTLS currently only supports TCP+TLS/Reality. Additionally, XTLS currently only supports TCP+TLS/Reality.

View File

@ -14,11 +14,11 @@ User-space implementation of the Wireguard protocol.
"peers": [ "peers": [
{ {
"publicKey": "PUBLIC_KEY", "publicKey": "PUBLIC_KEY",
"allowedIPs":[""] "allowedIPs": [""]
} }
], ],
"kernelMode": true, // optional, default true if it's supported and permission is sufficient "kernelMode": true, // optional, default true if it's supported and permission is sufficient
"mtu": 1420, // optional, default 1420 "mtu": 1420 // optional, default 1420
} }
``` ```

View File

@ -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`. 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 ::: 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. 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. 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. 3.
4. FakeDNS client queries are never logged to the access log. 4. FakeDNS client queries are never logged to the access log.
::: :::
> `maskAddress`: "quarter" | "half" | "full" > `maskAddress`: "quarter" | "half" | "full"

View File

@ -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` Access `http://127.0.0.1:11111/debug/vars`
Variables exported include: 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) 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> </details>
To get a better view of these numbers, [Netdata](https://github.com/netdata/netdata) (with python.d plugin) is a great option: 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 id: udp
expvar_type: int expvar_type: int
``` ```
</details> </details>
And you will get a nice plot like this: And you will get a nice plot like this:
@ -270,6 +273,7 @@ And you will get a nice plot like this:
![160428235-2988bf69-5d6c-41ec-8267-1bd512508aa8](https://github.com/chika0801/Xray-docs-next/assets/88967758/455e88ce-ced2-4593-a9fa-425bb293215b) ![160428235-2988bf69-5d6c-41ec-8267-1bd512508aa8](https://github.com/chika0801/Xray-docs-next/assets/88967758/455e88ce-ced2-4593-a9fa-425bb293215b)
### Additional ### Additional
Maybe reusing the empty object `stats` in config file is better than adding `metrics` here? 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 **Edit:** removed prometheus related things and added usage about expvars

View File

@ -8,11 +8,10 @@ components, such as load balancers. There are currently two options:
You can choose one of them as needed. You can choose one of them as needed.
## ObservatoryObject ## ObservatoryObject
```json ```json
{ {
"subjectSelector":[ "subjectSelector": ["outbound"],
"outbound"
],
"probeUrl": "https://www.google.com/generate_204", "probeUrl": "https://www.google.com/generate_204",
"probeInterval": "10s", "probeInterval": "10s",
"enableConcurrency": false "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. - `false`: Probe each matching outbound proxy one by one, pausing for the time set by `probeInterval` after probing each one.
## BurstObservatoryObject ## BurstObservatoryObject
```json ```json
{ {
"subjectSelector":[ "subjectSelector": ["outbound"],
"outbound"
],
"pingConfig": {} "pingConfig": {}
} }
``` ```
@ -52,8 +50,8 @@ An array of strings, where each string is used to match the prefix of outbound p
> `pingConfig`: [PingConfigObject](#PingConfigObject) > `pingConfig`: [PingConfigObject](#PingConfigObject)
### PingConfigObject ### PingConfigObject
```json ```json
{ {
"destination": "https://connectivitycheck.gstatic.com/generate_204", "destination": "https://connectivitycheck.gstatic.com/generate_204",

View File

@ -14,23 +14,23 @@ Freedom is an outbound protocol that can be used to send (normal) TCP or UDP dat
"length": "100-200", "length": "100-200",
"interval": "10-20" // ms "interval": "10-20" // ms
}, },
"noises":[ "noises": [
{ {
"type":"base64", "type": "base64",
"packet":"7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=", "packet": "7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=",
"delay":"10-16" "delay": "10-16"
}, },
{ {
"type":"rand", "type": "rand",
"packet":"10-20", "packet": "10-20",
"delay":"10-16" "delay": "10-16"
}, },
{ {
"type":"str", "type": "str",
"packet":"hiGFW", "packet": "hiGFW",
"delay":"10-16" "delay": "10-16"
} }
], ],
"proxyProtocol": 0 "proxyProtocol": 0
} }
``` ```
@ -76,7 +76,7 @@ A key-value map used to control TCP fragmentationunder some circumstances it
::: warning ::: warning
⚠️ "noise":{} is deptecated,only "noises":[{}] is supported in 24.9.16 and later ⚠️ "noise":{} is deptecated,only "noises":[{}] is supported in 24.9.16 and later
::: :::
> `noises`: [ noiseObject ] > `noises`: [ noiseObject ]

View File

@ -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. 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": [ "outbounds": [
{ {
"protocol": "loopback", "protocol": "loopback",
"tag": "need-to-split", "tag": "need-to-split",
"settings": { "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", "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", "tag": "udp-output",
// protocol, settings, streamSettings etc. // protocol, settings, streamSettings etc.
} },
], ],
"routing": { "routing": {
"rules": [ "rules": [
{ {
"inboundTag": ["traffic-input"], // tag set in the loopback outbound setting "inboundTag": ["traffic-input"], // tag set in the loopback outbound setting
"network": "tcp", "network": "tcp",
"outboundTag": "tcp-output" "outboundTag": "tcp-output",
}, },
{ {
"inboundTag": ["traffic-input"], // tag set in the loopback outbound "inboundTag": ["traffic-input"], // tag set in the loopback outbound
"network": "udp", "network": "udp",
"outboundTag": "udp-output" "outboundTag": "udp-output",
} },
] ],
} },
} }
``` ```

View File

@ -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> 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 | | domainStrategy | test-ipv6.com | bgp.he.net | chat.openai.com |
| :--- | :---: | :---: | :---: | | :------------- | :---------------------: | :--------: | :-------------: |
| ForceIPv6v4 | IPv6v4 | IPv6 | IPv6 | | ForceIPv6v4 | IPv6v4 | IPv6 | IPv6 |
| ForceIPv6 | The website won't open. | IPv6 | IPv6 | | ForceIPv6 | The website won't open. | IPv6 | IPv6 |
| ForceIPv4v6 | IPv6v4 **1** | IPv4 | IPv4 | | 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. ` **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** **Note 1**
- Conflicts with `"queryStrategy"` may cause the site to fail to open. - 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. - 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** **Note 2**
- Xray-core v1.8.0 - v1.8.4 without `"domainStrategy"`. - 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. - 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. - 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.

View File

@ -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 `"/"`. 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 > `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. 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\} > `headers`: map \{string: string\}

View File

@ -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. 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\} > `headers`: map \{string: string\}

View File

@ -28,6 +28,7 @@ The commands are:
Use "xray help <command>" for more information about a command. Use "xray help <command>" for more information about a command.
``` ```
### xray run ### xray run
Specify one or more configuration files and 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. The -dump flag tells Xray to print the merged config.
``` ```
::: tip ::: 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. 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` Sub-command `pb`
```bash ```bash
# Usage: xray convert pb [-debug] [-type] [json file] [json file] ... # Usage: xray convert pb [-debug] [-type] [json file] [json file] ...
@ -122,6 +125,7 @@ xray help convert pb
``` ```
Sub-command JSON Sub-command JSON
```bash ```bash
# Usage: xray convert json [-type] [stdin:] [typedMessage file] # Usage: xray convert json [-type] [stdin:] [typedMessage file]
@ -169,6 +173,7 @@ xray uuid
``` ```
### xray x25519 ### xray x25519
Generate x25519 key pair。 Generate x25519 key pair。
Usage: Usage:
@ -178,6 +183,7 @@ xray x25519 [-i "(base64.RawURLEncoding)" --std-encoding]
``` ```
### xray wg ### xray wg
Generate wireguard curve25519 key pair。 Generate wireguard curve25519 key pair。
Usage: Usage:

View File

@ -4,7 +4,7 @@
- Xray is available on the following platforms: - Xray is available on the following platforms:
- Windows 7 and later (x86 / amd64 / arm32 / arm64); - 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); - macOS 10.10 Yosemite and later (amd64 / arm64);
- Linux 2.6.23 and later (x86 / amd64 / arm / arm64 / mips64 / mips / ppc64 / s390x / riscv64); - 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.; - Including but not limited to Debian 7 / 8, Ubuntu 12.04 / 14.04 and subsequent versions, CentOS 7 / 8, Arch Linux, etc.;

View File

@ -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: 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" - 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 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 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 3. **Safety**: Airports are generally have good security practices, such as encryption and firewalls to ensure the security of user data

View File

@ -30,7 +30,7 @@ When writing this article, the installation script had some minor bugs when usin
1. Basic Linux commands for beginners: 1. Basic Linux commands for beginners:
| Number | Command name | Command description | | Number | Command name | Command description |
| :------: | :------: | :------: | | :------: | :----------: | :-----------------: |
| `cmd-14` | `rm` | delete | | `cmd-14` | `rm` | delete |
2. Download the installation script: 2. Download the installation script:
@ -94,7 +94,7 @@ chmod +r ~/xray_cert/xray.key
1. Basic Linux commands for beginners: 1. Basic Linux commands for beginners:
| Number | Command name | Command description | | Number | Command name | Command description |
| :------: | :----------: | :--------------------: | | :------: | :----------: | :------------------------------------: |
| `cmd-15` | `crontab -e` | Edit the current user's scheduled task | | `cmd-15` | `crontab -e` | Edit the current user's scheduled task |
2. Create a script file (`xray-cert-renew.sh`) 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"` 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 ```json
// REFERENCE: // REFERENCE:
@ -250,33 +250,41 @@ First, you can refer to the [official VLESS configuration example](https://githu
}, },
// 4* Inbound settings // 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. // 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, "port": 443,
"protocol": "vless", "protocol": "vless",
"settings": { "settings": {
"clients": [{ "clients": [
{
"id": "", // Fill in your UUID "id": "", // Fill in your UUID
"flow": "xtls-rprx-vision", "flow": "xtls-rprx-vision",
"level": 0, "level": 0,
"email": "vpsadmin@yourdomain.com" "email": "vpsadmin@yourdomain.com"
}], }
],
"decryption": "none", "decryption": "none",
"fallbacks": [{ "fallbacks": [
{
"dest": 80 // Fall back to anti-detection proxy by default "dest": 80 // Fall back to anti-detection proxy by default
}] }
]
}, },
"streamSettings": { "streamSettings": {
"network": "tcp", "network": "tcp",
"security": "tls", "security": "tls",
"tlsSettings": { "tlsSettings": {
"alpn": "http/1.1", "alpn": "http/1.1",
"certificates": [{ "certificates": [
{
"certificateFile": "/home/vpsadmin/xray_cert/xray.crt", "certificateFile": "/home/vpsadmin/xray_cert/xray.crt",
"keyFile": "/home/vpsadmin/xray_cert/xray.key" "keyFile": "/home/vpsadmin/xray_cert/xray.key"
}] }
]
} }
} }
}], }
],
// 5*Outbound settings // 5*Outbound settings
"outbounds": [ "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) // 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:
![Create log file and `config.json` configuration file](./ch07-img04-xray-log-and-config.gif) ![Create log file and `config.json` configuration file](./ch07-img04-xray-log-and-config.gif)
## 7.5 Start Xray service! ! (and check the service status) ## 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 8. Confirm that `BBR` is enabled
If you want to confirm whether `BBR` is enabled correctly, you can use the following command: If you want to confirm whether `BBR` is enabled correctly, you can use the following command:
```shell `shell
lsmod | grep bbr lsmod | grep bbr
``` `
This should return the following result: This should return the following result:
``` ` tcp_bbr
tcp_bbr `
``` If you want to confirm whether the `fq` algorithm is enabled correctly, you can use the following command:
If you want to confirm whether the `fq` algorithm is enabled correctly, you can use the following command: `shell
```shell
lsmod | grep fq lsmod | grep fq
``` `
This should return the following result: This should return the following result:
``` ` sch_fq
sch_fq `
```
## 7.8 Server Optimization 2: Enable HTTP to automatically redirect to HTTPS ## 7.8 Server Optimization 2: Enable HTTP to automatically redirect to HTTPS

View File

@ -26,7 +26,6 @@ features:
details: | details: |
Высоконастраиваемая система маршрутизации, отвечающая разнообразным требованиям использования и позволяющая максимально эффективно использовать производительность сети. Высоконастраиваемая система маршрутизации, отвечающая разнообразным требованиям использования и позволяющая максимально эффективно использовать производительность сети.
- title: Полная совместимость - title: Полная совместимость
details: | details: |
Полная совместимость с конфигурационными файлами и вызовами API v2ray-core. Полная совместимость с конфигурационными файлами и вызовами API v2ray-core.
@ -101,5 +100,3 @@ footer: Лицензия CC-BY-SA 4.0 | Авторские права 2020-на
### Динамика звезд на GitHub ### Динамика звезд на GitHub
[![Stargazers over time](https://starchart.cc/XTLS/Xray-core.svg)](https://starchart.cc/XTLS/Xray-core) [![Stargazers over time](https://starchart.cc/XTLS/Xray-core.svg)](https://starchart.cc/XTLS/Xray-core)

View File

@ -442,9 +442,9 @@ Shadowsocks-2022 — это новый протокол с переработа
Теперь появился открытый и бесплатный Android-клиент на основе Xray-core — [AnXray](https://github.com/XTLS/AnXray)! Поддерживается [@nekohasekai](https://github.com/nekohasekai). Теперь появился открытый и бесплатный 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> ## 2021.3.3 <Badge>[1.3.1](https://github.com/XTLS/Xray-core/releases/tag/v1.3.1)</Badge>
- В этой версии используется Golang 1.16, который официально поддерживает Apple Silicon. - В этой версии используется 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> ## 2021.2.14 <Badge>[1.3.0](https://github.com/XTLS/Xray-core/releases/tag/v1.3.0)</Badge>

View File

@ -90,5 +90,3 @@ lang: ru-RU
> burstObservatory: [BurstObservatoryObject](./observatory.md#burstobservatoryobject) > burstObservatory: [BurstObservatoryObject](./observatory.md#burstobservatoryobject)
Мониторинг параллельных подключений. Обнаружение состояния подключения исходящего прокси. Мониторинг параллельных подключений. Обнаружение состояния подключения исходящего прокси.

View File

@ -22,7 +22,12 @@
"api": { "api": {
"tag": "api", "tag": "api",
"listen": "127.0.0.1:8080", "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 ## Примеры вызова API
[Xray-API-documents](https://github.com/XTLS/Xray-API-documents) @crossfw [Xray-API-documents](https://github.com/XTLS/Xray-API-documents) @crossfw

View File

@ -58,17 +58,13 @@ DNS-запросы, отправляемые встроенным DNS-серве
}, },
{ {
"address": "https://8.8.8.8/dns-query", "address": "https://8.8.8.8/dns-query",
"domains": [ "domains": ["geosite:netflix"],
"geosite:netflix"
],
"skipFallback": true, "skipFallback": true,
"queryStrategy": "UseIPv4" "queryStrategy": "UseIPv4"
}, },
{ {
"address": "https://1.1.1.1/dns-query", "address": "https://1.1.1.1/dns-query",
"domains": [ "domains": ["geosite:openai"],
"geosite:openai"
],
"skipFallback": true, "skipFallback": true,
"queryStrategy": "UseIPv6" "queryStrategy": "UseIPv6"
}, },

View File

@ -196,7 +196,3 @@ FakeDNS будет использовать этот блок IP-адресов
] ]
} }
``` ```

View File

@ -12,12 +12,12 @@ Xray обычно использует uTLS для имитации поведе
Однако есть много недостатков: Однако есть много недостатков:
* Пользователь должен запускать браузер рядом с клиентом Xray только для открытия прокси-соединения. - Пользователь должен запускать браузер рядом с клиентом Xray только для открытия прокси-соединения.
* Browser Dialer не должен быть туннелирован через сам прокси, иначе возникнет петля. Пользователи TUN должны быть осторожны. - Browser Dialer не должен быть туннелирован через сам прокси, иначе возникнет петля. Пользователи TUN должны быть осторожны.
* Браузер может работать только со стандартным HTTP, что означает, что поддерживаются только [WebSocket](../../transports/websocket.md) и [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113#discussioncomment-11468947). - Браузер может работать только со стандартным 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`). - [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) необходимо учитывать при выполнении запросов с одного веб-сайта (`localhost:8080`) на другой (`proxy.example.com:443`).
* Браузер туннелирует ваш трафик с помощью JavaScript, поэтому наблюдается значительное снижение производительности (или разрядка аккумулятора). - Браузер туннелирует ваш трафик с помощью JavaScript, поэтому наблюдается значительное снижение производительности (или разрядка аккумулятора).
* Конфигурация, используемая с Browser Dialer, не может использовать собственные заголовки SNI или хоста. `SNI == host == address`. Пользовательские заголовки HTTP и `tlsSettings` игнорируются полностью. - Конфигурация, используемая с 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`, в других браузерах он может быть уже включен или для него может потребоваться другой флаг. [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113#discussioncomment-11468947) поддерживает QUIC, но также может использоваться собственный стек QUIC браузера. В Chrome это можно сделать через `chrome://flags`, в других браузерах он может быть уже включен или для него может потребоваться другой флаг.
В общем, `tlsSettings` полностью игнорируются при использовании Browser Dialer. Xray никак не контролирует, какую версию HTTP выбирает браузер. В общем, `tlsSettings` полностью игнорируются при использовании Browser Dialer. Xray никак не контролирует, какую версию HTTP выбирает браузер.

View File

@ -98,5 +98,3 @@ VLESS будет перенаправлять трафик с длиной пе
- [Краткое описание функции Fallbacks](../../document/level-1/fallbacks-lv1) - [Краткое описание функции Fallbacks](../../document/level-1/fallbacks-lv1)
## Теория Fallbacks <Badge text="В разработке" type="warning"/> ## Теория Fallbacks <Badge text="В разработке" type="warning"/>

View File

@ -134,5 +134,3 @@ $ xray run -confdir /etc/xray/confs
::: tip ::: tip
Вы можете использовать команду `xray run -confdir=./confs -dump` для просмотра объединенной конфигурации. Однако, поскольку ядро использует формат данных protobuf, формат вывода конфигурации для параметра `-dump` будет отличаться. Вы можете использовать команду `xray run -confdir=./confs -dump` для просмотра объединенной конфигурации. Однако, поскольку ядро использует формат данных protobuf, формат вывода конфигурации для параметра `-dump` будет отличаться.
::: :::

View File

@ -3,5 +3,3 @@
> **XTLS - это оригинальная технология Xray, которая является ключевым фактором высокой производительности Xray.** > **XTLS - это оригинальная технология Xray, которая является ключевым фактором высокой производительности Xray.**
<Badge text="WIP" type="warning"/> <Badge text="WIP" type="warning"/>

View File

@ -212,8 +212,3 @@ Xray будет использовать доменные имена, обнар
Количество случайных портов. Количество случайных портов.
Минимальное значение - `1`, максимальное значение - треть от диапазона портов, указанного в `port`. Минимальное значение - `1`, максимальное значение - треть от диапазона портов, указанного в `port`.
Рекомендуемое значение - `3`. Рекомендуемое значение - `3`.

View File

@ -70,5 +70,3 @@
> `pass`: string > `pass`: string
Пароль, тип данных: строка. Обязательный параметр. Пароль, тип данных: строка. Обязательный параметр.

View File

@ -66,7 +66,7 @@
Используйте команду `openssl rand -base64 <длина>` для генерации ключа, совместимого с shadowsocks-rust, длина зависит от используемого метода шифрования. Используйте команду `openssl rand -base64 <длина>` для генерации ключа, совместимого с shadowsocks-rust, длина зависит от используемого метода шифрования.
| Метод шифрования | Длина ключа | | Метод шифрования | Длина ключа |
| ------------------------------------ | ----------: | | ----------------------------- | ----------: |
| 2022-blake3-aes-128-gcm | 16 | | 2022-blake3-aes-128-gcm | 16 |
| 2022-blake3-aes-256-gcm | 32 | | 2022-blake3-aes-256-gcm | 32 |
| 2022-blake3-chacha20-poly1305 | 32 | | 2022-blake3-chacha20-poly1305 | 32 |
@ -106,5 +106,3 @@
Обратите внимание, что SS2022, в отличие от старого SS, не игнорирует `"password"` верхнего уровня, правильный способ записи пароля клиента: `ServerPassword:UserPassword`. Например: `"password": "114514:1919810"` Обратите внимание, что SS2022, в отличие от старого SS, не игнорирует `"password"` верхнего уровня, правильный способ записи пароля клиента: `ServerPassword:UserPassword`. Например: `"password": "114514:1919810"`
Остальные опции имеют то же значение, что и в InboundConfigurationObject. Остальные опции имеют то же значение, что и в InboundConfigurationObject.

View File

@ -55,7 +55,6 @@
**Предупреждение**: если на вашей машине настроено несколько IP-адресов, это может повлиять на работу [inbound](../inbound.md#inboundobject), когда для UDP используется `0.0.0.0`. **Предупреждение**: если на вашей машине настроено несколько IP-адресов, это может повлиять на работу [inbound](../inbound.md#inboundobject), когда для UDP используется `0.0.0.0`.
> `userLevel`: number > `userLevel`: number
Уровень пользователя. Подключение будет использовать [локальную политику](../policy.md#levelpolicyobject), соответствующую этому уровню пользователя. Уровень пользователя. Подключение будет использовать [локальную политику](../policy.md#levelpolicyobject), соответствующую этому уровню пользователя.

View File

@ -68,7 +68,3 @@ Trojan в Xray имеет полную поддержку fallbacks, конфи
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя. Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
Значение userLevel соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0. Значение userLevel соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.

View File

@ -103,5 +103,3 @@ VMess полагается на системное время. Убедитес
Уровень пользователя, который будет использоваться соединением для определения соответствующей [локальной политики](../policy.md#levelpolicyobject). Уровень пользователя, который будет использоваться соединением для определения соответствующей [локальной политики](../policy.md#levelpolicyobject).
Значение `level` соответствует значению `level` в [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0. Значение `level` соответствует значению `level` в [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.

View File

@ -14,7 +14,7 @@
"peers": [ "peers": [
{ {
"publicKey": "PUBLIC_KEY", "publicKey": "PUBLIC_KEY",
"allowedIPs":[""] "allowedIPs": [""]
} }
], ],
"mtu": 1420 // необязательно, по умолчанию 1420 "mtu": 1420 // необязательно, по умолчанию 1420
@ -44,7 +44,8 @@
- 16 байт — аутентификационный тег - 16 байт — аутентификационный тег
``` ```
```N байт — зашифрованные данные``` — это и есть значение MTU, которое зависит от того, используется ли IPv4 или IPv6. Значение может быть 1440 (IPv4) или 1420 (IPv6). В особых условиях значение может быть дополнительно уменьшено (например, для PPPoE — минус 8 байт). `N байт — зашифрованные данные` — это и есть значение MTU, которое зависит от того, используется ли IPv4 или IPv6. Значение может быть 1440 (IPv4) или 1420 (IPv6). В особых условиях значение может быть дополнительно уменьшено (например, для PPPoE — минус 8 байт).
</details> </details>
> `peers`: \[ [Peers](#peers) \] > `peers`: \[ [Peers](#peers) \]

View File

@ -60,12 +60,13 @@ LogObject соответствует полю `log` в конфигурацио
Записывать DNS-запросы, сделанные встроенными DNS-клиентами, в журнал доступа. Пример записи в журнале: DOH//doh.server got answer: domain.com -> [ip1, ip2] 2.333ms. Записывать DNS-запросы, сделанные встроенными DNS-клиентами, в журнал доступа. Пример записи в журнале: DOH//doh.server got answer: domain.com -> [ip1, ip2] 2.333ms.
::: tip ::: tip
1. Xray не выполняет все DNS-запросы через свои встроенные клиенты. Поэтому включение этой опции не означает, что все DNS-запросы, выполняемые Xray, будут записаны в журнал. 1. Xray не выполняет все DNS-запросы через свои встроенные клиенты. Поэтому включение этой опции не означает, что все DNS-запросы, выполняемые Xray, будут записаны в журнал.
2. DNS-запросы, сделанные встроенными DNS-клиентами, также записываются в журнал ошибок (с уровнем "Info") даже если эта опция отключена. 2. DNS-запросы, сделанные встроенными DNS-клиентами, также записываются в журнал ошибок (с уровнем "Info") даже если эта опция отключена.
3. Запросы клиента FakeDNS никогда не записываются в журнал доступа. 3. Запросы клиента FakeDNS никогда не записываются в журнал доступа.
::: :::
> `maskAddress`: "quarter" | "half" | "full" > `maskAddress`: "quarter" | "half" | "full"

View File

@ -36,8 +36,9 @@
Перейдите по адресу `http://127.0.0.1:11111/debug/vars`. Перейдите по адресу `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, опущено): Например, в [luci-app-xray](https://github.com/yichya/luci-app-xray) вы можете получить следующий вывод (стандартное содержимое expvar, такое как cmdline и memstats, опущено):
@ -130,6 +131,7 @@
} }
} }
``` ```
</details> </details>
Для лучшей визуализации можно использовать [Netdata](https://github.com/netdata/netdata) (с плагином python.d): Для лучшей визуализации можно использовать [Netdata](https://github.com/netdata/netdata) (с плагином python.d):
@ -244,6 +246,7 @@ xray:
id: udp id: udp
expvar_type: int expvar_type: int
``` ```
</details> </details>
Вы получите результат, подобный этому: Вы получите результат, подобный этому:

View File

@ -8,9 +8,7 @@
```json ```json
{ {
"subjectSelector":[ "subjectSelector": ["outbound"],
"outbound"
],
"probeUrl": "https://www.google.com/generate_204", "probeUrl": "https://www.google.com/generate_204",
"probeInterval": "10s", "probeInterval": "10s",
"enableConcurrency": false "enableConcurrency": false
@ -41,9 +39,7 @@ URL-адрес, используемый для проверки состоян
```json ```json
{ {
"subjectSelector":[ "subjectSelector": ["outbound"],
"outbound"
],
"pingConfig": {} "pingConfig": {}
} }
``` ```
@ -55,7 +51,6 @@ URL-адрес, используемый для проверки состоян
> `pingConfig`: [PingConfigObject](#PingConfigObject) > `pingConfig`: [PingConfigObject](#PingConfigObject)
### PingConfigObject ### PingConfigObject
```json ```json
@ -92,9 +87,3 @@ URL-адрес, используемый для проверки подключ
Время ожидания ответа при проверке. Время ожидания ответа при проверке.
Формат такой же, как и у `interval`. Формат такой же, как и у `interval`.

View File

@ -158,10 +158,3 @@ Mux нужно включать только на клиенте, сервер
- `skip` - не использовать Mux для трафика UDP/443. - `skip` - не использовать Mux для трафика UDP/443.
Будет использоваться исходный способ передачи UDP-трафика для данного протокола прокси. Будет использоваться исходный способ передачи UDP-трафика для данного протокола прокси.
Например, `Shadowsocks` будет использовать нативный UDP, а `VLESS` будет использовать UoT. Например, `Shadowsocks` будет использовать нативный UDP, а `VLESS` будет использовать UoT.

View File

@ -32,7 +32,3 @@ Blackhole отправит указанный ответ после получе
Если `type` равен `"none"` (значение по умолчанию), Blackhole просто закроет соединение. Если `type` равен `"none"` (значение по умолчанию), Blackhole просто закроет соединение.
Если `type` равен `"http"`, Blackhole вернет простой пакет HTTP 403, а затем закроет соединение. Если `type` равен `"http"`, Blackhole вернет простой пакет HTTP 403, а затем закроет соединение.

View File

@ -36,7 +36,7 @@ Freedom — это исходящий протокол, который можн
- При использовании `"AsIs"`, Xray будет напрямую использовать приоритет подключений по умолчанию в Golang. По некоторым причинам, UDP-соединения, использующие доменное имя, игнорируют системные настройки приоритета IPv4. - При использовании `"AsIs"`, Xray будет напрямую использовать приоритет подключений по умолчанию в Golang. По некоторым причинам, UDP-соединения, использующие доменное имя, игнорируют системные настройки приоритета IPv4.
- При указании других значений для разрешения будет использоваться [встроенный DNS-сервер](../dns.md) Xray-core. Если `DNSObject` не существует, будет использоваться системный DNS. Если имеется несколько подходящих IP-адресов, ядро случайным образом выберет один из них в качестве целевого IP-адреса. - При указании других значений для разрешения будет использоваться [встроенный 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"`. - Если в настройках встроенного DNS указан `"queryStrategy"`, фактическое поведение будет объединено с этим параметром, и будут разрешаться только те типы IP, которые указаны в обоих параметрах. Например, `"queryStrategy": "UseIPv4"` и `"domainStrategy": "UseIP"` фактически эквивалентны `"domainStrategy": "UseIPv4"`.
- При использовании параметров, начинающихся с `"Use"`, если результат разрешения не соответствует требованиям (например, доменное имя имеет только запись A, но используется `UseIPv6`), будет выполнен откат к `AsIs`. - При использовании параметров, начинающихся с `"Use"`, если результат разрешения не соответствует требованиям (например, доменное имя имеет только запись A, но используется `UseIPv6`), будет выполнен откат к `AsIs`.

View File

@ -88,6 +88,3 @@ HTTP-заголовки, пара "ключ-значение". Каждый кл
> `pass`: string > `pass`: string
Пароль, тип данных: строка. Обязательный параметр. Пароль, тип данных: строка. Обязательный параметр.

View File

@ -20,7 +20,7 @@ Loopback - это исходящий протокол данных, которы
Если необходимо, чтобы трафик, уже разделенный по правилам маршрутизации, был перенаправлен другими правилами маршрутизации (например, трафик TCP и UDP, разделенный одними и теми же правилами маршрутизации, должен идти через разные исходящие соединения), можно использовать исходящее соединение `loopback`. Если необходимо, чтобы трафик, уже разделенный по правилам маршрутизации, был перенаправлен другими правилами маршрутизации (например, трафик TCP и UDP, разделенный одними и теми же правилами маршрутизации, должен идти через разные исходящие соединения), можно использовать исходящее соединение `loopback`.
``` json ```json
{ {
"outbounds": [ "outbounds": [
{ {
@ -31,11 +31,11 @@ Loopback - это исходящий протокол данных, которы
} }
}, },
{ {
"tag": "tcp-output", "tag": "tcp-output"
// Настройки protocol, settings, streamSettings и т. д. // Настройки protocol, settings, streamSettings и т. д.
}, },
{ {
"tag": "udp-output", "tag": "udp-output"
// Настройки protocol, settings, streamSettings и т. д. // Настройки protocol, settings, streamSettings и т. д.
} }
], ],
@ -55,5 +55,3 @@ Loopback - это исходящий протокол данных, которы
} }
} }
``` ```

View File

@ -102,7 +102,7 @@
Используйте `openssl rand -base64 <длина>`, чтобы сгенерировать ключ, совместимый с shadowsocks-rust, длина зависит от используемого метода шифрования. Используйте `openssl rand -base64 <длина>`, чтобы сгенерировать ключ, совместимый с shadowsocks-rust, длина зависит от используемого метода шифрования.
| Метод шифрования | Длина ключа | | Метод шифрования | Длина ключа |
| ------------------------------------ | ----------: | | ----------------------------- | ----------: |
| 2022-blake3-aes-128-gcm | 16 | | 2022-blake3-aes-128-gcm | 16 |
| 2022-blake3-aes-256-gcm | 32 | | 2022-blake3-aes-256-gcm | 32 |
| 2022-blake3-chacha20-poly1305 | 32 | | 2022-blake3-chacha20-poly1305 | 32 |
@ -118,6 +118,3 @@
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя. Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
Значение `level` соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0. Значение `level` соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.

View File

@ -89,6 +89,3 @@
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя. Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
Значение userLevel соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0. Значение userLevel соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.

View File

@ -6,7 +6,6 @@
Trojan предназначен для работы в правильно настроенном зашифрованном TLS-туннеле. Trojan предназначен для работы в правильно настроенном зашифрованном TLS-туннеле.
::: :::
## OutboundConfigurationObject ## OutboundConfigurationObject
```json ```json
@ -60,8 +59,3 @@ Trojan предназначен для работы в правильно нас
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя. Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
Значение level соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0. Значение level соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.

View File

@ -8,7 +8,6 @@ VLESS - это легкий транспортный протокол без с
В отличие от [VMess](./vmess.md), VLESS не зависит от системного времени, аутентификация также осуществляется с помощью UUID. В отличие от [VMess](./vmess.md), VLESS не зависит от системного времени, аутентификация также осуществляется с помощью UUID.
## OutboundConfigurationObject ## OutboundConfigurationObject
```json ```json
@ -135,5 +134,3 @@ Splice - это функция, предоставляемая ядром Linux,
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя. Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
Значение level соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0. Значение level соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.

View File

@ -118,7 +118,3 @@ VMess полагается на системное время. Убедитес
"AuthenticatedLength" включает эксперимент с аутентифицированной длиной пакета. Этот эксперимент необходимо включить одновременно на клиенте и сервере, а также запустить одну и ту же версию программы. "AuthenticatedLength" включает эксперимент с аутентифицированной длиной пакета. Этот эксперимент необходимо включить одновременно на клиенте и сервере, а также запустить одну и ту же версию программы.
"NoTerminationSignal" включает эксперимент с отключением сигнала завершения соединения. Этот эксперимент может повлиять на стабильность проксируемого соединения. "NoTerminationSignal" включает эксперимент с отключением сигнала завершения соединения. Этот эксперимент может повлиять на стабильность проксируемого соединения.

View File

@ -72,7 +72,8 @@ MTU нижнего уровня tun в Wireguard.
- 16 байт — аутентификационный тег - 16 байт — аутентификационный тег
``` ```
```N байт — зашифрованные данные``` — это значение MTU. Для IPv4 оно равно 1440, для IPv6 — 1420. В особых условиях значение может быть уменьшено (например, для PPPoE — минус 8 байт). `N байт — зашифрованные данные` — это значение MTU. Для IPv4 оно равно 1440, для IPv6 — 1420. В особых условиях значение может быть уменьшено (например, для PPPoE — минус 8 байт).
</details> </details>
> `reserved` \[ number \] > `reserved` \[ number \]

View File

@ -143,7 +143,3 @@ Xray будет применять различные локальные пол
> `statsOutboundDownlink`: true | false > `statsOutboundDownlink`: true | false
Если значение равно `true`, включить учет входящего трафика для всех исходящих подключений. Если значение равно `true`, включить учет входящего трафика для всех исходящих подключений.

View File

@ -7,15 +7,18 @@
Принцип работы обратного прокси примерно следующий: Принцип работы обратного прокси примерно следующий:
- Предположим, на хосте A находится веб-сервер, у которого нет публичного IP-адреса и к которому нельзя получить прямой доступ из Интернета. Есть другой хост B с публичным IP-адресом. Нам нужно использовать B в качестве точки входа, перенаправляя трафик с B на A. - Предположим, на хосте A находится веб-сервер, у которого нет публичного IP-адреса и к которому нельзя получить прямой доступ из Интернета. Есть другой хост B с публичным IP-адресом. Нам нужно использовать B в качестве точки входа, перенаправляя трафик с B на A.
- На хосте B настраивается Xray для приема внешних запросов, поэтому он называется `portal` (портал). - На хосте B настраивается Xray для приема внешних запросов, поэтому он называется `portal` (портал).
- На хосте A настраивается Xray, который отвечает за соединение переадресации от B с веб-сервером. Он называется `bridge` (мост). - На хосте A настраивается Xray, который отвечает за соединение переадресации от B с веб-сервером. Он называется `bridge` (мост).
- `bridge` - `bridge`
- `bridge` активно устанавливает соединение с `portal` для регистрации обратного канала. Целевой адрес (домен) этого соединения можно задать самостоятельно. - `bridge` активно устанавливает соединение с `portal` для регистрации обратного канала. Целевой адрес (домен) этого соединения можно задать самостоятельно.
- После получения трафика из Интернета, перенаправленного `portal`, `bridge` пересылает его без изменений на веб-сервер на хосте A. Конечно, для этого требуется настройка модуля маршрутизации. - После получения трафика из Интернета, перенаправленного `portal`, `bridge` пересылает его без изменений на веб-сервер на хосте A. Конечно, для этого требуется настройка модуля маршрутизации.
- После получения ответа `bridge` также возвращает его без изменений `portal`. - После получения ответа `bridge` также возвращает его без изменений `portal`.
- `portal` - `portal`
- Если `portal` получает запрос, и домен совпадает, это означает, что данные ответа пришли от `bridge`. Это соединение будет использовано для установления обратного канала. - Если `portal` получает запрос, и домен совпадает, это означает, что данные ответа пришли от `bridge`. Это соединение будет использовано для установления обратного канала.
- Если `portal` получает запрос, и домен не совпадает, это означает, что соединение установлено пользователем из Интернета. Данные этого соединения будут перенаправлены на `bridge`. - Если `portal` получает запрос, и домен не совпадает, это означает, что соединение установлено пользователем из Интернета. Данные этого соединения будут перенаправлены на `bridge`.
@ -39,16 +42,16 @@
"bridges": [ "bridges": [
{ {
"tag": "bridge", "tag": "bridge",
"domain": "reverse-proxy.xray.internal" "domain": "reverse-proxy.xray.internal",
} },
], ],
"portals": [ "portals": [
{ {
"tag": "portal", "tag": "portal",
"domain": "reverse-proxy.xray.internal" "domain": "reverse-proxy.xray.internal",
} },
] ],
} },
} }
``` ```
@ -65,7 +68,7 @@
```jsonc ```jsonc
{ {
"tag": "bridge", "tag": "bridge",
"domain": "reverse-proxy.xray.internal" "domain": "reverse-proxy.xray.internal",
} }
``` ```
@ -83,7 +86,7 @@
```jsonc ```jsonc
{ {
"tag": "portal", "tag": "portal",
"domain": "reverse-proxy.xray.internal" "domain": "reverse-proxy.xray.internal",
} }
``` ```
@ -95,7 +98,6 @@
Домен. Когда `portal` получает трафик, если целевой домен трафика совпадает с этим доменом, `portal` считает, что текущее соединение является соединением связи, установленным `bridge`. Другой трафик будет рассматриваться как трафик, требующий пересылки. `portal` занимается идентификацией этих двух типов соединений и выполняет соответствующую пересылку. Домен. Когда `portal` получает трафик, если целевой домен трафика совпадает с этим доменом, `portal` считает, что текущее соединение является соединением связи, установленным `bridge`. Другой трафик будет рассматриваться как трафик, требующий пересылки. `portal` занимается идентификацией этих двух типов соединений и выполняет соответствующую пересылку.
::: tip ::: tip
Один Xray может быть `bridge`, `portal` или одновременно и тем, и другим, чтобы соответствовать требованиям различных сценариев. Один Xray может быть `bridge`, `portal` или одновременно и тем, и другим, чтобы соответствовать требованиям различных сценариев.
::: :::
@ -131,8 +133,8 @@ outbound:
"tag": "out", "tag": "out",
"protocol": "freedom", "protocol": "freedom",
"settings": { "settings": {
"redirect": "127.0.0.1:80" "redirect": "127.0.0.1:80",
} },
} }
``` ```
@ -147,13 +149,13 @@ outbound:
"port": 1024, "port": 1024,
"users": [ "users": [
{ {
"id": "5783a3e7-e373-51cd-8642-c83782b807c5" "id": "5783a3e7-e373-51cd-8642-c83782b807c5",
}
]
}
]
}, },
"tag": "interconn" ],
},
],
},
"tag": "interconn",
} }
``` ```
@ -169,16 +171,16 @@ outbound:
"type": "field", "type": "field",
"inboundTag": ["bridge"], "inboundTag": ["bridge"],
"domain": ["full:reverse-proxy.xray.internal"], "domain": ["full:reverse-proxy.xray.internal"],
"outboundTag": "interconn" "outboundTag": "interconn",
}, },
{ {
// Трафик от portal также будет выходить из bridge, но без указанного выше домена // Трафик от portal также будет выходить из bridge, но без указанного выше домена
// маршрутизируем на out, то есть перенаправляем на веб-сервер // маршрутизируем на out, то есть перенаправляем на веб-сервер
"type": "field", "type": "field",
"inboundTag": ["bridge"], "inboundTag": ["bridge"],
"outboundTag": "out" "outboundTag": "out",
} },
] ],
} }
``` ```
@ -210,8 +212,8 @@ inbound:
"settings": { "settings": {
"address": "127.0.0.1", "address": "127.0.0.1",
"port": 80, "port": 80,
"network": "tcp" "network": "tcp",
} },
} }
``` ```
@ -224,10 +226,10 @@ inbound:
"settings": { "settings": {
"clients": [ "clients": [
{ {
"id": "5783a3e7-e373-51cd-8642-c83782b807c5" "id": "5783a3e7-e373-51cd-8642-c83782b807c5",
} },
] ],
} },
} }
``` ```
@ -241,7 +243,7 @@ inbound:
// маршрутизируем на portal, который в конечном итоге перенаправит его на bridge // маршрутизируем на portal, который в конечном итоге перенаправит его на bridge
"type": "field", "type": "field",
"inboundTag": ["external"], "inboundTag": ["external"],
"outboundTag": "portal" "outboundTag": "portal",
}, },
{ {
// Если входящее соединение от interconn, значит, это запрос от bridge для установления обратного туннеля, // Если входящее соединение от interconn, значит, это запрос от bridge для установления обратного туннеля,
@ -250,8 +252,8 @@ inbound:
// маршрутизируемых на portal. // маршрутизируемых на portal.
"type": "field", "type": "field",
"inboundTag": ["interconn"], "inboundTag": ["interconn"],
"outboundTag": "portal" "outboundTag": "portal",
} },
] ],
} }
``` ```

View File

@ -234,12 +234,14 @@ JSON-объект, где ключи и значения являются стр
> `strategy`: [StrategyObject](#strategyobject) > `strategy`: [StrategyObject](#strategyobject)
#### StrategyObject #### StrategyObject
```json ```json
{ {
"type": "roundRobin", "type": "roundRobin",
"settings": {} "settings": {}
} }
``` ```
> `type` : "random" | "roundRobin" | "leastPing" | "leastLoad" > `type` : "random" | "roundRobin" | "leastPing" | "leastLoad"
- `random`: значение по умолчанию. Случайным образом выбирает соответствующий исходящий прокси. - `random`: значение по умолчанию. Случайным образом выбирает соответствующий исходящий прокси.
@ -250,6 +252,7 @@ JSON-объект, где ключи и значения являются стр
> `settings`: [StrategySettingsObject](#strategysettingsobject) > `settings`: [StrategySettingsObject](#strategysettingsobject)
##### StrategySettingsObject ##### StrategySettingsObject
Это необязательный параметр конфигурации, формат которого различается для разных стратегий балансировки нагрузки. В настоящее время этот параметр конфигурации можно добавить только для стратегии балансировки нагрузки `leastLoad`. Это необязательный параметр конфигурации, формат которого различается для разных стратегий балансировки нагрузки. В настоящее время этот параметр конфигурации можно добавить только для стратегии балансировки нагрузки `leastLoad`.
```json ```json
@ -258,11 +261,13 @@ JSON-объект, где ключи и значения являются стр
"maxRTT": "1s", "maxRTT": "1s",
"tolerance": 0.01, "tolerance": 0.01,
"baselines": ["1s"], "baselines": ["1s"],
"costs": [{ "costs": [
{
"regexp": false, "regexp": false,
"match": "tag", "match": "tag",
"value": 0.5 "value": 0.5
}] }
]
} }
``` ```

View File

@ -5,7 +5,6 @@
Транспорт определяет способ передачи данных. Обычно оба конца сетевого подключения должны использовать одинаковый транспорт. Транспорт определяет способ передачи данных. Обычно оба конца сетевого подключения должны использовать одинаковый транспорт.
Например, если один конец использует WebSocket, то другой конец также должен использовать WebSocket, иначе соединение не будет установлено. Например, если один конец использует WebSocket, то другой конец также должен использовать WebSocket, иначе соединение не будет установлено.
## StreamSettingsObject ## StreamSettingsObject
`StreamSettingsObject` соответствует элементу `streamSettings` во входящем или исходящем подключении. Для каждого входящего или исходящего подключения можно настроить различные параметры передачи, и можно использовать `streamSettings` для настройки некоторых параметров передачи. `StreamSettingsObject` соответствует элементу `streamSettings` во входящем или исходящем подключении. Для каждого входящего или исходящего подключения можно настроить различные параметры передачи, и можно использовать `streamSettings` для настройки некоторых параметров передачи.
@ -106,7 +105,7 @@ Reality — это самое безопасное на данный момен
```json ```json
{ {
"serverName": "xray.com", "serverName": "xray.com",
"serverNameToVerify":"", "serverNameToVerify": "",
"rejectUnknownSni": false, "rejectUnknownSni": false,
"allowInsecure": false, "allowInsecure": false,
"alpn": ["h2", "http/1.1"], "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). 3. Использование имени переменной отпечатка uTLS, например, `"HelloRandomizedNoALPN"` `"HelloChrome_106_Shuffle"`. Полный список см. в [библиотеке uTLS](https://github.com/refraction-networking/utls/blob/master/u_common.go#L434).
4. Отключение **эмуляции** отпечатка `TLS Client Hello` 4. Отключение **эмуляции** отпечатка `TLS Client Hello`
::: danger ::: danger
@ -259,6 +257,7 @@ Reality — это самое безопасное на данный момен
Если вам нужно получить оценку A/A+ в ssllibs или myssl, Если вам нужно получить оценку A/A+ в ssllibs или myssl,
пожалуйста, обратитесь к [этому](https://github.com/XTLS/Xray-core/discussions/56#discussioncomment-215600). пожалуйста, обратитесь к [этому](https://github.com/XTLS/Xray-core/discussions/56#discussioncomment-215600).
::: :::
> `curvePreferences`: \[ string \] > `curvePreferences`: \[ string \]
Массив строк, задающий предпочтительные кривые для выполнения ECDHE во время TLS-рукопожатия. Список поддерживаемых кривых приведён ниже (регистр не имеет значения): Массив строк, задающий предпочтительные кривые для выполнения ECDHE во время TLS-рукопожатия. Список поддерживаемых кривых приведён ниже (регистр не имеет значения):
@ -333,7 +332,7 @@ Reality лишь модифицирует TLS, и для реализации н
Обычно он совпадает с `dest`, фактическое допустимое значение — это любой SNI, принимаемый сервером (в зависимости от конфигурации `dest`), в качестве справки можно использовать [SAN](https://ru.wikipedia.org/wiki/Subject_Alternative_Name) возвращаемого сертификата. Обычно он совпадает с `dest`, фактическое допустимое значение — это любой SNI, принимаемый сервером (в зависимости от конфигурации `dest`), в качестве справки можно использовать [SAN](https://ru.wikipedia.org/wiki/Subject_Alternative_Name) возвращаемого сертификата.
Может содержать пустое значение ```""```, что означает принятие соединений без SNI. Может содержать пустое значение `""`, что означает принятие соединений без SNI.
> `privateKey` : string > `privateKey` : string
@ -367,7 +366,7 @@ Reality лишь модифицирует TLS, и для реализации н
Один из `serverNames` сервера. Один из `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 > `fingerprint` : string
@ -593,19 +592,18 @@ Reality лишь модифицирует TLS, и для реализации н
> "UseIP" | "UseIPv6v4" | "UseIPv6" | "UseIPv4v6" | "UseIPv4" > "UseIP" | "UseIPv6v4" | "UseIPv6" | "UseIPv4v6" | "UseIPv4"
> "ForceIP" | "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4" > "ForceIP" | "ForceIPv6v4" | "ForceIPv6" | "ForceIPv4v6" | "ForceIPv4"
В предыдущих версиях, когда Xray пытался установить системное соединение с использованием доменного имени, разрешение доменного имени выполнялось системой и не контролировалось Xray. Это приводило к таким проблемам, как [невозможность разрешить доменные имена в нестандартных средах Linux](https://github.com/v2ray/v2ray-core/issues/1909). Для решения этой проблемы в Xray 1.3.1 в Sockopt был добавлен параметр `domainStrategy` в разделе Freedom. В предыдущих версиях, когда Xray пытался установить системное соединение с использованием доменного имени, разрешение доменного имени выполнялось системой и не контролировалось Xray. Это приводило к таким проблемам, как [невозможность разрешить доменные имена в нестандартных средах Linux](https://github.com/v2ray/v2ray-core/issues/1909). Для решения этой проблемы в Xray 1.3.1 в Sockopt был добавлен параметр `domainStrategy` в разделе Freedom.
Значение по умолчанию: `"AsIs"`. Значение по умолчанию: `"AsIs"`.
Если целевой адрес представлен доменным именем, можно настроить соответствующее значение. Поведение Freedom в зависимости от настройки следующее: Если целевой адрес представлен доменным именем, можно настроить соответствующее значение. Поведение Freedom в зависимости от настройки следующее:
- При использовании `"AsIs"` Xray будет напрямую использовать встроенную функцию `Dial` из Go для установления соединения, с фиксированным приоритетом, заданным по умолчанию в RFC6724 (игнорируя такие настройки, как `gai.conf`). *(Простыми словами: IPv6 будет использоваться с приоритетом.)* - При использовании `"AsIs"` Xray будет напрямую использовать встроенную функцию `Dial` из Go для установления соединения, с фиксированным приоритетом, заданным по умолчанию в RFC6724 (игнорируя такие настройки, как `gai.conf`). _(Простыми словами: IPv6 будет использоваться с приоритетом.)_
- При использовании другого значения будет применен [встроенный DNS-сервер](../dns.md) Xray-core для разрешения доменного имени. - При использовании другого значения будет применен [встроенный DNS-сервер](../dns.md) Xray-core для разрешения доменного имени.
Если объект `DNSObject` отсутствует, будет использоваться системный DNS. Если существует несколько подходящих IP-адресов, ядро выберет один из них случайным образом. Если объект `DNSObject` отсутствует, будет использоваться системный DNS. Если существует несколько подходящих IP-адресов, ядро выберет один из них случайным образом.
- `"IPv4"` означает попытку установить соединение, используя только IPv4, - `"IPv4"` означает попытку установить соединение, используя только IPv4,
`"IPv4v6"` означает попытку соединения с использованием IPv4 или IPv6, но для доменов с двойным стеком будет использоваться IPv4. `"IPv4v6"` означает попытку соединения с использованием IPv4 или IPv6, но для доменов с двойным стеком будет использоваться IPv4.
*(Если поменять местами v4 и v6, логика остается аналогичной)* _(Если поменять местами v4 и v6, логика остается аналогичной)_
- Если во встроенном DNS установлен параметр `"queryStrategy"`, то фактическое поведение будет комбинацией с этим параметром, и будут разрешаться только типы IP-адресов, присутствующие в обоих параметрах. Например: - Если во встроенном DNS установлен параметр `"queryStrategy"`, то фактическое поведение будет комбинацией с этим параметром, и будут разрешаться только типы IP-адресов, присутствующие в обоих параметрах. Например:
`"queryStrategy": "UseIPv4"` и `"domainStrategy": "UseIP"` фактически эквивалентны `"domainStrategy": "UseIPv4"`. `"queryStrategy": "UseIPv4"` и `"domainStrategy": "UseIP"` фактически эквивалентны `"domainStrategy": "UseIPv4"`.
@ -708,7 +706,6 @@ Reality лишь модифицирует TLS, и для реализации н
Указывает имя сетевого интерфейса для исходящего трафика. Поддерживается в Linux, iOS, macOS и Windows. Указывает имя сетевого интерфейса для исходящего трафика. Поддерживается в Linux, iOS, macOS и Windows.
> `V6Only`: true | false > `V6Only`: true | false
Если установлено значение `true`, адрес `::` принимает только IPv6-соединения. Поддерживается только в Linux. Если установлено значение `true`, адрес `::` принимает только IPv6-соединения. Поддерживается только в Linux.
@ -717,7 +714,6 @@ Reality лишь модифицирует TLS, и для реализации н
Объявленный размер окна ограничен этим значением. Ядро выберет максимальное значение между этим значением и SOCK_MIN_RCVBUF/2. Объявленный размер окна ограничен этим значением. Ядро выберет максимальное значение между этим значением и SOCK_MIN_RCVBUF/2.
> `tcpMptcp`: true | false > `tcpMptcp`: true | false
По умолчанию этот параметр имеет значение `false`. Установите его в `true`, чтобы включить [Multipath TCP](https://en.wikipedia.org/wiki/Multipath_TCP). По умолчанию этот параметр имеет значение `false`. Установите его в `true`, чтобы включить [Multipath TCP](https://en.wikipedia.org/wiki/Multipath_TCP).
@ -742,7 +738,7 @@ Reality лишь модифицирует TLS, и для реализации н
`AddressOnly`: Сброс только адреса. `AddressOnly`: Сброс только адреса.
`PortAndAddress`: Сброс адреса и порта. `PortAndAddress`: Сброс адреса и порта.
Важно! Данная настройка применяется *до* этапа выбора стратегии разрешения доменов (`domainStrategy`) в `sockopt`. После сброса адреса продолжает действовать `domainStrategy` (если она активна), но *после* того, как `domainStrategy` в `Freedom` уже отработала. Если в `Freedom` настроено явное разрешение в IP-адрес, данная опция не оказывает никакого эффекта. Важно! Данная настройка применяется о_ этапа выбора стратегии разрешения доменов (`domainStrategy`) в `sockopt`. После сброса адреса продолжает действовать `domainStrategy` (если она активна), но _после_ того, как `domainStrategy` в `Freedom` уже отработала. Если в `Freedom` настроено явное разрешение в IP-адрес, данная опция не оказывает никакого эффекта.
PS: Если трафик домена, например, обычный веб-трафик, маршрутизируется через `Freedom` с установленной стратегией `AsIs`, то при активации этой опции будет предпринята попытка разрешить домен и сбросить адрес/порт в соответствии с полученными данными. Например, ядро Xray попытается запросить SRV-запись для `google.com` и перенаправить трафик, опираясь на информацию из этой записи. PS: Если трафик домена, например, обычный веб-трафик, маршрутизируется через `Freedom` с установленной стратегией `AsIs`, то при активации этой опции будет предпринята попытка разрешить домен и сбросить адрес/порт в соответствии с полученными данными. Например, ядро Xray попытается запросить SRV-запись для `google.com` и перенаправить трафик, опираясь на информацию из этой записи.

View File

@ -127,5 +127,3 @@ gRPC (HTTP/2) имеет встроенное мультиплексирован
::: tip ::: tip
При использовании CDN Cloudflare можно установить значение `65536` или выше, чтобы отключить механизм динамического окна, что предотвратит отправку непредвиденных кадров h2 GOAWAY CDN Cloudflare для закрытия существующего соединения. При использовании CDN Cloudflare можно установить значение `65536` или выше, чтобы отключить механизм динамического окна, что предотвратит отправку непредвиденных кадров h2 GOAWAY CDN Cloudflare для закрытия существующего соединения.
::: :::

View File

@ -37,7 +37,7 @@
HTTP-путь, используемый HTTPUpgrade, по умолчанию `"/"`. HTTP-путь, используемый HTTPUpgrade, по умолчанию `"/"`.
Если в пути клиента содержится параметр `ed` (например, ```/mypath?ed=2560```), будет активирована функция `Early Data` для уменьшения задержки, ее значение - порог длины первого пакета. Если длина первого пакета превышает это значение, `Early Data` не будет активирована. Рекомендуемое значение - 2560. Если в пути клиента содержится параметр `ed` (например, `/mypath?ed=2560`), будет активирована функция `Early Data` для уменьшения задержки, ее значение - порог длины первого пакета. Если длина первого пакета превышает это значение, `Early Data` не будет активирована. Рекомендуемое значение - 2560.
> `host`: string > `host`: string
@ -52,6 +52,3 @@ HTTP-путь, используемый HTTPUpgrade, по умолчанию `"/
Пользовательские HTTP-заголовки, пара ключ-значение, где каждый ключ представляет имя HTTP-заголовка, а соответствующее значение - строка. Пользовательские HTTP-заголовки, пара ключ-значение, где каждый ключ представляет имя HTTP-заголовка, а соответствующее значение - строка.
По умолчанию пустое. По умолчанию пустое.

View File

@ -146,7 +146,7 @@ mKCP жертвует пропускной способностью ради у
Протокол KCP использует заголовок размером 24 байта, а mKCP уменьшил его до 18 байт для пакета данных и 16 байт для пакета подтверждения. Более компактный заголовок помогает избежать обнаружения по признакам и ускоряет передачу данных. Протокол 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 секунд. mKCP может эффективно управлять состоянием соединения. Когда удаленный хост инициализирует закрытие соединения, соединение будет закрыто в течение двух секунд; когда удаленный хост теряет соединение, соединение будет закрыто в течение максимум 30 секунд.
Оригинальный KCP не поддерживает этот сценарий. Оригинальный KCP не поддерживает этот сценарий.

View File

@ -42,7 +42,7 @@ WebSocket распознает заголовок X-Forwarded-For в HTTP-зап
Путь, используемый WebSocket в HTTP-протоколе, значение по умолчанию — `"/"`. Путь, используемый WebSocket в HTTP-протоколе, значение по умолчанию — `"/"`.
Если в пути клиента есть параметр `ed` (например, ```/mypath?ed=2560```), будет активирован `Early Data` для уменьшения задержки. Если в пути клиента есть параметр `ed` (например, `/mypath?ed=2560`), будет активирован `Early Data` для уменьшения задержки.
> `host`: string > `host`: string
@ -57,6 +57,7 @@ WebSocket распознает заголовок X-Forwarded-For в HTTP-зап
Пользовательские HTTP-заголовки, пары ключ-значение, где каждый ключ представляет имя HTTP-заголовка, а соответствующее значение является строкой. Пользовательские HTTP-заголовки, пары ключ-значение, где каждый ключ представляет имя HTTP-заголовка, а соответствующее значение является строкой.
Значение по умолчанию: пустое. Значение по умолчанию: пустое.
> `heartbeatPeriod`: int > `heartbeatPeriod`: int
Задает интервал времени для отправки Ping-сообщений с целью поддержания соединения. Если не указано или указано значение 0, Ping-сообщения не отправляются (по умолчанию используется текущее поведение). Задает интервал времени для отправки Ping-сообщений с целью поддержания соединения. Если не указано или указано значение 0, Ping-сообщения не отправляются (по умолчанию используется текущее поведение).

View File

@ -39,5 +39,3 @@ VMess - это зашифрованный транспортный проток
### [Протокол mKCP](./protocols/mkcp.md) ### [Протокол mKCP](./protocols/mkcp.md)
mKCP - это потоковый транспортный протокол, основанный на [протоколе KCP](https://github.com/skywind3000/kcp), который может передавать любые потоки данных по порядку. mKCP - это потоковый транспортный протокол, основанный на [протоколе KCP](https://github.com/skywind3000/kcp), который может передавать любые потоки данных по порядку.

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