update 2025-04-12 14:15:39

This commit is contained in:
kenzok8 2025-04-12 14:15:39 +08:00
parent 9071e04781
commit ff5a8c05ff
15 changed files with 907 additions and 803 deletions

View File

@ -1,6 +1,6 @@
include $(TOPDIR)/rules.mk
PKG_VERSION:=1.21.2
PKG_VERSION:=1.22.0
LUCI_TITLE:=LuCI Support for nikki
LUCI_DEPENDS:=+luci-base +nikki

View File

@ -37,7 +37,8 @@ return view.extend({
m = new form.Map('nikki', _('Nikki'), `${_('Transparent Proxy with Mihomo on OpenWrt.')} <a href="https://github.com/nikkinikki-org/OpenWrt-nikki/wiki" target="_blank">${_('How To Use')}</a>`);
s = m.section(form.NamedSection, 'status', 'status', _('Status'));
s = m.section(form.TableSection, 'status', _('Status'));
s.anonymous = true;
o = s.option(form.Value, '_app_version', _('App Version'));
o.readonly = true;
@ -63,28 +64,28 @@ return view.extend({
});
});
o = s.option(form.Button, 'reload', '-');
o = s.option(form.Button, 'reload');
o.inputstyle = 'action';
o.inputtitle = _('Reload Service');
o.onclick = function () {
return nikki.reload();
};
o = s.option(form.Button, 'restart', '-');
o = s.option(form.Button, 'restart');
o.inputstyle = 'negative';
o.inputtitle = _('Restart Service');
o.onclick = function () {
return nikki.restart();
};
o = s.option(form.Button, 'update_dashboard', '-');
o = s.option(form.Button, 'update_dashboard');
o.inputstyle = 'positive';
o.inputtitle = _('Update Dashboard');
o.onclick = function () {
return nikki.updateDashboard();
};
o = s.option(form.Button, 'open_dashboard', '-');
o = s.option(form.Button, 'open_dashboard');
o.inputtitle = _('Open Dashboard');
o.onclick = function () {
return nikki.openDashboard();

View File

@ -29,8 +29,8 @@ return view.extend({
o = s.taboption('app_log', form.Button, 'clear_app_log');
o.inputstyle = 'negative';
o.inputtitle = _('Clear Log');
o.onclick = function () {
m.lookupOption('nikki.log._app_log')[0].getUIElement('log').setValue('');
o.onclick = function (_, section_id) {
m.lookupOption('_app_log', section_id)[0].getUIElement(section_id).setValue('');
return nikki.clearAppLog();
};
@ -52,8 +52,8 @@ return view.extend({
o = s.taboption('app_log', form.Button, 'scroll_app_log_to_bottom');
o.inputtitle = _('Scroll To Bottom');
o.onclick = function () {
const element = m.lookupOption('nikki.log._app_log')[0].getUIElement('log').node.firstChild;
o.onclick = function (_, section_id) {
const element = m.lookupOption('_app_log', section_id)[0].getUIElement(section_id).node.firstChild;
element.scrollTop = element.scrollHeight;
};
@ -62,8 +62,8 @@ return view.extend({
o = s.taboption('core_log', form.Button, 'clear_core_log');
o.inputstyle = 'negative';
o.inputtitle = _('Clear Log');
o.onclick = function () {
m.lookupOption('nikki.log._core_log')[0].getUIElement('log').setValue('');
o.onclick = function (_, section_id) {
m.lookupOption('_core_log', section_id)[0].getUIElement(section_id).setValue('');
return nikki.clearCoreLog();
};
@ -85,8 +85,8 @@ return view.extend({
o = s.taboption('core_log', form.Button, 'scroll_core_log_to_bottom');
o.inputtitle = _('Scroll To Bottom');
o.onclick = function () {
const element = m.lookupOption('nikki.log._core_log')[0].getUIElement('log').node.firstChild;
o.onclick = function (_, section_id) {
const element = m.lookupOption('_core_log', section_id)[0].getUIElement(section_id).node.firstChild;
element.scrollTop = element.scrollHeight;
};

View File

@ -61,7 +61,7 @@ return view.extend({
o.value(network.getName());
}
o = s.taboption('general', form.ListValue, 'ipv6', _('IPv6'));
o = s.taboption('general', form.ListValue, 'ipv6', 'IPv6');
o.optional = true;
o.placeholder = _('Unmodified');
o.value('0', _('Disable'));
@ -233,7 +233,7 @@ return view.extend({
o.placeholder = _('Unmodified');
o.rmempty = false;
o = s.taboption('dns', form.ListValue, 'dns_ipv6', _('IPv6'));
o = s.taboption('dns', form.ListValue, 'dns_ipv6', 'IPv6');
o.optional = true;
o.placeholder = _('Unmodified');
o.value('0', _('Disable'));
@ -309,7 +309,7 @@ return view.extend({
so = o.subsection.option(form.Value, 'domain_name', _('Domain Name'));
so.rmempty = false;
so = o.subsection.option(form.DynamicList, 'ip', _('IP'));
so = o.subsection.option(form.DynamicList, 'ip', 'IP');
o = s.taboption('dns', form.Flag, 'dns_nameserver', _('Overwrite Nameserver'));
o.rmempty = false;

View File

@ -22,104 +22,87 @@ return view.extend({
const groups = data[3]?.groups ?? [];
const cgroups = data[3]?.cgroups ?? [];
let m, s, o;
let m, s, o, so;
m = new form.Map('nikki');
s = m.section(form.NamedSection, 'proxy', 'proxy', _('Proxy Config'));
s.tab('transparent_proxy', _('Transparent Proxy'));
s.tab('proxy', _('Proxy Config'));
o = s.taboption('transparent_proxy', form.Flag, 'transparent_proxy', _('Enable'));
o = s.taboption('proxy', form.Flag, 'enabled', _('Enable'));
o.rmempty = false;
o = s.taboption('transparent_proxy', form.ListValue, 'tcp_transparent_proxy_mode', _('TCP Proxy Mode'));
o = s.taboption('proxy', form.ListValue, 'tcp_mode', _('TCP Mode'));
o.optional = true;
o.placeholder = _('Disable');
o.value('redirect', _('Redirect Mode'));
o.value('tproxy', _('TPROXY Mode'));
o.value('tun', _('TUN Mode'));
o = s.taboption('transparent_proxy', form.ListValue, 'udp_transparent_proxy_mode', _('UDP Proxy Mode'));
o = s.taboption('proxy', form.ListValue, 'udp_mode', _('UDP Mode'));
o.optional = true;
o.placeholder = _('Disable');
o.value('tproxy', _('TPROXY Mode'));
o.value('tun', _('TUN Mode'));
o = s.taboption('transparent_proxy', form.Flag, 'ipv4_dns_hijack', _('IPv4 DNS Hijack'));
o = s.taboption('proxy', form.Flag, 'ipv4_dns_hijack', _('IPv4 DNS Hijack'));
o.rmempty = false;
o = s.taboption('transparent_proxy', form.Flag, 'ipv6_dns_hijack', _('IPv6 DNS Hijack'));
o = s.taboption('proxy', form.Flag, 'ipv6_dns_hijack', _('IPv6 DNS Hijack'));
o.rmempty = false;
o = s.taboption('transparent_proxy', form.Flag, 'ipv4_proxy', _('IPv4 Proxy'));
o = s.taboption('proxy', form.Flag, 'ipv4_proxy', _('IPv4 Proxy'));
o.rmempty = false;
o = s.taboption('transparent_proxy', form.Flag, 'ipv6_proxy', _('IPv6 Proxy'));
o = s.taboption('proxy', form.Flag, 'ipv6_proxy', _('IPv6 Proxy'));
o.rmempty = false;
o = s.taboption('transparent_proxy', form.Flag, 'fake_ip_ping_hijack', _('Fake-IP Ping Hijack'));
o = s.taboption('proxy', form.Flag, 'fake_ip_ping_hijack', _('Fake-IP Ping Hijack'));
o.rmempty = false;
o = s.taboption('transparent_proxy', form.Flag, 'router_proxy', _('Router Proxy'));
s.tab('router', _('Router Proxy'));
o = s.taboption('router', form.Flag, 'router_proxy', _('Enable'));
o.rmempty = false;
o = s.taboption('transparent_proxy', form.Flag, 'lan_proxy', _('Lan Proxy'));
o.rmempty = false;
o = s.taboption('router', form.SectionValue, '_router_access_control', form.TableSection, 'router_access_control', _('Access Control'));
s.tab('access_control', _('Access Control'));
o.subsection.addremove = true;
o.subsection.anonymous = true;
o.subsection.sortable = true;
o = s.taboption('access_control', form.ListValue, 'access_control_mode', _('Mode'));
o.value('all', _('All Mode'));
o.value('allow', _('Allow Mode'));
o.value('block', _('Block Mode'));
so = o.subsection.option(form.Flag, 'enabled', _('Enable'));
so.default = '1';
so.rmempty = false;
o = s.taboption('access_control', form.DynamicList, 'acl_ip', 'IP');
o.datatype = 'ipmask4';
o.retain = true;
o.depends('access_control_mode', 'allow');
o.depends('access_control_mode', 'block');
so = o.subsection.option(form.DynamicList, 'user', _('User'));
for (const mac in hosts) {
const host = hosts[mac];
for (const ip of host.ipaddrs) {
const hint = host.name ?? mac;
o.value(ip, hint ? '%s (%s)'.format(ip, hint) : ip);
};
for (const user of users) {
so.value(user);
};
o = s.taboption('access_control', form.DynamicList, 'acl_ip6', 'IP6');
o.datatype = 'ipmask6';
o.retain = true;
o.depends('access_control_mode', 'allow');
o.depends('access_control_mode', 'block');
so = o.subsection.option(form.DynamicList, 'group', _('Group'));
for (const mac in hosts) {
const host = hosts[mac];
for (const ip of host.ip6addrs) {
const hint = host.name ?? mac;
o.value(ip, hint ? '%s (%s)'.format(ip, hint) : ip);
};
for (const group of groups) {
so.value(group);
};
o = s.taboption('access_control', form.DynamicList, 'acl_mac', 'MAC');
o.datatype = 'macaddr';
o.retain = true;
o.depends('access_control_mode', 'allow');
o.depends('access_control_mode', 'block');
so = o.subsection.option(form.DynamicList, 'cgroup', _('CGroup'));
for (const mac in hosts) {
const host = hosts[mac];
const hint = host.name ?? host.ipaddrs[0];
o.value(mac, hint ? '%s (%s)'.format(mac, hint) : mac);
for (const cgroup of cgroups) {
so.value(cgroup);
};
o = s.taboption('access_control', form.DynamicList, 'acl_interface', _('Interface'));
o.multiple = true;
o.optional = true;
o.retain = true;
o.depends('access_control_mode', 'allow');
o.depends('access_control_mode', 'block');
so = o.subsection.option(form.Flag, 'proxy', _('Proxy'));
so.rmempty = false;
s.tab('lan', _('LAN Proxy'));
o = s.taboption('lan', form.Flag, 'lan_proxy', _('Enable'));
o = s.taboption('lan', form.DynamicList, 'lan_inbound_interface', _('Inbound Interface'));
o.rmempty = false;
for (const network of networks) {
if (network.getName() === 'loopback') {
@ -128,26 +111,49 @@ return view.extend({
o.value(network.getName());
}
o = s.taboption('lan', form.SectionValue, '_lan_access_control', form.TableSection, 'lan_access_control', _('Access Control'));
o.subsection.addremove = true;
o.subsection.anonymous = true;
o.subsection.sortable = true;
so = o.subsection.option(form.Flag, 'enabled', _('Enable'));
so.default = '1';
so.rmempty = false;
so = o.subsection.option(form.DynamicList, 'ip', 'IP');
for (const mac in hosts) {
const host = hosts[mac];
for (const ip of host.ipaddrs) {
const hint = host.name ?? mac;
so.value(ip, hint ? '%s (%s)'.format(ip, hint) : ip);
};
};
so = o.subsection.option(form.DynamicList, 'ip6', 'IP6');
for (const mac in hosts) {
const host = hosts[mac];
for (const ip of host.ip6addrs) {
const hint = host.name ?? mac;
so.value(ip, hint ? '%s (%s)'.format(ip, hint) : ip);
};
};
so = o.subsection.option(form.DynamicList, 'mac', 'MAC');
for (const mac in hosts) {
const host = hosts[mac];
const hint = host.name ?? host.ipaddrs[0];
so.value(mac, hint ? '%s (%s)'.format(mac, hint) : mac);
};
so = o.subsection.option(form.Flag, 'proxy', _('Proxy'));
so.rmempty = false;
s.tab('bypass', _('Bypass'));
o = s.taboption('bypass', form.DynamicList, 'bypass_user', _('Bypass User'));
for (const user of users) {
o.value(user);
};
o = s.taboption('bypass', form.DynamicList, 'bypass_group', _('Bypass Group'));
for (const group of groups) {
o.value(group);
};
o = s.taboption('bypass', form.DynamicList, 'bypass_cgroup', _('Bypass cgroup'));
for (const cgroup of cgroups) {
o.value(cgroup);
};
o = s.taboption('bypass', form.Flag, 'bypass_china_mainland_ip', _('Bypass China Mainland IP'));
o.rmempty = false;

View File

@ -1,33 +1,29 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:120
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:121
msgid "API Listen"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:125
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:126
msgid "API Secret"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:70
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:69
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:114
msgid "Access Control"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:73
msgid "All Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:159
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:164
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:162
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:167
msgid "All Port"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:137
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:138
msgid "Allow Lan"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:262
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:74
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:263
msgid "Allow Mode"
msgstr ""
@ -44,45 +40,36 @@ msgstr ""
msgid "App Version"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:485
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:486
msgid "Append Rule"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:416
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:417
msgid "Append Rule Provider"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:472
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:473
msgid "Behavior"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:261
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:75
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:262
msgid "Block Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:131
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:155
msgid "Bypass"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:154
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:157
msgid "Bypass China Mainland IP"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:167
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:170
msgid "Bypass DSCP"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:140
msgid "Bypass Group"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:133
msgid "Bypass User"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:147
msgid "Bypass cgroup"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:91
msgid "CGroup"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:29
@ -98,8 +85,8 @@ msgstr ""
msgid "Clear Log"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:160
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:165
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:163
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:168
msgid "Commonly Used Port"
msgstr ""
@ -123,15 +110,15 @@ msgstr ""
msgid "Cron Expression"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:228
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:229
msgid "DNS Config"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:230
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:231
msgid "DNS Listen"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:241
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:242
msgid "DNS Mode"
msgstr ""
@ -139,27 +126,27 @@ msgstr ""
msgid "Debug Log"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:507
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:508
msgid "Destination IP"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:511
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:512
msgid "Destination IP Geo"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:508
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:509
msgid "Destination Port"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:157
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:160
msgid "Destination TCP Port to Proxy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:162
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:165
msgid "Destination UDP Port to Proxy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:188
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:189
msgid "Device Name"
msgstr ""
@ -171,20 +158,20 @@ msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:73
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:79
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:85
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:132
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:140
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:206
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:216
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:238
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:267
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:273
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:279
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:285
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:291
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:360
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:366
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:372
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:133
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:141
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:207
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:217
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:239
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:268
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:274
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:280
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:286
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:292
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:361
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:367
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:373
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:559
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:38
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:45
msgid "Disable"
@ -210,60 +197,60 @@ msgstr ""
msgid "Disable TCP Keep Alive"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:276
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:277
msgid "DoH Prefer HTTP/3"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:308
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:503
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:309
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:504
msgid "Domain Name"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:510
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:511
msgid "Domain Name Geo"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:505
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506
msgid "Domain Name Keyword"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:507
msgid "Domain Name Regex"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:504
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:505
msgid "Domain Name Suffix"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:168
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:169
msgid "Edit Authentications"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:222
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:223
msgid "Edit DNS Hijacks"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:254
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:255
msgid "Edit Fake-IP Filters"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:297
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:298
msgid "Edit Hosts"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:339
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:340
msgid "Edit Nameserver Policies"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:316
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:317
msgid "Edit Nameservers"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:419
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:420
msgid "Edit Rule Providers"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:488
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:489
msgid "Edit Rules"
msgstr ""
@ -281,34 +268,38 @@ msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:74
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:80
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:86
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:133
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:141
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:176
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:207
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:217
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:239
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:268
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:274
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:280
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:286
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:292
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:305
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:324
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:347
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:357
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:361
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:367
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:373
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:399
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:427
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:496
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:559
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:567
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:134
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:142
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:177
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:208
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:218
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:240
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:269
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:275
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:281
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:287
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:293
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:306
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:325
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:348
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:358
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:362
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:368
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:374
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:400
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:428
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:497
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:560
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:568
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:33
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:66
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:75
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:102
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:120
msgid "Enable"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:213
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:214
msgid "Endpoint Independent NAT"
msgstr ""
@ -320,11 +311,11 @@ msgstr ""
msgid "External Control Config"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:264
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:265
msgid "Fake-IP Cache"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:258
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:259
msgid "Fake-IP Filter Mode"
msgstr ""
@ -332,7 +323,7 @@ msgstr ""
msgid "Fake-IP Ping Hijack"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:246
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:247
msgid "Fake-IP Range"
msgstr ""
@ -340,15 +331,15 @@ msgstr ""
msgid "Fast Reload"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:466
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:467
msgid "File Format"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:460
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:461
msgid "File Path"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:454
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:455
msgid "File Size Limit"
msgstr ""
@ -369,15 +360,15 @@ msgstr ""
msgid "File:"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:378
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:379
msgid "Force Sniff Domain Name"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:203
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:204
msgid "GSO"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:209
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:210
msgid "GSO Max Size"
msgstr ""
@ -389,39 +380,39 @@ msgstr ""
msgid "Generate & Download"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:537
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:538
msgid "GeoData Loader"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:531
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:532
msgid "GeoIP Format"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:552
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553
msgid "GeoIP(ASN) Url"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:549
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550
msgid "GeoIP(DAT) Url"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:546
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:547
msgid "GeoIP(MMDB) Url"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:543
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:544
msgid "GeoSite Url"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:555
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:556
msgid "GeoX Auto Update"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:529
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:530
msgid "GeoX Config"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:561
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:562
msgid "GeoX Update Interval"
msgstr ""
@ -437,7 +428,11 @@ msgstr ""
msgid "Grant access to nikki procedures"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:143
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:85
msgid "Group"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:144
msgid "HTTP Port"
msgstr ""
@ -445,10 +440,6 @@ msgstr ""
msgid "How To Use"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:311
msgid "IP"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:49
msgid "IPv4 DNS Hijack"
msgstr ""
@ -457,11 +448,6 @@ msgstr ""
msgid "IPv4 Proxy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:64
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:235
msgid "IPv6"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:52
msgid "IPv6 DNS Hijack"
msgstr ""
@ -470,20 +456,20 @@ msgstr ""
msgid "IPv6 Proxy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:385
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:386
msgid "Ignore Sniff Domain Name"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:135
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:136
msgid "Inbound Config"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:117
msgid "Interface"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:104
msgid "Inbound Interface"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:67
msgid "Lan Proxy"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:100
msgid "LAN Proxy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:82
@ -499,7 +485,7 @@ msgstr ""
msgid "Log Level"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:199
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:200
msgid "MTU"
msgstr ""
@ -507,16 +493,16 @@ msgstr ""
msgid "Match Process"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:350
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:513
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:351
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:514
msgid "Matcher"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:541
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:542
msgid "Memory Conservative Loader"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:151
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:152
msgid "Mixed Port"
msgstr ""
@ -524,7 +510,7 @@ msgstr ""
msgid "Mixin Config"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:565
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:566
msgid "Mixin File Content"
msgstr ""
@ -533,16 +519,15 @@ msgid "Mixin Option"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:39
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:72
msgid "Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:433
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:434
msgid "Name"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:334
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:353
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:335
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:354
msgid "Nameserver"
msgstr ""
@ -551,12 +536,12 @@ msgstr ""
msgid "Nikki"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:523
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:524
msgid "No Resolve"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:447
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:516
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:448
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:517
msgid "Node"
msgstr ""
@ -572,55 +557,55 @@ msgstr ""
msgid "Outbound Interface"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:165
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:166
msgid "Overwrite Authentication"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:219
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:220
msgid "Overwrite DNS Hijack"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:411
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:412
msgid "Overwrite Destination"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:251
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:252
msgid "Overwrite Fake-IP Filter"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:375
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:376
msgid "Overwrite Force Sniff Domain Name"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:294
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:295
msgid "Overwrite Hosts"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:382
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:383
msgid "Overwrite Ignore Sniff Domain Name"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:313
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:314
msgid "Overwrite Nameserver"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:336
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:337
msgid "Overwrite Nameserver Policy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:389
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:390
msgid "Overwrite Sniff By Protocol"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:182
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:183
msgid "Password"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:567
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:568
msgid "Please go to the editor tab to edit the file for mixin"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:408
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:409
msgid "Port"
msgstr ""
@ -628,7 +613,7 @@ msgstr ""
msgid "Prefer"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:509
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:510
msgid "Process Name"
msgstr ""
@ -641,11 +626,17 @@ msgstr ""
msgid "Profile for Startup"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:402
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:403
msgid "Protocol"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:97
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:152
msgid "Proxy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:29
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:31
#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:37
msgid "Proxy Config"
msgstr ""
@ -662,7 +653,7 @@ msgstr ""
msgid "Redirect Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:155
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:156
msgid "Redirect Port"
msgstr ""
@ -674,7 +665,7 @@ msgstr ""
msgid "Remote"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:270
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:271
msgid "Respect Rules"
msgstr ""
@ -686,7 +677,7 @@ msgstr ""
msgid "Router Proxy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:414
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:415
msgid "Rule Config"
msgstr ""
@ -698,7 +689,7 @@ msgstr ""
msgid "Rule Provider:"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:502
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:503
msgid "Rule Set"
msgstr ""
@ -706,11 +697,11 @@ msgstr ""
msgid "Running"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:147
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:148
msgid "SOCKS Port"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:129
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:130
msgid "Save Proxy Selection"
msgstr ""
@ -723,27 +714,27 @@ msgstr ""
msgid "Scroll To Bottom"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:392
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:393
msgid "Sniff By Protocol"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:369
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:370
msgid "Sniff Pure IP"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:363
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:364
msgid "Sniff Redir-Host"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:355
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:356
msgid "Sniffer Config"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:192
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:193
msgid "Stack"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:540
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:541
msgid "Standard Loader"
msgstr ""
@ -785,7 +776,7 @@ msgid "TCP Keep Alive Interval"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:36
msgid "TCP Proxy Mode"
msgid "TCP Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:40
@ -793,11 +784,11 @@ msgstr ""
msgid "TPROXY Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:160
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:161
msgid "TPROXY Port"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:186
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:187
msgid "TUN Config"
msgstr ""
@ -814,22 +805,18 @@ msgstr ""
msgid "Total"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:31
msgid "Transparent Proxy"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38
msgid "Transparent Proxy with Mihomo on OpenWrt."
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:327
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:436
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:500
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:328
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:437
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:501
msgid "Type"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:43
msgid "UDP Proxy Mode"
msgid "UDP Mode"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:110
@ -862,42 +849,42 @@ msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:107
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:111
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:114
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:122
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:127
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:131
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:139
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:145
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:149
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:153
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:157
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:162
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:189
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:194
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:201
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:205
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:211
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:215
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:232
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:237
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:242
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:248
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:260
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:266
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:272
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:278
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:284
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:290
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:359
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:365
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:371
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:533
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:539
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:544
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:547
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:557
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:563
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:123
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:128
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:132
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:140
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:146
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:150
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:154
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:158
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:163
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:190
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:195
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:202
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:206
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:212
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:216
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:233
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:238
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:243
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:249
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:261
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:267
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:273
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:279
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:285
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:291
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:360
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:366
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:372
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:534
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:540
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:545
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:548
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:551
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:554
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:564
msgid "Unmodified"
msgstr ""
@ -913,7 +900,7 @@ msgstr ""
msgid "Update Dashboard"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:479
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:480
msgid "Update Interval"
msgstr ""
@ -921,15 +908,15 @@ msgstr ""
msgid "Upload Profile"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:442
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:443
msgid "Url"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:288
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:289
msgid "Use Hosts"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:282
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:283
msgid "Use System Hosts"
msgstr ""
@ -937,10 +924,14 @@ msgstr ""
msgid "Used"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:79
msgid "User"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:70
msgid "User Agent"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:179
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:180
msgid "Username"
msgstr ""

View File

@ -8,33 +8,29 @@ msgstr ""
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:120
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:121
msgid "API Listen"
msgstr "API 监听"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:125
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:126
msgid "API Secret"
msgstr "API 密钥"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:70
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:69
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:114
msgid "Access Control"
msgstr "访问控制"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:73
msgid "All Mode"
msgstr "全部模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:159
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:164
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:162
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:167
msgid "All Port"
msgstr "全部端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:137
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:138
msgid "Allow Lan"
msgstr "允许局域网访问"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:262
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:74
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:263
msgid "Allow Mode"
msgstr "白名单模式"
@ -51,46 +47,37 @@ msgstr "插件日志"
msgid "App Version"
msgstr "插件版本"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:485
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:486
msgid "Append Rule"
msgstr "追加规则"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:416
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:417
msgid "Append Rule Provider"
msgstr "追加规则提供者"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:472
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:473
msgid "Behavior"
msgstr "行为"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:261
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:75
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:262
msgid "Block Mode"
msgstr "黑名单模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:131
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:155
msgid "Bypass"
msgstr "绕过"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:154
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:157
msgid "Bypass China Mainland IP"
msgstr "绕过中国大陆 IP"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:167
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:170
msgid "Bypass DSCP"
msgstr "绕过 DSCP"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:140
msgid "Bypass Group"
msgstr "绕过用户组"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:133
msgid "Bypass User"
msgstr "绕过用户"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:147
msgid "Bypass cgroup"
msgstr "绕过资源控制组"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:91
msgid "CGroup"
msgstr "控制组"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:29
msgid "Choose File"
@ -105,8 +92,8 @@ msgstr "选择配置文件"
msgid "Clear Log"
msgstr "清空日志"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:160
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:165
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:163
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:168
msgid "Commonly Used Port"
msgstr "常用端口"
@ -130,15 +117,15 @@ msgstr "核心版本"
msgid "Cron Expression"
msgstr "Cron 表达式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:228
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:229
msgid "DNS Config"
msgstr "DNS 配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:230
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:231
msgid "DNS Listen"
msgstr "DNS 监听"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:241
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:242
msgid "DNS Mode"
msgstr "DNS 模式"
@ -146,27 +133,27 @@ msgstr "DNS 模式"
msgid "Debug Log"
msgstr "调试日志"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:507
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:508
msgid "Destination IP"
msgstr "目标 IP"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:511
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:512
msgid "Destination IP Geo"
msgstr "目标 IPGeo"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:508
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:509
msgid "Destination Port"
msgstr "目标端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:157
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:160
msgid "Destination TCP Port to Proxy"
msgstr "要代理的 TCP 目标端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:162
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:165
msgid "Destination UDP Port to Proxy"
msgstr "要代理的 UDP 目标端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:188
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:189
msgid "Device Name"
msgstr "设备名称"
@ -178,20 +165,20 @@ msgstr "直连模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:73
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:79
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:85
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:132
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:140
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:206
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:216
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:238
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:267
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:273
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:279
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:285
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:291
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:360
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:366
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:372
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:133
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:141
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:207
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:217
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:239
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:268
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:274
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:280
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:286
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:292
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:361
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:367
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:373
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:559
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:38
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:45
msgid "Disable"
@ -217,60 +204,60 @@ msgstr "禁用安全路径检查"
msgid "Disable TCP Keep Alive"
msgstr "禁用 TCP Keep Alive"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:276
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:277
msgid "DoH Prefer HTTP/3"
msgstr "DoH 优先 HTTP/3"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:308
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:503
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:309
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:504
msgid "Domain Name"
msgstr "域名"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:510
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:511
msgid "Domain Name Geo"
msgstr "域名Geo"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:505
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506
msgid "Domain Name Keyword"
msgstr "域名(关键字)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:507
msgid "Domain Name Regex"
msgstr "域名(正则表达式)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:504
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:505
msgid "Domain Name Suffix"
msgstr "域名(后缀)"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:168
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:169
msgid "Edit Authentications"
msgstr "编辑身份验证"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:222
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:223
msgid "Edit DNS Hijacks"
msgstr "编辑 DNS 劫持"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:254
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:255
msgid "Edit Fake-IP Filters"
msgstr "编辑 Fake-IP 过滤列表"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:297
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:298
msgid "Edit Hosts"
msgstr "编辑 Hosts"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:339
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:340
msgid "Edit Nameserver Policies"
msgstr "编辑 DNS 服务器查询策略"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:316
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:317
msgid "Edit Nameservers"
msgstr "编辑 DNS 服务器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:419
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:420
msgid "Edit Rule Providers"
msgstr "编辑规则提供者"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:488
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:489
msgid "Edit Rules"
msgstr "编辑规则"
@ -288,34 +275,38 @@ msgstr "编辑器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:74
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:80
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:86
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:133
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:141
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:176
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:207
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:217
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:239
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:268
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:274
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:280
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:286
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:292
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:305
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:324
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:347
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:357
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:361
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:367
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:373
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:399
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:427
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:496
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:559
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:567
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:134
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:142
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:177
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:208
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:218
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:240
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:269
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:275
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:281
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:287
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:293
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:306
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:325
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:348
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:358
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:362
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:368
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:374
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:400
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:428
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:497
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:560
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:568
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:33
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:66
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:75
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:102
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:120
msgid "Enable"
msgstr "启用"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:213
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:214
msgid "Endpoint Independent NAT"
msgstr "独立于端点的 NAT"
@ -327,11 +318,11 @@ msgstr "到期时间"
msgid "External Control Config"
msgstr "外部控制配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:264
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:265
msgid "Fake-IP Cache"
msgstr "Fake-IP 缓存"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:258
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:259
msgid "Fake-IP Filter Mode"
msgstr "Fake-IP 过滤模式"
@ -339,7 +330,7 @@ msgstr "Fake-IP 过滤模式"
msgid "Fake-IP Ping Hijack"
msgstr "Fake-IP Ping 劫持"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:246
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:247
msgid "Fake-IP Range"
msgstr "Fake-IP 范围"
@ -347,15 +338,15 @@ msgstr "Fake-IP 范围"
msgid "Fast Reload"
msgstr "快速重载"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:466
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:467
msgid "File Format"
msgstr "文件格式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:460
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:461
msgid "File Path"
msgstr "文件路径"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:454
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:455
msgid "File Size Limit"
msgstr "文件大小限制"
@ -376,15 +367,15 @@ msgstr "IPv6 保留地址"
msgid "File:"
msgstr "文件:"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:378
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:379
msgid "Force Sniff Domain Name"
msgstr "强制嗅探的域名"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:203
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:204
msgid "GSO"
msgstr "通用分段卸载"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:209
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:210
msgid "GSO Max Size"
msgstr "分段最大长度"
@ -396,39 +387,39 @@ msgstr "全局配置"
msgid "Generate & Download"
msgstr "生成并下载"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:537
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:538
msgid "GeoData Loader"
msgstr "GeoData 加载器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:531
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:532
msgid "GeoIP Format"
msgstr "GeoIP 格式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:552
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553
msgid "GeoIP(ASN) Url"
msgstr "GeoIP(ASN) 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:549
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550
msgid "GeoIP(DAT) Url"
msgstr "GeoIP(DAT) 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:546
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:547
msgid "GeoIP(MMDB) Url"
msgstr "GeoIP(MMDB) 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:543
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:544
msgid "GeoSite Url"
msgstr "GeoSite 下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:555
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:556
msgid "GeoX Auto Update"
msgstr "定时更新GeoX文件"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:529
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:530
msgid "GeoX Config"
msgstr "GeoX 配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:561
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:562
msgid "GeoX Update Interval"
msgstr "GeoX 文件更新间隔"
@ -444,7 +435,11 @@ msgstr "全局模式"
msgid "Grant access to nikki procedures"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:143
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:85
msgid "Group"
msgstr "用户组"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:144
msgid "HTTP Port"
msgstr "HTTP 端口"
@ -452,10 +447,6 @@ msgstr "HTTP 端口"
msgid "How To Use"
msgstr "使用说明"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:311
msgid "IP"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:49
msgid "IPv4 DNS Hijack"
msgstr "IPv4 DNS 劫持"
@ -464,11 +455,6 @@ msgstr "IPv4 DNS 劫持"
msgid "IPv4 Proxy"
msgstr "IPv4 代理"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:64
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:235
msgid "IPv6"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:52
msgid "IPv6 DNS Hijack"
msgstr "IPv6 DNS 劫持"
@ -477,20 +463,20 @@ msgstr "IPv6 DNS 劫持"
msgid "IPv6 Proxy"
msgstr "IPv6 代理"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:385
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:386
msgid "Ignore Sniff Domain Name"
msgstr "忽略嗅探的域名"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:135
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:136
msgid "Inbound Config"
msgstr "入站配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:117
msgid "Interface"
msgstr "接口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:104
msgid "Inbound Interface"
msgstr "入站接口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:67
msgid "Lan Proxy"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:100
msgid "LAN Proxy"
msgstr "局域网代理"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:82
@ -506,7 +492,7 @@ msgstr "日志"
msgid "Log Level"
msgstr "日志级别"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:199
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:200
msgid "MTU"
msgstr "最大传输单元"
@ -514,16 +500,16 @@ msgstr "最大传输单元"
msgid "Match Process"
msgstr "匹配进程"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:350
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:513
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:351
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:514
msgid "Matcher"
msgstr "匹配"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:541
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:542
msgid "Memory Conservative Loader"
msgstr "为内存受限设备优化的加载器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:151
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:152
msgid "Mixed Port"
msgstr "混合端口"
@ -531,7 +517,7 @@ msgstr "混合端口"
msgid "Mixin Config"
msgstr "混入配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:565
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:566
msgid "Mixin File Content"
msgstr "混入文件内容"
@ -540,16 +526,15 @@ msgid "Mixin Option"
msgstr "混入选项"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:39
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:72
msgid "Mode"
msgstr "模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:433
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:434
msgid "Name"
msgstr "名称"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:334
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:353
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:335
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:354
msgid "Nameserver"
msgstr "DNS 服务器"
@ -558,12 +543,12 @@ msgstr "DNS 服务器"
msgid "Nikki"
msgstr ""
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:523
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:524
msgid "No Resolve"
msgstr "不解析"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:447
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:516
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:448
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:517
msgid "Node"
msgstr "节点"
@ -579,55 +564,55 @@ msgstr "打开面板"
msgid "Outbound Interface"
msgstr "出站接口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:165
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:166
msgid "Overwrite Authentication"
msgstr "覆盖身份验证"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:219
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:220
msgid "Overwrite DNS Hijack"
msgstr "覆盖 DNS 劫持"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:411
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:412
msgid "Overwrite Destination"
msgstr "将嗅探结果作为连接目标"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:251
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:252
msgid "Overwrite Fake-IP Filter"
msgstr "覆盖 Fake-IP 过滤列表"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:375
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:376
msgid "Overwrite Force Sniff Domain Name"
msgstr "覆盖强制嗅探的域名"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:294
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:295
msgid "Overwrite Hosts"
msgstr "覆盖 Hosts"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:382
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:383
msgid "Overwrite Ignore Sniff Domain Name"
msgstr "覆盖忽略嗅探的域名"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:313
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:314
msgid "Overwrite Nameserver"
msgstr "覆盖 DNS 服务器"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:336
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:337
msgid "Overwrite Nameserver Policy"
msgstr "覆盖 DNS 服务器查询策略"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:389
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:390
msgid "Overwrite Sniff By Protocol"
msgstr "覆盖按协议嗅探"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:182
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:183
msgid "Password"
msgstr "密码"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:567
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:568
msgid "Please go to the editor tab to edit the file for mixin"
msgstr "请前往编辑器标签编辑用于混入的文件"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:408
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:409
msgid "Port"
msgstr "端口"
@ -635,7 +620,7 @@ msgstr "端口"
msgid "Prefer"
msgstr "优先"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:509
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:510
msgid "Process Name"
msgstr "进程名"
@ -648,11 +633,17 @@ msgstr "配置文件"
msgid "Profile for Startup"
msgstr "用于启动的配置文件"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:402
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:403
msgid "Protocol"
msgstr "协议"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:97
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:152
msgid "Proxy"
msgstr "代理"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:29
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:31
#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:37
msgid "Proxy Config"
msgstr "代理配置"
@ -669,7 +660,7 @@ msgstr "随机"
msgid "Redirect Mode"
msgstr "Redirect 模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:155
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:156
msgid "Redirect Port"
msgstr "Redirect 端口"
@ -681,7 +672,7 @@ msgstr "重载服务"
msgid "Remote"
msgstr "远程"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:270
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:271
msgid "Respect Rules"
msgstr "遵循分流规则"
@ -693,7 +684,7 @@ msgstr "重启服务"
msgid "Router Proxy"
msgstr "路由器代理"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:414
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:415
msgid "Rule Config"
msgstr "规则配置"
@ -705,7 +696,7 @@ msgstr "规则模式"
msgid "Rule Provider:"
msgstr "规则提供者:"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:502
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:503
msgid "Rule Set"
msgstr "规则集"
@ -713,11 +704,11 @@ msgstr "规则集"
msgid "Running"
msgstr "运行中"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:147
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:148
msgid "SOCKS Port"
msgstr "SOCKS 端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:129
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:130
msgid "Save Proxy Selection"
msgstr "保存节点/策略组选择"
@ -730,27 +721,27 @@ msgstr "定时重启"
msgid "Scroll To Bottom"
msgstr "滚动到底部"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:392
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:393
msgid "Sniff By Protocol"
msgstr "按协议嗅探"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:369
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:370
msgid "Sniff Pure IP"
msgstr "嗅探纯 IP 连接"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:363
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:364
msgid "Sniff Redir-Host"
msgstr "嗅探 Redir-Host 流量"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:355
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:356
msgid "Sniffer Config"
msgstr "嗅探器配置"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:192
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:193
msgid "Stack"
msgstr "栈"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:540
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:541
msgid "Standard Loader"
msgstr "标准加载器"
@ -792,19 +783,19 @@ msgid "TCP Keep Alive Interval"
msgstr "TCP Keep Alive 间隔"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:36
msgid "TCP Proxy Mode"
msgstr "TCP 代理模式"
msgid "TCP Mode"
msgstr "TCP 模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:40
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:46
msgid "TPROXY Mode"
msgstr "TPROXY 模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:160
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:161
msgid "TPROXY Port"
msgstr "TPROXY 端口"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:186
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:187
msgid "TUN Config"
msgstr "TUN 配置"
@ -821,23 +812,19 @@ msgstr "检查配置文件"
msgid "Total"
msgstr "总量"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:31
msgid "Transparent Proxy"
msgstr "透明代理"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38
msgid "Transparent Proxy with Mihomo on OpenWrt."
msgstr "在 OpenWrt 上使用 Mihomo 进行透明代理。"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:327
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:436
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:500
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:328
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:437
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:501
msgid "Type"
msgstr "类型"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:43
msgid "UDP Proxy Mode"
msgstr "UDP 代理模式"
msgid "UDP Mode"
msgstr "UDP 模式"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:110
msgid "UI Name"
@ -869,42 +856,42 @@ msgstr "统一延迟"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:107
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:111
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:114
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:122
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:127
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:131
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:139
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:145
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:149
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:153
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:157
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:162
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:189
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:194
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:201
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:205
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:211
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:215
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:232
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:237
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:242
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:248
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:260
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:266
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:272
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:278
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:284
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:290
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:359
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:365
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:371
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:533
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:539
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:544
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:547
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:557
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:563
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:123
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:128
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:132
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:140
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:146
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:150
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:154
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:158
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:163
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:190
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:195
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:202
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:206
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:212
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:216
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:233
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:238
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:243
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:249
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:261
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:267
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:273
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:279
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:285
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:291
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:360
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:366
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:372
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:534
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:540
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:545
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:548
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:551
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:554
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:564
msgid "Unmodified"
msgstr "不修改"
@ -920,7 +907,7 @@ msgstr "更新时间"
msgid "Update Dashboard"
msgstr "更新面板"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:479
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:480
msgid "Update Interval"
msgstr "更新间隔"
@ -928,15 +915,15 @@ msgstr "更新间隔"
msgid "Upload Profile"
msgstr "上传配置文件"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:442
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:443
msgid "Url"
msgstr "下载地址"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:288
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:289
msgid "Use Hosts"
msgstr "使用 Hosts"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:282
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:283
msgid "Use System Hosts"
msgstr "使用系统的 Hosts"
@ -944,10 +931,14 @@ msgstr "使用系统的 Hosts"
msgid "Used"
msgstr "已使用"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:79
msgid "User"
msgstr "用户"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:70
msgid "User Agent"
msgstr "用户代理UA"
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:179
#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:180
msgid "Username"
msgstr "用户名"

View File

@ -59,8 +59,8 @@ const methods = {
},
get_identifiers: {
call: function() {
const users = filter(get_users(), (x) => x != '' && x != 'root');
const groups = filter(get_groups(), (x) => x != '' && x != 'root');
const users = filter(get_users(), (x) => x != '');
const groups = filter(get_groups(), (x) => x != '');
const cgroups = filter(get_cgroups(), (x) => x != '' && x != 'nikki');
return { users: users, groups: groups, cgroups: cgroups };
}

View File

@ -5,9 +5,9 @@ PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/MetaCubeX/mihomo.git
PKG_SOURCE_DATE:=2025-04-06
PKG_SOURCE_VERSION:=9e8f4ada4754ae95b002535acbeb457e40b06731
PKG_MIRROR_HASH:=1c8a7d70de0cb903b58eca1937b6561003cae7e76f9f021fd3eb9007b6a1f65f
PKG_SOURCE_DATE:=2025-04-12
PKG_SOURCE_VERSION:=cedb36df5fe58d5d972b1507c1ab656aca5f046d
PKG_MIRROR_HASH:=b2f9fe4e2ebd38036eac0f2c5af79362cb2afbb780c36c236259ecace9db11da
PKG_LICENSE:=GPL3.0+
PKG_MAINTAINER:=Joseph Mory <morytyann@gmail.com>
@ -16,7 +16,7 @@ PKG_BUILD_DEPENDS:=golang/host
PKG_BUILD_PARALLEL:=1
PKG_BUILD_FLAGS:=no-mips16
PKG_BUILD_VERSION:=alpha-9e8f4ad
PKG_BUILD_VERSION:=alpha-cedb36d
PKG_BUILD_TIME:=$(shell date -u -Iseconds)
GO_PKG:=github.com/metacubex/mihomo

View File

@ -10,9 +10,9 @@ config config 'config'
option 'test_profile' '1'
config proxy 'proxy'
option 'transparent_proxy' '1'
option 'tcp_transparent_proxy_mode' 'redirect'
option 'udp_transparent_proxy_mode' 'tun'
option 'enabled' '1'
option 'tcp_mode' 'redirect'
option 'udp_mode' 'tun'
option 'ipv4_dns_hijack' '1'
option 'ipv6_dns_hijack' '1'
option 'ipv4_proxy' '1'
@ -20,30 +20,7 @@ config proxy 'proxy'
option 'fake_ip_ping_hijack' '1'
option 'router_proxy' '1'
option 'lan_proxy' '1'
option 'access_control_mode' 'all'
option 'acl_ip' ''
option 'acl_ip6' ''
option 'acl_mac' ''
option 'acl_interface' ''
list 'bypass_user' 'dnsmasq'
list 'bypass_user' 'ftp'
list 'bypass_user' 'logd'
list 'bypass_user' 'nobody'
list 'bypass_user' 'ntp'
list 'bypass_user' 'ubus'
list 'bypass_group' 'dnsmasq'
list 'bypass_group' 'ftp'
list 'bypass_group' 'logd'
list 'bypass_group' 'nogroup'
list 'bypass_group' 'ntp'
list 'bypass_group' 'ubus'
list 'bypass_cgroup' 'adguardhome'
list 'bypass_cgroup' 'aria2'
list 'bypass_cgroup' 'dnsmasq'
list 'bypass_cgroup' 'netbird'
list 'bypass_cgroup' 'qbittorrent'
list 'bypass_cgroup' 'tailscale'
list 'bypass_cgroup' 'zerotier'
list 'lan_inbound_interface' 'lan'
list 'bypass_dscp' '4'
option 'bypass_china_mainland_ip' '0'
option 'proxy_tcp_dport' '0-65535'
@ -100,6 +77,38 @@ config env 'env'
option 'disable_quic_go_gso' '0'
option 'disable_quic_go_ecn' '0'
config router_access_control
option 'enabled' '1'
list 'user' 'dnsmasq'
list 'user' 'ftp'
list 'user' 'logd'
list 'user' 'nobody'
list 'user' 'ntp'
list 'user' 'ubus'
list 'group' 'dnsmasq'
list 'group' 'ftp'
list 'group' 'logd'
list 'group' 'nogroup'
list 'group' 'ntp'
list 'group' 'ubus'
list 'cgroup' 'adguardhome'
list 'cgroup' 'aria2'
list 'cgroup' 'dnsmasq'
list 'cgroup' 'netbird'
list 'cgroup' 'qbittorrent'
list 'cgroup' 'sysntpd'
list 'cgroup' 'tailscale'
list 'cgroup' 'zerotier'
option 'proxy' '0'
config router_access_control
option 'enabled' '1'
option 'proxy' '1'
config lan_access_control
option 'enabled' '1'
option 'proxy' '1'
config authentication
option 'enabled' '1'
option 'username' 'nikki'

View File

@ -143,11 +143,11 @@ service_started() {
fi
# load config
config_load nikki
# check if transparent proxy enabled
local transparent_proxy
config_get_bool transparent_proxy "proxy" "transparent_proxy" 0
if [ "$transparent_proxy" == 0 ]; then
log "Transparent Proxy" "Disabled."
# check if proxy enabled
local enabled
config_get_bool enabled "proxy" "enabled" 0
if [ "$enabled" == 0 ]; then
log "Proxy" "Disabled."
return
fi
# get config
@ -156,19 +156,19 @@ service_started() {
local tun_device
config_get tun_device "mixin" "tun_device" "nikki"
## proxy config
### transparent proxy
local tcp_transparent_proxy_mode udp_transparent_proxy_mode ipv4_proxy ipv6_proxy
config_get tcp_transparent_proxy_mode "proxy" "tcp_transparent_proxy_mode"
config_get udp_transparent_proxy_mode "proxy" "udp_transparent_proxy_mode"
### general
local tcp_mode udp_mode ipv4_proxy ipv6_proxy
config_get tcp_mode "proxy" "tcp_mode"
config_get udp_mode "proxy" "udp_mode"
config_get_bool ipv4_proxy "proxy" "ipv4_proxy" 0
config_get_bool ipv6_proxy "proxy" "ipv6_proxy" 0
# prepare config
local tproxy_enable; tproxy_enable=0
if [[ "$tcp_transparent_proxy_mode" == "tproxy" || "$udp_transparent_proxy_mode" == "tproxy" ]]; then
if [[ "$tcp_mode" == "tproxy" || "$udp_mode" == "tproxy" ]]; then
tproxy_enable=1
fi
local tun_enable; tun_enable=0
if [[ "$tcp_transparent_proxy_mode" == "tun" || "$udp_transparent_proxy_mode" == "tun" ]]; then
if [[ "$tcp_mode" == "tun" || "$udp_mode" == "tun" ]]; then
tun_enable=1
fi
# fix compatible with dockerd
@ -197,17 +197,17 @@ service_started() {
fi
fi
fi
# transparent proxy
log "Transparent Proxy" "Enabled."
# proxy
log "Proxy" "Enabled."
# wait for tun device online
if [ "$tun_enable" == 1 ]; then
log "Transparent Proxy" "Waiting for tun device online..."
log "Proxy" "Waiting for tun device online..."
local tun_timeout; tun_timeout=15
local tun_interval; tun_interval=1
while [ "$tun_timeout" -gt 0 ]; do
if (ip link show dev "$tun_device" > /dev/null 2>&1); then
if [ $(ip -json addr show dev "$tun_device" | tun_device="$tun_device" yq -M '.[] | select(.ifname = strenv(tun_device)) | .addr_info | length') -gt 0 ]; then
log "Transparent Proxy" "Tun device is online."
log "Proxy" "Tun device is online."
break
fi
fi
@ -215,7 +215,7 @@ service_started() {
sleep "$tun_interval"
done
if [ "$tun_timeout" -le 0 ]; then
log "Transparent Proxy" "Waiting timeout, tun device is not online."
log "Proxy" "Waiting timeout, tun device is not online."
log "App" "Exit."
return
fi
@ -246,9 +246,9 @@ service_started() {
utpl -D cgroup_name="$CGROUP_NAME" -D cgroup_id="$CGROUP_ID" -D tproxy_fw_mark="$TPROXY_FW_MARK" -D tun_fw_mark="$TUN_FW_MARK" -S "$HIJACK_UT" | nft -f -
# check hijack
if (nft list tables | grep -q nikki); then
log "Transparent Proxy" "Hijack successful."
log "Proxy" "Hijack successful."
else
log "Transparent Proxy" "Hijack failed."
log "Proxy" "Hijack failed."
log "App" "Exit."
fi
}

View File

@ -5,11 +5,11 @@
config_load nikki
config_get enabled "config" "enabled" 0
config_get tcp_transparent_proxy_mode "proxy" "tcp_transparent_proxy_mode"
config_get udp_transparent_proxy_mode "proxy" "udp_transparent_proxy_mode"
config_get tcp_mode "proxy" "tcp_mode"
config_get udp_mode "proxy" "udp_mode"
config_get tun_device "mixin" "tun_device"
if [ "$enabled" == 1 ] && [[ "$tcp_transparent_proxy_mode" == "tun" || "$udp_transparent_proxy_mode" == "tun" ]]; then
if [ "$enabled" == 1 ] && [[ "$tcp_mode" == "tun" || "$udp_mode" == "tun" ]]; then
nft insert rule inet fw4 input iifname "$tun_device" counter accept comment "nikki"
nft insert rule inet fw4 forward oifname "$tun_device" counter accept comment "nikki"
nft insert rule inet fw4 forward iifname "$tun_device" counter accept comment "nikki"

View File

@ -30,6 +30,82 @@ mixin_dns_port=$(uci -q get nikki.mixin.dns_port); [ -n "$mixin_dns_port" ] && {
uci set nikki.mixin.dns_listen=[::]:$mixin_dns_port
}
# since v1.22.0
proxy_transparent_proxy=$(uci -q get nikki.proxy.transparent_proxy); [ -n "$proxy_transparent_proxy" ] && {
uci rename nikki.proxy.transparent_proxy=enabled
uci rename nikki.proxy.tcp_transparent_proxy_mode=tcp_mode
uci rename nikki.proxy.udp_transparent_proxy_mode=udp_mode
uci add nikki router_access_control
uci set nikki.@router_access_control[-1].enabled=1
proxy_bypass_user=$(uci -q get nikki.proxy.bypass_user); [ -n "$proxy_bypass_user" ] && {
for user in $proxy_bypass_user; do
uci add_list nikki.@router_access_control[-1].user="$user"
done
}
proxy_bypass_group=$(uci -q get nikki.proxy.bypass_group); [ -n "$proxy_bypass_group" ] && {
for group in $proxy_bypass_group; do
uci add_list nikki.@router_access_control[-1].group="$group"
done
}
proxy_bypass_cgroup=$(uci -q get nikki.proxy.bypass_cgroup); [ -n "$proxy_bypass_cgroup" ] && {
for cgroup in $proxy_bypass_cgroup; do
uci add_list nikki.@router_access_control[-1].cgroup="$cgroup"
done
}
uci set nikki.@router_access_control[-1].proxy=0
uci add nikki router_access_control
uci set nikki.@router_access_control[-1].enabled=1
uci set nikki.@router_access_control[-1].proxy=1
uci add_list nikki.proxy.lan_inbound_interface=lan
proxy_access_control_mode=$(uci -q get nikki.proxy.access_control_mode); [ "$proxy_access_control_mode" != "all" ] && {
proxy_acl_ip=$(uci -q get nikki.proxy.acl_ip); [ -n "$proxy_acl_ip" ] && {
for ip in $proxy_acl_ip; do
uci add nikki lan_access_control
uci set nikki.@lan_access_control[-1].enabled=1
uci add_list nikki.@lan_access_control[-1].ip="$ip"
[ "$proxy_access_control_mode" == "allow" ] && uci set nikki.@lan_access_control[-1].proxy=1
[ "$proxy_access_control_mode" == "block" ] && uci set nikki.@lan_access_control[-1].proxy=0
done
}
proxy_acl_ip6=$(uci -q get nikki.proxy.acl_ip6); [ -n "$proxy_acl_ip6" ] && {
for ip6 in $proxy_acl_ip6; do
uci add nikki lan_access_control
uci set nikki.@lan_access_control[-1].enabled=1
uci add_list nikki.@lan_access_control[-1].ip6="$ip6"
[ "$proxy_access_control_mode" == "allow" ] && uci set nikki.@lan_access_control[-1].proxy=1
[ "$proxy_access_control_mode" == "block" ] && uci set nikki.@lan_access_control[-1].proxy=0
done
}
proxy_acl_mac=$(uci -q get nikki.proxy.acl_mac); [ -n "$proxy_acl_mac" ] && {
for mac in $proxy_acl_mac; do
uci add nikki lan_access_control
uci set nikki.@lan_access_control[-1].enabled=1
uci add_list nikki.@lan_access_control[-1].mac="$mac"
[ "$proxy_access_control_mode" == "allow" ] && uci set nikki.@lan_access_control[-1].proxy=1
[ "$proxy_access_control_mode" == "block" ] && uci set nikki.@lan_access_control[-1].proxy=0
done
}
[ "$proxy_access_control_mode" == "block" ] && {
uci add nikki lan_access_control
uci set nikki.@lan_access_control[-1].enabled=1
uci set nikki.@lan_access_control[-1].proxy=1
}
}
uci del nikki.proxy.access_control_mode
uci del nikki.proxy.acl_ip
uci del nikki.proxy.acl_ip6
uci del nikki.proxy.acl_mac
uci del nikki.proxy.acl_interface
uci del nikki.proxy.bypass_user
uci del nikki.proxy.bypass_group
uci del nikki.proxy.bypass_cgroup
}
# commit
uci commit nikki

View File

@ -27,32 +27,43 @@
const tun_device = uci.get('nikki', 'mixin', 'tun_device');
const tcp_transparent_proxy_mode = uci.get('nikki', 'proxy', 'tcp_transparent_proxy_mode');
const udp_transparent_proxy_mode = uci.get('nikki', 'proxy', 'udp_transparent_proxy_mode');
const tcp_mode = uci.get('nikki', 'proxy', 'tcp_mode');
const udp_mode = uci.get('nikki', 'proxy', 'udp_mode');
const ipv4_dns_hijack = uci_bool(uci.get('nikki', 'proxy', 'ipv4_dns_hijack'));
const ipv6_dns_hijack = uci_bool(uci.get('nikki', 'proxy', 'ipv6_dns_hijack'));
const ipv4_proxy = uci_bool(uci.get('nikki', 'proxy', 'ipv4_proxy'));
const ipv6_proxy = uci_bool(uci.get('nikki', 'proxy', 'ipv6_proxy'));
const fake_ip_ping_hijack = uci_bool(uci.get('nikki', 'proxy', 'fake_ip_ping_hijack'));
const router_proxy = uci_bool(uci.get('nikki', 'proxy', 'router_proxy'));
const router_access_control = [];
uci.foreach('nikki', 'router_access_control', (access_control) => {
access_control['enabled'] = uci_bool(access_control['enabled']);
access_control['user'] = filter(uci_array(access_control['user']), (x) => index(users, x) >= 0);
access_control['group'] = filter(uci_array(access_control['group']), (x) => index(groups, x) >= 0);
access_control['cgroup'] = filter(uci_array(access_control['cgroup']), (x) => index(cgroups, x) >= 0);
access_control['proxy'] = uci_bool(access_control['proxy']);
push(router_access_control, access_control);
});
const lan_proxy = uci_bool(uci.get('nikki', 'proxy', 'lan_proxy'));
const access_control_mode = uci.get('nikki', 'proxy', 'access_control_mode');
const acl_ip = uci_array(uci.get('nikki', 'proxy', 'acl_ip'));
const acl_ip6 = uci_array(uci.get('nikki', 'proxy', 'acl_ip6'));
const acl_mac = uci_array(uci.get('nikki', 'proxy', 'acl_mac'));
const acl_interface = uci_array(uci.get('nikki', 'proxy', 'acl_interface'));
const bypass_user = filter(uci_array(uci.get('nikki', 'proxy', 'bypass_user')), (x) => x != 'root' && index(users, x) >= 0);
const bypass_group = filter(uci_array(uci.get('nikki', 'proxy', 'bypass_group')), (x) => x != 'root' && index(groups, x) >= 0);
let bypass_cgroup = [];
if (cgroups_version == 1) {
push(bypass_cgroup, cgroup_id);
} else if (cgroups_version == 2) {
bypass_cgroup = filter(uci_array(uci.get('nikki', 'proxy', 'bypass_cgroup')), (x) => x != 'nikki' && index(cgroups, x) >= 0);
push(bypass_cgroup, cgroup_name);
const lan_inbound_interface = uci_array(uci.get('nikki', 'proxy', 'lan_inbound_interface'));
const lan_inbound_device = [];
for (let interface in lan_inbound_interface) {
const device = ubus.call('network.interface', 'status', {'interface': interface})?.l3_device ?? '';
if (device != '') {
push(lan_inbound_device, device);
}
}
const lan_access_control = [];
uci.foreach('nikki', 'lan_access_control', (access_control) => {
access_control['enabled'] = uci_bool(access_control['enabled']);
access_control['ip'] = uci_array(access_control['ip']);
access_control['ip6'] = uci_array(access_control['ip6']);
access_control['mac'] = uci_array(access_control['mac']);
access_control['proxy'] = uci_bool(access_control['proxy']);
push(lan_access_control, access_control);
});
const bypass_dscp = uci_array(uci.get('nikki', 'proxy', 'bypass_dscp'));
const bypass_china_mainland_ip = uci_bool(uci.get('nikki', 'proxy', 'bypass_china_mainland_ip'));
@ -67,14 +78,6 @@
push(dns_hijack_nfproto, 'ipv6');
}
const acl_device = [];
for (let i = 0; i < length(acl_interface); i++) {
const device = ubus.call('network.interface', 'status', {'interface': acl_interface[i]})?.l3_device ?? '';
if (device != '') {
push(acl_device, device);
}
}
const proxy_nfproto = [];
if (ipv4_proxy) {
push(proxy_nfproto, 'ipv4');
@ -98,8 +101,8 @@ table inet nikki {
flags interval
{% if (length(dns_hijack_nfproto) > 0): %}
elements = {
{% for (let x in dns_hijack_nfproto): %}
{{ x }},
{% for (let nfproto in dns_hijack_nfproto): %}
{{ nfproto }},
{% endfor %}
}
{% endif %}
@ -110,67 +113,13 @@ table inet nikki {
flags interval
{% if (length(proxy_nfproto) > 0): %}
elements = {
{% for (let x in proxy_nfproto): %}
{{ x }},
{% for (let nfproto in proxy_nfproto): %}
{{ nfproto }},
{% endfor %}
}
{% endif %}
}
set bypass_user {
type uid
flags interval
auto-merge
{% if (length(bypass_user) > 0): %}
elements = {
{% for (let x in bypass_user): %}
{{ x }},
{% endfor %}
}
{% endif %}
}
set bypass_group {
type gid
flags interval
auto-merge
{% if (length(bypass_group) > 0): %}
elements = {
{% for (let x in bypass_group): %}
{{ x }},
{% endfor %}
}
{% endif %}
}
{% if (cgroups_version == 1): %}
set bypass_cgroup {
typeof meta cgroup
flags interval
auto-merge
{% if (length(bypass_cgroup) > 0): %}
elements = {
{% for (let x in bypass_cgroup): %}
{{ x }},
{% endfor %}
}
{% endif %}
}
{% elif (cgroups_version == 2): %}
set bypass_cgroup {
type cgroupsv2
flags interval
auto-merge
{% if (length(bypass_cgroup) > 0): %}
elements = {
{% for (let x in bypass_cgroup): %}
services/{{ x }},
{% endfor %}
}
{% endif %}
}
{% endif %}
set reserved_ip {
type ipv4_addr
flags interval
@ -183,6 +132,19 @@ table inet nikki {
auto-merge
}
set lan_inbound_device {
type ifname
flags interval
auto-merge
{% if (length(lan_inbound_device) > 0): %}
elements = {
{% for (let device in lan_inbound_device): %}
{{ device }},
{% endfor %}
}
{% endif %}
}
set china_ip {
type ipv4_addr
flags interval
@ -199,8 +161,8 @@ table inet nikki {
auto-merge
{% if (length(proxy_dport) > 0): %}
elements = {
{% for (let x in proxy_dport): %}
{{ x }},
{% for (let dport in proxy_dport): %}
{{ dport }},
{% endfor %}
}
{% endif %}
@ -212,145 +174,215 @@ table inet nikki {
auto-merge
{% if (length(bypass_dscp) > 0): %}
elements = {
{% for (let x in bypass_dscp): %}
{{ x }},
{% for (let dscp in bypass_dscp): %}
{{ dscp }},
{% endfor %}
}
{% endif %}
}
set acl_ip {
type ipv4_addr
flags interval
auto-merge
{% if (length(acl_ip) > 0): %}
elements = {
{% for (let x in acl_ip): %}
{{ x }},
{% endfor %}
}
chain router_dns_hijack {
{% for (let access_control in router_access_control): %}
{% if (access_control['enabled']): %}
{% if (length(access_control['user']) == 0 && length(access_control['group']) == 0 && length(access_control['cgroup']) == 0): %}
meta l4proto { tcp, udp } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% else %}
{% if (length(access_control['user']) > 0): %}
meta l4proto { tcp, udp } meta skuid { {% for (let user in access_control['user']): %} {{ user }}, {% endfor %} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endif %}
{% if (length(access_control['group']) > 0): %}
meta l4proto { tcp, udp } meta skgid { {% for (let group in access_control['group']): %} {{ group }}, {% endfor %} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endif %}
{% if (cgroups_version == 2 && length(access_control['cgroup']) > 0): %}
meta l4proto { tcp, udp } socket cgroupv2 level 2 { {% for (let cgroup in access_control['cgroup']): %} services/{{ cgroup }}, {% endfor %} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
}
set acl_ip6 {
type ipv6_addr
flags interval
auto-merge
{% if (length(acl_ip6) > 0): %}
elements = {
{% for (let x in acl_ip6): %}
{{ x }},
{% endfor %}
}
chain router_redirect {
{% for (let access_control in router_access_control): %}
{% if (access_control['enabled']): %}
{% if (length(access_control['user']) == 0 && length(access_control['group']) == 0 && length(access_control['cgroup']) == 0): %}
meta l4proto tcp counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} return {% endif %}
{% else %}
{% if (length(access_control['user']) > 0): %}
meta l4proto tcp meta skuid { {% for (let user in access_control['user']): %} {{ user }}, {% endfor %} } counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} return {% endif %}
{% endif %}
{% if (length(access_control['group']) > 0): %}
meta l4proto tcp meta skgid { {% for (let group in access_control['group']): %} {{ group }}, {% endfor %} } counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} return {% endif %}
{% endif %}
{% if (cgroups_version == 2 && length(access_control['cgroup']) > 0): %}
meta l4proto tcp socket cgroupv2 level 2 { {% for (let cgroup in access_control['cgroup']): %} services/{{ cgroup }}, {% endfor %} } counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
}
set acl_mac {
type ether_addr
flags interval
auto-merge
{% if (length(acl_mac) > 0): %}
elements = {
{% for (let x in acl_mac): %}
{{ x }},
{% endfor %}
}
chain router_tproxy {
{% for (let access_control in router_access_control): %}
{% if (access_control['enabled']): %}
{% if (length(access_control['user']) == 0 && length(access_control['group']) == 0 && length(access_control['cgroup']) == 0): %}
meta l4proto { tcp, udp } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
{% else %}
{% if (length(access_control['user']) > 0): %}
meta l4proto { tcp, udp } meta skuid { {% for (let user in access_control['user']): %} {{ user }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
{% endif %}
{% if (length(access_control['group']) > 0): %}
meta l4proto { tcp, udp } meta skgid { {% for (let group in access_control['group']): %} {{ group }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
{% endif %}
{% if (cgroups_version == 2 && length(access_control['cgroup']) > 0): %}
meta l4proto { tcp, udp } socket cgroupv2 level 2 { {% for (let cgroup in access_control['cgroup']): %} services/{{ cgroup }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
}
set acl_device {
type ifname
flags interval
auto-merge
{% if (length(acl_device) > 0): %}
elements = {
{% for (let x in acl_device): %}
{{ x }},
{% endfor %}
}
chain router_tun {
{% for (let access_control in router_access_control): %}
{% if (access_control['enabled']): %}
{% if (length(access_control['user']) == 0 && length(access_control['group']) == 0 && length(access_control['cgroup']) == 0): %}
meta l4proto { tcp, udp } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %}
{% else %}
{% if (length(access_control['user']) > 0): %}
meta l4proto { tcp, udp } meta skuid { {% for (let user in access_control['user']): %} {{ user }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %}
{% endif %}
{% if (length(access_control['group']) > 0): %}
meta l4proto { tcp, udp } meta skgid { {% for (let group in access_control['group']): %} {{ group }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %}
{% endif %}
{% if (cgroups_version == 2 && length(access_control['cgroup']) > 0): %}
meta l4proto { tcp, udp } socket cgroupv2 level 2 { {% for (let cgroup in access_control['cgroup']): %} services/{{ cgroup }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
}
chain lan_dns_hijack {
{% if (access_control_mode == 'all'): %}
meta l4proto { tcp, udp } th dport 53 counter redirect to :{{ dns_port }}
{% elif (access_control_mode == 'allow'): %}
meta l4proto { tcp, udp } th dport 53 ip saddr @acl_ip counter redirect to :{{ dns_port }}
meta l4proto { tcp, udp } th dport 53 ip6 saddr @acl_ip6 counter redirect to :{{ dns_port }}
meta l4proto { tcp, udp } th dport 53 ether saddr @acl_mac counter redirect to :{{ dns_port }}
meta l4proto { tcp, udp } th dport 53 iifname @acl_device counter redirect to :{{ dns_port }}
{% elif (access_control_mode == 'block'): %}
meta l4proto { tcp, udp } th dport 53 ip saddr @acl_ip counter return
meta l4proto { tcp, udp } th dport 53 ip6 saddr @acl_ip6 counter return
meta l4proto { tcp, udp } th dport 53 ether saddr @acl_mac counter return
meta l4proto { tcp, udp } th dport 53 iifname @acl_device counter return
meta l4proto { tcp, udp } th dport 53 counter redirect to :{{ dns_port }}
{% for (let access_control in lan_access_control): %}
{% if (access_control['enabled']): %}
{% if (length(access_control['ip']) == 0 && length(access_control['ip6']) == 0 && length(access_control['mac']) == 0): %}
meta l4proto { tcp, udp } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% else %}
{% if (length(access_control['ip']) > 0): %}
meta l4proto { tcp, udp } ip saddr { {% for (let ip in access_control['ip']): %} {{ ip }}, {% endfor %} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endif %}
{% if (length(access_control['ip6']) > 0): %}
meta l4proto { tcp, udp } ip6 saddr { {% for (let ip6 in access_control['ip6']): %} {{ ip6 }}, {% endfor %} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endif %}
{% if (length(access_control['mac']) > 0): %}
meta l4proto { tcp, udp } ether saddr { {% for (let mac in access_control['mac']): %} {{ mac }}, {% endfor %} } th dport 53 counter {% if (access_control.proxy == '1'): %} redirect to :{{ dns_port }} {% else %} return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
}
chain lan_redirect {
{% if (access_control_mode == 'all'): %}
meta l4proto tcp counter redirect to :{{ redir_port }}
{% elif (access_control_mode == 'allow'): %}
meta l4proto tcp ip saddr @acl_ip counter redirect to :{{ redir_port }}
meta l4proto tcp ip6 saddr @acl_ip6 counter redirect to :{{ redir_port }}
meta l4proto tcp ether saddr @acl_mac counter redirect to :{{ redir_port }}
meta l4proto tcp iifname @acl_device counter redirect to :{{ redir_port }}
{% elif (access_control_mode == 'block'): %}
meta l4proto tcp ip saddr @acl_ip counter return
meta l4proto tcp ip6 saddr @acl_ip6 counter return
meta l4proto tcp ether saddr @acl_mac counter return
meta l4proto tcp iifname @acl_device counter return
meta l4proto tcp counter redirect to :{{ redir_port }}
{% for (let access_control in lan_access_control): %}
{% if (access_control['enabled']): %}
{% if (length(access_control['ip']) == 0 && length(access_control['ip6']) == 0 && length(access_control['mac']) == 0): %}
meta l4proto tcp tcp counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} counter return {% endif %}
{% else %}
{% if (length(access_control['ip']) > 0): %}
meta l4proto tcp ip saddr { {% for (let ip in access_control['ip']): %} {{ ip }}, {% endfor %} } counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} return {% endif %}
{% endif %}
{% if (length(access_control['ip6']) > 0): %}
meta l4proto tcp ip6 saddr { {% for (let ip6 in access_control['ip6']): %} {{ ip6 }}, {% endfor %} } counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} return {% endif %}
{% endif %}
{% if (length(access_control['mac']) > 0): %}
meta l4proto tcp ether saddr { {% for (let mac in access_control['mac']): %} {{ mac }}, {% endfor %} } counter {% if (access_control.proxy == '1'): %} redirect to :{{ redir_port }} {% else %} return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
}
chain lan_tproxy {
{% if (access_control_mode == 'all'): %}
meta l4proto { tcp, udp } meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept
{% elif (access_control_mode == 'allow'): %}
meta l4proto { tcp, udp } ip saddr @acl_ip meta mark set {{ tproxy_fw_mark }} tproxy ip to :{{ tproxy_port }} counter accept
meta l4proto { tcp, udp } ip6 saddr @acl_ip6 meta mark set {{ tproxy_fw_mark }} tproxy ip6 to :{{ tproxy_port }} counter accept
meta l4proto { tcp, udp } ether saddr @acl_mac meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept
meta l4proto { tcp, udp } iifname @acl_device meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept
{% elif (access_control_mode == 'block'): %}
meta l4proto { tcp, udp } ip saddr @acl_ip counter return
meta l4proto { tcp, udp } ip6 saddr @acl_ip6 counter return
meta l4proto { tcp, udp } ether saddr @acl_mac counter return
meta l4proto { tcp, udp } iifname @acl_device counter return
meta l4proto { tcp, udp } meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept
{% for (let access_control in lan_access_control): %}
{% if (access_control['enabled']): %}
{% if (length(access_control['ip']) == 0 && length(access_control['ip6']) == 0 && length(access_control['mac']) == 0): %}
meta l4proto { tcp, udp } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
{% else %}
{% if (length(access_control['ip']) > 0): %}
meta l4proto { tcp, udp } ip saddr { {% for (let ip in access_control['ip']): %} {{ ip }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy ip to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
{% endif %}
{% if (length(access_control['ip6']) > 0): %}
meta l4proto { tcp, udp } ip6 saddr { {% for (let ip6 in access_control['ip6']): %} {{ ip6 }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy ip6 to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
{% endif %}
{% if (length(access_control['mac']) > 0): %}
meta l4proto { tcp, udp } ether saddr { {% for (let mac in access_control['mac']): %} {{ mac }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
}
chain lan_tun {
{% if (access_control_mode == 'all'): %}
meta l4proto { tcp, udp } meta mark set {{ tun_fw_mark }} counter
{% elif (access_control_mode == 'allow'): %}
meta l4proto { tcp, udp } ip saddr @acl_ip meta mark set {{ tun_fw_mark }} counter
meta l4proto { tcp, udp } ip6 saddr @acl_ip6 meta mark set {{ tun_fw_mark }} counter
meta l4proto { tcp, udp } ether saddr @acl_mac meta mark set {{ tun_fw_mark }} counter
meta l4proto { tcp, udp } iifname @acl_device meta mark set {{ tun_fw_mark }} counter
{% elif (access_control_mode == 'block'): %}
meta l4proto { tcp, udp } ip saddr @acl_ip counter return
meta l4proto { tcp, udp } ip6 saddr @acl_ip6 counter return
meta l4proto { tcp, udp } ether saddr @acl_mac counter return
meta l4proto { tcp, udp } iifname @acl_device counter return
meta l4proto { tcp, udp } meta mark set {{ tun_fw_mark }} counter
{% for (let access_control in lan_access_control): %}
{% if (access_control['enabled']): %}
{% if (length(access_control['ip']) == 0 && length(access_control['ip6']) == 0 && length(access_control['mac']) == 0): %}
meta l4proto { tcp, udp } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %}counter return {% endif %}
{% else %}
{% if (length(access_control['ip']) > 0): %}
meta l4proto { tcp, udp } ip saddr { {% for (let ip in access_control['ip']): %} {{ ip }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %}counter return {% endif %}
{% endif %}
{% if (length(access_control['ip6']) > 0): %}
meta l4proto { tcp, udp } ip6 saddr { {% for (let ip6 in access_control['ip6']): %} {{ ip6 }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %}counter return {% endif %}
{% endif %}
{% if (length(access_control['mac']) > 0): %}
meta l4proto { tcp, udp } ether saddr { {% for (let mac in access_control['mac']): %} {{ mac }}, {% endfor %} } {% if (access_control.proxy == '1'): %} meta mark set {{ tun_fw_mark }} counter accept {% else %}counter return {% endif %}
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
}
{% if (router_proxy): %}
chain nat_output {
type nat hook output priority filter; policy accept;
{% if (cgroups_version == 1): %}
meta cgroup @bypass_cgroup counter return
meta cgroup {{ cgroup_id }} counter return
{% elif (cgroups_version == 2): %}
socket cgroupv2 level 2 @bypass_cgroup counter return
socket cgroupv2 level 2 services/{{ cgroup_name }} counter return
{% endif %}
meta skuid @bypass_user counter return
meta skgid @bypass_group counter return
meta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } th dport 53 counter redirect to :{{ dns_port }}
{% if (tcp_transparent_proxy_mode == 'redirect'): %}
meta nfproto @dns_hijack_nfproto jump router_dns_hijack
{% if (tcp_mode == 'redirect'): %}
fib daddr type { local, multicast, broadcast, anycast } counter return
ct direction reply counter return
ip daddr @reserved_ip counter return
@ -361,7 +393,7 @@ table inet nikki {
meta nfproto ipv6 meta l4proto . th dport != @proxy_dport counter return
meta l4proto { tcp, udp } ip dscp @bypass_dscp ip daddr != {{ fake_ip_range }} counter return
meta l4proto { tcp, udp } ip6 dscp @bypass_dscp counter return
meta nfproto @proxy_nfproto meta l4proto tcp counter redirect to :{{ redir_port }}
meta nfproto @proxy_nfproto jump router_redirect
{% endif %}
{% if (fake_ip_ping_hijack): %}
ip protocol icmp icmp type echo-request ip daddr {{ fake_ip_range }} counter redirect
@ -371,12 +403,10 @@ table inet nikki {
chain mangle_output {
type route hook output priority mangle; policy accept;
{% if (cgroups_version == 1): %}
meta cgroup @bypass_cgroup counter return
meta cgroup {{ cgroup_id }} counter return
{% elif (cgroups_version == 2): %}
socket cgroupv2 level 2 @bypass_cgroup counter return
socket cgroupv2 level 2 services/{{ cgroup_name }} counter return
{% endif %}
meta skuid @bypass_user counter return
meta skgid @bypass_group counter return
fib daddr type { local, multicast, broadcast, anycast } counter return
ct direction reply counter return
ip daddr @reserved_ip counter return
@ -388,25 +418,25 @@ table inet nikki {
meta l4proto { tcp, udp } ip dscp @bypass_dscp ip daddr != {{ fake_ip_range }} counter return
meta l4proto { tcp, udp } ip6 dscp @bypass_dscp counter return
meta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } th dport 53 counter return
{% if (tcp_transparent_proxy_mode == 'tproxy'): %}
meta nfproto @proxy_nfproto meta l4proto tcp meta mark set {{ tproxy_fw_mark }} counter
{% elif (tcp_transparent_proxy_mode == 'tun'): %}
meta nfproto @proxy_nfproto meta l4proto tcp meta mark set {{ tun_fw_mark }} counter
{% if (tcp_mode == 'tproxy'): %}
meta nfproto @proxy_nfproto meta l4proto tcp jump router_tproxy
{% elif (tcp_mode == 'tun'): %}
meta nfproto @proxy_nfproto meta l4proto tcp jump router_tun
{% endif %}
{% if (udp_transparent_proxy_mode == 'tproxy'): %}
meta nfproto @proxy_nfproto meta l4proto udp meta mark set {{ tproxy_fw_mark }} counter
{% elif (udp_transparent_proxy_mode == 'tun'): %}
meta nfproto @proxy_nfproto meta l4proto udp meta mark set {{ tun_fw_mark }} counter
{% if (udp_mode == 'tproxy'): %}
meta nfproto @proxy_nfproto meta l4proto udp jump router_tproxy
{% elif (udp_mode == 'tun'): %}
meta nfproto @proxy_nfproto meta l4proto udp jump router_tun
{% endif %}
}
chain mangle_prerouting_router {
type filter hook prerouting priority mangle - 1; policy accept;
{% if (tcp_transparent_proxy_mode == 'tproxy' || udp_transparent_proxy_mode == 'tproxy'): %}
meta l4proto { tcp, udp } iifname lo meta mark {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept
{% if (tcp_mode == 'tproxy' || udp_mode == 'tproxy'): %}
iifname lo meta l4proto { tcp, udp } meta mark {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept
{% endif %}
{% if (tcp_transparent_proxy_mode == 'tun' || udp_transparent_proxy_mode == 'tun'): %}
meta l4proto { tcp, udp } iifname {{ tun_device }} counter accept
{% if (tcp_mode == 'tun' || udp_mode == 'tun'): %}
iifname {{ tun_device }} meta l4proto { icmp, tcp, udp } counter accept
{% endif %}
}
{% endif %}
@ -414,8 +444,8 @@ table inet nikki {
{% if (lan_proxy): %}
chain dstnat {
type nat hook prerouting priority dstnat + 1; policy accept;
meta nfproto @dns_hijack_nfproto jump lan_dns_hijack
{% if (tcp_transparent_proxy_mode == 'redirect'): %}
iifname @lan_inbound_device meta nfproto @dns_hijack_nfproto jump lan_dns_hijack
{% if (tcp_mode == 'redirect'): %}
fib daddr type { local, multicast, broadcast, anycast } counter return
ct direction reply counter return
ip daddr @reserved_ip counter return
@ -426,7 +456,7 @@ table inet nikki {
meta nfproto ipv6 meta l4proto . th dport != @proxy_dport counter return
meta l4proto { tcp, udp } ip dscp @bypass_dscp ip daddr != {{ fake_ip_range }} counter return
meta l4proto { tcp, udp } ip6 dscp @bypass_dscp counter return
meta nfproto @proxy_nfproto jump lan_redirect
iifname @lan_inbound_device meta nfproto @proxy_nfproto jump lan_redirect
{% endif %}
{% if (fake_ip_ping_hijack): %}
ip protocol icmp icmp type echo-request ip daddr {{ fake_ip_range }} counter redirect
@ -446,15 +476,15 @@ table inet nikki {
meta l4proto { tcp, udp } ip dscp @bypass_dscp ip daddr != {{ fake_ip_range }} counter return
meta l4proto { tcp, udp } ip6 dscp @bypass_dscp counter return
meta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } th dport 53 counter return
{% if (tcp_transparent_proxy_mode == 'tproxy'): %}
meta nfproto @proxy_nfproto meta l4proto tcp jump lan_tproxy
{% elif (tcp_transparent_proxy_mode == 'tun'): %}
meta nfproto @proxy_nfproto meta l4proto tcp jump lan_tun
{% if (tcp_mode == 'tproxy'): %}
iifname @lan_inbound_device meta nfproto @proxy_nfproto meta l4proto tcp jump lan_tproxy
{% elif (tcp_mode == 'tun'): %}
iifname @lan_inbound_device meta nfproto @proxy_nfproto meta l4proto tcp jump lan_tun
{% endif %}
{% if (udp_transparent_proxy_mode == 'tproxy'): %}
meta nfproto @proxy_nfproto meta l4proto udp jump lan_tproxy
{% elif (udp_transparent_proxy_mode == 'tun'): %}
meta nfproto @proxy_nfproto meta l4proto udp jump lan_tun
{% if (udp_mode == 'tproxy'): %}
iifname @lan_inbound_device meta nfproto @proxy_nfproto meta l4proto udp jump lan_tproxy
{% elif (udp_mode == 'tun'): %}
iifname @lan_inbound_device meta nfproto @proxy_nfproto meta l4proto udp jump lan_tun
{% endif %}
}
{% endif %}

View File

@ -47,7 +47,7 @@ if (uci_bool(uci.get('nikki', 'mixin', 'authentication'))) {
}
config['tun'] = {};
if (uci.get('nikki', 'proxy', 'tcp_transparent_proxy_mode') == 'tun' || uci.get('nikki', 'proxy', 'udp_transparent_proxy_mode') == 'tun') {
if (uci.get('nikki', 'proxy', 'tcp_mode') == 'tun' || uci.get('nikki', 'proxy', 'udp_mode') == 'tun') {
config['tun']['enable'] = true;
config['tun']['auto-route'] = false;
config['tun']['auto-redirect'] = false;