@@ -8,6 +8,16 @@ chains=(
88 BOX_IP_V4
99)
1010
11+ init_chains () {
12+ local table=" $1 "
13+ local iptables=" iptables -w 64"
14+
15+ for chain in " ${chains[@]} " ; do
16+ ${iptables} -t ${table} -N ${chain} 2> /dev/null
17+ ${iptables} -t ${table} -F ${chain}
18+ done
19+ }
20+
1121cleanup_limit () {
1222 local iptables=" iptables -w 64"
1323
@@ -49,6 +59,24 @@ setup_intranet_rules() {
4959 done
5060}
5161
62+ # 处理 dns 流量
63+ setup_dns () {
64+ local table=" $1 "
65+ local chain=" $2 "
66+ local iptables=" iptables -w 64"
67+
68+ for proto in tcp udp; do
69+ case ${table} in
70+ nat)
71+ ${iptables} -t ${table} -A ${chain} -p ${proto} --dport 53 -j REDIRECT --to-ports " ${redir_port} "
72+ ;;
73+ mangle)
74+ ${iptables} -t ${table} -A ${chain} -p ${proto} --dport 53 -j TPROXY --on-port ${tproxy_port} --tproxy-mark ${fwmark}
75+ ;;
76+ esac
77+ done
78+ }
79+
5280# 统一的包过滤函数
5381handle_packages () {
5482 local table=" $1 "
@@ -101,13 +129,10 @@ redirect() {
101129
102130 log info " Setting up iptables for redirect mode"
103131
104- # 创建自定义链
105- for chain in " ${chains[@]} " ; do
106- ${iptables} -t nat -N ${chain} 2> /dev/null
107- ${iptables} -t nat -F ${chain}
108- done
132+ # 初始化自定义链
133+ init_chains nat
109134
110- # 设置基础绕过规则
135+ # 处理 sing-box 流量
111136 ${iptables} -t nat -I BOX_LOCAL -m owner --uid-owner " ${box_user} " --gid-owner " ${box_group} " -j RETURN
112137
113138 # 处理应用过滤
@@ -119,10 +144,8 @@ redirect() {
119144 setup_intranet_rules nat BOX_LOCAL
120145
121146 # DNS 处理
122- for proto in tcp udp; do
123- ${iptables} -t nat -A BOX_EXTERNAL -p ${proto} --dport 53 -j REDIRECT --to-ports " ${redir_port} "
124- ${iptables} -t nat -A BOX_LOCAL -p ${proto} --dport 53 -j REDIRECT --to-ports " ${redir_port} "
125- done
147+ setup_dns nat BOX_EXTERNAL
148+ setup_dns nat BOX_LOCAL
126149
127150 # 处理特殊接口
128151 ${iptables} -t nat -A BOX_EXTERNAL -p tcp -i lo -j REDIRECT --to-ports " ${redir_port} "
@@ -159,31 +182,26 @@ tproxy() {
159182
160183 log info " Setting up iptables for tproxy mode"
161184
185+ # 初始化自定义链
186+ init_chains mangle
187+
162188 # 配置策略路由
163189 ip rule add fwmark " ${fwmark} " table " ${table} " pref " ${pref} "
164190 ip route add local default dev lo table " ${table} "
165191
166- # 创建自定义链
167- for chain in " ${chains[@]} " ; do
168- ${iptables} -t mangle -N ${chain} 2> /dev/null
169- ${iptables} -t mangle -F ${chain}
170- done
192+ # 处理 sing-box 流量
193+ ${iptables} -t mangle -A BOX_LOCAL -m owner --uid-owner ${box_user} --gid-owner ${box_group} -j RETURN
171194
172- # DNS 处理
173- for proto in tcp udp; do
174- ${iptables} -t mangle -A BOX_EXTERNAL -p ${proto} --dport 53 -j TPROXY --on-port ${tproxy_port} --tproxy-mark ${fwmark}
175- done
195+ # 应用过滤
196+ handle_packages mangle BOX_LOCAL " include"
197+ handle_packages mangle BOX_LOCAL " exclude"
176198
177199 # 内网流量处理
178200 setup_intranet_rules mangle BOX_EXTERNAL
179201 setup_intranet_rules mangle BOX_LOCAL
180202
181- # 处理本地流量
182- ${iptables} -t mangle -A BOX_LOCAL -m owner --uid-owner ${box_user} --gid-owner ${box_group} -j RETURN
183-
184- # 应用过滤
185- handle_packages mangle BOX_LOCAL " include"
186- handle_packages mangle BOX_LOCAL " exclude"
203+ # DNS 处理
204+ setup_dns mangle BOX_EXTERNAL
187205
188206 # 处理特殊接口
189207 for proto in tcp udp; do
@@ -236,7 +254,7 @@ tun() {
236254}
237255
238256# 清理手机产商的网络限制
239- cleanup_limit
257+ (sleep 10 && cleanup_limit) &
240258
241259# 主程序入口
242260case " $1 " in
0 commit comments