diff --git a/frontend/src/pages/xray/DnsServerModal.vue b/frontend/src/pages/xray/DnsServerModal.vue
new file mode 100644
index 00000000..ca85115d
--- /dev/null
+++ b/frontend/src/pages/xray/DnsServerModal.vue
@@ -0,0 +1,168 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ s }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/pages/xray/DnsTab.vue b/frontend/src/pages/xray/DnsTab.vue
index e20c9a90..522d86b9 100644
--- a/frontend/src/pages/xray/DnsTab.vue
+++ b/frontend/src/pages/xray/DnsTab.vue
@@ -1,27 +1,46 @@
-
-
-
-
-
+
+
+
+
+ {{ t('pages.xray.dns.enable') }}
+ {{ t('pages.xray.dns.enableDesc') }}
+
+
+
+
-
-
-
-
-
+
+
+ {{ t('pages.xray.dns.tag') }}
+ {{ t('pages.xray.dns.tagDesc') }}
+
+
+
+
-
-
-
+
+ {{ t('pages.xray.dns.clientIp') }}
+ {{ t('pages.xray.dns.clientIpDesc') }}
+
+
+
+
+
+
+ {{ t('pages.xray.dns.strategy') }}
+ {{ t('pages.xray.dns.strategyDesc') }}
+
+
+ {{ s }}
+
+
+
+
+
+ {{ t('pages.xray.dns.disableCache') }}
+ {{ t('pages.xray.dns.disableCacheDesc') }}
+
+
+
+
+
+
+ {{ t('pages.xray.dns.disableFallback') }}
+ {{ t('pages.xray.dns.disableFallbackDesc') }}
+
+
+
+
+
+
+ {{ t('pages.xray.dns.disableFallbackIfMatch') }}
+ {{ t('pages.xray.dns.disableFallbackIfMatchDesc') }}
+
+
+
+
+
+
+ {{ t('pages.xray.dns.enableParallelQuery') }}
+ {{ t('pages.xray.dns.enableParallelQueryDesc') }}
+
+
+
+
+
+
+ {{ t('pages.xray.dns.useSystemHosts') }}
+ {{ t('pages.xray.dns.useSystemHostsDesc') }}
+
+
+
+
-
-
+
+
+
+
+
+
+
+ {{ t('pages.xray.dns.add') }}
+
+
+
+
+
+
+
+ {{ t('pages.xray.dns.add') }}
+
+
+
+
+
+ {{ index + 1 }}
+
+
+
+
+
+
+
+ {{ t('edit') }}
+
+
+ {{ t('delete') }}
+
+
+
+
+
+
+
+ {{ addrFor(record.server) }}
+
+
+ {{ domainsFor(record.server) }}
+
+
+ {{ expectIPsFor(record.server) }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('pages.xray.fakedns.add') }}
+
+
+
+
+
+
+
+ {{ t('pages.xray.fakedns.add') }}
+
+
+
+
+
+ {{ index + 1 }}
+
+
+
+
+
+
+ updateFakednsField(index, 'ipPool', e.target.value)"
+ />
+
+
+ updateFakednsField(index, 'poolSize', v)"
+ />
+
+
+
+
+
+
+
+
+