mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-07-01 12:32:09 +00:00
Merge branch 'main' into main
This commit is contained in:
commit
bacbcc61a4
38 changed files with 413 additions and 241 deletions
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
|
@ -97,7 +97,7 @@ jobs:
|
|||
cd x-ui/bin
|
||||
|
||||
# Download dependencies
|
||||
Xray_URL="https://github.com/XTLS/Xray-core/releases/download/v25.5.16/"
|
||||
Xray_URL="https://github.com/XTLS/Xray-core/releases/download/v25.6.8/"
|
||||
if [ "${{ matrix.platform }}" == "amd64" ]; then
|
||||
wget -q ${Xray_URL}Xray-linux-64.zip
|
||||
unzip Xray-linux-64.zip
|
||||
|
|
|
@ -3,11 +3,11 @@ set -euo pipefail
|
|||
IFS=$'\n\t'
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# DockerInit.sh — download and prepare Xray binaries and geolocation databases
|
||||
# DockerInit.sh <EFBFBD> download and prepare Xray binaries and geolocation databases
|
||||
# ------------------------------------------------------------------------------
|
||||
|
||||
# Xray version
|
||||
readonly XRAY_VERSION="v25.5.16"
|
||||
readonly XRAY_VERSION="v25.6.8"
|
||||
|
||||
# URL template for downloading Xray
|
||||
readonly XRAY_URL_TEMPLATE="https://github.com/XTLS/Xray-core/releases/download/${XRAY_VERSION}/Xray-linux-%s.zip"
|
||||
|
@ -152,4 +152,4 @@ if [[ "${1-}" == "-h" || "${1-}" == "--help" ]]; then
|
|||
fi
|
||||
|
||||
# Run main with the provided argument (if any)
|
||||
main "${1-}"
|
||||
main "${1-}"
|
|
@ -23,7 +23,7 @@
|
|||
## البدء السريع
|
||||
|
||||
```
|
||||
$ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
||||
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
||||
```
|
||||
|
||||
للحصول على الوثائق الكاملة، يرجى زيارة [ويكي المشروع](https://github.com/MHSanaei/3x-ui/wiki).
|
||||
|
@ -53,4 +53,4 @@ $ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/instal
|
|||
|
||||
## النجوم عبر الزمن
|
||||
|
||||
[](https://starchart.cc/MHSanaei/3x-ui)
|
||||
[](https://starchart.cc/MHSanaei/3x-ui)
|
||||
|
|
|
@ -23,7 +23,7 @@ Como una versión mejorada del proyecto X-UI original, 3X-UI proporciona mayor e
|
|||
## Inicio Rápido
|
||||
|
||||
```
|
||||
$ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
||||
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
||||
```
|
||||
|
||||
Para documentación completa, visita la [Wiki del proyecto](https://github.com/MHSanaei/3x-ui/wiki).
|
||||
|
@ -53,4 +53,4 @@ Para documentación completa, visita la [Wiki del proyecto](https://github.com/M
|
|||
|
||||
## Estrellas a lo Largo del Tiempo
|
||||
|
||||
[](https://starchart.cc/MHSanaei/3x-ui)
|
||||
[](https://starchart.cc/MHSanaei/3x-ui)
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
## شروع سریع
|
||||
|
||||
```
|
||||
$ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
||||
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
||||
```
|
||||
|
||||
برای مستندات کامل، لطفاً به [ویکی پروژه](https://github.com/MHSanaei/3x-ui/wiki) مراجعه کنید.
|
||||
|
@ -53,4 +53,4 @@ $ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/instal
|
|||
|
||||
## ستارهها در طول زمان
|
||||
|
||||
[](https://starchart.cc/MHSanaei/3x-ui)
|
||||
[](https://starchart.cc/MHSanaei/3x-ui)
|
||||
|
|
|
@ -23,7 +23,7 @@ As an enhanced fork of the original X-UI project, 3X-UI provides improved stabil
|
|||
## Quick Start
|
||||
|
||||
```bash
|
||||
$ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
||||
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
||||
```
|
||||
|
||||
For full documentation, please visit the [project Wiki](https://github.com/MHSanaei/3x-ui/wiki).
|
||||
|
@ -53,4 +53,4 @@ For full documentation, please visit the [project Wiki](https://github.com/MHSan
|
|||
|
||||
## Stargazers over Time
|
||||
|
||||
[](https://starchart.cc/MHSanaei/3x-ui)
|
||||
[](https://starchart.cc/MHSanaei/3x-ui)
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
## Быстрый старт
|
||||
|
||||
```
|
||||
$ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
||||
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
||||
```
|
||||
|
||||
Полную документацию смотрите в [вики проекта](https://github.com/MHSanaei/3x-ui/wiki).
|
||||
|
@ -53,4 +53,4 @@ $ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/instal
|
|||
|
||||
## Звезды с течением времени
|
||||
|
||||
[](https://starchart.cc/MHSanaei/3x-ui)
|
||||
[](https://starchart.cc/MHSanaei/3x-ui)
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
## 快速开始
|
||||
|
||||
```
|
||||
$ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
||||
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
|
||||
```
|
||||
|
||||
完整文档请参阅 [项目Wiki](https://github.com/MHSanaei/3x-ui/wiki)。
|
||||
|
@ -53,4 +53,4 @@ $ bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/instal
|
|||
|
||||
## 随时间变化的星标数
|
||||
|
||||
[](https://starchart.cc/MHSanaei/3x-ui)
|
||||
[](https://starchart.cc/MHSanaei/3x-ui)
|
||||
|
|
|
@ -1,8 +1,10 @@
|
|||
services:
|
||||
3x-ui:
|
||||
image: ghcr.io/mhsanaei/3x-ui:latest
|
||||
container_name: 3x-ui
|
||||
hostname: yourhostname
|
||||
3xui:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: ./Dockerfile
|
||||
container_name: 3xui_app
|
||||
# hostname: yourhostname <- optional
|
||||
volumes:
|
||||
- $PWD/db/:/etc/x-ui/
|
||||
- $PWD/cert/:/root/cert/
|
||||
|
|
|
@ -57,7 +57,7 @@ install_base() {
|
|||
ubuntu | debian | armbian)
|
||||
apt-get update && apt-get install -y -q wget curl tar tzdata
|
||||
;;
|
||||
centos | almalinux | rocky | ol)
|
||||
centos | rhel | almalinux | rocky | ol)
|
||||
yum -y update && yum install -y -q wget curl tar tzdata
|
||||
;;
|
||||
fedora | amzn | virtuozzo)
|
||||
|
|
|
@ -5,6 +5,7 @@ import (
|
|||
"net"
|
||||
"strings"
|
||||
"time"
|
||||
"math"
|
||||
|
||||
"x-ui/util/common"
|
||||
)
|
||||
|
@ -78,11 +79,11 @@ func (s *AllSetting) CheckValid() error {
|
|||
}
|
||||
}
|
||||
|
||||
if s.WebPort <= 0 || s.WebPort > 65535 {
|
||||
if s.WebPort <= 0 || s.WebPort > math.MaxUint16 {
|
||||
return common.NewError("web port is not a valid port:", s.WebPort)
|
||||
}
|
||||
|
||||
if s.SubPort <= 0 || s.SubPort > 65535 {
|
||||
if s.SubPort <= 0 || s.SubPort > math.MaxUint16 {
|
||||
return common.NewError("Sub port is not a valid port:", s.SubPort)
|
||||
}
|
||||
|
||||
|
|
|
@ -299,6 +299,12 @@
|
|||
min-height: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 1024px) {
|
||||
.title {
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
}
|
||||
|
||||
.words-wrapper {
|
||||
width: 100%;
|
||||
|
@ -617,4 +623,4 @@
|
|||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
|
110
web/html/modals/dns_presets_modal.html
Normal file
110
web/html/modals/dns_presets_modal.html
Normal file
|
@ -0,0 +1,110 @@
|
|||
{{define "modals/dnsPresetsModal"}}
|
||||
<a-modal id="dnsPresets-modal" v-model="dnsPresetsModal.visible" :title="dnsPresetsModal.title" :closable="true"
|
||||
:mask-closable="false" :footer="null" :class="themeSwitcher.currentTheme">
|
||||
<a-list class="ant-dns-presets-list" bordered :style="{ width: '100%' }">
|
||||
<a-list-item v-for="dns in dnsPresetsDatabase" :style="{ padding: '12px 16px' }">
|
||||
<a-row justify="space-between" align="middle">
|
||||
<a-col :span="12">
|
||||
<a-space direction="vertical" size="small">
|
||||
<span class="ant-dns-presets-list-name">[[ dns.name ]]</span>
|
||||
<a-tag :color="dns.family ? 'purple' : 'green'">[[ dns.family ? '{{ i18n "pages.xray.dns.dnsPresetFamily" }}' : 'DNS' ]]</a-tag>
|
||||
</a-space>
|
||||
</a-col>
|
||||
<a-col :span="12" :style="{ textAlign: 'right' }">
|
||||
<a-button type="primary" @click="dnsPresetsModal.install(dns.data)">{{ i18n "install" }}</a-button>
|
||||
</a-col>
|
||||
</a-row>
|
||||
</a-list-item>
|
||||
</a-list>
|
||||
</a-modal>
|
||||
|
||||
<style>
|
||||
.dark .ant-dns-presets-list {
|
||||
border-color: var(--dark-color-stroke)
|
||||
}
|
||||
|
||||
.dark .ant-dns-presets-list-name {
|
||||
color: var(--dark-color-text-primary);
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
const dnsPresetsDatabase = [
|
||||
{
|
||||
name: 'Google DNS',
|
||||
family: false,
|
||||
data: [
|
||||
"8.8.8.8",
|
||||
"8.8.4.4",
|
||||
"2001:4860:4860::8888",
|
||||
"2001:4860:4860::8844"
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'Cloudflare DNS',
|
||||
family: false,
|
||||
data: [
|
||||
"1.1.1.1",
|
||||
"1.0.0.1",
|
||||
"2606:4700:4700::1111",
|
||||
"2606:4700:4700::1001"
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'Adguard DNS',
|
||||
family: false,
|
||||
data: [
|
||||
"94.140.14.14",
|
||||
"94.140.15.15",
|
||||
"2a10:50c0::ad1:ff",
|
||||
"2a10:50c0::ad2:ff"
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'Adguard Family DNS',
|
||||
family: true,
|
||||
data: [
|
||||
"94.140.14.14",
|
||||
"94.140.15.15",
|
||||
"2a10:50c0::ad1:ff",
|
||||
"2a10:50c0::ad2:ff"
|
||||
]
|
||||
},
|
||||
{
|
||||
name: 'Cloudflare Family DNS',
|
||||
family: true,
|
||||
data: [
|
||||
"1.1.1.3",
|
||||
"1.0.0.3",
|
||||
"2606:4700:4700::1113",
|
||||
"2606:4700:4700::1003"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
const dnsPresetsModal = {
|
||||
title: '',
|
||||
visible: false,
|
||||
selected: null,
|
||||
install(selectedPreset) {
|
||||
return ObjectUtil.execute(dnsPresetsModal.selected, selectedPreset);
|
||||
},
|
||||
show({ title = '', selected = (selectedPreset) => { }, isEdit = false }) {
|
||||
this.title = title;
|
||||
this.selected = selected;
|
||||
this.visible = true;
|
||||
},
|
||||
close() {
|
||||
dnsPresetsModal.visible = false;
|
||||
},
|
||||
};
|
||||
|
||||
new Vue({
|
||||
delimiters: ['[[', ']]'],
|
||||
el: '#dnsPresets-modal',
|
||||
data: {
|
||||
dnsPresetsModal: dnsPresetsModal,
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{{end}}
|
|
@ -1,57 +0,0 @@
|
|||
{{define "modals/fakednsModal"}}
|
||||
<a-modal id="fakedns-modal" v-model="fakednsModal.visible" :title="fakednsModal.title" @ok="fakednsModal.ok"
|
||||
:closable="true" :mask-closable="false"
|
||||
:ok-text="fakednsModal.okText" cancel-text='{{ i18n "close" }}' :class="themeSwitcher.currentTheme">
|
||||
<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }">
|
||||
<a-form-item label='{{ i18n "pages.xray.fakedns.ipPool" }}'>
|
||||
<a-input v-model.trim="fakednsModal.fakeDns.ipPool"></a-input>
|
||||
</a-form-item>
|
||||
<a-form-item label='{{ i18n "pages.xray.fakedns.poolSize" }}'>
|
||||
<a-input-number v-model.number="fakednsModal.fakeDns.poolSize" :min="1"></a-input-number>
|
||||
</a-form-item>
|
||||
</a-form>
|
||||
</a-modal>
|
||||
<script>
|
||||
const fakednsModal = {
|
||||
title: '',
|
||||
visible: false,
|
||||
okText: '{{ i18n "confirm" }}',
|
||||
isEdit: false,
|
||||
confirm: null,
|
||||
fakeDns: {
|
||||
ipPool: "198.18.0.0/16",
|
||||
poolSize: 65535,
|
||||
},
|
||||
ok() {
|
||||
ObjectUtil.execute(fakednsModal.confirm, fakednsModal.fakeDns);
|
||||
},
|
||||
show({ title='', okText='{{ i18n "confirm" }}', fakeDns, confirm=(fakeDns)=>{}, isEdit=false }) {
|
||||
this.title = title;
|
||||
this.okText = okText;
|
||||
this.confirm = confirm;
|
||||
this.visible = true;
|
||||
if(isEdit) {
|
||||
this.fakeDns = fakeDns;
|
||||
} else {
|
||||
this.fakeDns = {
|
||||
ipPool: "198.18.0.0/16",
|
||||
poolSize: 65535,
|
||||
}
|
||||
}
|
||||
this.isEdit = isEdit;
|
||||
},
|
||||
close() {
|
||||
fakednsModal.visible = false;
|
||||
},
|
||||
};
|
||||
|
||||
new Vue({
|
||||
delimiters: ['[[', ']]'],
|
||||
el: '#fakedns-modal',
|
||||
data: {
|
||||
fakednsModal: fakednsModal,
|
||||
}
|
||||
});
|
||||
|
||||
</script>
|
||||
{{end}}
|
|
@ -433,6 +433,9 @@
|
|||
<a-tooltip title='{{ i18n "copy" }}'>
|
||||
<a-button :style="{ minWidth: '24px' }" size="small" icon="snippets" @click="copy(infoModal.links[index])"></a-button>
|
||||
</a-tooltip>
|
||||
<a-tooltip title='{{ i18n "download" }}'>
|
||||
<a-button :style="{ minWidth: '24px' }" size="small" icon="download" @click="FileManager.downloadTextFile(infoModal.links[index], `peer-${index + 1}.conf`)"></a-button>
|
||||
</a-tooltip>
|
||||
</tr-info-title>
|
||||
<div v-html="infoModal.links[index].replaceAll(`\n`,`<br />`)" :style="{ borderRadius: '1rem', padding: '0.5rem' }" class="client-table-odd-row">
|
||||
</div>
|
||||
|
|
|
@ -6,6 +6,16 @@
|
|||
<a-form-item label='{{ i18n "pages.xray.outbound.address" }}'>
|
||||
<a-input v-model.trim="dnsModal.dnsServer.address"></a-input>
|
||||
</a-form-item>
|
||||
<a-form-item label='{{ i18n "pages.inbounds.port" }}'>
|
||||
<a-input-number v-model.number="dnsModal.dnsServer.port" :min="1" :max="65531"></a-input-number>
|
||||
</a-form-item>
|
||||
<a-form-item label='{{ i18n "pages.xray.dns.strategy" }}'>
|
||||
<a-select v-model="dnsModal.dnsServer.queryStrategy" :style="{ width: '100%' }"
|
||||
:dropdown-class-name="themeSwitcher.currentTheme">
|
||||
<a-select-option :value="l" :label="l" v-for="l in ['UseSystem', 'UseIP', 'UseIPv4', 'UseIPv6']"> [[ l ]] </a-select-option>
|
||||
</a-select>
|
||||
</a-form-item>
|
||||
<a-divider :style="{ margin: '5px 0' }"></a-divider>
|
||||
<a-form-item label='{{ i18n "pages.xray.dns.domains" }}'>
|
||||
<a-button icon="plus" size="small" type="primary" @click="dnsModal.dnsServer.domains.push('')"></a-button>
|
||||
<template v-for="(domain, index) in dnsModal.dnsServer.domains">
|
||||
|
@ -15,15 +25,6 @@
|
|||
</a-input>
|
||||
</template>
|
||||
</a-form-item>
|
||||
<a-form-item label='{{ i18n "pages.xray.dns.strategy" }}' v-if="isAdvanced">
|
||||
<a-select v-model="dnsModal.dnsServer.queryStrategy" :style="{ width: '100%' }"
|
||||
:dropdown-class-name="themeSwitcher.currentTheme">
|
||||
<a-select-option :value="l" :label="l" v-for="l in ['UseIP', 'UseIPv4', 'UseIPv6']"> [[ l ]] </a-select-option>
|
||||
</a-select>
|
||||
</a-form-item>
|
||||
<a-form-item label='Skip Fallback' v-if="isAdvanced">
|
||||
<a-switch v-model="dnsModal.dnsServer.skipFallback"></a-switch>
|
||||
</a-form-item>
|
||||
<a-form-item label='{{ i18n "pages.xray.dns.expectIPs"}}'>
|
||||
<a-button icon="plus" size="small" type="primary" @click="dnsModal.dnsServer.expectIPs.push('')"></a-button>
|
||||
<template v-for="(domain, index) in dnsModal.dnsServer.expectIPs">
|
||||
|
@ -33,31 +34,50 @@
|
|||
</a-input>
|
||||
</template>
|
||||
</a-form-item>
|
||||
<a-form-item label='{{ i18n "pages.xray.dns.unexpectIPs"}}'>
|
||||
<a-button icon="plus" size="small" type="primary" @click="dnsModal.dnsServer.unexpectedIPs.push('')"></a-button>
|
||||
<template v-for="(domain, index) in dnsModal.dnsServer.unexpectedIPs">
|
||||
<a-input v-model.trim="dnsModal.dnsServer.unexpectedIPs[index]">
|
||||
<a-button icon="minus" size="small" slot="addonAfter"
|
||||
@click="dnsModal.dnsServer.unexpectedIPs.splice(index,1)"></a-button>
|
||||
</a-input>
|
||||
</template>
|
||||
</a-form-item>
|
||||
<a-divider :style="{ margin: '5px 0' }"></a-divider>
|
||||
<a-form-item label='Skip Fallback'>
|
||||
<a-switch v-model="dnsModal.dnsServer.skipFallback"></a-switch>
|
||||
</a-form-item>
|
||||
<a-form-item label='Disable Cache'>
|
||||
<a-switch v-model="dnsModal.dnsServer.disableCache"></a-switch>
|
||||
</a-form-item>
|
||||
<a-form-item label='Final Query'>
|
||||
<a-switch v-model="dnsModal.dnsServer.finalQuery"></a-switch>
|
||||
</a-form-item>
|
||||
</a-form>
|
||||
</a-modal>
|
||||
<script>
|
||||
const defaultDnsObject = {
|
||||
address: "localhost",
|
||||
port: 53,
|
||||
domains: [],
|
||||
expectIPs: [],
|
||||
unexpectedIPs: [],
|
||||
queryStrategy: 'UseIP',
|
||||
skipFallback: true,
|
||||
disableCache: false,
|
||||
finalQuery: false
|
||||
}
|
||||
|
||||
const dnsModal = {
|
||||
title: '',
|
||||
visible: false,
|
||||
okText: '{{ i18n "confirm" }}',
|
||||
isEdit: false,
|
||||
confirm: null,
|
||||
dnsServer: {
|
||||
address: "localhost",
|
||||
domains: [],
|
||||
expectIPs: [],
|
||||
queryStrategy: 'UseIP',
|
||||
skipFallback: true,
|
||||
dnsServer: { ...defaultDnsObject },
|
||||
ok() {
|
||||
ObjectUtil.execute(dnsModal.confirm, { ...dnsModal.dnsServer });
|
||||
},
|
||||
ok() {
|
||||
domains = dnsModal.dnsServer.domains.filter(d => d.length > 0);
|
||||
expectIPs = dnsModal.dnsServer.expectIPs.filter(ip => ip.length > 0);
|
||||
dnsModal.dnsServer.domains = domains;
|
||||
dnsModal.dnsServer.expectIPs = expectIPs;
|
||||
newDnsServer = (domains.length > 0 || expectIPs.length > 0) ? dnsModal.dnsServer : dnsModal.dnsServer.address;
|
||||
ObjectUtil.execute(dnsModal.confirm, newDnsServer);
|
||||
},
|
||||
|
||||
show({
|
||||
title = '',
|
||||
okText = '{{ i18n "confirm" }}',
|
||||
|
@ -69,28 +89,28 @@
|
|||
this.okText = okText;
|
||||
this.confirm = confirm;
|
||||
this.visible = true;
|
||||
this.isEdit = isEdit;
|
||||
|
||||
if (isEdit) {
|
||||
if (typeof dnsServer == 'object') {
|
||||
this.dnsServer = dnsServer;
|
||||
} else {
|
||||
this.dnsServer = {
|
||||
address: dnsServer ?? "",
|
||||
domains: [],
|
||||
expectIPs: [],
|
||||
queryStrategy: 'UseIP',
|
||||
skipFallback: true,
|
||||
}
|
||||
switch (typeof dnsServer) {
|
||||
case 'string':
|
||||
const dnsObj = { ...defaultDnsObject };
|
||||
|
||||
dnsObj.address = dnsServer;
|
||||
|
||||
this.dnsServer = dnsObj;
|
||||
break;
|
||||
case 'object':
|
||||
this.dnsServer = dnsServer;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
this.dnsServer = {
|
||||
address: "localhost",
|
||||
domains: [],
|
||||
expectIPs: [],
|
||||
queryStrategy: 'UseIP',
|
||||
skipFallback: true,
|
||||
}
|
||||
this.dnsServer = { ...defaultDnsObject };
|
||||
|
||||
this.dnsServer.domains = [];
|
||||
this.dnsServer.expectIPs = [];
|
||||
this.dnsServer.unexpectedIPs = [];
|
||||
}
|
||||
this.isEdit = isEdit;
|
||||
},
|
||||
close() {
|
||||
dnsModal.visible = false;
|
||||
|
@ -101,13 +121,6 @@
|
|||
el: '#dns-modal',
|
||||
data: {
|
||||
dnsModal: dnsModal,
|
||||
},
|
||||
computed: {
|
||||
isAdvanced: {
|
||||
get: function () {
|
||||
return dnsModal.dnsServer.domains.length > 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
56
web/html/modals/xray_fakedns_modal.html
Normal file
56
web/html/modals/xray_fakedns_modal.html
Normal file
|
@ -0,0 +1,56 @@
|
|||
{{define "modals/fakednsModal"}}
|
||||
<a-modal id="fakedns-modal" v-model="fakednsModal.visible" :title="fakednsModal.title" @ok="fakednsModal.ok"
|
||||
:closable="true" :mask-closable="false" :ok-text="fakednsModal.okText" cancel-text='{{ i18n "close" }}'
|
||||
:class="themeSwitcher.currentTheme">
|
||||
<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }">
|
||||
<a-form-item label='{{ i18n "pages.xray.fakedns.ipPool" }}'>
|
||||
<a-input v-model.trim="fakednsModal.fakeDns.ipPool"></a-input>
|
||||
</a-form-item>
|
||||
<a-form-item label='{{ i18n "pages.xray.fakedns.poolSize" }}'>
|
||||
<a-input-number v-model.number="fakednsModal.fakeDns.poolSize" :min="1"></a-input-number>
|
||||
</a-form-item>
|
||||
</a-form>
|
||||
</a-modal>
|
||||
<script>
|
||||
const fakednsDefaultData = {
|
||||
ipPool: "198.18.0.0/16",
|
||||
poolSize: 65535,
|
||||
}
|
||||
|
||||
const fakednsModal = {
|
||||
title: '',
|
||||
visible: false,
|
||||
okText: '{{ i18n "confirm" }}',
|
||||
isEdit: false,
|
||||
confirm: null,
|
||||
fakeDns: { ...fakednsDefaultData },
|
||||
ok() {
|
||||
ObjectUtil.execute(fakednsModal.confirm, fakednsModal.fakeDns);
|
||||
},
|
||||
show({ title = '', okText = '{{ i18n "confirm" }}', fakeDns, confirm = (fakeDns) => { }, isEdit = false }) {
|
||||
this.title = title;
|
||||
this.okText = okText;
|
||||
this.confirm = confirm;
|
||||
this.visible = true;
|
||||
if (isEdit) {
|
||||
this.fakeDns = fakeDns;
|
||||
} else {
|
||||
this.fakeDns = { ...fakednsDefaultData }
|
||||
}
|
||||
this.isEdit = isEdit;
|
||||
},
|
||||
close() {
|
||||
fakednsModal.visible = false;
|
||||
},
|
||||
};
|
||||
|
||||
new Vue({
|
||||
delimiters: ['[[', ']]'],
|
||||
el: '#fakedns-modal',
|
||||
data: {
|
||||
fakednsModal: fakednsModal,
|
||||
}
|
||||
});
|
||||
|
||||
</script>
|
||||
{{end}}
|
|
@ -135,7 +135,7 @@
|
|||
</template>
|
||||
</a-setting-list-item>
|
||||
</a-collapse-panel>
|
||||
<a-collapse-panel key="4" header='{{ i18n "pages.xray.blockConfigs"}}'>
|
||||
<a-collapse-panel key="4" header='{{ i18n "pages.xray.basicRouting"}}'>
|
||||
<a-row :xs="24" :sm="24" :lg="12">
|
||||
<a-alert type="warning" :style="{ textAlign: 'center' }">
|
||||
<template slot="message">
|
||||
|
@ -144,22 +144,12 @@
|
|||
</template>
|
||||
</a-alert>
|
||||
</a-row>
|
||||
<a-setting-list-item paddings="small">
|
||||
<a-setting-list-item paddings="small" :style="{ marginBottom: '20px' }">
|
||||
<template #title>{{ i18n "pages.xray.Torrent"}}</template>
|
||||
<template #description>{{ i18n "pages.xray.TorrentDesc"}}</template>
|
||||
<template #control>
|
||||
<a-switch v-model="torrentSettings"></a-switch>
|
||||
</template>
|
||||
</a-setting-list-item>
|
||||
<a-setting-list-item paddings="small">
|
||||
<template #title>{{ i18n "pages.xray.Family"}}</template>
|
||||
<template #description>{{ i18n "pages.xray.FamilyDesc"}}</template>
|
||||
<template #control>
|
||||
<a-switch v-model="familyProtectSettings"></a-switch>
|
||||
</template>
|
||||
</a-setting-list-item>
|
||||
</a-collapse-panel>
|
||||
<a-collapse-panel key="5" header='{{ i18n "pages.xray.basicRouting"}}'>
|
||||
<a-row :xs="24" :sm="24" :lg="12">
|
||||
<a-alert type="warning" :style="{ textAlign: 'center' }">
|
||||
<template slot="message">
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
<template #control>
|
||||
<a-select v-model="dnsStrategy" :style="{ width: '100%' }"
|
||||
:dropdown-class-name="themeSwitcher.currentTheme">
|
||||
<a-select-option :value="l" :label="l" v-for="l in ['UseIP', 'UseIPv4', 'UseIPv6']">
|
||||
<a-select-option :value="l" :label="l" v-for="l in ['UseSystem', 'UseIP', 'UseIPv4', 'UseIPv6']">
|
||||
<span>[[ l ]]</span>
|
||||
</a-select-option>
|
||||
</a-select>
|
||||
|
@ -56,6 +56,14 @@
|
|||
<a-switch v-model="dnsDisableFallbackIfMatch"></a-switch>
|
||||
</template>
|
||||
</a-setting-list-item>
|
||||
|
||||
<a-setting-list-item paddings="small">
|
||||
<template #title>{{ i18n "pages.xray.dns.useSystemHosts" }}</template>
|
||||
<template #description>{{ i18n "pages.xray.dns.useSystemHostsDesc" }}</template>
|
||||
<template #control>
|
||||
<a-switch v-model="dnsUseSystemHosts"></a-switch>
|
||||
</template>
|
||||
</a-setting-list-item>
|
||||
</template>
|
||||
</a-collapse-panel>
|
||||
<template v-if="enableDNS">
|
||||
|
@ -102,9 +110,12 @@
|
|||
</template>
|
||||
<template v-else>
|
||||
<a-empty description='{{ i18n "emptyDnsDesc" }}' :style="{ margin: '10px' }">
|
||||
<a-button type="primary" icon="plus" @click="addDNSServer()" :style="{ marginTop: '10px' }">
|
||||
<span>{{ i18n "pages.xray.dns.add" }}</span>
|
||||
</a-button>
|
||||
<a-button-group>
|
||||
<a-button type="primary" icon="plus" @click="addDNSServer()">
|
||||
<span>{{ i18n "pages.xray.dns.add" }}</span>
|
||||
</a-button>
|
||||
<a-button type="primary" icon="menu" @click="openDNSPresets()"></a-button>
|
||||
</a-button-group>
|
||||
</a-empty>
|
||||
</template>
|
||||
</a-collapse-panel>
|
||||
|
|
|
@ -128,6 +128,7 @@
|
|||
{{template "modals/reverseModal"}}
|
||||
{{template "modals/balancerModal"}}
|
||||
{{template "modals/dnsModal"}}
|
||||
{{template "modals/dnsPresetsModal"}}
|
||||
{{template "modals/fakednsModal"}}
|
||||
{{template "modals/warpModal"}}
|
||||
<script>
|
||||
|
@ -135,18 +136,18 @@
|
|||
{ title: "#", align: 'center', width: 15, scopedSlots: { customRender: 'action' } },
|
||||
{ title: '{{ i18n "pages.xray.rules.source"}}', children: [
|
||||
{ title: 'IP', dataIndex: "source", align: 'center', width: 20, ellipsis: true },
|
||||
{ title: 'Port', dataIndex: 'sourcePort', align: 'center', width: 10, ellipsis: true } ]},
|
||||
{ title: '{{ i18n "pages.inbounds.port" }}', dataIndex: 'sourcePort', align: 'center', width: 10, ellipsis: true } ]},
|
||||
{ title: '{{ i18n "pages.inbounds.network"}}', children: [
|
||||
{ title: 'L4', dataIndex: 'network', align: 'center', width: 10 },
|
||||
{ title: 'Protocol', dataIndex: 'protocol', align: 'center', width: 15, ellipsis: true },
|
||||
{ title: '{{ i18n "protocol" }}', dataIndex: 'protocol', align: 'center', width: 15, ellipsis: true },
|
||||
{ title: 'Attrs', dataIndex: 'attrs', align: 'center', width: 10, ellipsis: true } ]},
|
||||
{ title: '{{ i18n "pages.xray.rules.dest"}}', children: [
|
||||
{ title: 'IP', dataIndex: 'ip', align: 'center', width: 20, ellipsis: true },
|
||||
{ title: 'Domain', dataIndex: 'domain', align: 'center', width: 20, ellipsis: true },
|
||||
{ title: 'Port', dataIndex: 'port', align: 'center', width: 10, ellipsis: true }]},
|
||||
{ title: '{{ i18n "pages.xray.outbound.domain" }}', dataIndex: 'domain', align: 'center', width: 20, ellipsis: true },
|
||||
{ title: '{{ i18n "pages.inbounds.port" }}', dataIndex: 'port', align: 'center', width: 10, ellipsis: true }]},
|
||||
{ title: '{{ i18n "pages.xray.rules.inbound"}}', children: [
|
||||
{ title: 'Tag', dataIndex: 'inboundTag', align: 'center', width: 15, ellipsis: true },
|
||||
{ title: 'Client Email', dataIndex: 'user', align: 'center', width: 20, ellipsis: true }]},
|
||||
{ title: '{{ i18n "pages.xray.outbound.tag" }}', dataIndex: 'inboundTag', align: 'center', width: 15, ellipsis: true },
|
||||
{ title: '{{ i18n "pages.inbounds.client" }}', dataIndex: 'user', align: 'center', width: 20, ellipsis: true }]},
|
||||
{ title: '{{ i18n "pages.xray.rules.outbound"}}', dataIndex: 'outboundTag', align: 'center', width: 17 },
|
||||
{ title: '{{ i18n "pages.xray.rules.balancer"}}', dataIndex: 'balancerTag', align: 'center', width: 15 },
|
||||
];
|
||||
|
@ -308,16 +309,7 @@
|
|||
{ label: 'Netflix', value: 'geosite:netflix' },
|
||||
{ label: 'Reddit', value: 'geosite:reddit' },
|
||||
{ label: 'Speedtest', value: 'geosite:speedtest' },
|
||||
],
|
||||
familyProtectDNS: {
|
||||
"servers": [
|
||||
"1.1.1.3", // https://developers.cloudflare.com/1.1.1.1/setup/
|
||||
"1.0.0.3",
|
||||
"2606:4700:4700::1113",
|
||||
"2606:4700:4700::1003"
|
||||
],
|
||||
"queryStrategy": "UseIP"
|
||||
},
|
||||
]
|
||||
},
|
||||
defaultObservatory: {
|
||||
subjectSelector: [],
|
||||
|
@ -826,6 +818,16 @@
|
|||
this.obsSettings = '';
|
||||
this.changeObsCode()
|
||||
},
|
||||
openDNSPresets() {
|
||||
dnsPresetsModal.show({
|
||||
title: '{{ i18n "pages.xray.dns.dnsPresetTitle" }}',
|
||||
selected: (selectedPreset) => {
|
||||
this.dnsServers = selectedPreset;
|
||||
|
||||
dnsPresetsModal.close();
|
||||
}
|
||||
});
|
||||
},
|
||||
addDNSServer(){
|
||||
dnsModal.show({
|
||||
title: '{{ i18n "pages.xray.dns.add" }}',
|
||||
|
@ -1270,21 +1272,6 @@
|
|||
}
|
||||
},
|
||||
},
|
||||
familyProtectSettings: {
|
||||
get: function () {
|
||||
if (!this.templateSettings || !this.templateSettings.dns || !this.templateSettings.dns.servers) return false;
|
||||
return ArrayUtils.doAllItemsExist(this.settingsData.familyProtectDNS.servers, this.templateSettings.dns.servers);
|
||||
},
|
||||
set: function (newValue) {
|
||||
newTemplateSettings = this.templateSettings;
|
||||
if (newValue) {
|
||||
newTemplateSettings.dns = this.settingsData.familyProtectDNS;
|
||||
} else {
|
||||
newTemplateSettings.dns.servers = newTemplateSettings.dns?.servers?.filter(data => !this.settingsData.familyProtectDNS.servers.includes(data))
|
||||
}
|
||||
this.templateSettings = newTemplateSettings;
|
||||
},
|
||||
},
|
||||
WarpExist: {
|
||||
get: function() {
|
||||
return this.templateSettings ? this.templateSettings.outbounds.findIndex((o) => o.tag == "warp")>=0 : false;
|
||||
|
@ -1376,6 +1363,20 @@
|
|||
this.templateSettings = newTemplateSettings;
|
||||
}
|
||||
},
|
||||
dnsUseSystemHosts: {
|
||||
get: function () {
|
||||
return this.enableDNS ? this.templateSettings.dns.useSystemHosts : false;
|
||||
},
|
||||
set: function (newValue) {
|
||||
newTemplateSettings = this.templateSettings;
|
||||
if (newValue) {
|
||||
newTemplateSettings.dns.useSystemHosts = newValue;
|
||||
} else {
|
||||
delete newTemplateSettings.dns.useSystemHosts
|
||||
}
|
||||
this.templateSettings = newTemplateSettings;
|
||||
}
|
||||
},
|
||||
dnsStrategy: {
|
||||
get: function () {
|
||||
return this.enableDNS ? this.templateSettings.dns.queryStrategy : null;
|
||||
|
|
|
@ -81,5 +81,9 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
"stats": {}
|
||||
}
|
||||
"stats": {},
|
||||
"metrics": {
|
||||
"tag": "metrics_out",
|
||||
"listen": "127.0.0.1:11111"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -295,7 +295,7 @@ func (s *ServerService) GetXrayVersions() ([]string, error) {
|
|||
continue
|
||||
}
|
||||
|
||||
if major > 25 || (major == 25 && minor > 3) || (major == 25 && minor == 3 && patch >= 3) {
|
||||
if major > 25 || (major == 25 && minor > 6) || (major == 25 && minor == 6 && patch >= 8) {
|
||||
versions = append(versions, release.TagName)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -400,7 +400,6 @@
|
|||
"generalConfigsDesc" = "الخيارات دي هتحدد التعديلات العامة."
|
||||
"logConfigs" = "السجلات"
|
||||
"logConfigsDesc" = "السجلات ممكن تأثر على كفاءة السيرفر. ننصح بتفعيلها بحكمة لما تكون محتاجها."
|
||||
"blockConfigs" = "درع الحماية"
|
||||
"blockConfigsDesc" = "الخيارات دي هتحجب الترافيك بناءً على بروتوكولات ومواقع محددة."
|
||||
"basicRouting" = "توجيه أساسي"
|
||||
"blockConnectionsConfigsDesc" = "الخيارات دي هتحجب الترافيك بناءً على الدولة المطلوبة."
|
||||
|
@ -420,9 +419,6 @@
|
|||
"RoutingStrategy" = "استراتيجية التوجيه العامة"
|
||||
"RoutingStrategyDesc" = "حدد استراتيجية التوجيه الإجمالية لحل كل الطلبات."
|
||||
"Torrent" = "حظر بروتوكول التورنت"
|
||||
"TorrentDesc" = "بيحجب بروتوكول التورنت."
|
||||
"Family" = "حماية العيلة"
|
||||
"FamilyDesc" = "بيحجب المحتويات الكبار وعناوين المواقع الضارة."
|
||||
"Inbounds" = "الإدخالات"
|
||||
"InboundsDesc" = "قبول العملاء المعينين."
|
||||
"Outbounds" = "المخرجات"
|
||||
|
@ -522,6 +518,12 @@
|
|||
"edit" = "عدل السيرفر"
|
||||
"domains" = "الدومينات"
|
||||
"expectIPs" = "العناوين المتوقعة"
|
||||
"unexpectIPs" = "عناوين IP غير متوقعة"
|
||||
"useSystemHosts" = "استخدام ملف Hosts الخاص بالنظام"
|
||||
"useSystemHostsDesc" = "استخدام ملف hosts من نظام مثبت"
|
||||
"usePreset" = "استخدام النموذج"
|
||||
"dnsPresetTitle" = "قوالب DNS"
|
||||
"dnsPresetFamily" = "العائلي"
|
||||
|
||||
[pages.xray.fakedns]
|
||||
"add" = "أضف Fake DNS"
|
||||
|
|
|
@ -399,7 +399,6 @@
|
|||
"generalConfigsDesc" = "These options will determine general adjustments."
|
||||
"logConfigs" = "Log"
|
||||
"logConfigsDesc" = "Logs may affect your server's efficiency. It is recommended to enable it wisely only in case of your needs"
|
||||
"blockConfigs" = "Protection Shield"
|
||||
"blockConfigsDesc" = "These options will block traffic based on specific requested protocols and websites."
|
||||
"basicRouting" = "Basic Routing"
|
||||
"blockConnectionsConfigsDesc" = "These options will block traffic based on the specific requested country."
|
||||
|
@ -419,9 +418,6 @@
|
|||
"RoutingStrategy" = "Overall Routing Strategy"
|
||||
"RoutingStrategyDesc" = "Set the overall traffic routing strategy for resolving all requests."
|
||||
"Torrent" = "Block BitTorrent Protocol"
|
||||
"TorrentDesc" = "Blocks BitTorrent protocol."
|
||||
"Family" = "Family Protection"
|
||||
"FamilyDesc" = "Blocks adult content, and malware websites."
|
||||
"Inbounds" = "Inbounds"
|
||||
"InboundsDesc" = "Accepting the specific clients."
|
||||
"Outbounds" = "Outbounds"
|
||||
|
@ -521,6 +517,12 @@
|
|||
"edit" = "Edit Server"
|
||||
"domains" = "Domains"
|
||||
"expectIPs" = "Expect IPs"
|
||||
"unexpectIPs" = "Unexpect IPs"
|
||||
"useSystemHosts" = "Use System Hosts"
|
||||
"useSystemHostsDesc" = "Use the hosts file from an installed system"
|
||||
"usePreset" = "Use Preset"
|
||||
"dnsPresetTitle" = "DNS Presets"
|
||||
"dnsPresetFamily" = "Family"
|
||||
|
||||
[pages.xray.fakedns]
|
||||
"add" = "Add Fake DNS"
|
||||
|
|
|
@ -402,7 +402,6 @@
|
|||
"generalConfigsDesc" = "Estas opciones proporcionarán ajustes generales."
|
||||
"logConfigs" = "Registro"
|
||||
"logConfigsDesc" = "Los registros pueden afectar la eficiencia de su servidor. Se recomienda habilitarlos sabiamente solo en caso de sus necesidades."
|
||||
"blockConfigs" = "Configuraciones de Bloqueo"
|
||||
"blockConfigsDesc" = "Estas opciones evitarán que los usuarios se conecten a protocolos y sitios web específicos."
|
||||
"basicRouting" = "Enrutamiento Básico"
|
||||
"blockConnectionsConfigsDesc" = "Estas opciones bloquearán el tráfico según el país solicitado específico."
|
||||
|
@ -422,9 +421,6 @@
|
|||
"RoutingStrategy" = "Configurar Estrategia de Enrutamiento de Dominios"
|
||||
"RoutingStrategyDesc" = "Establece la estrategia general de enrutamiento para la resolución de DNS."
|
||||
"Torrent" = "Prohibir Uso de BitTorrent"
|
||||
"TorrentDesc" = "Cambia la plantilla de configuración para evitar el uso de BitTorrent por parte de los usuarios."
|
||||
"Family" = "Bloquee malware y contenido para adultos"
|
||||
"FamilyDesc" = "Resolutores de DNS de Cloudflare para bloquear malware y contenido para adultos para protección familiar."
|
||||
"Inbounds" = "Entrante"
|
||||
"InboundsDesc" = "Cambia la plantilla de configuración para aceptar clientes específicos."
|
||||
"Outbounds" = "Salidas"
|
||||
|
@ -524,6 +520,12 @@
|
|||
"edit" = "Editar Servidor"
|
||||
"domains" = "Dominios"
|
||||
"expectIPs" = "IPs esperadas"
|
||||
"unexpectIPs" = "IPs inesperadas"
|
||||
"useSystemHosts" = "Usar Hosts del sistema"
|
||||
"useSystemHostsDesc" = "Usar el archivo hosts de un sistema instalado"
|
||||
"usePreset" = "Usar plantilla"
|
||||
"dnsPresetTitle" = "Plantillas DNS"
|
||||
"dnsPresetFamily" = "Familiar"
|
||||
|
||||
[pages.xray.fakedns]
|
||||
"add" = "Agregar DNS Falso"
|
||||
|
|
|
@ -402,7 +402,6 @@
|
|||
"generalConfigsDesc" = "این گزینهها استراتژی کلی ترافیک را تعیین میکنند"
|
||||
"logConfigs" = "گزارش"
|
||||
"logConfigsDesc" = "گزارشها ممکن است بر کارایی سرور شما تأثیر بگذارد. توصیه می شود فقط در صورت نیاز آن را عاقلانه فعال کنید"
|
||||
"blockConfigs" = "سپر محافظ"
|
||||
"blockConfigsDesc" = "این گزینهها ترافیک را بر اساس پروتکلهای درخواستی خاص، و وب سایتها مسدود میکند"
|
||||
"basicRouting" = "مسیریابی پایه"
|
||||
"blockConnectionsConfigsDesc" = "این گزینهها ترافیک را بر اساس کشور درخواستشده خاص مسدود میکنند."
|
||||
|
@ -422,9 +421,6 @@
|
|||
"RoutingStrategy" = "استراتژی کلی مسیریابی"
|
||||
"RoutingStrategyDesc" = "استراتژی کلی مسیریابی برای حل تمام درخواستها را تعیین میکند"
|
||||
"Torrent" = "مسدودسازی پروتکل بیتتورنت"
|
||||
"TorrentDesc" = "پروتکل بیت تورنت را مسدود میکند"
|
||||
"Family" = "محافظت خانواده"
|
||||
"FamilyDesc" = "محتوای مخصوص بزرگسالان، و وبسایتهای ناامن را مسدود میکند"
|
||||
"Inbounds" = "ورودیها"
|
||||
"InboundsDesc" = "پذیرش کلاینت خاص"
|
||||
"Outbounds" = "خروجیها"
|
||||
|
@ -524,6 +520,12 @@
|
|||
"edit" = "ویرایش سرور"
|
||||
"domains" = "دامنهها"
|
||||
"expectIPs" = "آیپیهای مورد انتظار"
|
||||
"unexpectIPs" = "آیپیهای غیرمنتظره"
|
||||
"useSystemHosts" = "استفاده از Hosts سیستم"
|
||||
"useSystemHostsDesc" = "استفاده از فایل hosts یک سیستم نصبشده"
|
||||
"usePreset" = "استفاده از پیشتنظیم"
|
||||
"dnsPresetTitle" = "پیشتنظیمهای DNS"
|
||||
"dnsPresetFamily" = "خانوادگی"
|
||||
|
||||
[pages.xray.fakedns]
|
||||
"add" = "افزودن دیاناس جعلی"
|
||||
|
|
|
@ -402,7 +402,6 @@
|
|||
"generalConfigsDesc" = "Opsi ini akan menentukan penyesuaian strategi umum."
|
||||
"logConfigs" = "Catatan"
|
||||
"logConfigsDesc" = "Log dapat mempengaruhi efisiensi server Anda. Disarankan untuk mengaktifkannya dengan bijak hanya jika diperlukan"
|
||||
"blockConfigs" = "Pelindung"
|
||||
"blockConfigsDesc" = "Opsi ini akan memblokir lalu lintas berdasarkan protokol dan situs web yang diminta."
|
||||
"basicRouting" = "Perutean Dasar"
|
||||
"blockConnectionsConfigsDesc" = "Opsi ini akan memblokir lalu lintas berdasarkan negara yang diminta."
|
||||
|
@ -423,8 +422,6 @@
|
|||
"RoutingStrategyDesc" = "Atur strategi pengalihan lalu lintas keseluruhan untuk menyelesaikan semua permintaan."
|
||||
"Torrent" = "Blokir Protokol BitTorrent"
|
||||
"TorrentDesc" = "Memblokir protokol BitTorrent."
|
||||
"Family" = "Proteksi Keluarga"
|
||||
"FamilyDesc" = "Memblokir konten dewasa dan situs web berbahaya."
|
||||
"Inbounds" = "Masuk"
|
||||
"InboundsDesc" = "Menerima klien tertentu."
|
||||
"Outbounds" = "Keluar"
|
||||
|
@ -524,6 +521,12 @@
|
|||
"edit" = "Sunting Server"
|
||||
"domains" = "Domains"
|
||||
"expectIPs" = "IP yang Diharapkan"
|
||||
"unexpectIPs" = "IP tak terduga"
|
||||
"useSystemHosts" = "Gunakan Hosts Sistem"
|
||||
"useSystemHostsDesc" = "Gunakan file hosts dari sistem yang terinstal"
|
||||
"usePreset" = "Gunakan templat"
|
||||
"dnsPresetTitle" = "Templat DNS"
|
||||
"dnsPresetFamily" = "Keluarga"
|
||||
|
||||
[pages.xray.fakedns]
|
||||
"add" = "Tambahkan DNS Palsu"
|
||||
|
|
|
@ -402,7 +402,6 @@
|
|||
"generalConfigsDesc" = "これらのオプションは一般設定を決定します"
|
||||
"logConfigs" = "ログ"
|
||||
"logConfigsDesc" = "ログはサーバーのパフォーマンスに影響を与える可能性があるため、必要な場合にのみ有効にすることをお勧めします"
|
||||
"blockConfigs" = "防御フィルター"
|
||||
"blockConfigsDesc" = "これらのオプションは、特定のプロトコルやウェブサイトへのユーザー接続をブロックします"
|
||||
"basicRouting" = "基本ルーティング"
|
||||
"blockConnectionsConfigsDesc" = "これらのオプションにより、特定のリクエスト元の国に基づいてトラフィックをブロックします。"
|
||||
|
@ -422,9 +421,6 @@
|
|||
"RoutingStrategy" = "ルーティングドメイン戦略設定"
|
||||
"RoutingStrategyDesc" = "DNS解決の全体的なルーティング戦略を設定する"
|
||||
"Torrent" = "BitTorrent プロトコルをブロック"
|
||||
"TorrentDesc" = "BitTorrentの使用を禁止する"
|
||||
"Family" = "ファミリー保護"
|
||||
"FamilyDesc" = "アダルトコンテンツや悪意のあるサイトをブロックする"
|
||||
"Inbounds" = "インバウンドルール"
|
||||
"InboundsDesc" = "特定のクライアントからのトラフィックを受け入れる"
|
||||
"Outbounds" = "アウトバウンドルール"
|
||||
|
@ -524,6 +520,12 @@
|
|||
"edit" = "サーバー編集"
|
||||
"domains" = "ドメイン"
|
||||
"expectIPs" = "期待されるIP"
|
||||
"unexpectIPs" = "予期しないIP"
|
||||
"useSystemHosts" = "システムのHostsを使用"
|
||||
"useSystemHostsDesc" = "インストール済みシステムのhostsファイルを使用する"
|
||||
"usePreset" = "テンプレートを使用"
|
||||
"dnsPresetTitle" = "DNSテンプレート"
|
||||
"dnsPresetFamily" = "ファミリー"
|
||||
|
||||
[pages.xray.fakedns]
|
||||
"add" = "フェイクDNS追加"
|
||||
|
|
|
@ -402,7 +402,6 @@
|
|||
"generalConfigsDesc" = "Essas opções determinam ajustes gerais."
|
||||
"logConfigs" = "Log"
|
||||
"logConfigsDesc" = "Os logs podem afetar a eficiência do servidor. É recomendável habilitá-los com sabedoria apenas se necessário."
|
||||
"blockConfigs" = "Escudo de Proteção"
|
||||
"blockConfigsDesc" = "Essas opções bloqueiam tráfego com base em protocolos e sites específicos solicitados."
|
||||
"basicRouting" = "Roteamento Básico"
|
||||
"blockConnectionsConfigsDesc" = "Essas opções bloquearão o tráfego com base no país solicitado."
|
||||
|
@ -422,9 +421,6 @@
|
|||
"RoutingStrategy" = "Estratégia Geral de Roteamento"
|
||||
"RoutingStrategyDesc" = "Definir a estratégia geral de roteamento de tráfego para resolver todas as solicitações."
|
||||
"Torrent" = "Bloquear Protocolo BitTorrent"
|
||||
"TorrentDesc" = "Bloqueia o protocolo BitTorrent."
|
||||
"Family" = "Proteção Familiar"
|
||||
"FamilyDesc" = "Bloqueia conteúdo adulto e sites maliciosos."
|
||||
"Inbounds" = "Inbounds"
|
||||
"InboundsDesc" = "Aceitar clientes específicos."
|
||||
"Outbounds" = "Outbounds"
|
||||
|
@ -524,6 +520,12 @@
|
|||
"edit" = "Editar Servidor"
|
||||
"domains" = "Domínios"
|
||||
"expectIPs" = "IPs Esperadas"
|
||||
"unexpectIPs" = "IPs inesperados"
|
||||
"useSystemHosts" = "Usar Hosts do sistema"
|
||||
"useSystemHostsDesc" = "Usar o arquivo hosts de um sistema instalado"
|
||||
"usePreset" = "Usar modelo"
|
||||
"dnsPresetTitle" = "Modelos DNS"
|
||||
"dnsPresetFamily" = "Familiar"
|
||||
|
||||
[pages.xray.fakedns]
|
||||
"add" = "Adicionar Fake DNS"
|
||||
|
|
|
@ -68,7 +68,7 @@
|
|||
"emptyDnsDesc" = "Нет добавленных DNS-серверов."
|
||||
"emptyFakeDnsDesc" = "Нет добавленных Fake DNS-серверов."
|
||||
"emptyBalancersDesc" = "Нет добавленных балансировщиков."
|
||||
"emptyReverseDesc" = "Нет добавленных обратных прокси."
|
||||
"emptyReverseDesc" = "Нет добавленных реверс-прокси."
|
||||
"somethingWentWrong" = "Что-то пошло не так"
|
||||
|
||||
[menu]
|
||||
|
@ -396,13 +396,12 @@
|
|||
"stopSuccess" = "Xray успешно остановлен"
|
||||
"restartError" = "Произошла ошибка при перезапуске Xray."
|
||||
"stopError" = "Произошла ошибка при остановке Xray."
|
||||
"basicTemplate" = "Базовый шаблон"
|
||||
"basicTemplate" = "Основное"
|
||||
"advancedTemplate" = "Расширенный шаблон"
|
||||
"generalConfigs" = "Основные настройки"
|
||||
"generalConfigsDesc" = "Эти параметры описывают общие настройки"
|
||||
"logConfigs" = "Логи"
|
||||
"logConfigsDesc" = "Логи могут замедлять работу сервера. Включайте только нужные вам виды логов при необходимости!"
|
||||
"blockConfigs" = "Блокировка подключений"
|
||||
"blockConfigsDesc" = "Настройте, чтобы клиенты не имели доступа к определенным протоколам и веб-сайтами"
|
||||
"basicRouting" = "Базовые соединения"
|
||||
"blockConnectionsConfigsDesc" = "Эти параметры будут блокировать трафик в зависимости от страны назначения."
|
||||
|
@ -422,9 +421,6 @@
|
|||
"RoutingStrategy" = "Настройка маршрутизации доменов"
|
||||
"RoutingStrategyDesc" = "Установка общей стратегии маршрутизации разрешения DNS"
|
||||
"Torrent" = "Заблокировать BitTorrent"
|
||||
"TorrentDesc" = "Запретить входящий/исходящий трафик, в котором фигурирует протокол BitTorrent"
|
||||
"Family" = "Семейный режим"
|
||||
"FamilyDesc" = "Использовать DNS-сервера Cloudflare для блокировки вредоносного ПО и контента для взрослых в целях защиты семьи."
|
||||
"Inbounds" = "Входящее соединение"
|
||||
"InboundsDesc" = "Изменение шаблона конфигурации для подключения определенных клиентов"
|
||||
"Outbounds" = "Исходящее соединение"
|
||||
|
@ -470,13 +466,13 @@
|
|||
|
||||
[pages.xray.outbound]
|
||||
"addOutbound" = "Создать исходящее соединение"
|
||||
"addReverse" = "Создать обратный прокси"
|
||||
"addReverse" = "Создать реверс-прокси"
|
||||
"editOutbound" = "Изменить исходящее соединение"
|
||||
"editReverse" = "Редактировать обратное прокси"
|
||||
"editReverse" = "Редактировать реверс-прокси"
|
||||
"tag" = "Тег"
|
||||
"tagDesc" = "Уникальный тег"
|
||||
"address" = "Адрес"
|
||||
"reverse" = "Обратный"
|
||||
"reverse" = "Реверс-прокси"
|
||||
"domain" = "Домен"
|
||||
"type" = "Тип"
|
||||
"bridge" = "Мост"
|
||||
|
@ -524,6 +520,12 @@
|
|||
"edit" = "Редактировать DNS"
|
||||
"domains" = "Домены"
|
||||
"expectIPs" = "Ожидаемые IP"
|
||||
"unexpectIPs" = "Неожидаемые IP"
|
||||
"useSystemHosts" = "Использовать системные Hosts"
|
||||
"useSystemHostsDesc" = "Использовать файл hosts из установленной системы"
|
||||
"usePreset" = "Использовать шаблон"
|
||||
"dnsPresetTitle" = "Шаблоны DNS"
|
||||
"dnsPresetFamily" = "Семейный"
|
||||
|
||||
[pages.xray.fakedns]
|
||||
"add" = "Создать Fake DNS"
|
||||
|
|
|
@ -402,7 +402,6 @@
|
|||
"generalConfigsDesc" = "Bu seçenekler genel ayarlamaları belirler."
|
||||
"logConfigs" = "Günlük"
|
||||
"logConfigsDesc" = "Günlükler sunucunuzun verimliliğini etkileyebilir. Yalnızca ihtiyaç durumunda akıllıca etkinleştirmeniz önerilir"
|
||||
"blockConfigs" = "Koruma Kalkanı"
|
||||
"blockConfigsDesc" = "Bu seçenekler belirli istek protokolleri ve web siteleri temelinde trafiği engeller."
|
||||
"basicRouting" = "Temel Yönlendirme"
|
||||
"blockConnectionsConfigsDesc" = "Bu seçenekler belirli bir istenen ülkeye göre trafiği engelleyecektir."
|
||||
|
@ -422,9 +421,6 @@
|
|||
"RoutingStrategy" = "Genel Yönlendirme Stratejisi"
|
||||
"RoutingStrategyDesc" = "Tüm istekleri çözmek için genel trafik yönlendirme stratejisini ayarlayın."
|
||||
"Torrent" = "BitTorrent Protokolünü Engelle"
|
||||
"TorrentDesc" = "BitTorrent protokolünü engeller."
|
||||
"Family" = "Aile Koruması"
|
||||
"FamilyDesc" = "Yetişkin içerikli ve kötü amaçlı yazılım web sitelerini engeller."
|
||||
"Inbounds" = "Gelenler"
|
||||
"InboundsDesc" = "Belirli müşterileri kabul eder."
|
||||
"Outbounds" = "Gidenler"
|
||||
|
@ -524,6 +520,12 @@
|
|||
"edit" = "Sunucuyu Düzenle"
|
||||
"domains" = "Alan Adları"
|
||||
"expectIPs" = "Beklenen IP'ler"
|
||||
"unexpectIPs" = "Beklenmeyen IP'ler"
|
||||
"useSystemHosts" = "Sistem Hosts'larını Kullan"
|
||||
"useSystemHostsDesc" = "Yüklü bir sistemden hosts dosyasını kullan"
|
||||
"usePreset" = "Şablon kullan"
|
||||
"dnsPresetTitle" = "DNS Şablonları"
|
||||
"dnsPresetFamily" = "Aile"
|
||||
|
||||
[pages.xray.fakedns]
|
||||
"add" = "Sahte DNS Ekle"
|
||||
|
|
|
@ -402,7 +402,6 @@
|
|||
"generalConfigsDesc" = "Ці параметри визначатимуть загальні налаштування."
|
||||
"logConfigs" = "Журнал"
|
||||
"logConfigsDesc" = "Журнали можуть вплинути на ефективність вашого сервера. Рекомендується вмикати його з розумом лише у випадку ваших потреб"
|
||||
"blockConfigs" = "Захисний екран"
|
||||
"blockConfigsDesc" = "Ці параметри блокуватимуть трафік на основі конкретних запитуваних протоколів і веб-сайтів."
|
||||
"basicRouting" = "Основна Маршрутизація"
|
||||
"blockConnectionsConfigsDesc" = "Ці параметри блокуватимуть трафік на основі запитаних країн."
|
||||
|
@ -422,9 +421,6 @@
|
|||
"RoutingStrategy" = "Загальна стратегія маршрутизації"
|
||||
"RoutingStrategyDesc" = "Установити загальну стратегію маршрутизації трафіку для вирішення всіх запитів."
|
||||
"Torrent" = "Блокувати протокол BitTorrent"
|
||||
"TorrentDesc" = "Блокує протокол BitTorrent."
|
||||
"Family" = "Захист сім'ї"
|
||||
"FamilyDesc" = "Блокує вміст для дорослих і веб-сайти з шкідливими програмами."
|
||||
"Inbounds" = "Вхідні"
|
||||
"InboundsDesc" = "Прийняття певних клієнтів."
|
||||
"Outbounds" = "Вихід"
|
||||
|
@ -524,6 +520,12 @@
|
|||
"edit" = "Редагувати сервер"
|
||||
"domains" = "Домени"
|
||||
"expectIPs" = "Очікувані IP"
|
||||
"unexpectIPs" = "Неочікувані IP"
|
||||
"useSystemHosts" = "Використовувати системні Hosts"
|
||||
"useSystemHostsDesc" = "Використовувати файл hosts з встановленої системи"
|
||||
"usePreset" = "Використати шаблон"
|
||||
"dnsPresetTitle" = "Шаблони DNS"
|
||||
"dnsPresetFamily" = "Сімейний"
|
||||
|
||||
[pages.xray.fakedns]
|
||||
"add" = "Додати підроблений DNS"
|
||||
|
|
|
@ -402,7 +402,6 @@
|
|||
"generalConfigsDesc" = "Những tùy chọn này sẽ cung cấp điều chỉnh tổng quát."
|
||||
"logConfigs" = "Nhật ký"
|
||||
"logConfigsDesc" = "Nhật ký có thể ảnh hưởng đến hiệu suất máy chủ của bạn. Bạn chỉ nên kích hoạt nó một cách khôn ngoan trong trường hợp bạn cần"
|
||||
"blockConfigs" = "Cấu hình Chặn"
|
||||
"blockConfigsDesc" = "Những tùy chọn này sẽ ngăn người dùng kết nối đến các giao thức và trang web cụ thể."
|
||||
"basicRouting" = "Định tuyến Cơ bản"
|
||||
"blockConnectionsConfigsDesc" = "Các tùy chọn này sẽ chặn lưu lượng truy cập dựa trên quốc gia được yêu cầu cụ thể."
|
||||
|
@ -422,9 +421,6 @@
|
|||
"RoutingStrategy" = "Cấu hình Chiến lược Định tuyến Tên miền"
|
||||
"RoutingStrategyDesc" = "Đặt chiến lược định tuyến tổng thể cho việc giải quyết DNS."
|
||||
"Torrent" = "Cấu hình sử dụng BitTorrent"
|
||||
"TorrentDesc" = "Thay đổi mẫu cấu hình để tránh việc người dùng sử dụng BitTorrent."
|
||||
"Family" = "Chặn phần mềm độc hại và nội dung người lớn"
|
||||
"FamilyDesc" = "Trình phân giải DNS của Cloudflare để chặn phần mềm độc hại và nội dung người lớn để bảo vệ gia đình."
|
||||
"Inbounds" = "Đầu vào"
|
||||
"InboundsDesc" = "Thay đổi mẫu cấu hình để chấp nhận các máy khách cụ thể."
|
||||
"Outbounds" = "Đầu ra"
|
||||
|
@ -524,6 +520,12 @@
|
|||
"edit" = "Chỉnh sửa máy chủ"
|
||||
"domains" = "Tên miền"
|
||||
"expectIPs" = "Các IP Dự Kiến"
|
||||
"unexpectIPs" = "IP không mong muốn"
|
||||
"useSystemHosts" = "Sử dụng Hosts hệ thống"
|
||||
"useSystemHostsDesc" = "Sử dụng file hosts từ hệ thống đã cài đặt"
|
||||
"usePreset" = "Dùng mẫu"
|
||||
"dnsPresetTitle" = "Mẫu DNS"
|
||||
"dnsPresetFamily" = "Gia đình"
|
||||
|
||||
[pages.xray.fakedns]
|
||||
"add" = "Thêm DNS giả"
|
||||
|
|
|
@ -402,7 +402,6 @@
|
|||
"generalConfigsDesc" = "这些选项将决定常规配置"
|
||||
"logConfigs" = "日志"
|
||||
"logConfigsDesc" = "日志可能会影响服务器的性能,建议仅在需要时启用"
|
||||
"blockConfigs" = "防护屏蔽"
|
||||
"blockConfigsDesc" = "这些选项将阻止用户连接到特定协议和网站"
|
||||
"basicRouting" = "基本路由"
|
||||
"blockConnectionsConfigsDesc" = "这些选项将根据特定的请求国家阻止流量。"
|
||||
|
@ -422,9 +421,6 @@
|
|||
"RoutingStrategy" = "配置路由域策略"
|
||||
"RoutingStrategyDesc" = "设置 DNS 解析的整体路由策略"
|
||||
"Torrent" = "屏蔽 BitTorrent 协议"
|
||||
"TorrentDesc" = "禁止使用 BitTorrent"
|
||||
"Family" = "家庭保护"
|
||||
"FamilyDesc" = "屏蔽成人内容和恶意网站"
|
||||
"Inbounds" = "入站规则"
|
||||
"InboundsDesc" = "接受来自特定客户端的流量"
|
||||
"Outbounds" = "出站规则"
|
||||
|
@ -524,6 +520,12 @@
|
|||
"edit" = "编辑服务器"
|
||||
"domains" = "域"
|
||||
"expectIPs" = "预期 IP"
|
||||
"unexpectIPs" = "意外IP"
|
||||
"useSystemHosts" = "使用系统Hosts"
|
||||
"useSystemHostsDesc" = "使用已安装系统的hosts文件"
|
||||
"usePreset" = "使用模板"
|
||||
"dnsPresetTitle" = "DNS模板"
|
||||
"dnsPresetFamily" = "家庭"
|
||||
|
||||
[pages.xray.fakedns]
|
||||
"add" = "添加假 DNS"
|
||||
|
|
|
@ -404,7 +404,6 @@
|
|||
"generalConfigsDesc" = "這些選項將決定常規配置"
|
||||
"logConfigs" = "日誌"
|
||||
"logConfigsDesc" = "日誌可能會影響伺服器的效能,建議僅在需要時啟用"
|
||||
"blockConfigs" = "防護遮蔽"
|
||||
"blockConfigsDesc" = "這些選項將阻止使用者連線到特定協議和網站"
|
||||
"basicRouting" = "基本路由"
|
||||
"blockConnectionsConfigsDesc" = "這些選項將根據特定的請求國家阻止流量。"
|
||||
|
@ -424,9 +423,6 @@
|
|||
"RoutingStrategy" = "配置路由域策略"
|
||||
"RoutingStrategyDesc" = "設定 DNS 解析的整體路由策略"
|
||||
"Torrent" = "遮蔽 BitTorrent 協議"
|
||||
"TorrentDesc" = "禁止使用 BitTorrent"
|
||||
"Family" = "家庭保護"
|
||||
"FamilyDesc" = "遮蔽成人內容和惡意網站"
|
||||
"Inbounds" = "入站規則"
|
||||
"InboundsDesc" = "接受來自特定客戶端的流量"
|
||||
"Outbounds" = "出站規則"
|
||||
|
@ -526,6 +522,12 @@
|
|||
"edit" = "編輯伺服器"
|
||||
"domains" = "域"
|
||||
"expectIPs" = "預期 IP"
|
||||
"unexpectIPs" = "意外IP"
|
||||
"useSystemHosts" = "使用系統Hosts"
|
||||
"useSystemHostsDesc" = "使用已安裝系統的hosts檔案"
|
||||
"usePreset" = "使用範本"
|
||||
"dnsPresetTitle" = "DNS範本"
|
||||
"dnsPresetFamily" = "家庭"
|
||||
|
||||
[pages.xray.fakedns]
|
||||
"add" = "新增假 DNS"
|
||||
|
|
8
x-ui.sh
8
x-ui.sh
|
@ -474,7 +474,7 @@ enable_bbr() {
|
|||
ubuntu | debian | armbian)
|
||||
apt-get update && apt-get install -yqq --no-install-recommends ca-certificates
|
||||
;;
|
||||
centos | almalinux | rocky | ol)
|
||||
centos | rhel | almalinux | rocky | ol)
|
||||
yum -y update && yum -y install ca-certificates
|
||||
;;
|
||||
fedora | amzn | virtuozzo)
|
||||
|
@ -995,7 +995,7 @@ ssl_cert_issue() {
|
|||
ubuntu | debian | armbian)
|
||||
apt update && apt install socat -y
|
||||
;;
|
||||
centos | almalinux | rocky | ol)
|
||||
centos | rhel | almalinux | rocky | ol)
|
||||
yum -y update && yum -y install socat
|
||||
;;
|
||||
fedora | amzn | virtuozzo)
|
||||
|
@ -1511,7 +1511,7 @@ install_iplimit() {
|
|||
debian | armbian)
|
||||
apt update && apt install fail2ban -y
|
||||
;;
|
||||
centos | almalinux | rocky | ol)
|
||||
centos | rhel | almalinux | rocky | ol)
|
||||
yum update -y && yum install epel-release -y
|
||||
yum -y install fail2ban
|
||||
;;
|
||||
|
@ -1591,7 +1591,7 @@ remove_iplimit() {
|
|||
apt-get purge -y fail2ban -y
|
||||
apt-get autoremove -y
|
||||
;;
|
||||
centos | almalinux | rocky | ol)
|
||||
centos | rhel | almalinux | rocky | ol)
|
||||
yum remove fail2ban -y
|
||||
yum autoremove -y
|
||||
;;
|
||||
|
|
|
@ -6,6 +6,7 @@ import (
|
|||
"fmt"
|
||||
"regexp"
|
||||
"time"
|
||||
"math"
|
||||
|
||||
"x-ui/logger"
|
||||
"x-ui/util/common"
|
||||
|
@ -32,7 +33,7 @@ type XrayAPI struct {
|
|||
}
|
||||
|
||||
func (x *XrayAPI) Init(apiPort int) error {
|
||||
if apiPort <= 0 {
|
||||
if apiPort <= 0 || apiPort > math.MaxUint16 {
|
||||
return fmt.Errorf("invalid Xray API port: %d", apiPort)
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ type Config struct {
|
|||
FakeDNS json_util.RawMessage `json:"fakedns"`
|
||||
Observatory json_util.RawMessage `json:"observatory"`
|
||||
BurstObservatory json_util.RawMessage `json:"burstObservatory"`
|
||||
Metrics json_util.RawMessage `json:"metrics"`
|
||||
}
|
||||
|
||||
func (c *Config) Equals(other *Config) bool {
|
||||
|
@ -61,5 +62,8 @@ func (c *Config) Equals(other *Config) bool {
|
|||
if !bytes.Equal(c.FakeDNS, other.FakeDNS) {
|
||||
return false
|
||||
}
|
||||
if !bytes.Equal(c.Metrics, other.Metrics) {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue