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

|
||||
|
||||
### Additional
|
||||
|
||||
Maybe reusing the empty object `stats` in config file is better than adding `metrics` here?
|
||||
|
||||
**Edit:** removed prometheus related things and added usage about expvars
|
||||
|
|
|
@ -8,11 +8,10 @@ components, such as load balancers. There are currently two options:
|
|||
You can choose one of them as needed.
|
||||
|
||||
## ObservatoryObject
|
||||
|
||||
```json
|
||||
{
|
||||
"subjectSelector":[
|
||||
"outbound"
|
||||
],
|
||||
"subjectSelector": ["outbound"],
|
||||
"probeUrl": "https://www.google.com/generate_204",
|
||||
"probeInterval": "10s",
|
||||
"enableConcurrency": false
|
||||
|
@ -37,11 +36,10 @@ The interval at which probes are initiated. The time format is a number followed
|
|||
- `false`: Probe each matching outbound proxy one by one, pausing for the time set by `probeInterval` after probing each one.
|
||||
|
||||
## BurstObservatoryObject
|
||||
|
||||
```json
|
||||
{
|
||||
"subjectSelector":[
|
||||
"outbound"
|
||||
],
|
||||
"subjectSelector": ["outbound"],
|
||||
"pingConfig": {}
|
||||
}
|
||||
```
|
||||
|
@ -52,8 +50,8 @@ An array of strings, where each string is used to match the prefix of outbound p
|
|||
|
||||
> `pingConfig`: [PingConfigObject](#PingConfigObject)
|
||||
|
||||
|
||||
### PingConfigObject
|
||||
|
||||
```json
|
||||
{
|
||||
"destination": "https://connectivitycheck.gstatic.com/generate_204",
|
||||
|
|
|
@ -14,23 +14,23 @@ Freedom is an outbound protocol that can be used to send (normal) TCP or UDP dat
|
|||
"length": "100-200",
|
||||
"interval": "10-20" // ms
|
||||
},
|
||||
"noises":[
|
||||
{
|
||||
"type":"base64",
|
||||
"packet":"7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=",
|
||||
"delay":"10-16"
|
||||
},
|
||||
{
|
||||
"type":"rand",
|
||||
"packet":"10-20",
|
||||
"delay":"10-16"
|
||||
},
|
||||
{
|
||||
"type":"str",
|
||||
"packet":"hiGFW",
|
||||
"delay":"10-16"
|
||||
}
|
||||
],
|
||||
"noises": [
|
||||
{
|
||||
"type": "base64",
|
||||
"packet": "7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=",
|
||||
"delay": "10-16"
|
||||
},
|
||||
{
|
||||
"type": "rand",
|
||||
"packet": "10-20",
|
||||
"delay": "10-16"
|
||||
},
|
||||
{
|
||||
"type": "str",
|
||||
"packet": "hiGFW",
|
||||
"delay": "10-16"
|
||||
}
|
||||
],
|
||||
"proxyProtocol": 0
|
||||
}
|
||||
```
|
||||
|
@ -76,7 +76,7 @@ A key-value map used to control TCP fragmentation,under some circumstances it
|
|||
|
||||
::: warning
|
||||
⚠️ "noise":{} is deptecated,only "noises":[{}] is supported in 24.9.16 and later
|
||||
:::
|
||||
:::
|
||||
|
||||
> `noises`: [ noiseObject ]
|
||||
|
||||
|
|
|
@ -20,15 +20,15 @@ This tag can be used as `inboundTag` in routing rules, all traffics going throug
|
|||
|
||||
If you need to do some more detailed routing for traffics that have been routed by routing rules, like splitting routed traffics to TCP traffics and UDP traffics and send them to different outbounds, this can be done with `loopback` outbound.
|
||||
|
||||
``` jsonc
|
||||
```jsonc
|
||||
{
|
||||
"outbounds": [
|
||||
{
|
||||
"protocol": "loopback",
|
||||
"tag": "need-to-split",
|
||||
"settings": {
|
||||
"inboundTag": "traffic-input" // This tag will be used as the inboundTag inside the RuleObject
|
||||
}
|
||||
"inboundTag": "traffic-input", // This tag will be used as the inboundTag inside the RuleObject
|
||||
},
|
||||
},
|
||||
{
|
||||
"tag": "tcp-output",
|
||||
|
@ -37,21 +37,21 @@ If you need to do some more detailed routing for traffics that have been routed
|
|||
{
|
||||
"tag": "udp-output",
|
||||
// protocol, settings, streamSettings etc.
|
||||
}
|
||||
},
|
||||
],
|
||||
"routing": {
|
||||
"rules": [
|
||||
{
|
||||
"inboundTag": ["traffic-input"], // tag set in the loopback outbound setting
|
||||
"network": "tcp",
|
||||
"outboundTag": "tcp-output"
|
||||
"outboundTag": "tcp-output",
|
||||
},
|
||||
{
|
||||
"inboundTag": ["traffic-input"], // tag set in the loopback outbound
|
||||
"inboundTag": ["traffic-input"], // tag set in the loopback outbound
|
||||
"network": "udp",
|
||||
"outboundTag": "udp-output"
|
||||
}
|
||||
]
|
||||
}
|
||||
"outboundTag": "udp-output",
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
```
|
||||
|
|
|
@ -68,18 +68,19 @@ Xray-core v1.8.6 New parameter.<br>
|
|||
If you do not write this parameter, or leave it blank, the default value is `"ForceIP"`.<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 |
|
||||
| :--- | :---: | :---: | :---: |
|
||||
| ForceIPv6v4 | IPv6v4 | IPv6 | IPv6 |
|
||||
| ForceIPv6 | The website won't open. | IPv6 | IPv6 |
|
||||
| ForceIPv4v6 | IPv6v4 **1** | IPv4 | IPv4 |
|
||||
| ForceIPv4 | IPv4 | IPv4 | IPv4 |
|
||||
| ForceIP | IPv6v4 **2** | IPv6 | IPv6 |
|
||||
| domainStrategy | test-ipv6.com | bgp.he.net | chat.openai.com |
|
||||
| :------------- | :---------------------: | :--------: | :-------------: |
|
||||
| ForceIPv6v4 | IPv6v4 | IPv6 | IPv6 |
|
||||
| ForceIPv6 | The website won't open. | IPv6 | IPv6 |
|
||||
| ForceIPv4v6 | IPv6v4 **1** | IPv4 | IPv4 |
|
||||
| ForceIPv4 | IPv4 | IPv4 | IPv4 |
|
||||
| ForceIP | IPv6v4 **2** | IPv6 | IPv6 |
|
||||
|
||||
**1:** Tip `You already have an IPv6 address, but your browser is less inclined to use it, which is more worrying. `<br>
|
||||
**2:** The chances of prompting `You already have an IPv6 address, but your browser is less inclined to use it, which is more worrisome. `
|
||||
|
||||
**Note 1**:
|
||||
|
||||
- Conflicts with `"queryStrategy"` may cause the site to fail to open.
|
||||
- For example when `domainStrategy: "ForceIPv4"` is used, geosite:openai's site with `"queryStrategy": "UseIPv6"` will fail to open.
|
||||
|
||||
|
@ -101,6 +102,7 @@ When the destination address is a domain name, use the Xray-core [built-in DNS s
|
|||
```
|
||||
|
||||
**Note 2**:
|
||||
|
||||
- Xray-core v1.8.0 - v1.8.4 without `"domainStrategy"`.
|
||||
- When the destination address is a domain name, use the Xray-core built-in DNS server query to obtain the IP, using the value of `"queryStrategy"` in the `"dns"` configuration to control the IPv4 or IPv6 priority.
|
||||
- If the `"dns"` configuration is not written, the system DNS query is used to obtain IP, and the IPv4 or IPv6 priority is controlled by the system.
|
||||
|
|
|
@ -609,7 +609,7 @@ Default value `false`, fill in `true` to enable [Multipath TCP](https://en.wikip
|
|||
|
||||
Default value `false`, recommended to be enabled with "tcpMptcp": true.
|
||||
|
||||
> `customSockopt`: []
|
||||
> `customSockopt`: []
|
||||
|
||||
An array for advanced users to specify any sockopt. In theory, all the above connection-related settings can be set equivalently here. Naturally, other options that exist in Linux but have not been added to the core can also be set. The example below is equivalent to `"tcpcongestion": "bbr"` in core.
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ The `HttpUpgradeObject` corresponds to the `httpupgradeSettings` section under t
|
|||
"path": "/",
|
||||
"host": "xray.com",
|
||||
"headers": {
|
||||
"key": "value"
|
||||
"key": "value"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
@ -37,7 +37,7 @@ When `true`, the downstream must first send PROXY protocol version 1 or 2 after
|
|||
|
||||
HTTP path used by the HTTPUpgrade connection. Defaults to `"/"`.
|
||||
|
||||
If the `path` property include an `ed` query field (e.g. ```/mypath?ed=2560```), "early data" will be used to decrease latency, with the value defining the threshold of the first packet's size. If the size of the first packet exceeds the defined value, "early data" will not be applied. The recommended value is `2560`.
|
||||
If the `path` property include an `ed` query field (e.g. `/mypath?ed=2560`), "early data" will be used to decrease latency, with the value defining the threshold of the first packet's size. If the size of the first packet exceeds the defined value, "early data" will not be applied. The recommended value is `2560`.
|
||||
|
||||
> `host`: string
|
||||
|
||||
|
@ -45,8 +45,8 @@ HTTP Host sent by the HTTPUpgrade connection. Empty by default. If this value is
|
|||
|
||||
If the `Host` header has been defined on the server in any way, the server will validate if the `Host` header matches.
|
||||
|
||||
The current priority of the `Host` header sent by clients: ```host``` > ```headers``` > ```address```
|
||||
The current priority of the `Host` header sent by clients: `host` > `headers` > `address`
|
||||
|
||||
> `headers`: map \{string: string\}
|
||||
|
||||
Customized HTTP headers defined in key-value pairs. Defaults to empty.
|
||||
Customized HTTP headers defined in key-value pairs. Defaults to empty.
|
||||
|
|
|
@ -49,7 +49,7 @@ The `Host` header sent in HTTP requests. Defaults to an empty string. Servers wi
|
|||
|
||||
If the `Host` header has been defined on the server in any way, the server will validate if the `Host` header matches.
|
||||
|
||||
The current priority of the `Host` header sent by clients: ```host``` > ```headers``` > ```address```
|
||||
The current priority of the `Host` header sent by clients: `host` > `headers` > `address`
|
||||
|
||||
> `headers`: map \{string: string\}
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@ The commands are:
|
|||
Use "xray help <command>" for more information about a command.
|
||||
|
||||
```
|
||||
|
||||
### xray run
|
||||
|
||||
Specify one or more configuration files and run.
|
||||
|
@ -54,6 +55,7 @@ without launching the server
|
|||
|
||||
The -dump flag tells Xray to print the merged config.
|
||||
```
|
||||
|
||||
::: tip
|
||||
Except from the default JSON format, config can also use TOML and YAML. It will automatically recognized from file extensions when the `-format` flag is not set.
|
||||
:::
|
||||
|
@ -105,6 +107,7 @@ The commands are:
|
|||
```
|
||||
|
||||
Sub-command `pb`
|
||||
|
||||
```bash
|
||||
# Usage: xray convert pb [-debug] [-type] [json file] [json file] ...
|
||||
|
||||
|
@ -122,6 +125,7 @@ xray help convert pb
|
|||
```
|
||||
|
||||
Sub-command JSON
|
||||
|
||||
```bash
|
||||
# Usage: xray convert json [-type] [stdin:] [typedMessage file]
|
||||
|
||||
|
@ -169,6 +173,7 @@ xray uuid
|
|||
```
|
||||
|
||||
### xray x25519
|
||||
|
||||
Generate x25519 key pair。
|
||||
|
||||
Usage:
|
||||
|
@ -178,6 +183,7 @@ xray x25519 [-i "(base64.RawURLEncoding)" --std-encoding]
|
|||
```
|
||||
|
||||
### xray wg
|
||||
|
||||
Generate wireguard curve25519 key pair。
|
||||
|
||||
Usage:
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
- Xray is available on the following platforms:
|
||||
- Windows 7 and later (x86 / amd64 / arm32 / arm64);
|
||||
- If you need to use these version (1.8.18 and later marked with ```win7```, 1.8.6, 1.8.4) in Windows 7, operating system update **KB4474419** is required. For better Internet security, it is recommended to install KB4490628 to acquire later operating system updates from Windows Update.
|
||||
- If you need to use these version (1.8.18 and later marked with `win7`, 1.8.6, 1.8.4) in Windows 7, operating system update **KB4474419** is required. For better Internet security, it is recommended to install KB4490628 to acquire later operating system updates from Windows Update.
|
||||
- macOS 10.10 Yosemite and later (amd64 / arm64);
|
||||
- Linux 2.6.23 and later (x86 / amd64 / arm / arm64 / mips64 / mips / ppc64 / s390x / riscv64);
|
||||
- Including but not limited to Debian 7 / 8, Ubuntu 12.04 / 14.04 and subsequent versions, CentOS 7 / 8, Arch Linux, etc.;
|
||||
|
|
|
@ -57,6 +57,7 @@ First of all, I would like to respond to critics by asking a question: Is using
|
|||
Secondly, I believe that there is a fundamental difference between "not understanding" and "not wanting to understand". The bad attitude of some people who just want handouts is naturally annoying, but those who sincerely want to learn but don't know how should not be subject to unjustified contempt and discrimination. It is precisely this kind of bad community atmosphere that does not distinguish between newcomers that prompted me to write this article. So without further ado, let's take a look at the advantages and disadvantages of using an airport:
|
||||
|
||||
- Advantages of "Airports"
|
||||
|
||||
1. **Stability**: Airports usually feature multiple exit nodes, hence resistance to attempts at blocking these node, if one get block simply switch to another
|
||||
2. **Speed**: Airports typically make use of high capacity machines and high throughput network infrastructures, therefore you can expect a higher overall network speed
|
||||
3. **Safety**: Airports are generally have good security practices, such as encryption and firewalls to ensure the security of user data
|
||||
|
@ -67,7 +68,7 @@ Secondly, I believe that there is a fundamental difference between "not understa
|
|||
|
||||
- Risks of "Airport"
|
||||
|
||||
"The counterpart of convenience in 'internet' security is 'risk', some risk of 'airports' you can find on the market are"
|
||||
"The counterpart of convenience in 'internet' security is 'risk', some risk of 'airports' you can find on the market are"
|
||||
|
||||
1. service providers can obtain all infomation that passes through their servers, these data are very likely stored by the providers for a long time with little legal means to stop them
|
||||
2. there is little governance on the market for "airports", meaning there are plenty cases of fraud where providers disappear after being paid
|
||||
|
|
|
@ -7,7 +7,7 @@ This chapter is rather special because it involves monetary transactions. This a
|
|||
You need to obtain a healthy VPS with an unblocked IP, and perform the following basic preparations in the management console:
|
||||
|
||||
1. Install Debian 10 64 bit Operating System on your VPS.
|
||||
2. Note down the IP address of VPS (this article will use `"100.200.300.400"` as an example, which is an intentionally incorrect and illegal IP address. Please replace it with your real IP address).
|
||||
2. Note down the IP address of VPS (this article will use `"100.200.300.400"` as an example, which is an intentionally incorrect and illegal IP address. Please replace it with your real IP address).
|
||||
3. Note down the SSH remote login port of VPS.
|
||||
4. Note down the username and password for SSH remote login.
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ The things to do next are very simple:
|
|||
|
||||
## 7.2 Install Xray
|
||||
|
||||
First of all, the official carrier of Xray is the binary program generated by the open source project [xray-core](https://github.com/XTLS/Xray-core) (Open sourced with License `MPL 2.0`
|
||||
First of all, the official carrier of Xray is the binary program generated by the open source project [xray-core](https://github.com/XTLS/Xray-core) (Open sourced with License `MPL 2.0`
|
||||
). If you put this binary on the server and run it, it is the server side; if you download it to the local computer and run it, it is the client side. The main difference comes from [configuration].
|
||||
|
||||
When installing, it is very simple and direct to use the official installation script directly. It provides a variety of installation options. If you are interested, you can go to the official [installation script repository](https://github.com/XTLS/Xray-install) to see the script instructions. **This article uses the [non-root
|
||||
|
@ -29,9 +29,9 @@ When writing this article, the installation script had some minor bugs when usin
|
|||
|
||||
1. Basic Linux commands for beginners:
|
||||
|
||||
| Number | Command name | Command description |
|
||||
| :------: | :------: | :------: |
|
||||
| `cmd-14` | `rm` | delete |
|
||||
| Number | Command name | Command description |
|
||||
| :------: | :----------: | :-----------------: |
|
||||
| `cmd-14` | `rm` | delete |
|
||||
|
||||
2. Download the installation script:
|
||||
|
||||
|
@ -89,34 +89,34 @@ chmod +r ~/xray_cert/xray.key
|
|||
|
||||

|
||||
|
||||
5. `acme.sh` will check the certificate every 60 days and automatically renew the expiring certificate. But as far as I know, it does not automatically install the new certificate to `xray-core`, so we need to add a system automatic periodic task to complete this step.
|
||||
5. `acme.sh` will check the certificate every 60 days and automatically renew the expiring certificate. But as far as I know, it does not automatically install the new certificate to `xray-core`, so we need to add a system automatic periodic task to complete this step.
|
||||
|
||||
1. Basic Linux commands for beginners:
|
||||
|
||||
| Number | Command name | Command description |
|
||||
| :------: | :----------: | :--------------------: |
|
||||
| `cmd-15` | `crontab -e` | Edit the current user's scheduled task |
|
||||
| Number | Command name | Command description |
|
||||
| :------: | :----------: | :------------------------------------: |
|
||||
| `cmd-15` | `crontab -e` | Edit the current user's scheduled task |
|
||||
|
||||
2. Create a script file (`xray-cert-renew.sh`)
|
||||
|
||||
```shell
|
||||
nano ~/xray_cert/xray-cert-renew.sh
|
||||
```
|
||||
```shell
|
||||
nano ~/xray_cert/xray-cert-renew.sh
|
||||
```
|
||||
|
||||
3. Copy the following content, remember to replace your real domain name, then save and exit
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
/home/vpsadmin/.acme.sh/acme.sh --install-cert -d a-name.yourdomain.com --ecc --fullchain-file /home/vpsadmin/xray_cert/xray.crt --key-file /home/vpsadmin/xray_cert/xray.key
|
||||
echo "Xray Certificates Renewed"
|
||||
|
||||
chmod +r /home/vpsadmin/xray_cert/xray.key
|
||||
echo "Read Permission Granted for Private Key"
|
||||
|
||||
sudo systemctl restart xray
|
||||
echo "Xray Restarted"
|
||||
```
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
/home/vpsadmin/.acme.sh/acme.sh --install-cert -d a-name.yourdomain.com --ecc --fullchain-file /home/vpsadmin/xray_cert/xray.crt --key-file /home/vpsadmin/xray_cert/xray.key
|
||||
echo "Xray Certificates Renewed"
|
||||
|
||||
chmod +r /home/vpsadmin/xray_cert/xray.key
|
||||
echo "Read Permission Granted for Private Key"
|
||||
|
||||
sudo systemctl restart xray
|
||||
echo "Xray Restarted"
|
||||
```
|
||||
|
||||
::: warning
|
||||
As you have reminded, `acme.sh` has a `reloadcmd` command that can automatically execute a specific command when the certificate is updated, so you can specify to automatically install the certificate for `Xray`, but because `crontab` is a very useful and commonly used function in Linux, this article retains the `crontab` method to update the `Xray` certificate. (If you interested in `reloadcmd` can check out the [official documentation](https://github.com/acmesh-official/acme.sh) of `acme.sh`)
|
||||
|
@ -125,27 +125,27 @@ chmod +r ~/xray_cert/xray.key
|
|||
to enable this setting and delete the restart command in the script.
|
||||
:::
|
||||
|
||||
4. Add [executable] permissions to this file
|
||||
4. Add [executable] permissions to this file
|
||||
|
||||
```
|
||||
chmod +x ~/xray_cert/xray-cert-renew.sh
|
||||
```
|
||||
|
||||
5. Run `crontab -e` and add an automatic task [Automatically run `xray-cert-renew.sh` once a month] (Note that you should not add `sudo`, because we are adding an automatic task for the `vpsadmin`
|
||||
account. When you run it for the first time, you will be asked to choose an editor. Of course, choose the familiar `nano`!)
|
||||
5. Run `crontab -e` and add an automatic task [Automatically run `xray-cert-renew.sh` once a month] (Note that you should not add `sudo`, because we are adding an automatic task for the `vpsadmin`
|
||||
account. When you run it for the first time, you will be asked to choose an editor. Of course, choose the familiar `nano`!)
|
||||
|
||||
```shell
|
||||
crontab -e
|
||||
```
|
||||
```shell
|
||||
crontab -e
|
||||
```
|
||||
|
||||
6. Add the following content to the end of the file, save and exit.
|
||||
6. Add the following content to the end of the file, save and exit.
|
||||
|
||||
```
|
||||
# 1:00am, 1st day each month, run `xray-cert-renew.sh`
|
||||
0 1 1 * * bash /home/vpsadmin/xray_cert/xray-cert-renew.sh
|
||||
```
|
||||
|
||||
7. The complete process is demonstrated as follows:
|
||||
7. The complete process is demonstrated as follows:
|
||||
|
||||

|
||||
|
||||
|
@ -155,46 +155,46 @@ First, you can refer to the [official VLESS configuration example](https://githu
|
|||
|
||||
1. Generate a legal `UUID` and save it for backup (`UUID` can be simply and roughly understood as an ID that is almost never repeated like a fingerprint)
|
||||
|
||||
```shell
|
||||
xray uuid
|
||||
```
|
||||
```shell
|
||||
xray uuid
|
||||
```
|
||||
|
||||
2. Create log files and folders for backup
|
||||
|
||||
1. Basic Linux commands for beginners:
|
||||
| Number | Command name | Command description |
|
||||
|:--:|:--:|:--:|
|
||||
| `cmd-16` | `touch` | Create a blank file |
|
||||
1. Basic Linux commands for beginners:
|
||||
| Number | Command name | Command description |
|
||||
|:--:|:--:|:--:|
|
||||
| `cmd-16` | `touch` | Create a blank file |
|
||||
|
||||
2. Create a [log dedicated folder] in the `vpsadmin` folder
|
||||
2. Create a [log dedicated folder] in the `vpsadmin` folder
|
||||
|
||||
```shell
|
||||
mkdir ~/xray_log
|
||||
```
|
||||
```shell
|
||||
mkdir ~/xray_log
|
||||
```
|
||||
|
||||
3. Generate the two required log files (access log, error log)
|
||||
3. Generate the two required log files (access log, error log)
|
||||
|
||||
```shell
|
||||
touch ~/xray_log/access.log && touch ~/xray_log/error.log
|
||||
```
|
||||
```shell
|
||||
touch ~/xray_log/access.log && touch ~/xray_log/error.log
|
||||
```
|
||||
|
||||
::: warning
|
||||
This location is not the standard log file location of `Xray`. It is placed here to avoid permission issues that cause trouble for new users. Once you are familiar with it, it is recommended to return to the default location: `/var/log/xray/access.log` and `/var/log/xray/error.log`.
|
||||
:::
|
||||
::: warning
|
||||
This location is not the standard log file location of `Xray`. It is placed here to avoid permission issues that cause trouble for new users. Once you are familiar with it, it is recommended to return to the default location: `/var/log/xray/access.log` and `/var/log/xray/error.log`.
|
||||
:::
|
||||
|
||||
4. Because Xray is used by the nobody user by default, we need to allow other users to have "write" permissions (`*.log` means all files with the suffix `log`, and the efficiency advantage of the `CLI` interface gradually appears at this time)
|
||||
```shell
|
||||
chmod a+w ~/xray_log/*.log
|
||||
```
|
||||
4. Because Xray is used by the nobody user by default, we need to allow other users to have "write" permissions (`*.log` means all files with the suffix `log`, and the efficiency advantage of the `CLI` interface gradually appears at this time)
|
||||
```shell
|
||||
chmod a+w ~/xray_log/*.log
|
||||
```
|
||||
|
||||
3. Use `nano` to create the configuration file of `Xray`
|
||||
|
||||
```shell
|
||||
sudo nano /usr/local/etc/xray/config.json
|
||||
```
|
||||
```shell
|
||||
sudo nano /usr/local/etc/xray/config.json
|
||||
```
|
||||
|
||||
4. Copy all the files below and fill in the previously generated `UUID` into the 61st line `"id": "",`. (After filling in, it will look like `"id": "uuiduuid-uuid-uuid-uuid-uuiduuiduuid"`
|
||||
) This configuration file in this article adds my various verbose comments to help you understand the function of each configuration module.
|
||||
) This configuration file in this article adds my various verbose comments to help you understand the function of each configuration module.
|
||||
|
||||
```json
|
||||
// REFERENCE:
|
||||
|
@ -207,94 +207,102 @@ First, you can refer to the [official VLESS configuration example](https://githu
|
|||
// ├─ 4_inbounds Inbound settings - what traffic can flow into Xray
|
||||
// └─ 5_outbounds Outbound settings - where does the traffic out of Xray go
|
||||
{
|
||||
// 1\_Log settings
|
||||
"log": {
|
||||
"loglevel": "warning", // content from less to more: "none", "error", "warning", "info", "debug"
|
||||
"access": "/home/vpsadmin/xray_log/access.log", // access record
|
||||
"error": "/home/vpsadmin/xray_log/error.log" // Error log
|
||||
},
|
||||
// 2_DNS settings
|
||||
"dns": {
|
||||
"servers": [
|
||||
"https+local://1.1.1.1/dns-query", // Prefer 1.1.1.1 DoH query, sacrificing speed but preventing ISP snooping
|
||||
"localhost"
|
||||
]
|
||||
},
|
||||
// 3*Diversion settings
|
||||
"routing": {
|
||||
"domainStrategy": "IPIfNonMatch",
|
||||
"rules": [
|
||||
// 3.1 Prevent local server flow problems: such as intranet attacks or abuse, incorrect local loopbacks, etc.
|
||||
{
|
||||
"type": "field",
|
||||
"ip": [
|
||||
"geoip:private" // Diversion condition: In the geoip file, the rule named "private" (local)
|
||||
],
|
||||
"outboundTag": "block" // Diversion strategy: Hand over to the outbound "block" for processing (black hole shielding)
|
||||
},
|
||||
{
|
||||
// 3.2 Prevent the server from connecting directly to China
|
||||
"type": "field",
|
||||
"ip": ["geoip:cn"],
|
||||
"outboundTag": "block"
|
||||
},
|
||||
// 3.3 Block ads
|
||||
{
|
||||
"type": "field",
|
||||
"domain": [
|
||||
"geosite:category-ads-all" // Diversion conditions: In the geosite file, the rule named "category-ads-all" (various advertising domain names)
|
||||
],
|
||||
"outboundTag": "block" // Diversion strategy: Hand it over to the outbound "block" for processing (black hole shielding)
|
||||
}
|
||||
]
|
||||
},
|
||||
// 4* Inbound settings
|
||||
// 4.1 Here is only the simplest vless+xtls inbound, because this is the most powerful mode of Xray. If you need other, please add it according to the template.
|
||||
"inbounds": [{
|
||||
"port": 443,
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"clients": [{
|
||||
"id": "", // Fill in your UUID
|
||||
"flow": "xtls-rprx-vision",
|
||||
"level": 0,
|
||||
"email": "vpsadmin@yourdomain.com"
|
||||
}],
|
||||
"decryption": "none",
|
||||
"fallbacks": [{
|
||||
"dest": 80 // Fall back to anti-detection proxy by default
|
||||
}]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "tcp",
|
||||
"security": "tls",
|
||||
"tlsSettings": {
|
||||
"alpn": "http/1.1",
|
||||
"certificates": [{
|
||||
"certificateFile": "/home/vpsadmin/xray_cert/xray.crt",
|
||||
"keyFile": "/home/vpsadmin/xray_cert/xray.key"
|
||||
}]
|
||||
}
|
||||
}
|
||||
}],
|
||||
// 5*Outbound settings
|
||||
"outbounds": [
|
||||
// 5.1 The first outbound is the default rule, freedom is a direct connection to the outside (vps is already an external network, so it is a direct connection)
|
||||
{
|
||||
"tag": "direct",
|
||||
"protocol": "freedom"
|
||||
},
|
||||
// 5.2 Blocking rules, blackhole protocol is to import traffic into the black hole (blocking)
|
||||
{
|
||||
"tag": "block",
|
||||
"protocol": "blackhole"
|
||||
}
|
||||
]
|
||||
// 1\_Log settings
|
||||
"log": {
|
||||
"loglevel": "warning", // content from less to more: "none", "error", "warning", "info", "debug"
|
||||
"access": "/home/vpsadmin/xray_log/access.log", // access record
|
||||
"error": "/home/vpsadmin/xray_log/error.log" // Error log
|
||||
},
|
||||
// 2_DNS settings
|
||||
"dns": {
|
||||
"servers": [
|
||||
"https+local://1.1.1.1/dns-query", // Prefer 1.1.1.1 DoH query, sacrificing speed but preventing ISP snooping
|
||||
"localhost"
|
||||
]
|
||||
},
|
||||
// 3*Diversion settings
|
||||
"routing": {
|
||||
"domainStrategy": "IPIfNonMatch",
|
||||
"rules": [
|
||||
// 3.1 Prevent local server flow problems: such as intranet attacks or abuse, incorrect local loopbacks, etc.
|
||||
{
|
||||
"type": "field",
|
||||
"ip": [
|
||||
"geoip:private" // Diversion condition: In the geoip file, the rule named "private" (local)
|
||||
],
|
||||
"outboundTag": "block" // Diversion strategy: Hand over to the outbound "block" for processing (black hole shielding)
|
||||
},
|
||||
{
|
||||
// 3.2 Prevent the server from connecting directly to China
|
||||
"type": "field",
|
||||
"ip": ["geoip:cn"],
|
||||
"outboundTag": "block"
|
||||
},
|
||||
// 3.3 Block ads
|
||||
{
|
||||
"type": "field",
|
||||
"domain": [
|
||||
"geosite:category-ads-all" // Diversion conditions: In the geosite file, the rule named "category-ads-all" (various advertising domain names)
|
||||
],
|
||||
"outboundTag": "block" // Diversion strategy: Hand it over to the outbound "block" for processing (black hole shielding)
|
||||
}
|
||||
]
|
||||
},
|
||||
// 4* Inbound settings
|
||||
// 4.1 Here is only the simplest vless+xtls inbound, because this is the most powerful mode of Xray. If you need other, please add it according to the template.
|
||||
"inbounds": [
|
||||
{
|
||||
"port": 443,
|
||||
"protocol": "vless",
|
||||
"settings": {
|
||||
"clients": [
|
||||
{
|
||||
"id": "", // Fill in your UUID
|
||||
"flow": "xtls-rprx-vision",
|
||||
"level": 0,
|
||||
"email": "vpsadmin@yourdomain.com"
|
||||
}
|
||||
],
|
||||
"decryption": "none",
|
||||
"fallbacks": [
|
||||
{
|
||||
"dest": 80 // Fall back to anti-detection proxy by default
|
||||
}
|
||||
]
|
||||
},
|
||||
"streamSettings": {
|
||||
"network": "tcp",
|
||||
"security": "tls",
|
||||
"tlsSettings": {
|
||||
"alpn": "http/1.1",
|
||||
"certificates": [
|
||||
{
|
||||
"certificateFile": "/home/vpsadmin/xray_cert/xray.crt",
|
||||
"keyFile": "/home/vpsadmin/xray_cert/xray.key"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
// 5*Outbound settings
|
||||
"outbounds": [
|
||||
// 5.1 The first outbound is the default rule, freedom is a direct connection to the outside (vps is already an external network, so it is a direct connection)
|
||||
{
|
||||
"tag": "direct",
|
||||
"protocol": "freedom"
|
||||
},
|
||||
// 5.2 Blocking rules, blackhole protocol is to import traffic into the black hole (blocking)
|
||||
{
|
||||
"tag": "block",
|
||||
"protocol": "blackhole"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
5) The complete process is demonstrated as follows:
|
||||

|
||||
5. The complete process is demonstrated as follows:
|
||||

|
||||
|
||||
## 7.5 Start Xray service! ! (and check the service status)
|
||||
|
||||
|
@ -396,94 +404,92 @@ If your line really has a very high packet loss rate, the only reliable solution
|
|||
|
||||
6. I have said so much because there are too many misconceptions and scam scripts around `BBR` to fool novices. I hope you now have a relatively clear understanding of `BBR`. Next, let's install the latest Debian kernel and enable `BBR`! (It's really simple)
|
||||
|
||||
1. Add the official `backports` source to Debian 10 to get the updated software library
|
||||
1. Add the official `backports` source to Debian 10 to get the updated software library
|
||||
|
||||
```shell
|
||||
sudo nano /etc/apt/sources.list
|
||||
```
|
||||
```shell
|
||||
sudo nano /etc/apt/sources.list
|
||||
```
|
||||
|
||||
::: warning description
|
||||
This article takes Debian 10 as an example, so there is still no problem using `/etc/apt/sources.list`, but if you are not starting from scratch according to this article, or using other Linux
|
||||
distributions, it is recommended that you create a `/etc/apt/sources.list.d/` folder and create your own configuration file in this folder, such as `/etc/apt/sources.list.d/vpsadmin.list`
|
||||
, to ensure compatibility and avoid the default file being overwritten in unforeseen circumstances and causing configuration loss.
|
||||
:::
|
||||
::: warning description
|
||||
This article takes Debian 10 as an example, so there is still no problem using `/etc/apt/sources.list`, but if you are not starting from scratch according to this article, or using other Linux
|
||||
distributions, it is recommended that you create a `/etc/apt/sources.list.d/` folder and create your own configuration file in this folder, such as `/etc/apt/sources.list.d/vpsadmin.list`
|
||||
, to ensure compatibility and avoid the default file being overwritten in unforeseen circumstances and causing configuration loss.
|
||||
:::
|
||||
|
||||
2. Then add the following item at the end, save and exit.
|
||||
2. Then add the following item at the end, save and exit.
|
||||
|
||||
```
|
||||
deb http://deb.debian.org/debian buster-backports main
|
||||
```
|
||||
```
|
||||
deb http://deb.debian.org/debian buster-backports main
|
||||
```
|
||||
|
||||
3. Refresh the software library and query the latest version of the official Debian kernel and install it. Please be sure to install the version corresponding to your VPS (this article takes the more common [amd64] as an example).
|
||||
3. Refresh the software library and query the latest version of the official Debian kernel and install it. Please be sure to install the version corresponding to your VPS (this article takes the more common [amd64] as an example).
|
||||
|
||||
```shell
|
||||
sudo apt update && sudo apt -t buster-backports install linux-image-amd64
|
||||
```
|
||||
```shell
|
||||
sudo apt update && sudo apt -t buster-backports install linux-image-amd64
|
||||
```
|
||||
|
||||
::: warning Note
|
||||
::: warning Note
|
||||
|
||||
If your VPS supports it, you can try the [cloud server dedicated kernel] `linux-image-cloud-amd64`. The advantages are simplicity and low resource usage. The disadvantage is that some students have reported that forced installation on an unsupported system will cause the system to fail to boot (the kernel cannot be recognized).
|
||||
If your VPS supports it, you can try the [cloud server dedicated kernel] `linux-image-cloud-amd64`. The advantages are simplicity and low resource usage. The disadvantage is that some students have reported that forced installation on an unsupported system will cause the system to fail to boot (the kernel cannot be recognized).
|
||||
|
||||
To avoid the tragedy of being unable to identify, please make sure:
|
||||
To avoid the tragedy of being unable to identify, please make sure:
|
||||
|
||||
- Take a system snapshot before trying, or
|
||||
- You have `vnc` to save the day (and you know how to use it)
|
||||
- Take a system snapshot before trying, or
|
||||
- You have `vnc` to save the day (and you know how to use it)
|
||||
|
||||
:::
|
||||
:::
|
||||
|
||||
4. Modify the `kernel` parameter configuration file `sysctl.conf` and specify to enable `BBR`
|
||||
4. Modify the `kernel` parameter configuration file `sysctl.conf` and specify to enable `BBR`
|
||||
|
||||
```shell
|
||||
sudo nano /etc/sysctl.conf
|
||||
```
|
||||
```shell
|
||||
sudo nano /etc/sysctl.conf
|
||||
```
|
||||
|
||||
::: warning description
|
||||
This article takes Debian 10 as an example, so it is still no problem to use `/etc/sysctl.conf`, but if you are not following this article from scratch, or use other Linux distributions, it is recommended that you create a `/etc/sysctl.d/`
|
||||
folder and create your own configuration file in this folder, such as `/etc/sysctl.d/vpsadmin.conf`, to ensure compatibility, because some distributions no longer read parameters from `/etc/sysctl.conf` after `systemd`
|
||||
207 version. Using a custom configuration file can also prevent the default file from being overwritten in unexpected circumstances, resulting in configuration loss.
|
||||
:::
|
||||
::: warning description
|
||||
This article takes Debian 10 as an example, so it is still no problem to use `/etc/sysctl.conf`, but if you are not following this article from scratch, or use other Linux distributions, it is recommended that you create a `/etc/sysctl.d/`
|
||||
folder and create your own configuration file in this folder, such as `/etc/sysctl.d/vpsadmin.conf`, to ensure compatibility, because some distributions no longer read parameters from `/etc/sysctl.conf` after `systemd`
|
||||
207 version. Using a custom configuration file can also prevent the default file from being overwritten in unexpected circumstances, resulting in configuration loss.
|
||||
:::
|
||||
|
||||
5. Add the following content
|
||||
5. Add the following content
|
||||
|
||||
```
|
||||
net.core.default_qdisc=fq
|
||||
net.ipv4.tcp_congestion_control=bbr
|
||||
```
|
||||
```
|
||||
net.core.default_qdisc=fq
|
||||
net.ipv4.tcp_congestion_control=bbr
|
||||
```
|
||||
|
||||
6. Restart the VPS to make the kernel update and `BBR` settings take effect
|
||||
6. Restart the VPS to make the kernel update and `BBR` settings take effect
|
||||
|
||||
```shell
|
||||
sudo reboot
|
||||
```
|
||||
```shell
|
||||
sudo reboot
|
||||
```
|
||||
|
||||
7. The complete process is demonstrated as follows:
|
||||
7. The complete process is demonstrated as follows:
|
||||
|
||||
::: tip
|
||||
Because the VPS I am demonstrating supports the cloud server-specific kernel, I used `linux-image-cloud-amd64` in the animation.
|
||||
::: tip
|
||||
Because the VPS I am demonstrating supports the cloud server-specific kernel, I used `linux-image-cloud-amd64` in the animation.
|
||||
|
||||
If you are not sure whether your VPS supports it, please follow the command in step 3 and use the regular kernel `linux-image-amd64`.
|
||||
:::
|
||||
If you are not sure whether your VPS supports it, please follow the command in step 3 and use the regular kernel `linux-image-amd64`.
|
||||
:::
|
||||
|
||||

|
||||

|
||||
|
||||
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:
|
||||
```shell
|
||||
`shell
|
||||
lsmod | grep bbr
|
||||
```
|
||||
This should return the following result:
|
||||
```
|
||||
tcp_bbr
|
||||
```
|
||||
If you want to confirm whether the `fq` algorithm is enabled correctly, you can use the following command:
|
||||
```shell
|
||||
`
|
||||
This should return the following result:
|
||||
` tcp_bbr
|
||||
`
|
||||
If you want to confirm whether the `fq` algorithm is enabled correctly, you can use the following command:
|
||||
`shell
|
||||
lsmod | grep fq
|
||||
```
|
||||
This should return the following result:
|
||||
```
|
||||
sch_fq
|
||||
```
|
||||
`
|
||||
This should return the following result:
|
||||
` sch_fq
|
||||
`
|
||||
|
||||
## 7.8 Server Optimization 2: Enable HTTP to automatically redirect to HTTPS
|
||||
|
||||
|
@ -569,4 +575,4 @@ Affected sections:
|
|||
|
||||
Affected sections:
|
||||
|
||||
- 7.8 Server Optimization 2 - 4. Add a local port listener at the same level as the `80` port to provide web page display
|
||||
- 7.8 Server Optimization 2 - 4. Add a local port listener at the same level as the `80` port to provide web page display
|
||||
|
|
|
@ -24,8 +24,7 @@ features:
|
|||
|
||||
- title: Мощная маршрутизация
|
||||
details: |
|
||||
Высоконастраиваемая система маршрутизации, отвечающая разнообразным требованиям использования и позволяющая максимально эффективно использовать производительность сети.
|
||||
|
||||
Высоконастраиваемая система маршрутизации, отвечающая разнообразным требованиям использования и позволяющая максимально эффективно использовать производительность сети.
|
||||
|
||||
- title: Полная совместимость
|
||||
details: |
|
||||
|
@ -44,12 +43,12 @@ footer: Лицензия CC-BY-SA 4.0 | Авторские права 2020-на
|
|||
|
||||
- Xray-core - это расширенная версия v2ray-core с улучшенной общей производительностью, включающая XTLS и другие улучшения. Xray-core ~~полностью~~ совместим с функциональностью и конфигурацией v2ray-core.
|
||||
- Только один исполняемый файл, включающий функциональность ctl, команда run используется по умолчанию.
|
||||
- Конфигурация ~~полностью~~ совместима, переменные среды и вызовы API должны начинаться с XRAY\_
|
||||
- Конфигурация ~~полностью~~ совместима, переменные среды и вызовы API должны начинаться с XRAY\_
|
||||
- Открытый raw протокол ReadV на всех платформах.
|
||||
- Обеспечивает полную поддержку VLESS и Trojan XTLS, обе с ReadV.
|
||||
- Предоставляет несколько режимов управления потоком XTLS, непревзойденная производительность!
|
||||
|
||||
> Конфигурация без изменений, результат — значительно лучше.
|
||||
> Конфигурация без изменений, результат — значительно лучше.
|
||||
|
||||
### Кто мы?
|
||||
|
||||
|
@ -101,5 +100,3 @@ footer: Лицензия CC-BY-SA 4.0 | Авторские права 2020-на
|
|||
### Динамика звезд на GitHub
|
||||
|
||||
[](https://starchart.cc/XTLS/Xray-core)
|
||||
|
||||
|
||||
|
|
|
@ -442,9 +442,9 @@ Shadowsocks-2022 — это новый протокол с переработа
|
|||
|
||||
Теперь появился открытый и бесплатный Android-клиент на основе Xray-core — [AnXray](https://github.com/XTLS/AnXray)! Поддерживается [@nekohasekai](https://github.com/nekohasekai).
|
||||
|
||||
- Поддержка множества протоколов, плагинов.
|
||||
- Главный визуальный дизайнер [@RPRX](https://github.com/RPRX) разработал логотип и слоган в X-стиле, а также уникальную материальную черно-белую тему.
|
||||
- В приложении есть небольшой сюрприз, который ждет вас.
|
||||
- Поддержка множества протоколов, плагинов.
|
||||
- Главный визуальный дизайнер [@RPRX](https://github.com/RPRX) разработал логотип и слоган в X-стиле, а также уникальную материальную черно-белую тему.
|
||||
- В приложении есть небольшой сюрприз, который ждет вас.
|
||||
|
||||
В последние два дня детали постоянно дорабатывались с утра до ночи, надеемся, что все добавят больше звезд и внимания.
|
||||
|
||||
|
@ -504,7 +504,7 @@ Shadowsocks-2022 — это новый протокол с переработа
|
|||
## 2021.3.3 <Badge>[1.3.1](https://github.com/XTLS/Xray-core/releases/tag/v1.3.1)</Badge>
|
||||
|
||||
- В этой версии используется Golang 1.16, который официально поддерживает Apple Silicon.
|
||||
- В то же время исправлена ошибка, которая могла вызвать панику. ~~Holmium_ считает, что это обман, нападение.~~
|
||||
- В то же время исправлена ошибка, которая могла вызвать панику. ~~Holmium\_ считает, что это обман, нападение.~~
|
||||
- Исправлено несколько устаревших проблем.
|
||||
|
||||
## 2021.2.14 <Badge>[1.3.0](https://github.com/XTLS/Xray-core/releases/tag/v1.3.0)</Badge>
|
||||
|
|
|
@ -3,11 +3,11 @@ title: Конфигурационный файл
|
|||
lang: ru-RU
|
||||
---
|
||||
|
||||
> **В этом разделе вы узнаете все детали настройки Xray. Овладев этими знаниями, вы сможете раскрыть весь потенциал Xray.**
|
||||
> **В этом разделе вы узнаете все детали настройки Xray. Овладев этими знаниями, вы сможете раскрыть весь потенциал Xray.**
|
||||
|
||||
## Обзор
|
||||
|
||||
Конфигурационный файл Xray имеет формат JSON. Формат конфигурации одинаков для клиента и сервера, но фактическое содержимое отличается.
|
||||
Конфигурационный файл Xray имеет формат JSON. Формат конфигурации одинаков для клиента и сервера, но фактическое содержимое отличается.
|
||||
Он выглядит следующим образом:
|
||||
|
||||
```json
|
||||
|
@ -45,11 +45,11 @@ lang: ru-RU
|
|||
|
||||
> dns: [DnsObject](./dns.md)
|
||||
|
||||
Встроенный DNS-сервер. Если этот параметр не настроен, используются системные настройки DNS.
|
||||
Встроенный DNS-сервер. Если этот параметр не настроен, используются системные настройки DNS.
|
||||
|
||||
> routing: [RoutingObject](./routing.md)
|
||||
|
||||
Функция маршрутизации. Позволяет настроить правила для разделения трафика и отправки его через разные исходящие подключения.
|
||||
Функция маршрутизации. Позволяет настроить правила для разделения трафика и отправки его через разные исходящие подключения.
|
||||
|
||||
> policy: [PolicyObject](./policy.md)
|
||||
|
||||
|
@ -73,22 +73,20 @@ lang: ru-RU
|
|||
|
||||
> reverse: [ReverseObject](./reverse.md)
|
||||
|
||||
Обратный прокси. Позволяет перенаправлять трафик с сервера на клиент, т.е. перенаправлять трафик в обратном направлении.
|
||||
Обратный прокси. Позволяет перенаправлять трафик с сервера на клиент, т.е. перенаправлять трафик в обратном направлении.
|
||||
|
||||
> fakedns: [FakeDnsObject](./fakedns.md)
|
||||
|
||||
Настройка FakeDNS. Может использоваться совместно с прозрачным проксированием для получения фактических доменных имен.
|
||||
Настройка FakeDNS. Может использоваться совместно с прозрачным проксированием для получения фактических доменных имен.
|
||||
|
||||
> metrics: [metricsObject](./metrics.md)
|
||||
|
||||
Настройка метрик. Более прямой (и, надеемся, лучший) способ экспорта статистики.
|
||||
Настройка метрик. Более прямой (и, надеемся, лучший) способ экспорта статистики.
|
||||
|
||||
> observatory: [ObservatoryObject](./observatory.md#observatoryobject)
|
||||
|
||||
Мониторинг фоновых подключений. Обнаружение состояния подключения исходящего прокси.
|
||||
Мониторинг фоновых подключений. Обнаружение состояния подключения исходящего прокси.
|
||||
|
||||
> burstObservatory: [BurstObservatoryObject](./observatory.md#burstobservatoryobject)
|
||||
|
||||
Мониторинг параллельных подключений. Обнаружение состояния подключения исходящего прокси.
|
||||
|
||||
|
||||
Мониторинг параллельных подключений. Обнаружение состояния подключения исходящего прокси.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
Настройка API предоставляет API-интерфейсы на основе [gRPC](https://grpc.io/) для удаленного вызова.
|
||||
|
||||
Интерфейсы можно включить с помощью модуля конфигурации api. Когда API включен, Xray создает исходящее подключение с тем же тегом, что и тег API.
|
||||
Интерфейсы можно включить с помощью модуля конфигурации api. Когда API включен, Xray создает исходящее подключение с тем же тегом, что и тег API.
|
||||
Необходимо вручную направить все входящие API-подключения на это исходящее подключение с помощью [правил маршрутизации](./routing.md).
|
||||
См. раздел [Связанные настройки](#связанные-настройки) в этом документе.
|
||||
|
||||
|
@ -22,7 +22,12 @@
|
|||
"api": {
|
||||
"tag": "api",
|
||||
"listen": "127.0.0.1:8080",
|
||||
"services": ["HandlerService", "LoggerService", "StatsService", "RoutingService"]
|
||||
"services": [
|
||||
"HandlerService",
|
||||
"LoggerService",
|
||||
"StatsService",
|
||||
"RoutingService"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
@ -33,7 +38,7 @@
|
|||
|
||||
> `listen`: string
|
||||
|
||||
IP-адрес и порт, на котором прослушивает API-сервер. Это необязательный параметр.
|
||||
IP-адрес и порт, на котором прослушивает API-сервер. Это необязательный параметр.
|
||||
|
||||
Если этот параметр опущен, необходимо добавить настройки inbounds и routing, как показано в примере в разделе [Связанные настройки](#связанные-настройки).
|
||||
|
||||
|
@ -140,5 +145,3 @@ xray.app.stats.command.StatsService
|
|||
## Примеры вызова API
|
||||
|
||||
[Xray-API-documents](https://github.com/XTLS/Xray-API-documents) @crossfw
|
||||
|
||||
|
||||
|
|
|
@ -6,12 +6,12 @@
|
|||
|
||||
- На этапе маршрутизации: разрешает доменные имена в IP-адреса и выполняет сопоставление правил на основе полученных IP-адресов для разделения трафика. Разрешение доменных имен и разделение трафика зависят от значения `domainStrategy` в конфигурации модуля маршрутизации. Встроенный DNS-сервер будет использоваться для DNS-запросов только в том случае, если установлено одно из следующих двух значений:
|
||||
|
||||
- `"IPIfNonMatch"`: при запросе доменного имени выполняется сопоставление домена в маршрутизации, если совпадение не найдено, для этого доменного имени используется встроенный DNS-сервер для выполнения DNS-запроса, и возвращенный IP-адрес используется для повторного сопоставления IP-маршрутизации.
|
||||
- `"IPOnDemand"`: при обнаружении любого правила на основе IP-адреса доменное имя немедленно разрешается в IP-адрес для сопоставления.
|
||||
- `"IPIfNonMatch"`: при запросе доменного имени выполняется сопоставление домена в маршрутизации, если совпадение не найдено, для этого доменного имени используется встроенный DNS-сервер для выполнения DNS-запроса, и возвращенный IP-адрес используется для повторного сопоставления IP-маршрутизации.
|
||||
- `"IPOnDemand"`: при обнаружении любого правила на основе IP-адреса доменное имя немедленно разрешается в IP-адрес для сопоставления.
|
||||
|
||||
- Разрешает целевой адрес для подключения.
|
||||
- Например, если в исходящем подключении `freedom` установить `domainStrategy` равным `UseIP`, то запросы, отправленные этим исходящим подключением, сначала будут разрешены во встроенном сервере из доменного имени в IP-адрес, а затем будет выполнено подключение.
|
||||
- Например, если в `sockopt` установить `domainStrategy` равным `UseIP`, то системные подключения, инициированные этим исходящим подключением, сначала будут разрешены во встроенном сервере из доменного имени в IP-адрес, а затем будет выполнено подключение.
|
||||
- Например, если в исходящем подключении `freedom` установить `domainStrategy` равным `UseIP`, то запросы, отправленные этим исходящим подключением, сначала будут разрешены во встроенном сервере из доменного имени в IP-адрес, а затем будет выполнено подключение.
|
||||
- Например, если в `sockopt` установить `domainStrategy` равным `UseIP`, то системные подключения, инициированные этим исходящим подключением, сначала будут разрешены во встроенном сервере из доменного имени в IP-адрес, а затем будет выполнено подключение.
|
||||
|
||||
::: tip СОВЕТ 1
|
||||
DNS-запросы, отправляемые встроенным DNS-сервером, автоматически перенаправляются в соответствии с конфигурацией маршрутизации.
|
||||
|
@ -28,11 +28,11 @@ DNS-запросы, отправляемые встроенным DNS-серве
|
|||
- Совпадает с сопоставлением «доменное имя - IP», «доменное имя - массив IP» в `hosts`, то этот IP или массив IP возвращается в качестве результата разрешения DNS.
|
||||
- Совпадает с сопоставлением «доменное имя - доменное имя» в `hosts`, то значение этого сопоставления (другое доменное имя) будет использоваться в качестве текущего запрашиваемого доменного имени, и процесс обработки DNS будет продолжаться до тех пор, пока не будет разрешен IP-адрес или возвращено пустое разрешение.
|
||||
- Не совпадает с `hosts`, но совпадает с одним (несколькими) списками доменов `domains` на DNS-серверах, то в соответствии с приоритетом совпадающих правил, DNS-серверы, соответствующие этим правилам, будут использоваться для запроса по очереди. Если запрос к DNS-серверу не удался или `expectIPs` не совпадает, то для запроса будет использоваться следующий DNS-сервер. В противном случае возвращается разрешенный IP-адрес. Если запрос ко всем совпадающим DNS-серверам не удался или `expectIPs` не совпадает, то компонент DNS:
|
||||
- По умолчанию выполнит «откат DNS-запроса (fallback)»: DNS-серверы, которые не использовались в предыдущем неудачном запросе и для которых `skipFallback` имеет значение по умолчанию `false`, будут использоваться для запроса по очереди. Если запрос не удался или `expectIPs` не совпадает, то возвращается пустое разрешение; в противном случае возвращается разрешенный IP-адрес.
|
||||
- Если `disableFallback` установлен в `true`, то «откат DNS-запроса (fallback)» выполняться не будет.
|
||||
- По умолчанию выполнит «откат DNS-запроса (fallback)»: DNS-серверы, которые не использовались в предыдущем неудачном запросе и для которых `skipFallback` имеет значение по умолчанию `false`, будут использоваться для запроса по очереди. Если запрос не удался или `expectIPs` не совпадает, то возвращается пустое разрешение; в противном случае возвращается разрешенный IP-адрес.
|
||||
- Если `disableFallback` установлен в `true`, то «откат DNS-запроса (fallback)» выполняться не будет.
|
||||
- Не совпадает ни с `hosts`, ни со списками доменов `domains` на DNS-серверах, то:
|
||||
- По умолчанию DNS-серверы, для которых `skipFallback` имеет значение по умолчанию `false`, будут использоваться для запроса по очереди. Если запрос к первому выбранному DNS-серверу не удался или `expectIPs` не совпадает, то для запроса будет использоваться следующий выбранный DNS-сервер. В противном случае возвращается разрешенный IP-адрес. Если запрос ко всем выбранным DNS-серверам не удался или `expectIPs` не совпадает, то возвращается пустое разрешение.
|
||||
- Если количество DNS-серверов, для которых `skipFallback` имеет значение по умолчанию `false`, равно 0 или `disableFallback` установлен в `true`, то для запроса будет использоваться первый DNS-сервер в конфигурации DNS. Если запрос не удался или `expectIPs` не совпадает, то возвращается пустое разрешение; в противном случае возвращается разрешенный IP-адрес.
|
||||
- По умолчанию DNS-серверы, для которых `skipFallback` имеет значение по умолчанию `false`, будут использоваться для запроса по очереди. Если запрос к первому выбранному DNS-серверу не удался или `expectIPs` не совпадает, то для запроса будет использоваться следующий выбранный DNS-сервер. В противном случае возвращается разрешенный IP-адрес. Если запрос ко всем выбранным DNS-серверам не удался или `expectIPs` не совпадает, то возвращается пустое разрешение.
|
||||
- Если количество DNS-серверов, для которых `skipFallback` имеет значение по умолчанию `false`, равно 0 или `disableFallback` установлен в `true`, то для запроса будет использоваться первый DNS-сервер в конфигурации DNS. Если запрос не удался или `expectIPs` не совпадает, то возвращается пустое разрешение; в противном случае возвращается разрешенный IP-адрес.
|
||||
|
||||
## DnsObject
|
||||
|
||||
|
@ -58,17 +58,13 @@ DNS-запросы, отправляемые встроенным DNS-серве
|
|||
},
|
||||
{
|
||||
"address": "https://8.8.8.8/dns-query",
|
||||
"domains": [
|
||||
"geosite:netflix"
|
||||
],
|
||||
"domains": ["geosite:netflix"],
|
||||
"skipFallback": true,
|
||||
"queryStrategy": "UseIPv4"
|
||||
},
|
||||
{
|
||||
"address": "https://1.1.1.1/dns-query",
|
||||
"domains": [
|
||||
"geosite:openai"
|
||||
],
|
||||
"domains": ["geosite:openai"],
|
||||
"skipFallback": true,
|
||||
"queryStrategy": "UseIPv6"
|
||||
},
|
||||
|
@ -114,7 +110,7 @@ DNS-запросы, отправляемые встроенным DNS-серве
|
|||
|
||||
Если значение имеет вид `"https://хост:порт/dns-query"`, например, `"https://dns.google/dns-query"`, Xray будет использовать `DNS over HTTPS` (RFC8484, сокращенно DOH) для запроса. Некоторые провайдеры имеют сертификаты с псевдонимами IP-адресов, можно напрямую указывать IP-адрес, например, `https://1.1.1.1/dns-query`. Также можно использовать нестандартные порты и пути, например, `"https://a.b.c.d:8443/my-dns-query"`.
|
||||
|
||||
Если значение имеет вид `"h2c://хост:порт/dns-query"`, например, `"h2c://dns.google/dns-query"`, Xray будет использовать формат запроса `DNS over HTTPS`, но отправит его в виде открытого текста h2c. Нельзя использовать напрямую. В этом случае необходимо самостоятельно настроить исходящее соединение Freedom + streamSettings, установив TLS, чтобы обернуть его в обычный DOH-запрос. Используется для особых целей, например, когда требуется настроить SNI для DOH-запроса или использовать отпечаток utls.
|
||||
Если значение имеет вид `"h2c://хост:порт/dns-query"`, например, `"h2c://dns.google/dns-query"`, Xray будет использовать формат запроса `DNS over HTTPS`, но отправит его в виде открытого текста h2c. Нельзя использовать напрямую. В этом случае необходимо самостоятельно настроить исходящее соединение Freedom + streamSettings, установив TLS, чтобы обернуть его в обычный DOH-запрос. Используется для особых целей, например, когда требуется настроить SNI для DOH-запроса или использовать отпечаток utls.
|
||||
|
||||
Если значение имеет вид `"https+local://хост:порт/dns-query"`, например, `"https+local://dns.google/dns-query"`, Xray будет использовать `локальный режим DOH (DOHL)` для запроса. Это означает, что DOH-запрос не будет проходить через компонент маршрутизации, а будет отправляться непосредственно через исходящее подключение Freedom, чтобы сократить время ожидания. Обычно подходит для использования на сервере. Также можно использовать нестандартные порты и пути.
|
||||
|
||||
|
|
|
@ -196,7 +196,3 @@ FakeDNS будет использовать этот блок IP-адресов
|
|||
]
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -12,12 +12,12 @@ Xray обычно использует uTLS для имитации поведе
|
|||
|
||||
Однако есть много недостатков:
|
||||
|
||||
* Пользователь должен запускать браузер рядом с клиентом Xray только для открытия прокси-соединения.
|
||||
* Browser Dialer не должен быть туннелирован через сам прокси, иначе возникнет петля. Пользователи TUN должны быть осторожны.
|
||||
* Браузер может работать только со стандартным HTTP, что означает, что поддерживаются только [WebSocket](../../transports/websocket.md) и [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113#discussioncomment-11468947).
|
||||
* [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) необходимо учитывать при выполнении запросов с одного веб-сайта (`localhost:8080`) на другой (`proxy.example.com:443`).
|
||||
* Браузер туннелирует ваш трафик с помощью JavaScript, поэтому наблюдается значительное снижение производительности (или разрядка аккумулятора).
|
||||
* Конфигурация, используемая с Browser Dialer, не может использовать собственные заголовки SNI или хоста. `SNI == host == address`. Пользовательские заголовки HTTP и `tlsSettings` игнорируются полностью.
|
||||
- Пользователь должен запускать браузер рядом с клиентом Xray только для открытия прокси-соединения.
|
||||
- Browser Dialer не должен быть туннелирован через сам прокси, иначе возникнет петля. Пользователи TUN должны быть осторожны.
|
||||
- Браузер может работать только со стандартным HTTP, что означает, что поддерживаются только [WebSocket](../../transports/websocket.md) и [XHTTP](https://github.com/XTLS/Xray-core/discussions/4113#discussioncomment-11468947).
|
||||
- [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) необходимо учитывать при выполнении запросов с одного веб-сайта (`localhost:8080`) на другой (`proxy.example.com:443`).
|
||||
- Браузер туннелирует ваш трафик с помощью JavaScript, поэтому наблюдается значительное снижение производительности (или разрядка аккумулятора).
|
||||
- Конфигурация, используемая с Browser Dialer, не может использовать собственные заголовки SNI или хоста. `SNI == host == address`. Пользовательские заголовки HTTP и `tlsSettings` игнорируются полностью.
|
||||
|
||||
## Конфигурация
|
||||
|
||||
|
@ -51,4 +51,3 @@ Xray обычно использует uTLS для имитации поведе
|
|||
[XHTTP](https://github.com/XTLS/Xray-core/discussions/4113#discussioncomment-11468947) поддерживает QUIC, но также может использоваться собственный стек QUIC браузера. В Chrome это можно сделать через `chrome://flags`, в других браузерах он может быть уже включен или для него может потребоваться другой флаг.
|
||||
|
||||
В общем, `tlsSettings` полностью игнорируются при использовании Browser Dialer. Xray никак не контролирует, какую версию HTTP выбирает браузер.
|
||||
|
||||
|
|
|
@ -28,4 +28,4 @@ Xray предоставляет следующие переменные сред
|
|||
- Название: `xray.location.confdir` или `XRAY_LOCATION_CONFDIR`.
|
||||
- Значение по умолчанию: `""`.
|
||||
|
||||
Файлы `.json` в этом каталоге будут читаться в порядке имен файлов как параметры конфигурации.
|
||||
Файлы `.json` в этом каталоге будут читаться в порядке имен файлов как параметры конфигурации.
|
||||
|
|
|
@ -98,5 +98,3 @@ VLESS будет перенаправлять трафик с длиной пе
|
|||
- [Краткое описание функции Fallbacks](../../document/level-1/fallbacks-lv1)
|
||||
|
||||
## Теория Fallbacks <Badge text="В разработке" type="warning"/>
|
||||
|
||||
|
||||
|
|
|
@ -104,19 +104,19 @@ $ xray run -confdir /etc/xray/confs
|
|||
```json
|
||||
{
|
||||
"log": {
|
||||
"loglevel": "debug" // объект верхнего уровня перезаписывает предыдущий
|
||||
"loglevel": "debug" // объект верхнего уровня перезаписывает предыдущий
|
||||
},
|
||||
"inbounds": [
|
||||
{
|
||||
"tag": "socks", // перезапись элемента с тем же tag
|
||||
"protocol": "socks",
|
||||
"listen": "127.0.0.1",
|
||||
"port": 1080
|
||||
"port": 1080
|
||||
}
|
||||
],
|
||||
"outbounds": [
|
||||
{
|
||||
"tag": "block", // добавлено в начало outbounds
|
||||
"tag": "block", // добавлено в начало outbounds
|
||||
"protocol": "blackhole"
|
||||
},
|
||||
{
|
||||
|
@ -134,5 +134,3 @@ $ xray run -confdir /etc/xray/confs
|
|||
::: tip
|
||||
Вы можете использовать команду `xray run -confdir=./confs -dump` для просмотра объединенной конфигурации. Однако, поскольку ядро использует формат данных protobuf, формат вывода конфигурации для параметра `-dump` будет отличаться.
|
||||
:::
|
||||
|
||||
|
||||
|
|
|
@ -3,5 +3,3 @@
|
|||
> **XTLS - это оригинальная технология Xray, которая является ключевым фактором высокой производительности Xray.**
|
||||
|
||||
<Badge text="WIP" type="warning"/>
|
||||
|
||||
|
||||
|
|
|
@ -55,9 +55,9 @@
|
|||
|
||||
- Целое число: фактический номер порта.
|
||||
- Переменная окружения: начинается с `"env:"`, за которым следует имя переменной окружения, например `"env:PORT"`.
|
||||
Xray будет анализировать эту переменную окружения как строку.
|
||||
Xray будет анализировать эту переменную окружения как строку.
|
||||
- Строка: может быть числом в виде строки, например `"1234"`, или диапазоном портов, например `"5-10"`, что означает порты с 5 по 10 (6 портов).
|
||||
Можно использовать запятые для разделения диапазонов, например `11,13,15-17`, что означает порты 11, 13, 15, 16 и 17 (5 портов).
|
||||
Можно использовать запятые для разделения диапазонов, например `11,13,15-17`, что означает порты 11, 13, 15, 16 и 17 (5 портов).
|
||||
|
||||
Если указан только один порт, Xray будет прослушивать входящие подключения на этом порту.
|
||||
Если указан диапазон портов, то фактическое поведение зависит от настройки `allocate`.
|
||||
|
@ -90,12 +90,12 @@
|
|||
Например, типичный сценарий выглядит следующим образом:
|
||||
|
||||
1. Устройство пытается получить доступ к abc.com.
|
||||
Сначала устройство выполняет DNS-запрос и получает IP-адрес 1.2.3.4 для abc.com.
|
||||
Затем устройство пытается установить соединение с 1.2.3.4.
|
||||
Сначала устройство выполняет DNS-запрос и получает IP-адрес 1.2.3.4 для abc.com.
|
||||
Затем устройство пытается установить соединение с 1.2.3.4.
|
||||
2. Если обнаружение трафика не настроено, Xray получает запрос на подключение к 1.2.3.4 и не может использовать доменные правила для маршрутизации и разделения трафика.
|
||||
3. Если в sniffing включен параметр `enabled`, Xray при обработке трафика этого соединения попытается извлечь доменное имя из данных трафика, т.е. abc.com.
|
||||
4. Xray заменит 1.2.3.4 на abc.com.
|
||||
Маршрутизация сможет использовать доменные правила для разделения трафика.
|
||||
Маршрутизация сможет использовать доменные правила для разделения трафика.
|
||||
|
||||
Так как запрос теперь направляется на abc.com, можно выполнять больше действий, например, повторное разрешение DNS, помимо разделения трафика по доменным правилам.
|
||||
|
||||
|
@ -197,9 +197,9 @@ Xray будет использовать доменные имена, обнар
|
|||
Стратегия выделения портов.
|
||||
|
||||
- `"always"` - всегда выделять все указанные порты.
|
||||
Xray будет прослушивать все порты, указанные в `port`.
|
||||
Xray будет прослушивать все порты, указанные в `port`.
|
||||
- `"random"` - случайным образом открывать порты.
|
||||
Каждые `refresh` минут Xray будет случайным образом выбирать `concurrency` портов из диапазона, указанного в `port`, и прослушивать их.
|
||||
Каждые `refresh` минут Xray будет случайным образом выбирать `concurrency` портов из диапазона, указанного в `port`, и прослушивать их.
|
||||
|
||||
> `refresh`: number
|
||||
|
||||
|
@ -212,8 +212,3 @@ Xray будет использовать доменные имена, обнар
|
|||
Количество случайных портов.
|
||||
Минимальное значение - `1`, максимальное значение - треть от диапазона портов, указанного в `port`.
|
||||
Рекомендуемое значение - `3`.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
**Протокол HTTP не обеспечивает шифрования передачи данных, поэтому он не подходит для передачи данных через общедоступные сети и более уязвим для использования в качестве ботнета.**
|
||||
:::
|
||||
|
||||
Использование входящих соединений `http` более целесообразно в локальной сети или локальной среде, где он может быть использован для прослушивания входящих подключений и предоставления локальных сервисов другим программам.
|
||||
Использование входящих соединений `http` более целесообразно в локальной сети или локальной среде, где он может быть использован для прослушивания входящих подключений и предоставления локальных сервисов другим программам.
|
||||
|
||||
::: tip СОВЕТ 1
|
||||
`http proxy` может проксировать только протокол tcp, протоколы семейства udp не поддерживаются.
|
||||
|
@ -70,5 +70,3 @@
|
|||
> `pass`: string
|
||||
|
||||
Пароль, тип данных: строка. Обязательный параметр.
|
||||
|
||||
|
||||
|
|
|
@ -65,11 +65,11 @@
|
|||
|
||||
Используйте команду `openssl rand -base64 <длина>` для генерации ключа, совместимого с shadowsocks-rust, длина зависит от используемого метода шифрования.
|
||||
|
||||
| Метод шифрования | Длина ключа |
|
||||
| ------------------------------------ | ----------: |
|
||||
| 2022-blake3-aes-128-gcm | 16 |
|
||||
| 2022-blake3-aes-256-gcm | 32 |
|
||||
| 2022-blake3-chacha20-poly1305 | 32 |
|
||||
| Метод шифрования | Длина ключа |
|
||||
| ----------------------------- | ----------: |
|
||||
| 2022-blake3-aes-128-gcm | 16 |
|
||||
| 2022-blake3-aes-256-gcm | 32 |
|
||||
| 2022-blake3-chacha20-poly1305 | 32 |
|
||||
|
||||
В реализации Go всегда работают 32-битные ключи.
|
||||
|
||||
|
@ -106,5 +106,3 @@
|
|||
Обратите внимание, что SS2022, в отличие от старого SS, не игнорирует `"password"` верхнего уровня, правильный способ записи пароля клиента: `ServerPassword:UserPassword`. Например: `"password": "114514:1919810"`
|
||||
|
||||
Остальные опции имеют то же значение, что и в InboundConfigurationObject.
|
||||
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
|
||||
> `auth`: "noauth" | "password"
|
||||
|
||||
Метод аутентификации протокола Socks. Поддерживается анонимный метод `"noauth"` и метод с паролем `"password"`.
|
||||
Метод аутентификации протокола Socks. Поддерживается анонимный метод `"noauth"` и метод с паролем `"password"`.
|
||||
|
||||
При использовании метода `password` для HTTP-запросов, отправляемых на входящее соединение, также потребуется указать те же имя пользователя и пароль.
|
||||
|
||||
|
@ -55,7 +55,6 @@
|
|||
|
||||
**Предупреждение**: если на вашей машине настроено несколько IP-адресов, это может повлиять на работу [inbound](../inbound.md#inboundobject), когда для UDP используется `0.0.0.0`.
|
||||
|
||||
|
||||
> `userLevel`: number
|
||||
|
||||
Уровень пользователя. Подключение будет использовать [локальную политику](../policy.md#levelpolicyobject), соответствующую этому уровню пользователя.
|
||||
|
|
|
@ -68,7 +68,3 @@ Trojan в Xray имеет полную поддержку fallbacks, конфи
|
|||
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
|
||||
|
||||
Значение userLevel соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -103,5 +103,3 @@ VMess полагается на системное время. Убедитес
|
|||
Уровень пользователя, который будет использоваться соединением для определения соответствующей [локальной политики](../policy.md#levelpolicyobject).
|
||||
|
||||
Значение `level` соответствует значению `level` в [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.
|
||||
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
Реализация протокола Wireguard в пользовательском пространстве.
|
||||
|
||||
::: danger
|
||||
**Протокол Wireguard не предназначен для обхода блокировок. Использование его на внешнем уровне может привести к блокировке сервера из-за характерных признаков.**
|
||||
**Протокол Wireguard не предназначен для обхода блокировок. Использование его на внешнем уровне может привести к блокировке сервера из-за характерных признаков.**
|
||||
:::
|
||||
|
||||
## InboundConfigurationObject
|
||||
|
@ -14,7 +14,7 @@
|
|||
"peers": [
|
||||
{
|
||||
"publicKey": "PUBLIC_KEY",
|
||||
"allowedIPs":[""]
|
||||
"allowedIPs": [""]
|
||||
}
|
||||
],
|
||||
"mtu": 1420 // необязательно, по умолчанию 1420
|
||||
|
@ -44,7 +44,8 @@
|
|||
- 16 байт — аутентификационный тег
|
||||
```
|
||||
|
||||
```N байт — зашифрованные данные``` — это и есть значение MTU, которое зависит от того, используется ли IPv4 или IPv6. Значение может быть 1440 (IPv4) или 1420 (IPv6). В особых условиях значение может быть дополнительно уменьшено (например, для PPPoE — минус 8 байт).
|
||||
`N байт — зашифрованные данные` — это и есть значение MTU, которое зависит от того, используется ли IPv4 или IPv6. Значение может быть 1440 (IPv4) или 1420 (IPv6). В особых условиях значение может быть дополнительно уменьшено (например, для PPPoE — минус 8 байт).
|
||||
|
||||
</details>
|
||||
|
||||
> `peers`: \[ [Peers](#peers) \]
|
||||
|
|
|
@ -6,7 +6,7 @@ Xray имеет два типа журналов: журнал доступа и
|
|||
Вы можете настроить способ вывода каждого типа журнала отдельно.
|
||||
|
||||
::: tip
|
||||
Настройки логирования применяются не сразу. Поэтому в процессе запуска вы можете увидеть записи от несконфигурированного логгера. Например, могут появиться сообщения уровня `"info"`, даже если вы установили уровень логирования `"warning"`.
|
||||
Настройки логирования применяются не сразу. Поэтому в процессе запуска вы можете увидеть записи от несконфигурированного логгера. Например, могут появиться сообщения уровня `"info"`, даже если вы установили уровень логирования `"warning"`.
|
||||
:::
|
||||
|
||||
## LogObject
|
||||
|
@ -43,15 +43,15 @@ LogObject соответствует полю `log` в конфигурацио
|
|||
|
||||
> `loglevel`: "debug" | "info" | "warning" | "error" | "none"
|
||||
|
||||
Уровень логирования для журнала ошибок, указывающий, какая информация должна быть записана. Значение по умолчанию — `"warning"`.
|
||||
Обратите внимание, что этот параметр применяется только к журналу ошибок. Он не влияет на журнал доступа (за исключением значения `"none"`). Журнал доступа не имеет уровней логирования.
|
||||
Уровень логирования для журнала ошибок, указывающий, какая информация должна быть записана. Значение по умолчанию — `"warning"`.
|
||||
Обратите внимание, что этот параметр применяется только к журналу ошибок. Он не влияет на журнал доступа (за исключением значения `"none"`). Журнал доступа не имеет уровней логирования.
|
||||
|
||||
- `"debug"`: информация, используемая при отладке программы.
|
||||
Включает всю информацию уровня `"info"`.
|
||||
Включает всю информацию уровня `"info"`.
|
||||
- `"info"`: информация о состоянии во время выполнения и т.д., не влияющая на нормальную работу.
|
||||
Включает всю информацию уровня `"warning"`.
|
||||
Включает всю информацию уровня `"warning"`.
|
||||
- `"warning"`: информация, выводимая при возникновении проблем, не влияющих на нормальную работу, но которые могут повлиять на работу пользователя.
|
||||
Включает всю информацию уровня `"error"`.
|
||||
Включает всю информацию уровня `"error"`.
|
||||
- `"error"`: Xray столкнулся с проблемой, которая не позволяет ему работать нормально, и ее необходимо немедленно решить.
|
||||
- `"none"`: не записывать ничего.
|
||||
|
||||
|
@ -60,12 +60,13 @@ LogObject соответствует полю `log` в конфигурацио
|
|||
Записывать DNS-запросы, сделанные встроенными DNS-клиентами, в журнал доступа. Пример записи в журнале: DOH//doh.server got answer: domain.com -> [ip1, ip2] 2.333ms.
|
||||
|
||||
::: tip
|
||||
|
||||
1. Xray не выполняет все DNS-запросы через свои встроенные клиенты. Поэтому включение этой опции не означает, что все DNS-запросы, выполняемые Xray, будут записаны в журнал.
|
||||
|
||||
2. DNS-запросы, сделанные встроенными DNS-клиентами, также записываются в журнал ошибок (с уровнем "Info") даже если эта опция отключена.
|
||||
|
||||
3. Запросы клиента FakeDNS никогда не записываются в журнал доступа.
|
||||
:::
|
||||
:::
|
||||
|
||||
> `maskAddress`: "quarter" | "half" | "full"
|
||||
|
||||
|
|
|
@ -15,11 +15,11 @@
|
|||
|
||||
> `tag`: string
|
||||
|
||||
Тег исходящего прокси для метрик. Настроив входящее соединение AnyDoor и маршрутизацию AnyDoor на этот исходящий прокси, вы сможете получить доступ к метрикам через AnyDoor.
|
||||
Тег исходящего прокси для метрик. Настроив входящее соединение AnyDoor и маршрутизацию AnyDoor на этот исходящий прокси, вы сможете получить доступ к метрикам через AnyDoor.
|
||||
|
||||
> `listen`: string
|
||||
|
||||
Более простой способ — просто прослушивать указанный адрес и порт для предоставления сервиса.
|
||||
Более простой способ — просто прослушивать указанный адрес и порт для предоставления сервиса.
|
||||
|
||||
Если при установке этого поля `tag` пустой, он автоматически устанавливается в `Metrics`. Если оба поля не заданы, ядро не запустится.
|
||||
|
||||
|
@ -36,8 +36,9 @@
|
|||
Перейдите по адресу `http://127.0.0.1:11111/debug/vars`.
|
||||
|
||||
Содержит следующие переменные:
|
||||
* `stats`: включает все данные о входящих и исходящих соединениях, а также о пользователях.
|
||||
* `observatory`: содержит результаты наблюдений observatory.
|
||||
|
||||
- `stats`: включает все данные о входящих и исходящих соединениях, а также о пользователях.
|
||||
- `observatory`: содержит результаты наблюдений observatory.
|
||||
|
||||
Например, в [luci-app-xray](https://github.com/yichya/luci-app-xray) вы можете получить следующий вывод (стандартное содержимое expvar, такое как cmdline и memstats, опущено):
|
||||
|
||||
|
@ -45,91 +46,92 @@
|
|||
|
||||
```json
|
||||
{
|
||||
"observatory": {
|
||||
"tcp_outbound": {
|
||||
"alive": true,
|
||||
"delay": 782,
|
||||
"outbound_tag": "tcp_outbound",
|
||||
"last_seen_time": 1648477189,
|
||||
"last_try_time": 1648477189
|
||||
},
|
||||
"udp_outbound": {
|
||||
"alive": true,
|
||||
"delay": 779,
|
||||
"outbound_tag": "udp_outbound",
|
||||
"last_seen_time": 1648477191,
|
||||
"last_try_time": 1648477191
|
||||
}
|
||||
"observatory": {
|
||||
"tcp_outbound": {
|
||||
"alive": true,
|
||||
"delay": 782,
|
||||
"outbound_tag": "tcp_outbound",
|
||||
"last_seen_time": 1648477189,
|
||||
"last_try_time": 1648477189
|
||||
},
|
||||
"stats": {
|
||||
"inbound": {
|
||||
"api": {
|
||||
"downlink": 0,
|
||||
"uplink": 0
|
||||
},
|
||||
"dns_server_inbound_5300": {
|
||||
"downlink": 14286,
|
||||
"uplink": 5857
|
||||
},
|
||||
"http_inbound": {
|
||||
"downlink": 74460,
|
||||
"uplink": 10231
|
||||
},
|
||||
"https_inbound": {
|
||||
"downlink": 0,
|
||||
"uplink": 0
|
||||
},
|
||||
"metrics": {
|
||||
"downlink": 6327,
|
||||
"uplink": 1347
|
||||
},
|
||||
"socks_inbound": {
|
||||
"downlink": 19925615,
|
||||
"uplink": 5512
|
||||
},
|
||||
"tproxy_tcp_inbound": {
|
||||
"downlink": 4739161,
|
||||
"uplink": 1568869
|
||||
},
|
||||
"tproxy_udp_inbound": {
|
||||
"downlink": 0,
|
||||
"uplink": 2608142
|
||||
}
|
||||
},
|
||||
"outbound": {
|
||||
"blackhole_outbound": {
|
||||
"downlink": 0,
|
||||
"uplink": 0
|
||||
},
|
||||
"direct": {
|
||||
"downlink": 97714548,
|
||||
"uplink": 3234617
|
||||
},
|
||||
"dns_server_outbound": {
|
||||
"downlink": 7116,
|
||||
"uplink": 2229
|
||||
},
|
||||
"manual_tproxy_outbound_tcp_1": {
|
||||
"downlink": 0,
|
||||
"uplink": 0
|
||||
},
|
||||
"manual_tproxy_outbound_udp_1": {
|
||||
"downlink": 0,
|
||||
"uplink": 0
|
||||
},
|
||||
"tcp_outbound": {
|
||||
"downlink": 23873238,
|
||||
"uplink": 1049595
|
||||
},
|
||||
"udp_outbound": {
|
||||
"downlink": 639282,
|
||||
"uplink": 74634
|
||||
}
|
||||
},
|
||||
"user": {}
|
||||
"udp_outbound": {
|
||||
"alive": true,
|
||||
"delay": 779,
|
||||
"outbound_tag": "udp_outbound",
|
||||
"last_seen_time": 1648477191,
|
||||
"last_try_time": 1648477191
|
||||
}
|
||||
},
|
||||
"stats": {
|
||||
"inbound": {
|
||||
"api": {
|
||||
"downlink": 0,
|
||||
"uplink": 0
|
||||
},
|
||||
"dns_server_inbound_5300": {
|
||||
"downlink": 14286,
|
||||
"uplink": 5857
|
||||
},
|
||||
"http_inbound": {
|
||||
"downlink": 74460,
|
||||
"uplink": 10231
|
||||
},
|
||||
"https_inbound": {
|
||||
"downlink": 0,
|
||||
"uplink": 0
|
||||
},
|
||||
"metrics": {
|
||||
"downlink": 6327,
|
||||
"uplink": 1347
|
||||
},
|
||||
"socks_inbound": {
|
||||
"downlink": 19925615,
|
||||
"uplink": 5512
|
||||
},
|
||||
"tproxy_tcp_inbound": {
|
||||
"downlink": 4739161,
|
||||
"uplink": 1568869
|
||||
},
|
||||
"tproxy_udp_inbound": {
|
||||
"downlink": 0,
|
||||
"uplink": 2608142
|
||||
}
|
||||
},
|
||||
"outbound": {
|
||||
"blackhole_outbound": {
|
||||
"downlink": 0,
|
||||
"uplink": 0
|
||||
},
|
||||
"direct": {
|
||||
"downlink": 97714548,
|
||||
"uplink": 3234617
|
||||
},
|
||||
"dns_server_outbound": {
|
||||
"downlink": 7116,
|
||||
"uplink": 2229
|
||||
},
|
||||
"manual_tproxy_outbound_tcp_1": {
|
||||
"downlink": 0,
|
||||
"uplink": 0
|
||||
},
|
||||
"manual_tproxy_outbound_udp_1": {
|
||||
"downlink": 0,
|
||||
"uplink": 0
|
||||
},
|
||||
"tcp_outbound": {
|
||||
"downlink": 23873238,
|
||||
"uplink": 1049595
|
||||
},
|
||||
"udp_outbound": {
|
||||
"downlink": 639282,
|
||||
"uplink": 74634
|
||||
}
|
||||
},
|
||||
"user": {}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Для лучшей визуализации можно использовать [Netdata](https://github.com/netdata/netdata) (с плагином python.d):
|
||||
|
@ -244,6 +246,7 @@ xray:
|
|||
id: udp
|
||||
expvar_type: int
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Вы получите результат, подобный этому:
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# Мониторинг подключений
|
||||
|
||||
Компонент мониторинга подключений использует HTTP-пинги для проверки состояния подключения исходящих прокси. Результаты мониторинга могут использоваться другими компонентами, например, балансировщиком нагрузки.
|
||||
Компонент мониторинга подключений использует HTTP-пинги для проверки состояния подключения исходящих прокси. Результаты мониторинга могут использоваться другими компонентами, например, балансировщиком нагрузки.
|
||||
В настоящее время доступны два режима: [observatory](#observatoryobject) (фоновый мониторинг подключений) и [burstObservatory](#burstobservatoryobject) (мониторинг параллельных подключений).
|
||||
Выберите один из них в соответствии с вашими потребностями.
|
||||
|
||||
|
@ -8,9 +8,7 @@
|
|||
|
||||
```json
|
||||
{
|
||||
"subjectSelector":[
|
||||
"outbound"
|
||||
],
|
||||
"subjectSelector": ["outbound"],
|
||||
"probeUrl": "https://www.google.com/generate_204",
|
||||
"probeInterval": "10s",
|
||||
"enableConcurrency": false
|
||||
|
@ -41,9 +39,7 @@ URL-адрес, используемый для проверки состоян
|
|||
|
||||
```json
|
||||
{
|
||||
"subjectSelector":[
|
||||
"outbound"
|
||||
],
|
||||
"subjectSelector": ["outbound"],
|
||||
"pingConfig": {}
|
||||
}
|
||||
```
|
||||
|
@ -55,7 +51,6 @@ URL-адрес, используемый для проверки состоян
|
|||
|
||||
> `pingConfig`: [PingConfigObject](#PingConfigObject)
|
||||
|
||||
|
||||
### PingConfigObject
|
||||
|
||||
```json
|
||||
|
@ -92,9 +87,3 @@ URL-адрес, используемый для проверки подключ
|
|||
|
||||
Время ожидания ответа при проверке.
|
||||
Формат такой же, как и у `interval`.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# Исходящие подключения
|
||||
|
||||
Исходящие подключения используются для отправки данных. Доступные протоколы см. в разделе [Исходящие протоколы](./outbounds/).
|
||||
Исходящие подключения используются для отправки данных. Доступные протоколы см. в разделе [Исходящие протоколы](./outbounds/).
|
||||
|
||||
## OutboundObject
|
||||
|
||||
|
@ -41,7 +41,7 @@ Xray будет использовать случайный IP-адрес из
|
|||
|
||||
Специальное значение `origin` — при использовании этого значения запросы будут отправляться с IP-адреса, через который было установлено соединение с локальной машиной.
|
||||
|
||||
Например, если на машине есть целый блок IPv4-адресов `11.4.5.0/24` и прослушивается 0.0.0.0 (все IPv4 и IPv6 адреса на сетевой карте), и клиент подключается к локальной машине через `11.4.5.14`, то исходящие запросы также будут отправляться через `11.4.5.14`. Если же клиент использует `11.4.5.10` для подключения к локальной машине, то исходящие запросы будут отправляться через `11.4.5.10`. То же самое относится и к случаям, когда на машине есть целый блок/несколько IPv6-адресов.
|
||||
Например, если на машине есть целый блок IPv4-адресов `11.4.5.0/24` и прослушивается 0.0.0.0 (все IPv4 и IPv6 адреса на сетевой карте), и клиент подключается к локальной машине через `11.4.5.14`, то исходящие запросы также будут отправляться через `11.4.5.14`. Если же клиент использует `11.4.5.10` для подключения к локальной машине, то исходящие запросы будут отправляться через `11.4.5.10`. То же самое относится и к случаям, когда на машине есть целый блок/несколько IPv6-адресов.
|
||||
|
||||
> `protocol`: string
|
||||
|
||||
|
@ -156,12 +156,5 @@ Mux нужно включать только на клиенте, сервер
|
|||
- По умолчанию `reject` - отклонять трафик (обычно браузеры автоматически переключаются на TCP HTTP/2).
|
||||
- `allow` - разрешить трафик через Mux.
|
||||
- `skip` - не использовать Mux для трафика UDP/443.
|
||||
Будет использоваться исходный способ передачи UDP-трафика для данного протокола прокси.
|
||||
Например, `Shadowsocks` будет использовать нативный UDP, а `VLESS` будет использовать UoT.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Будет использоваться исходный способ передачи UDP-трафика для данного протокола прокси.
|
||||
Например, `Shadowsocks` будет использовать нативный UDP, а `VLESS` будет использовать UoT.
|
||||
|
|
|
@ -16,7 +16,7 @@ Blackhole - это протокол исходящих данных, котор
|
|||
|
||||
Настройка ответа Blackhole.
|
||||
|
||||
Blackhole отправит указанный ответ после получения данных , а затем закроет соединение. Данные для будут отброшены.
|
||||
Blackhole отправит указанный ответ после получения данных , а затем закроет соединение. Данные для будут отброшены.
|
||||
Если этот параметр не указан, Blackhole просто закроет соединение.
|
||||
|
||||
### ResponseObject
|
||||
|
@ -32,7 +32,3 @@ Blackhole отправит указанный ответ после получе
|
|||
Если `type` равен `"none"` (значение по умолчанию), Blackhole просто закроет соединение.
|
||||
|
||||
Если `type` равен `"http"`, Blackhole вернет простой пакет HTTP 403, а затем закроет соединение.
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ Freedom — это исходящий протокол, который можн
|
|||
- При использовании `"AsIs"`, Xray будет напрямую использовать приоритет подключений по умолчанию в Golang. По некоторым причинам, UDP-соединения, использующие доменное имя, игнорируют системные настройки приоритета IPv4.
|
||||
|
||||
- При указании других значений для разрешения будет использоваться [встроенный DNS-сервер](../dns.md) Xray-core. Если `DNSObject` не существует, будет использоваться системный DNS. Если имеется несколько подходящих IP-адресов, ядро случайным образом выберет один из них в качестве целевого IP-адреса.
|
||||
- `"IPv4"` означает попытку установить соединение, используя только IPv4, `"IPv4v6"` означает попытку соединения с использованием IPv4 или IPv6, но для доменов с двойным стеком будет использоваться IPv4. *(Если поменять местами v4 и v6, логика остается аналогичной)*
|
||||
- `"IPv4"` означает попытку установить соединение, используя только IPv4, `"IPv4v6"` означает попытку соединения с использованием IPv4 или IPv6, но для доменов с двойным стеком будет использоваться IPv4. _(Если поменять местами v4 и v6, логика остается аналогичной)_
|
||||
|
||||
- Если в настройках встроенного DNS указан `"queryStrategy"`, фактическое поведение будет объединено с этим параметром, и будут разрешаться только те типы IP, которые указаны в обоих параметрах. Например, `"queryStrategy": "UseIPv4"` и `"domainStrategy": "UseIP"` фактически эквивалентны `"domainStrategy": "UseIPv4"`.
|
||||
- При использовании параметров, начинающихся с `"Use"`, если результат разрешения не соответствует требованиям (например, доменное имя имеет только запись A, но используется `UseIPv6`), будет выполнен откат к `AsIs`.
|
||||
|
@ -76,7 +76,7 @@ Freedom будет принудительно отправлять все дан
|
|||
|
||||
> `noises`: array
|
||||
|
||||
UDP-шум, используемый для отправки случайных данных в качестве "шума" перед установлением UDP-соединения. Наличие этой структуры считается включением. Это может обмануть снифферы, но также может нарушить нормальное соединение. Используйте на свой страх и риск. По этой причине он обходит порт 53, так как это нарушает работу DNS.
|
||||
UDP-шум, используемый для отправки случайных данных в качестве "шума" перед установлением UDP-соединения. Наличие этой структуры считается включением. Это может обмануть снифферы, но также может нарушить нормальное соединение. Используйте на свой страх и риск. По этой причине он обходит порт 53, так как это нарушает работу DNS.
|
||||
|
||||
Массив, в котором можно определить несколько пакетов шума для отправки. Отдельный элемент массива определяется следующим образом:
|
||||
|
||||
|
@ -95,4 +95,4 @@ UDP-шум, используемый для отправки случайных
|
|||
|
||||
Протокол PROXY обычно используется в сочетании с `redirect` для перенаправления на сервер Nginx или другой сервер, на котором включен протокол PROXY. Если сервер не поддерживает протокол PROXY, соединение будет разорвано.
|
||||
|
||||
`proxyProtocol` принимает значение номера версии протокола PROXY — `1` или `2`. Если не указано, по умолчанию используется значение `0` (протокол не используется).
|
||||
`proxyProtocol` принимает значение номера версии протокола PROXY — `1` или `2`. Если не указано, по умолчанию используется значение `0` (протокол не используется).
|
||||
|
|
|
@ -88,6 +88,3 @@ HTTP-заголовки, пара "ключ-значение". Каждый кл
|
|||
> `pass`: string
|
||||
|
||||
Пароль, тип данных: строка. Обязательный параметр.
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ Loopback - это исходящий протокол данных, которы
|
|||
|
||||
Если необходимо, чтобы трафик, уже разделенный по правилам маршрутизации, был перенаправлен другими правилами маршрутизации (например, трафик TCP и UDP, разделенный одними и теми же правилами маршрутизации, должен идти через разные исходящие соединения), можно использовать исходящее соединение `loopback`.
|
||||
|
||||
``` json
|
||||
```json
|
||||
{
|
||||
"outbounds": [
|
||||
{
|
||||
|
@ -31,11 +31,11 @@ Loopback - это исходящий протокол данных, которы
|
|||
}
|
||||
},
|
||||
{
|
||||
"tag": "tcp-output",
|
||||
"tag": "tcp-output"
|
||||
// Настройки protocol, settings, streamSettings и т. д.
|
||||
},
|
||||
{
|
||||
"tag": "udp-output",
|
||||
"tag": "udp-output"
|
||||
// Настройки protocol, settings, streamSettings и т. д.
|
||||
}
|
||||
],
|
||||
|
@ -55,5 +55,3 @@ Loopback - это исходящий протокол данных, которы
|
|||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
|
|
@ -101,11 +101,11 @@
|
|||
|
||||
Используйте `openssl rand -base64 <длина>`, чтобы сгенерировать ключ, совместимый с shadowsocks-rust, длина зависит от используемого метода шифрования.
|
||||
|
||||
| Метод шифрования | Длина ключа |
|
||||
| ------------------------------------ | ----------: |
|
||||
| 2022-blake3-aes-128-gcm | 16 |
|
||||
| 2022-blake3-aes-256-gcm | 32 |
|
||||
| 2022-blake3-chacha20-poly1305 | 32 |
|
||||
| Метод шифрования | Длина ключа |
|
||||
| ----------------------------- | ----------: |
|
||||
| 2022-blake3-aes-128-gcm | 16 |
|
||||
| 2022-blake3-aes-256-gcm | 32 |
|
||||
| 2022-blake3-chacha20-poly1305 | 32 |
|
||||
|
||||
В реализации Go всегда работают 32-битные ключи.
|
||||
|
||||
|
@ -118,6 +118,3 @@
|
|||
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
|
||||
|
||||
Значение `level` соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -89,6 +89,3 @@
|
|||
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
|
||||
|
||||
Значение userLevel соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
Trojan предназначен для работы в правильно настроенном зашифрованном TLS-туннеле.
|
||||
:::
|
||||
|
||||
|
||||
## OutboundConfigurationObject
|
||||
|
||||
```json
|
||||
|
@ -60,8 +59,3 @@ Trojan предназначен для работы в правильно нас
|
|||
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
|
||||
|
||||
Значение level соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -8,7 +8,6 @@ VLESS - это легкий транспортный протокол без с
|
|||
|
||||
В отличие от [VMess](./vmess.md), VLESS не зависит от системного времени, аутентификация также осуществляется с помощью UUID.
|
||||
|
||||
|
||||
## OutboundConfigurationObject
|
||||
|
||||
```json
|
||||
|
@ -135,5 +134,3 @@ Splice - это функция, предоставляемая ядром Linux,
|
|||
Уровень пользователя, для соединения будет использоваться [локальная политика](../policy.md#levelpolicyobject), соответствующая этому уровню пользователя.
|
||||
|
||||
Значение level соответствует значению `level` в разделе [policy](../policy.md#policyobject). Если не указано, используется значение по умолчанию - 0.
|
||||
|
||||
|
||||
|
|
|
@ -118,7 +118,3 @@ VMess полагается на системное время. Убедитес
|
|||
"AuthenticatedLength" включает эксперимент с аутентифицированной длиной пакета. Этот эксперимент необходимо включить одновременно на клиенте и сервере, а также запустить одну и ту же версию программы.
|
||||
|
||||
"NoTerminationSignal" включает эксперимент с отключением сигнала завершения соединения. Этот эксперимент может повлиять на стабильность проксируемого соединения.
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -72,7 +72,8 @@ MTU нижнего уровня tun в Wireguard.
|
|||
- 16 байт — аутентификационный тег
|
||||
```
|
||||
|
||||
```N байт — зашифрованные данные``` — это значение MTU. Для IPv4 оно равно 1440, для IPv6 — 1420. В особых условиях значение может быть уменьшено (например, для PPPoE — минус 8 байт).
|
||||
`N байт — зашифрованные данные` — это значение MTU. Для IPv4 оно равно 1440, для IPv6 — 1420. В особых условиях значение может быть уменьшено (например, для PPPoE — минус 8 байт).
|
||||
|
||||
</details>
|
||||
|
||||
> `reserved` \[ number \]
|
||||
|
|
|
@ -143,7 +143,3 @@ Xray будет применять различные локальные пол
|
|||
> `statsOutboundDownlink`: true | false
|
||||
|
||||
Если значение равно `true`, включить учет входящего трафика для всех исходящих подключений.
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -6,18 +6,21 @@
|
|||
|
||||
Принцип работы обратного прокси примерно следующий:
|
||||
|
||||
- Предположим, на хосте A находится веб-сервер, у которого нет публичного IP-адреса и к которому нельзя получить прямой доступ из Интернета. Есть другой хост B с публичным IP-адресом. Нам нужно использовать B в качестве точки входа, перенаправляя трафик с B на A.
|
||||
- На хосте B настраивается Xray для приема внешних запросов, поэтому он называется `portal` (портал).
|
||||
- На хосте A настраивается Xray, который отвечает за соединение переадресации от B с веб-сервером. Он называется `bridge` (мост).
|
||||
- Предположим, на хосте A находится веб-сервер, у которого нет публичного IP-адреса и к которому нельзя получить прямой доступ из Интернета. Есть другой хост B с публичным IP-адресом. Нам нужно использовать B в качестве точки входа, перенаправляя трафик с B на A.
|
||||
|
||||
- На хосте B настраивается Xray для приема внешних запросов, поэтому он называется `portal` (портал).
|
||||
- На хосте A настраивается Xray, который отвечает за соединение переадресации от B с веб-сервером. Он называется `bridge` (мост).
|
||||
|
||||
- `bridge`
|
||||
- `bridge` активно устанавливает соединение с `portal` для регистрации обратного канала. Целевой адрес (домен) этого соединения можно задать самостоятельно.
|
||||
- После получения трафика из Интернета, перенаправленного `portal`, `bridge` пересылает его без изменений на веб-сервер на хосте A. Конечно, для этого требуется настройка модуля маршрутизации.
|
||||
- После получения ответа `bridge` также возвращает его без изменений `portal`.
|
||||
|
||||
- `bridge` активно устанавливает соединение с `portal` для регистрации обратного канала. Целевой адрес (домен) этого соединения можно задать самостоятельно.
|
||||
- После получения трафика из Интернета, перенаправленного `portal`, `bridge` пересылает его без изменений на веб-сервер на хосте A. Конечно, для этого требуется настройка модуля маршрутизации.
|
||||
- После получения ответа `bridge` также возвращает его без изменений `portal`.
|
||||
|
||||
- `portal`
|
||||
- Если `portal` получает запрос, и домен совпадает, это означает, что данные ответа пришли от `bridge`. Это соединение будет использовано для установления обратного канала.
|
||||
- Если `portal` получает запрос, и домен не совпадает, это означает, что соединение установлено пользователем из Интернета. Данные этого соединения будут перенаправлены на `bridge`.
|
||||
|
||||
- Если `portal` получает запрос, и домен совпадает, это означает, что данные ответа пришли от `bridge`. Это соединение будет использовано для установления обратного канала.
|
||||
- Если `portal` получает запрос, и домен не совпадает, это означает, что соединение установлено пользователем из Интернета. Данные этого соединения будут перенаправлены на `bridge`.
|
||||
|
||||
- `bridge` выполняет динамическую балансировку нагрузки в зависимости от объема трафика.
|
||||
|
||||
|
@ -39,16 +42,16 @@
|
|||
"bridges": [
|
||||
{
|
||||
"tag": "bridge",
|
||||
"domain": "reverse-proxy.xray.internal"
|
||||
}
|
||||
"domain": "reverse-proxy.xray.internal",
|
||||
},
|
||||
],
|
||||
"portals": [
|
||||
{
|
||||
"tag": "portal",
|
||||
"domain": "reverse-proxy.xray.internal"
|
||||
}
|
||||
]
|
||||
}
|
||||
"domain": "reverse-proxy.xray.internal",
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -65,7 +68,7 @@
|
|||
```jsonc
|
||||
{
|
||||
"tag": "bridge",
|
||||
"domain": "reverse-proxy.xray.internal"
|
||||
"domain": "reverse-proxy.xray.internal",
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -83,7 +86,7 @@
|
|||
```jsonc
|
||||
{
|
||||
"tag": "portal",
|
||||
"domain": "reverse-proxy.xray.internal"
|
||||
"domain": "reverse-proxy.xray.internal",
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -93,8 +96,7 @@
|
|||
|
||||
> `domain`: string
|
||||
|
||||
Домен. Когда `portal` получает трафик, если целевой домен трафика совпадает с этим доменом, `portal` считает, что текущее соединение является соединением связи, установленным `bridge`. Другой трафик будет рассматриваться как трафик, требующий пересылки. `portal` занимается идентификацией этих двух типов соединений и выполняет соответствующую пересылку.
|
||||
|
||||
Домен. Когда `portal` получает трафик, если целевой домен трафика совпадает с этим доменом, `portal` считает, что текущее соединение является соединением связи, установленным `bridge`. Другой трафик будет рассматриваться как трафик, требующий пересылки. `portal` занимается идентификацией этих двух типов соединений и выполняет соответствующую пересылку.
|
||||
|
||||
::: tip
|
||||
Один Xray может быть `bridge`, `portal` или одновременно и тем, и другим, чтобы соответствовать требованиям различных сценариев.
|
||||
|
@ -108,7 +110,7 @@
|
|||
|
||||
### Конфигурация bridge
|
||||
|
||||
`bridge` обычно требует двух исходящих соединений (outbound): одно для подключения к `portal`, другое для отправки фактического трафика. Другими словами, вам нужно использовать маршрутизацию для различения двух типов трафика.
|
||||
`bridge` обычно требует двух исходящих соединений (outbound): одно для подключения к `portal`, другое для отправки фактического трафика. Другими словами, вам нужно использовать маршрутизацию для различения двух типов трафика.
|
||||
|
||||
Конфигурация обратного прокси:
|
||||
|
||||
|
@ -131,8 +133,8 @@ outbound:
|
|||
"tag": "out",
|
||||
"protocol": "freedom",
|
||||
"settings": {
|
||||
"redirect": "127.0.0.1:80"
|
||||
}
|
||||
"redirect": "127.0.0.1:80",
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -147,13 +149,13 @@ outbound:
|
|||
"port": 1024,
|
||||
"users": [
|
||||
{
|
||||
"id": "5783a3e7-e373-51cd-8642-c83782b807c5"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
"tag": "interconn"
|
||||
"tag": "interconn",
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -169,22 +171,22 @@ outbound:
|
|||
"type": "field",
|
||||
"inboundTag": ["bridge"],
|
||||
"domain": ["full:reverse-proxy.xray.internal"],
|
||||
"outboundTag": "interconn"
|
||||
"outboundTag": "interconn",
|
||||
},
|
||||
{
|
||||
// Трафик от portal также будет выходить из bridge, но без указанного выше домена
|
||||
// маршрутизируем на out, то есть перенаправляем на веб-сервер
|
||||
"type": "field",
|
||||
"inboundTag": ["bridge"],
|
||||
"outboundTag": "out"
|
||||
}
|
||||
]
|
||||
"outboundTag": "out",
|
||||
},
|
||||
],
|
||||
}
|
||||
```
|
||||
|
||||
### Конфигурация portal
|
||||
|
||||
`portal` обычно требует двух входящих соединений (inbound): одно для приема соединений от `bridge`, другое для приема фактического трафика. Вам также нужно использовать маршрутизацию для различения двух типов трафика.
|
||||
`portal` обычно требует двух входящих соединений (inbound): одно для приема соединений от `bridge`, другое для приема фактического трафика. Вам также нужно использовать маршрутизацию для различения двух типов трафика.
|
||||
|
||||
Конфигурация обратного прокси:
|
||||
|
||||
|
@ -210,8 +212,8 @@ inbound:
|
|||
"settings": {
|
||||
"address": "127.0.0.1",
|
||||
"port": 80,
|
||||
"network": "tcp"
|
||||
}
|
||||
"network": "tcp",
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -224,10 +226,10 @@ inbound:
|
|||
"settings": {
|
||||
"clients": [
|
||||
{
|
||||
"id": "5783a3e7-e373-51cd-8642-c83782b807c5"
|
||||
}
|
||||
]
|
||||
}
|
||||
"id": "5783a3e7-e373-51cd-8642-c83782b807c5",
|
||||
},
|
||||
],
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -241,7 +243,7 @@ inbound:
|
|||
// маршрутизируем на portal, который в конечном итоге перенаправит его на bridge
|
||||
"type": "field",
|
||||
"inboundTag": ["external"],
|
||||
"outboundTag": "portal"
|
||||
"outboundTag": "portal",
|
||||
},
|
||||
{
|
||||
// Если входящее соединение от interconn, значит, это запрос от bridge для установления обратного туннеля,
|
||||
|
@ -250,8 +252,8 @@ inbound:
|
|||
// маршрутизируемых на portal.
|
||||
"type": "field",
|
||||
"inboundTag": ["interconn"],
|
||||
"outboundTag": "portal"
|
||||
}
|
||||
]
|
||||
"outboundTag": "portal",
|
||||
},
|
||||
],
|
||||
}
|
||||
```
|
||||
|
|
|
@ -27,8 +27,8 @@
|
|||
|
||||
- `"AsIs"`: для выбора маршрута используются только доменные имена. Значение по умолчанию.
|
||||
- `"IPIfNonMatch"`: если доменное имя не соответствует ни одному правилу, доменное имя разрешается в IP-адрес (запись A или запись AAAA) для повторного сопоставления;
|
||||
- Если у доменного имени несколько записей A, предпринимается попытка сопоставить все записи A, пока одна из них не будет соответствовать какому-либо правилу;
|
||||
- Разрешенный IP-адрес используется только при выборе маршрута, в пересылаемых пакетах данных по-прежнему используется исходное доменное имя;
|
||||
- Если у доменного имени несколько записей A, предпринимается попытка сопоставить все записи A, пока одна из них не будет соответствовать какому-либо правилу;
|
||||
- Разрешенный IP-адрес используется только при выборе маршрута, в пересылаемых пакетах данных по-прежнему используется исходное доменное имя;
|
||||
- `"IPOnDemand"`: если при сопоставлении встречается любое правило на основе IP-адреса, доменное имя немедленно разрешается в IP-адрес для сопоставления;
|
||||
|
||||
> `domainMatcher`: "hybrid" | "linear"
|
||||
|
@ -117,8 +117,8 @@
|
|||
- IP-адрес: например, `"127.0.0.1"`.
|
||||
- [CIDR](https://ru.wikipedia.org/wiki/Бесклассовая_междоменная_маршрутизация): например, `"10.0.0.0/8"`, также можно использовать `"0.0.0.0/0"` `"::/0"` для указания всех IPv4- или IPv6-адресов.
|
||||
- Предопределенный список IP-адресов: этот список встроен в каждый установочный пакет Xray, имя файла - `geoip.dat`. Формат использования: `"geoip:код_страны"`, должно начинаться с `geoip:` (в нижнем регистре), за которым следует двухбуквенный код страны, поддерживаются почти все страны с доступом в Интернет.
|
||||
- Специальное значение: `"geoip:private"`, включает в себя все частные адреса, например, `127.0.0.1`.
|
||||
- Функция инверсии (!), `"geoip:!cn"` означает результаты, не входящие в `geoip:cn`.
|
||||
- Специальное значение: `"geoip:private"`, включает в себя все частные адреса, например, `127.0.0.1`.
|
||||
- Функция инверсии (!), `"geoip:!cn"` означает результаты, не входящие в `geoip:cn`.
|
||||
- Загрузка IP-адресов из файла: имеет вид `"ext:файл:тег"`, должно начинаться с `ext:` (в нижнем регистре), за которым следует имя файла и тег, файл хранится в [каталоге ресурсов](./features/env.md#путь-к-файлу-ресурсов), формат файла такой же, как у `geoip.dat`, тег должен существовать в файле.
|
||||
|
||||
> `port`: number | string
|
||||
|
@ -234,12 +234,14 @@ JSON-объект, где ключи и значения являются стр
|
|||
> `strategy`: [StrategyObject](#strategyobject)
|
||||
|
||||
#### StrategyObject
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "roundRobin",
|
||||
"settings": {}
|
||||
"type": "roundRobin",
|
||||
"settings": {}
|
||||
}
|
||||
```
|
||||
|
||||
> `type` : "random" | "roundRobin" | "leastPing" | "leastLoad"
|
||||
|
||||
- `random`: значение по умолчанию. Случайным образом выбирает соответствующий исходящий прокси.
|
||||
|
@ -250,19 +252,22 @@ JSON-объект, где ключи и значения являются стр
|
|||
> `settings`: [StrategySettingsObject](#strategysettingsobject)
|
||||
|
||||
##### StrategySettingsObject
|
||||
|
||||
Это необязательный параметр конфигурации, формат которого различается для разных стратегий балансировки нагрузки. В настоящее время этот параметр конфигурации можно добавить только для стратегии балансировки нагрузки `leastLoad`.
|
||||
|
||||
```json
|
||||
{
|
||||
"expected": 2,
|
||||
"maxRTT": "1s",
|
||||
"tolerance": 0.01,
|
||||
"baselines": ["1s"],
|
||||
"costs": [{
|
||||
"regexp": false,
|
||||
"match": "tag",
|
||||
"value": 0.5
|
||||
}]
|
||||
"expected": 2,
|
||||
"maxRTT": "1s",
|
||||
"tolerance": 0.01,
|
||||
"baselines": ["1s"],
|
||||
"costs": [
|
||||
{
|
||||
"regexp": false,
|
||||
"match": "tag",
|
||||
"value": 0.5
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
|
|
|
@ -53,4 +53,4 @@
|
|||
|
||||
- `outbound>>>[tag]>>>traffic>>>downlink`
|
||||
|
||||
Входящий трафик для определенного исходящего подключения в байтах.
|
||||
Входящий трафик для определенного исходящего подключения в байтах.
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue