Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMHSanaei <ho3ein.sanaei@gmail.com>2026-01-18 18:47:01 +0300
committerMHSanaei <ho3ein.sanaei@gmail.com>2026-01-18 18:47:01 +0300
commit88eab032be7197dd87d0b4c9864af4b6b4fd820b (patch)
tree65ac15d0025541adbe53e9f9088e19104851f9d4
parent20ec863f51f4fee88b35c3eaaf370a700b78109e (diff)
Add TUN protocol for inbound
Introduces TUN protocol to inbound.js, including a new TunSettings class. Updates inbound form to support TUN protocol and adds a dedicated form template for TUN settings. Translation files are updated with TUN-related strings for all supported languages.
-rw-r--r--web/assets/js/model/inbound.js34
-rw-r--r--web/html/form/inbound.html62
-rw-r--r--web/html/form/protocol/tun.html44
-rw-r--r--web/translation/translate.ar_EG.toml6
-rw-r--r--web/translation/translate.en_US.toml6
-rw-r--r--web/translation/translate.es_ES.toml6
-rw-r--r--web/translation/translate.fa_IR.toml6
-rw-r--r--web/translation/translate.id_ID.toml6
-rw-r--r--web/translation/translate.ja_JP.toml6
-rw-r--r--web/translation/translate.pt_BR.toml6
-rw-r--r--web/translation/translate.ru_RU.toml6
-rw-r--r--web/translation/translate.tr_TR.toml6
-rw-r--r--web/translation/translate.uk_UA.toml6
-rw-r--r--web/translation/translate.vi_VN.toml6
-rw-r--r--web/translation/translate.zh_CN.toml6
-rw-r--r--web/translation/translate.zh_TW.toml6
16 files changed, 200 insertions, 18 deletions
diff --git a/web/assets/js/model/inbound.js b/web/assets/js/model/inbound.js
index 8d4b6819..e5fe368f 100644
--- a/web/assets/js/model/inbound.js
+++ b/web/assets/js/model/inbound.js
@@ -7,6 +7,7 @@ const Protocols = {
MIXED: 'mixed',
HTTP: 'http',
WIREGUARD: 'wireguard',
+ TUN: 'tun',
};
const SSMethods = {
@@ -1739,6 +1740,7 @@ Inbound.Settings = class extends XrayCommonClass {
case Protocols.MIXED: return new Inbound.MixedSettings(protocol);
case Protocols.HTTP: return new Inbound.HttpSettings(protocol);
case Protocols.WIREGUARD: return new Inbound.WireguardSettings(protocol);
+ case Protocols.TUN: return new Inbound.TunSettings(protocol);
default: return null;
}
}
@@ -1753,6 +1755,7 @@ Inbound.Settings = class extends XrayCommonClass {
case Protocols.MIXED: return Inbound.MixedSettings.fromJson(json);
case Protocols.HTTP: return Inbound.HttpSettings.fromJson(json);
case Protocols.WIREGUARD: return Inbound.WireguardSettings.fromJson(json);
+ case Protocols.TUN: return Inbound.TunSettings.fromJson(json);
default: return null;
}
}
@@ -2586,3 +2589,34 @@ Inbound.WireguardSettings.Peer = class extends XrayCommonClass {
};
}
};
+
+Inbound.TunSettings = class extends Inbound.Settings {
+ constructor(
+ protocol,
+ name = 'xray0',
+ mtu = 1500,
+ userLevel = 0
+ ) {
+ super(protocol);
+ this.name = name;
+ this.mtu = mtu;
+ this.userLevel = userLevel;
+ }
+
+ static fromJson(json = {}) {
+ return new Inbound.TunSettings(
+ Protocols.TUN,
+ json.name ?? 'xray0',
+ json.mtu ?? json.MTU ?? 1500,
+ json.userLevel ?? 0
+ );
+ }
+
+ toJson() {
+ return {
+ name: this.name || 'xray0',
+ mtu: this.mtu || 1500,
+ userLevel: this.userLevel || 0,
+ };
+ }
+};
diff --git a/web/html/form/inbound.html b/web/html/form/inbound.html
index fdd381b0..8b59dc28 100644
--- a/web/html/form/inbound.html
+++ b/web/html/form/inbound.html
@@ -1,6 +1,7 @@
{{define "form/inbound"}}
<!-- base -->
-<a-form :colon="false" :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }">
+<a-form :colon="false" :label-col="{ md: {span:8} }"
+ :wrapper-col="{ md: {span:14} }">
<a-form-item label='{{ i18n "enable" }}'>
<a-switch v-model="dbInbound.enable"></a-switch>
</a-form-item>
@@ -9,8 +10,10 @@
</a-form-item>
<a-form-item label='{{ i18n "protocol" }}'>
- <a-select v-model="inbound.protocol" :disabled="isEdit" :dropdown-class-name="themeSwitcher.currentTheme">
- <a-select-option v-for="p in Protocols" :key="p" :value="p">[[ p ]]</a-select-option>
+ <a-select v-model="inbound.protocol" :disabled="isEdit"
+ :dropdown-class-name="themeSwitcher.currentTheme">
+ <a-select-option v-for="p in Protocols" :key="p" :value="p">[[ p
+ ]]</a-select-option>
</a-select>
</a-form-item>
@@ -28,7 +31,8 @@
</a-form-item>
<a-form-item label='{{ i18n "pages.inbounds.port" }}'>
- <a-input-number v-model.number="inbound.port" :min="1" :max="65535"></a-input-number>
+ <a-input-number v-model.number="inbound.port" :min="1"
+ :max="65535"></a-input-number>
</a-form-item>
<a-form-item>
@@ -41,29 +45,42 @@
<a-icon type="question-circle"></a-icon>
</a-tooltip>
</template>
- <a-input-number v-model.number="dbInbound.totalGB" :min="0"></a-input-number>
+ <a-input-number v-model.number="dbInbound.totalGB"
+ :min="0"></a-input-number>
</a-form-item>
<a-form-item>
<template slot="label">
<a-tooltip>
<template slot="title">
- <span>{{ i18n "pages.inbounds.periodicTrafficResetDesc" }}</span>
- <br v-if="dbInbound.lastTrafficResetTime && dbInbound.lastTrafficResetTime > 0">
- <span v-if="dbInbound.lastTrafficResetTime && dbInbound.lastTrafficResetTime > 0">
+ <span>{{ i18n "pages.inbounds.periodicTrafficResetDesc"
+ }}</span>
+ <br
+ v-if="dbInbound.lastTrafficResetTime && dbInbound.lastTrafficResetTime > 0">
+ <span
+ v-if="dbInbound.lastTrafficResetTime && dbInbound.lastTrafficResetTime > 0">
<strong>{{ i18n "pages.inbounds.lastReset" }}:</strong>
- <span>[[ IntlUtil.formatDate(dbInbound.lastTrafficResetTime) ]]</span>
+ <span>[[
+ IntlUtil.formatDate(dbInbound.lastTrafficResetTime)
+ ]]</span>
</span>
</template>
{{ i18n "pages.inbounds.periodicTrafficResetTitle" }}
<a-icon type="question-circle"></a-icon>
</a-tooltip>
</template>
- <a-select v-model="dbInbound.trafficReset" :dropdown-class-name="themeSwitcher.currentTheme">
- <a-select-option value="never">{{ i18n "pages.inbounds.periodicTrafficReset.never" }}</a-select-option>
- <a-select-option value="daily">{{ i18n "pages.inbounds.periodicTrafficReset.daily" }}</a-select-option>
- <a-select-option value="weekly">{{ i18n "pages.inbounds.periodicTrafficReset.weekly" }}</a-select-option>
- <a-select-option value="monthly">{{ i18n "pages.inbounds.periodicTrafficReset.monthly" }}</a-select-option>
+ <a-select v-model="dbInbound.trafficReset"
+ :dropdown-class-name="themeSwitcher.currentTheme">
+ <a-select-option value="never">{{ i18n
+ "pages.inbounds.periodicTrafficReset.never" }}</a-select-option>
+ <a-select-option value="daily">{{ i18n
+ "pages.inbounds.periodicTrafficReset.daily" }}</a-select-option>
+ <a-select-option value="weekly">{{ i18n
+ "pages.inbounds.periodicTrafficReset.weekly"
+ }}</a-select-option>
+ <a-select-option value="monthly">{{ i18n
+ "pages.inbounds.periodicTrafficReset.monthly"
+ }}</a-select-option>
</a-select>
</a-form-item>
@@ -71,16 +88,20 @@
<template slot="label">
<a-tooltip>
<template slot="title">
- <span>{{ i18n "pages.inbounds.leaveBlankToNeverExpire" }}</span>
+ <span>{{ i18n "pages.inbounds.leaveBlankToNeverExpire"
+ }}</span>
</template>
{{ i18n "pages.inbounds.expireDate" }}
<a-icon type="question-circle"></a-icon>
</a-tooltip>
</template>
- <a-date-picker :style="{ width: '100%' }" v-if="datepicker == 'gregorian'" :show-time="{ format: 'HH:mm:ss' }"
- format="YYYY-MM-DD HH:mm:ss" :dropdown-class-name="themeSwitcher.currentTheme"
+ <a-date-picker :style="{ width: '100%' }"
+ v-if="datepicker == 'gregorian'" :show-time="{ format: 'HH:mm:ss' }"
+ format="YYYY-MM-DD HH:mm:ss"
+ :dropdown-class-name="themeSwitcher.currentTheme"
v-model="dbInbound._expiryTime"></a-date-picker>
- <a-persian-datepicker v-else placeholder='{{ i18n "pages.settings.datepickerPlaceholder" }}'
+ <a-persian-datepicker v-else
+ placeholder='{{ i18n "pages.settings.datepickerPlaceholder" }}'
value="dbInbound._expiryTime" v-model="dbInbound._expiryTime">
</a-persian-datepicker>
</a-form-item>
@@ -126,6 +147,11 @@
{{template "form/wireguard"}}
</template>
+<!-- tun -->
+<template v-if="inbound.protocol === Protocols.TUN">
+ {{template "form/tun"}}
+</template>
+
<!-- stream settings -->
<template v-if="inbound.canEnableStream()">
{{template "form/streamSettings"}}
diff --git a/web/html/form/protocol/tun.html b/web/html/form/protocol/tun.html
new file mode 100644
index 00000000..08f80620
--- /dev/null
+++ b/web/html/form/protocol/tun.html
@@ -0,0 +1,44 @@
+{{define "form/tun"}}
+<a-form :colon="false" :label-col="{ md: {span:8} }"
+ :wrapper-col="{ md: {span:14} }">
+ <a-form-item>
+ <template slot="label">
+ <a-tooltip>
+ <template slot="title">
+ <span>{{ i18n "pages.xray.tun.nameDesc" }}</span>
+ </template>
+ Interface Name
+ <a-icon type="question-circle"></a-icon>
+ </a-tooltip>
+ </template>
+ <a-input v-model.trim="inbound.settings.name"
+ placeholder="xray0"></a-input>
+ </a-form-item>
+ <a-form-item>
+ <template slot="label">
+ <a-tooltip>
+ <template slot="title">
+ <span>{{ i18n "pages.xray.tun.mtuDesc" }}</span>
+ </template>
+ MTU
+ <a-icon type="question-circle"></a-icon>
+ </a-tooltip>
+ </template>
+ <a-input-number v-model.number="inbound.settings.mtu" :min="1"
+ :max="9000" placeholder="1500"></a-input-number>
+ </a-form-item>
+ <a-form-item>
+ <template slot="label">
+ <a-tooltip>
+ <template slot="title">
+ <span>{{ i18n "pages.xray.tun.userLevelDesc" }}</span>
+ </template>
+ {{ i18n "pages.xray.tun.userLevel" }}
+ <a-icon type="question-circle"></a-icon>
+ </a-tooltip>
+ </template>
+ <a-input-number v-model.number="inbound.settings.userLevel" :min="0"
+ placeholder="0"></a-input-number>
+ </a-form-item>
+</a-form>
+{{end}}
diff --git a/web/translation/translate.ar_EG.toml b/web/translation/translate.ar_EG.toml
index fad0e872..06a3e937 100644
--- a/web/translation/translate.ar_EG.toml
+++ b/web/translation/translate.ar_EG.toml
@@ -531,6 +531,12 @@
"psk" = "المفتاح المشترك"
"domainStrategy" = "استراتيجية الدومين"
+[pages.xray.tun]
+"nameDesc" = "اسم واجهة TUN. القيمة الافتراضية هي 'xray0'"
+"mtuDesc" = "وحدة النقل الأقصى. الحد الأقصى لحجم حزم البيانات. القيمة الافتراضية هي 1500"
+"userLevel" = "مستوى المستخدم"
+"userLevelDesc" = "ستستخدم جميع الاتصالات المُرسلة عبر هذا الإدخال مستوى المستخدم هذا. القيمة الافتراضية هي 0"
+
[pages.xray.dns]
"enable" = "فعل DNS"
"enableDesc" = "فعل سيرفر DNS المدمج"
diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml
index b1ac6523..6da9185b 100644
--- a/web/translation/translate.en_US.toml
+++ b/web/translation/translate.en_US.toml
@@ -531,6 +531,12 @@
"psk" = "PreShared Key"
"domainStrategy" = "Domain Strategy"
+[pages.xray.tun]
+"nameDesc" = "The name of the TUN interface. Default is 'xray0'"
+"mtuDesc" = "Maximum Transmission Unit. The maximum size of data packets. Default is 1500"
+"userLevel" = "User Level"
+"userLevelDesc" = "All connections made through this inbound will use this user level. Default is 0"
+
[pages.xray.dns]
"enable" = "Enable DNS"
"enableDesc" = "Enable built-in DNS server"
diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml
index 203945c5..ccd5beff 100644
--- a/web/translation/translate.es_ES.toml
+++ b/web/translation/translate.es_ES.toml
@@ -531,6 +531,12 @@
"psk" = "Clave precompartida"
"domainStrategy" = "Estrategia de dominio"
+[pages.xray.tun]
+"nameDesc" = "El nombre de la interfaz TUN. El valor predeterminado es 'xray0'"
+"mtuDesc" = "Unidad Máxima de Transmisión. El tamaño máximo de los paquetes de datos. El valor predeterminado es 1500"
+"userLevel" = "Nivel de Usuario"
+"userLevelDesc" = "Todas las conexiones realizadas a través de este entrada utilizarán este nivel de usuario. El valor predeterminado es 0"
+
[pages.xray.dns]
"enable" = "Habilitar DNS"
"enableDesc" = "Habilitar servidor DNS incorporado"
diff --git a/web/translation/translate.fa_IR.toml b/web/translation/translate.fa_IR.toml
index 985158d7..a25484d1 100644
--- a/web/translation/translate.fa_IR.toml
+++ b/web/translation/translate.fa_IR.toml
@@ -531,6 +531,12 @@
"psk" = "کلید مشترک"
"domainStrategy" = "استراتژی حل دامنه"
+[pages.xray.tun]
+"nameDesc" = "نام رابط TUN. مقدار پیش‌فرض 'xray0' است"
+"mtuDesc" = "واحد انتقال حداکثر. بیشترین اندازه بسته‌های داده. مقدار پیش‌فرض 1500 است"
+"userLevel" = "سطح کاربر"
+"userLevelDesc" = "تمام اتصالات انجام‌شده از طریق این ورودی از این سطح کاربری استفاده خواهند کرد. مقدار پیش‌فرض 0 است"
+
[pages.xray.dns]
"enable" = "فعال کردن حل دامنه"
"enableDesc" = "سرور حل دامنه داخلی را فعال کنید"
diff --git a/web/translation/translate.id_ID.toml b/web/translation/translate.id_ID.toml
index fb1fe427..7bd7aae0 100644
--- a/web/translation/translate.id_ID.toml
+++ b/web/translation/translate.id_ID.toml
@@ -531,6 +531,12 @@
"psk" = "Kunci Pra-Bagi"
"domainStrategy" = "Strategi Domain"
+[pages.xray.tun]
+"nameDesc" = "Nama antarmuka TUN. Standar adalah 'xray0'"
+"mtuDesc" = "Unit Transmisi Maksimum. Ukuran maksimum paket data. Standar adalah 1500"
+"userLevel" = "Level Pengguna"
+"userLevelDesc" = "Semua koneksi yang dibuat melalui inbound ini akan menggunakan level pengguna ini. Standar adalah 0"
+
[pages.xray.dns]
"enable" = "Aktifkan DNS"
"enableDesc" = "Aktifkan server DNS bawaan"
diff --git a/web/translation/translate.ja_JP.toml b/web/translation/translate.ja_JP.toml
index 992573c4..bc9c294a 100644
--- a/web/translation/translate.ja_JP.toml
+++ b/web/translation/translate.ja_JP.toml
@@ -531,6 +531,12 @@
"psk" = "共有キー"
"domainStrategy" = "ドメイン戦略"
+[pages.xray.tun]
+"nameDesc" = "TUN インターフェースの名前。デフォルトは 'xray0' です"
+"mtuDesc" = "最大伝送単位。データパケットの最大サイズ。デフォルトは 1500 です"
+"userLevel" = "ユーザーレベル"
+"userLevelDesc" = "このインバウンドを通じて確立されたすべての接続は、このユーザーレベルを使用します。デフォルトは 0 です"
+
[pages.xray.dns]
"enable" = "DNSを有効にする"
"enableDesc" = "組み込みDNSサーバーを有効にする"
diff --git a/web/translation/translate.pt_BR.toml b/web/translation/translate.pt_BR.toml
index c44ac161..86b3b97b 100644
--- a/web/translation/translate.pt_BR.toml
+++ b/web/translation/translate.pt_BR.toml
@@ -531,6 +531,12 @@
"psk" = "Chave Pré-Compartilhada"
"domainStrategy" = "Estratégia de Domínio"
+[pages.xray.tun]
+"nameDesc" = "O nome da interface TUN. O padrão é 'xray0'"
+"mtuDesc" = "Unidade Máxima de Transmissão. O tamanho máximo dos pacotes de dados. O padrão é 1500"
+"userLevel" = "Nível do Usuário"
+"userLevelDesc" = "Todas as conexões feitas através deste inbound usarão este nível de usuário. O padrão é 0"
+
[pages.xray.dns]
"enable" = "Ativar DNS"
"enableDesc" = "Ativar o servidor DNS integrado"
diff --git a/web/translation/translate.ru_RU.toml b/web/translation/translate.ru_RU.toml
index 50f0c5b3..63fbbbb6 100644
--- a/web/translation/translate.ru_RU.toml
+++ b/web/translation/translate.ru_RU.toml
@@ -531,6 +531,12 @@
"psk" = "Общий ключ"
"domainStrategy" = "Стратегия домена"
+[pages.xray.tun]
+"nameDesc" = "Имя интерфейса TUN. Значение по умолчанию - 'xray0'"
+"mtuDesc" = "Максимальная единица передачи. Максимальный размер пакетов данных. Значение по умолчанию - 1500"
+"userLevel" = "Уровень пользователя"
+"userLevelDesc" = "Все соединения, установленные через этот входящий поток, будут использовать этот уровень пользователя. Значение по умолчанию - 0"
+
[pages.xray.dns]
"enable" = "Включить DNS"
"enableDesc" = "Включить встроенный DNS-сервер"
diff --git a/web/translation/translate.tr_TR.toml b/web/translation/translate.tr_TR.toml
index aa450f4a..25b8de9b 100644
--- a/web/translation/translate.tr_TR.toml
+++ b/web/translation/translate.tr_TR.toml
@@ -531,6 +531,12 @@
"psk" = "Ön Paylaşılan Anahtar"
"domainStrategy" = "Alan Adı Stratejisi"
+[pages.xray.tun]
+"nameDesc" = "TUN arabiriminin adı. Varsayılan değer 'xray0'dir"
+"mtuDesc" = "Maksimum İletim Birimi. Veri paketlerinin maksimum boyutu. Varsayılan değer 1500'dür"
+"userLevel" = "Kullanıcı Seviyesi"
+"userLevelDesc" = "Bu giriş yoluyla yapılan tüm bağlantılar bu kullanıcı seviyesini kullanacaktır. Varsayılan değer 0'dır"
+
[pages.xray.dns]
"enable" = "DNS'yi Etkinleştir"
"enableDesc" = "Dahili DNS sunucusunu etkinleştir"
diff --git a/web/translation/translate.uk_UA.toml b/web/translation/translate.uk_UA.toml
index c90957d0..c32854ae 100644
--- a/web/translation/translate.uk_UA.toml
+++ b/web/translation/translate.uk_UA.toml
@@ -531,6 +531,12 @@
"psk" = "Спільний ключ"
"domainStrategy" = "Стратегія домену"
+[pages.xray.tun]
+"nameDesc" = "Назва інтерфейсу TUN. Значення за замовчуванням - 'xray0'"
+"mtuDesc" = "Максимальна одиниця передачі. Максимальний розмір пакетів даних. Значення за замовчуванням - 1500"
+"userLevel" = "Рівень користувача"
+"userLevelDesc" = "Всі з'єднання, встановлені через цей вхід, використовуватимуть цей рівень користувача. Значення за замовчуванням - 0"
+
[pages.xray.dns]
"enable" = "Увімкнути DNS"
"enableDesc" = "Увімкнути вбудований DNS-сервер"
diff --git a/web/translation/translate.vi_VN.toml b/web/translation/translate.vi_VN.toml
index af880c05..1187548e 100644
--- a/web/translation/translate.vi_VN.toml
+++ b/web/translation/translate.vi_VN.toml
@@ -531,6 +531,12 @@
"psk" = "Khóa chia sẻ"
"domainStrategy" = "Chiến lược tên miền"
+[pages.xray.tun]
+"nameDesc" = "Tên của giao diện TUN. Giá trị mặc định là 'xray0'"
+"mtuDesc" = "Đơn vị Truyền Tối đa. Kích thước tối đa của các gói dữ liệu. Giá trị mặc định là 1500"
+"userLevel" = "Mức Người Dùng"
+"userLevelDesc" = "Tất cả các kết nối được thực hiện thông qua inbound này sẽ sử dụng mức người dùng này. Giá trị mặc định là 0"
+
[pages.xray.dns]
"enable" = "Kích hoạt DNS"
"enableDesc" = "Kích hoạt máy chủ DNS tích hợp"
diff --git a/web/translation/translate.zh_CN.toml b/web/translation/translate.zh_CN.toml
index 64d6120d..923cc21b 100644
--- a/web/translation/translate.zh_CN.toml
+++ b/web/translation/translate.zh_CN.toml
@@ -531,6 +531,12 @@
"psk" = "共享密钥"
"domainStrategy" = "域策略"
+[pages.xray.tun]
+"nameDesc" = "TUN 接口的名称。默认值为 'xray0'"
+"mtuDesc" = "最大传输单元。数据包的最大大小。默认值为 1500"
+"userLevel" = "用户级别"
+"userLevelDesc" = "通过此入站的所有连接都将使用此用户级别。默认值为 0"
+
[pages.xray.dns]
"enable" = "启用 DNS"
"enableDesc" = "启用内置 DNS 服务器"
diff --git a/web/translation/translate.zh_TW.toml b/web/translation/translate.zh_TW.toml
index 9c5c956f..df32d742 100644
--- a/web/translation/translate.zh_TW.toml
+++ b/web/translation/translate.zh_TW.toml
@@ -531,6 +531,12 @@
"psk" = "共享金鑰"
"domainStrategy" = "域策略"
+[pages.xray.tun]
+"nameDesc" = "TUN 介面的名稱。預設值為 'xray0'"
+"mtuDesc" = "最大傳輸單元。資料包的最大大小。預設值為 1500"
+"userLevel" = "用戶級別"
+"userLevelDesc" = "通過此入站的所有連接都將使用此用戶級別。預設值為 0"
+
[pages.xray.dns]
"enable" = "啟用 DNS"
"enableDesc" = "啟用內建 DNS 伺服器"