update 2026-06-11 02:27:18

This commit is contained in:
action 2026-06-11 02:27:19 +08:00
parent 15d6d1ef44
commit 3e8ff8ad29
14 changed files with 1227 additions and 1133 deletions

View File

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

View File

@ -134,6 +134,12 @@ return view.extend({
s.tab('rlimit', _('RLIMIT Config'));
o = s.taboption('rlimit', form.Value, 'rlimit_nproc_soft', _('Number of Processes Soft Limit'));
o.datatype = 'uinteger';
o = s.taboption('rlimit', form.Value, 'rlimit_nproc_hard', _('Number of Processes Hard Limit'));
o.datatype = 'uinteger';
o = s.taboption('rlimit', form.Value, 'rlimit_address_space_soft', _('Address Space Size Soft Limit'));
o.datatype = 'uinteger';
o.placeholder = _('Unlimited');
@ -166,6 +172,14 @@ return view.extend({
s.tab('environment_variable', _('Environment Variable Config'));
o = s.taboption('environment_variable', form.Value, 'env_go_max_procs', 'GOMAXPROCS');
o.datatype = 'uinteger';
o.placeholder = _('Unlimited');
o = s.taboption('environment_variable', form.Value, 'env_go_mem_limit', 'GOMEMLIMIT');
o.datatype = 'uinteger';
o.placeholder = _('Unlimited');
o = s.taboption('environment_variable', form.DynamicList, 'env_safe_paths', _('Safe Paths'));
o.load = function (section_id) {
return this.super('load', section_id)?.split(':');

View File

@ -25,10 +25,13 @@ return view.extend({
s = m.section(form.NamedSection, 'log', 'log', _('Log'));
s.tab('log_config', _('Log Config'));
o = s.taboption('log_config', form.Flag, 'clear_at_stop', _('Clear At Stop'));
o.rmempty = false;
o = s.taboption('log_config', form.Flag, 'scheduled_clear', _('Scheduled Clear'));
o.rmempty = false;
o = s.taboption('log_config', form.Value, 'scheduled_clear_cron', _('Scheduled Clear Cron'));
o.retain = true;
o.rmempty = false;

View File

@ -81,6 +81,7 @@ return view.extend({
o = s.option(form.ListValue, 'prefer', _('Prefer'));
o.default = 'remote';
o.modalonly = true;
o.rmempty = false;
o.value('remote', _('Remote'));
o.value('local', _('Local'));

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -7,25 +7,14 @@ PKG_RELEASE:=1
PKG_LICENSE:=GPL3.0+
PKG_MAINTAINER:=Joseph Mory <morytyann@gmail.com>
PKG_BUILD_DEPENDS:=golang/host
PKG_BUILD_PARALLEL:=1
PKG_BUILD_FLAGS:=no-mips16
PKG_BUILD_TIME:=$(shell date -u -Iseconds)
GO_PKG:=github.com/metacubex/mihomo
GO_PKG_LDFLAGS_X:=$(GO_PKG)/constant.Version=$(PKG_SOURCE_VERSION) $(GO_PKG)/constant.BuildTime=$(PKG_BUILD_TIME)
GO_PKG_TAGS:=with_gvisor
include $(INCLUDE_DIR)/package.mk
include $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk
define Package/nikki
SECTION:=net
CATEGORY:=Network
TITLE:=Transparent Proxy with Mihomo on OpenWrt.
URL:=https://github.com/nikkinikki-org
DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle +curl +yq firewall4 +ip-full +kmod-inet-diag +kmod-nft-socket +kmod-nft-tproxy +kmod-tun +kmod-dummy +mihomo
DEPENDS:=+ca-bundle +curl +yq firewall4 +ip-full +kmod-inet-diag +kmod-nft-socket +kmod-nft-tproxy +kmod-tun +kmod-dummy +mihomo
endef
define Package/nikki/conffiles
@ -87,5 +76,4 @@ define Build/Compile
endef
$(eval $(call GoBinPackage,nikki))
$(eval $(call BuildPackage,nikki))

View File

@ -234,6 +234,7 @@ config routing 'routing'
config editor 'editor'
config log 'log'
option 'clear_at_stop' '1'
option 'scheduled_clear' '1'
option 'scheduled_clear_cron' '*/5 * * * *'
option 'scheduled_clear_size_limit' '1'

View File

@ -67,7 +67,9 @@ start_service() {
local fast_reload
config_get_bool fast_reload "procd" "fast_reload" 0
### rlimit
local rlimit_address_space_soft rlimit_address_space_hard rlimit_data_soft rlimit_data_hard rlimit_stack_soft rlimit_stack_hard rlimit_nofile_soft rlimit_nofile_hard
local rlimit_nproc_soft rlimit_nproc_hard rlimit_address_space_soft rlimit_address_space_hard rlimit_data_soft rlimit_data_hard rlimit_stack_soft rlimit_stack_hard rlimit_nofile_soft rlimit_nofile_hard
config_get rlimit_nproc_soft "procd" "rlimit_nproc_soft" "$(ulimit -Su)"
config_get rlimit_nproc_hard "procd" "rlimit_nproc_hard" "$(ulimit -Hu)"
config_get rlimit_address_space_soft "procd" "rlimit_address_space_soft"
config_get rlimit_address_space_hard "procd" "rlimit_address_space_hard"
config_get rlimit_data_soft "procd" "rlimit_data_soft"
@ -77,7 +79,9 @@ start_service() {
config_get rlimit_nofile_soft "procd" "rlimit_nofile_soft" "$(ulimit -Sn)"
config_get rlimit_nofile_hard "procd" "rlimit_nofile_hard" "$(ulimit -Hn)"
### environment variable
local env_safe_paths env_disable_loopback_detector env_disable_quic_go_gso env_disable_quic_go_ecn env_skip_system_ipv6_check
local env_go_max_procs env_go_mem_limit env_safe_paths env_disable_loopback_detector env_disable_quic_go_gso env_disable_quic_go_ecn env_skip_system_ipv6_check
config_get env_go_max_procs "procd" "env_go_max_procs"
config_get env_go_mem_limit "procd" "env_go_mem_limit"
config_get env_safe_paths "procd" "env_safe_paths"
config_get_bool env_disable_loopback_detector "procd" "env_disable_loopback_detector" 0
config_get_bool env_disable_quic_go_gso "procd" "env_disable_quic_go_gso" 0
@ -179,9 +183,9 @@ start_service() {
yq -M -i 'del(.sniffer.sniff)' "$RUN_PROFILE_PATH"
fi
if [ "$mixin_file_content" = 0 ]; then
ucode -S "$MIXIN_UC" | yq -M -p json -o yaml | yq -M -i eval-all '... comments="" | . as $item ireduce ({}; . * $item ) | .proxies = .nikki-proxies + .proxies | del(.nikki-proxies) | .proxy-groups = .nikki-proxy-groups + .proxy-groups | del(.nikki-proxy-groups) | .rules = .nikki-rules + .rules | del(.nikki-rules)' "$RUN_PROFILE_PATH" -
ucode -S "$MIXIN_UC" | yq -M -p json -o yaml | yq -M -i eval-all '... comments="" | . as $item ireduce ({}; . * $item ) | .proxies = .nikki-proxies + .proxies | del(.nikki-proxies) | .proxy-groups = .nikki-proxy-groups + .proxy-groups | del(.nikki-proxy-groups) | .rules = .nikki-rules + .rules | del(.nikki-rules) | explode(.)' "$RUN_PROFILE_PATH" -
elif [ "$mixin_file_content" = 1 ]; then
ucode -S "$MIXIN_UC" | yq -M -p json -o yaml | yq -M -i eval-all '... comments="" | . as $item ireduce ({}; . * $item ) | .proxies = .nikki-proxies + .proxies | del(.nikki-proxies) | .proxy-groups = .nikki-proxy-groups + .proxy-groups | del(.nikki-proxy-groups) | .rules = .nikki-rules + .rules | del(.nikki-rules)' "$RUN_PROFILE_PATH" "$MIXIN_FILE_PATH" -
ucode -S "$MIXIN_UC" | yq -M -p json -o yaml | yq -M -i eval-all '... comments="" | . as $item ireduce ({}; . * $item ) | .proxies = .nikki-proxies + .proxies | del(.nikki-proxies) | .proxy-groups = .nikki-proxy-groups + .proxy-groups | del(.nikki-proxy-groups) | .rules = .nikki-rules + .rules | del(.nikki-rules) | explode(.)' "$RUN_PROFILE_PATH" "$MIXIN_FILE_PATH" -
fi
if [ "$proxy_enabled" = 1 ]; then
if yq -M -e 'has("tun")' "$RUN_PROFILE_PATH" > /dev/null 2>&1; then
@ -247,21 +251,27 @@ start_service() {
procd_set_param command /bin/sh -c "$PROG -d $RUN_DIR >> $CORE_LOG_PATH 2>&1"
procd_set_param file "$RUN_PROFILE_PATH"
procd_append_param env SAFE_PATHS="$env_safe_paths"
procd_append_param env DISABLE_LOOPBACK_DETECTOR="$env_disable_loopback_detector"
procd_append_param env QUIC_GO_DISABLE_GSO="$env_disable_quic_go_gso"
procd_append_param env QUIC_GO_DISABLE_ECN="$env_disable_quic_go_ecn"
procd_append_param env SKIP_SYSTEM_IPV6_CHECK="$env_skip_system_ipv6_check"
if [ "$fast_reload" = 1 ]; then
procd_set_param reload_signal HUP
fi
procd_set_param pidfile "$PID_FILE_PATH"
procd_set_param respawn
procd_append_param limits nproc="${rlimit_nproc_soft} ${rlimit_nproc_hard}"
procd_append_param limits as="${rlimit_address_space_soft:-unlimited} ${rlimit_address_space_hard:-unlimited}"
procd_append_param limits data="${rlimit_data_soft:-unlimited} ${rlimit_data_hard:-unlimited}"
procd_append_param limits stack="${rlimit_stack_soft:-unlimited} ${rlimit_stack_hard:-unlimited}"
procd_append_param limits nofile="${rlimit_nofile_soft} ${rlimit_nofile_hard}"
procd_append_param env GOMAXPROCS="$env_go_max_procs"
procd_append_param env GOMEMLIMIT="$env_go_mem_limit"
procd_append_param env SAFE_PATHS="$env_safe_paths"
procd_append_param env DISABLE_LOOPBACK_DETECTOR="$env_disable_loopback_detector"
procd_append_param env QUIC_GO_DISABLE_GSO="$env_disable_quic_go_gso"
procd_append_param env QUIC_GO_DISABLE_ECN="$env_disable_quic_go_ecn"
procd_append_param env SKIP_SYSTEM_IPV6_CHECK="$env_skip_system_ipv6_check"
procd_close_instance
# cron
local reload_cron; reload_cron=0
@ -439,11 +449,20 @@ cleanup() {
# load config
config_load nikki
# get config
## log config
local log_clear_at_stop
config_get_bool log_clear_at_stop "log" "clear_at_stop" 0
## routing config
local tproxy_route_table tun_route_table dummy_device
config_get tproxy_route_table "routing" "tproxy_route_table" "80"
config_get tun_route_table "routing" "tun_route_table" "81"
config_get dummy_device "routing" "dummy_device" "nikki-dummy"
# clear logs if needed
if [ "$log_clear_at_stop" = 1 ]; then
echo -n > "$APP_LOG_PATH"
echo -n > "$CORE_LOG_PATH"
log "Log" "Logs are cleared due to clear at stop is enabled."
fi
# delete routing policy
ip -4 rule del table "$tproxy_route_table" > /dev/null 2>&1
ip -4 rule del table "$tun_route_table" > /dev/null 2>&1

View File

@ -225,6 +225,10 @@ log_scheduled_clear_cron=$(uci -q get nikki.log.scheduled_clear_cron); [ -z "$lo
log_scheduled_clear_size_limit=$(uci -q get nikki.log.scheduled_clear_size_limit); [ -z "$log_scheduled_clear_size_limit" ] && uci set nikki.log.scheduled_clear_size_limit=1
log_scheduled_clear_size_limit_unit=$(uci -q get nikki.log.scheduled_clear_size_limit_unit); [ -z "$log_scheduled_clear_size_limit_unit" ] && uci set nikki.log.scheduled_clear_size_limit_unit=MB
# since v1.25.4
config_clear_at_stop=$(uci -q get nikki.log.clear_at_stop); [ -z "$config_clear_at_stop" ] && uci set nikki.log.clear_at_stop=1
# commit
uci commit nikki

View File

@ -255,6 +255,7 @@ table inet nikki {
}
{% if (router_proxy): %}
{% if (length(dns_hijack_nfproto) > 0): %}
chain router_dns_hijack {
{% for (let access_control in router_access_control): %}
{% if (length(access_control['user']) == 0 && length(access_control['group']) == 0 && length(access_control['cgroup']) == 0): %}
@ -274,6 +275,7 @@ table inet nikki {
{% endif %}
{% endfor %}
}
{% endif %}
{% if (tcp_mode == 'redirect'): %}
chain router_redirect {
@ -367,6 +369,7 @@ table inet nikki {
{% endif %}
{% if (lan_proxy): %}
{% if (length(dns_hijack_nfproto) > 0): %}
chain lan_dns_hijack {
{% for (let access_control in lan_access_control): %}
{% if (length(access_control['ip']) == 0 && length(access_control['ip6']) == 0 && length(access_control['mac']) == 0): %}
@ -388,6 +391,7 @@ table inet nikki {
{% endif %}
{% endfor %}
}
{% endif %}
{% if (tcp_mode == 'redirect'): %}
chain lan_redirect {
@ -502,7 +506,9 @@ table inet nikki {
{% elif (cgroups_version == 2): %}
socket cgroupv2 level 2 "services/{{ cgroup_name }}" counter return
{% endif %}
{% if (length(dns_hijack_nfproto) > 0): %}
jump router_dns_hijack
{% endif %}
{% if (tcp_mode == 'redirect'): %}
fib daddr type { local, broadcast, anycast, multicast } counter return
ct direction reply counter return
@ -566,7 +572,9 @@ table inet nikki {
{% if (lan_proxy): %}
chain dstnat {
type nat hook prerouting priority dstnat + 1; policy accept;
{% if (length(dns_hijack_nfproto) > 0): %}
iifname @lan_inbound_device jump lan_dns_hijack
{% endif %}
{% if (tcp_mode == 'redirect'): %}
fib daddr type { local, broadcast, anycast, multicast } counter return
ct direction reply counter return

View File

@ -21,13 +21,13 @@ define Download/geoip
HASH:=a322dfb6bfd8987c83453c39582a07771c9deddf9f8f7d2d19c7927ebd5e76c8
endef
GEOSITE_VER:=20260610072848
GEOSITE_VER:=20260610135238
GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER)
define Download/geosite
URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/
URL_FILE:=dlc.dat
FILE:=$(GEOSITE_FILE)
HASH:=b091b91f20b493b46b30e09b7b6814753c07d64bf3b8c8d7fc58e45c253114ff
HASH:=212a668172704826304534f6e71a1459a07bfdb1e9ff54bda79e172fc3fbf249
endef
GEOSITE_IRAN_VER:=202606080206