@@ -93,6 +93,7 @@ stop_by_pidfile() {
9393# 仅匹配该进程的本地出站流量,不影响同为 uid 2000 的 Sub-Store / adb shell。
9494HTTP_META_BYPASS_GID=9999
9595HTTP_META_BYPASS_MARK=" 0x20000/0x20000"
96+ HTTP_META_BYPASS_CHAIN=" SUBSTORE_HTTPMETA"
9697
9798http_meta_bypass_vpn_enabled () {
9899 [ " ${run_http_meta:- true} " = " true" ] || return 1
@@ -103,26 +104,58 @@ http_meta_bypass_vpn_enabled() {
103104http_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