diff --git a/frontend/src/components/FinalMaskForm.vue b/frontend/src/components/FinalMaskForm.vue
new file mode 100644
index 00000000..23856b90
--- /dev/null
+++ b/frontend/src/components/FinalMaskForm.vue
@@ -0,0 +1,544 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TCP Mask {{ mIdx + 1 }}
+
+
+
+
+ changeMaskType(mask, t)">
+ Fragment
+ Header Custom
+ Sudoku
+
+
+
+
+
+
+
+ tlshello
+ 1-3
+ 1-5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Clients Group {{ gi + 1 }}
+
+
+
+
+ changeItemType(item, t)">
+ Array
+ String
+ Hex
+ Base64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Servers Group {{ gi + 1 }}
+
+
+
+
+ changeItemType(item, t)">
+ Array
+ String
+ Hex
+ Base64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ UDP Mask {{ mIdx + 1 }}
+
+
+
+
+ changeUdpMaskType(mask, t)">
+
+ Salamander (Hysteria2)
+
+
+ mKCP AES-128-GCM
+ Header DNS
+ Header DTLS 1.2
+ Header SRTP
+ Header uTP
+ Header WeChat Video
+ Header WireGuard
+ mKCP Original
+ xDNS
+ xICMP
+ Header Custom
+ Noise
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Noise {{ ni + 1 }}
+
+
+
+ changeItemType(n, t)">
+ Array
+ String
+ Hex
+ Base64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Client {{ ci + 1 }}
+
+
+
+ changeItemType(c, t)">
+ Array
+ String
+ Hex
+ Base64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Server {{ si + 1 }}
+
+
+
+ changeItemType(s, t)">
+ Array
+ String
+ Hex
+ Base64
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Reno
+ BBR
+ Brutal
+ Force Brutal
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/pages/inbounds/InboundFormModal.vue b/frontend/src/pages/inbounds/InboundFormModal.vue
index e8f54af6..fb38f197 100644
--- a/frontend/src/pages/inbounds/InboundFormModal.vue
+++ b/frontend/src/pages/inbounds/InboundFormModal.vue
@@ -29,6 +29,7 @@ import {
MODE_OPTION,
} from '@/models/inbound.js';
import { DBInbound } from '@/models/dbinbound.js';
+import FinalMaskForm from '@/components/FinalMaskForm.vue';
const { t } = useI18n();
@@ -1509,6 +1510,9 @@ watch(
+
+
+
@@ -1557,7 +1561,7 @@ watch(
diff --git a/frontend/src/pages/xray/OutboundFormModal.vue b/frontend/src/pages/xray/OutboundFormModal.vue
index bd4f3eb2..080b9400 100644
--- a/frontend/src/pages/xray/OutboundFormModal.vue
+++ b/frontend/src/pages/xray/OutboundFormModal.vue
@@ -20,6 +20,7 @@ import {
MODE_OPTION,
DNSRuleActions,
} from '@/models/outbound.js';
+import FinalMaskForm from '@/components/FinalMaskForm.vue';
const { t } = useI18n();
@@ -27,7 +28,7 @@ const { t } = useI18n();
// web/html/form/outbound.html. Covers every protocol + transport
// combination the legacy panel exposes; the JSON tab still lets
// power-users hand-edit fields the structured form doesn't surface
-// (deep finalmask/quic tuning, reverse-sniffing, etc.).
+// (reverse-sniffing, exotic outbound DNS rules, etc.).
const props = defineProps({
open: { type: Boolean, default: false },
@@ -740,6 +741,9 @@ function regenerateWgKeys() {
+
+
+