Skip to content

Commit c7c8419

Browse files
committed
feat: apply optional http-meta extra fwmark
1 parent ee17825 commit c7c8419

1 file changed

Lines changed: 42 additions & 5 deletions

File tree

‎module/scripts/sub_store.service‎

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ stop_by_pidfile() {
9393
# 仅匹配该进程的本地出站流量,不影响同为 uid 2000 的 Sub-Store / adb shell。
9494
HTTP_META_BYPASS_GID=9999
9595
HTTP_META_BYPASS_MARK="0x20000/0x20000"
96+
HTTP_META_BYPASS_CHAIN="SUBSTORE_HTTPMETA"
9697

9798
http_meta_bypass_vpn_enabled() {
9899
[ "${run_http_meta:-true}" = "true" ] || return 1
@@ -103,26 +104,58 @@ http_meta_bypass_vpn_enabled() {
103104
http_meta_bypass_vpn_rule() {
104105
local ipt="$1"
105106
local action="$2"
107+
local extra_mark="${http_meta_bypass_vpn_extra_mark:-}"
106108

107109
command -v "$ipt" >/dev/null 2>&1 || return 1
108110

109111
case "$action" in
110112
add)
111-
"$ipt" -t mangle -C OUTPUT \
113+
# 清理旧版直接挂在 OUTPUT 上的规则
114+
while "$ipt" -t mangle -C OUTPUT \
112115
-m owner --uid-owner 2000 --gid-owner "$HTTP_META_BYPASS_GID" \
113-
-j MARK --set-xmark "$HTTP_META_BYPASS_MARK" >/dev/null 2>&1 && return 0
114-
"$ipt" -t mangle -I OUTPUT 1 \
116+
-j MARK --set-xmark "$HTTP_META_BYPASS_MARK" >/dev/null 2>&1; do
117+
"$ipt" -t mangle -D OUTPUT \
118+
-m owner --uid-owner 2000 --gid-owner "$HTTP_META_BYPASS_GID" \
119+
-j MARK --set-xmark "$HTTP_META_BYPASS_MARK" >/dev/null 2>&1 || break
120+
done
121+
122+
"$ipt" -t mangle -N "$HTTP_META_BYPASS_CHAIN" 2>/dev/null || true
123+
"$ipt" -t mangle -F "$HTTP_META_BYPASS_CHAIN" || return 1
124+
"$ipt" -t mangle -A "$HTTP_META_BYPASS_CHAIN" \
125+
-j MARK --set-xmark "$HTTP_META_BYPASS_MARK" || return 1
126+
127+
if [ -n "$extra_mark" ]; then
128+
"$ipt" -t mangle -A "$HTTP_META_BYPASS_CHAIN" \
129+
-j MARK --set-xmark "$extra_mark" || return 1
130+
fi
131+
132+
"$ipt" -t mangle -C OUTPUT \
115133
-m owner --uid-owner 2000 --gid-owner "$HTTP_META_BYPASS_GID" \
116-
-j MARK --set-xmark "$HTTP_META_BYPASS_MARK"
134+
-j "$HTTP_META_BYPASS_CHAIN" >/dev/null 2>&1 ||
135+
"$ipt" -t mangle -I OUTPUT 1 \
136+
-m owner --uid-owner 2000 --gid-owner "$HTTP_META_BYPASS_GID" \
137+
-j "$HTTP_META_BYPASS_CHAIN"
117138
;;
118139
del)
140+
while "$ipt" -t mangle -C OUTPUT \
141+
-m owner --uid-owner 2000 --gid-owner "$HTTP_META_BYPASS_GID" \
142+
-j "$HTTP_META_BYPASS_CHAIN" >/dev/null 2>&1; do
143+
"$ipt" -t mangle -D OUTPUT \
144+
-m owner --uid-owner 2000 --gid-owner "$HTTP_META_BYPASS_GID" \
145+
-j "$HTTP_META_BYPASS_CHAIN" >/dev/null 2>&1 || break
146+
done
147+
148+
# 兼容清理旧版直接挂在 OUTPUT 上的 protectedFromVpn 规则
119149
while "$ipt" -t mangle -C OUTPUT \
120150
-m owner --uid-owner 2000 --gid-owner "$HTTP_META_BYPASS_GID" \
121151
-j MARK --set-xmark "$HTTP_META_BYPASS_MARK" >/dev/null 2>&1; do
122152
"$ipt" -t mangle -D OUTPUT \
123153
-m owner --uid-owner 2000 --gid-owner "$HTTP_META_BYPASS_GID" \
124154
-j MARK --set-xmark "$HTTP_META_BYPASS_MARK" >/dev/null 2>&1 || break
125155
done
156+
157+
"$ipt" -t mangle -F "$HTTP_META_BYPASS_CHAIN" >/dev/null 2>&1 || true
158+
"$ipt" -t mangle -X "$HTTP_META_BYPASS_CHAIN" >/dev/null 2>&1 || true
126159
;;
127160
*)
128161
return 1
@@ -157,7 +190,11 @@ setup_http_meta_bypass_vpn() {
157190
return 1
158191
}
159192

160-
log Info "http-meta VPN 绕过已启用 (gid $HTTP_META_BYPASS_GID, protectedFromVpn)"
193+
if [ -n "${http_meta_bypass_vpn_extra_mark:-}" ]; then
194+
log Info "http-meta VPN 绕过已启用 (gid $HTTP_META_BYPASS_GID, protectedFromVpn + ${http_meta_bypass_vpn_extra_mark})"
195+
else
196+
log Info "http-meta VPN 绕过已启用 (gid $HTTP_META_BYPASS_GID, protectedFromVpn)"
197+
fi
161198
return 0
162199
}
163200

0 commit comments

Comments
 (0)