diff options
| author | MHSanaei <ho3ein.sanaei@gmail.com> | 2026-01-18 18:47:01 +0300 |
|---|---|---|
| committer | MHSanaei <ho3ein.sanaei@gmail.com> | 2026-01-18 18:47:01 +0300 |
| commit | 88eab032be7197dd87d0b4c9864af4b6b4fd820b (patch) | |
| tree | 65ac15d0025541adbe53e9f9088e19104851f9d4 | |
| parent | 20ec863f51f4fee88b35c3eaaf370a700b78109e (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.js | 34 | ||||
| -rw-r--r-- | web/html/form/inbound.html | 62 | ||||
| -rw-r--r-- | web/html/form/protocol/tun.html | 44 | ||||
| -rw-r--r-- | web/translation/translate.ar_EG.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.en_US.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.es_ES.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.fa_IR.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.id_ID.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.ja_JP.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.pt_BR.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.ru_RU.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.tr_TR.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.uk_UA.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.vi_VN.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.zh_CN.toml | 6 | ||||
| -rw-r--r-- | web/translation/translate.zh_TW.toml | 6 |
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 伺服器" |
