Browse Source

Merge pull request #1047 from Adze1502/master

mwan3: update to version 1.6-1
Steven Barth 10 years ago
parent
commit
a341c46ddf

+ 3
- 3
net/mwan3/Makefile View File

@@ -8,8 +8,8 @@
8 8
 include $(TOPDIR)/rules.mk
9 9
 
10 10
 PKG_NAME:=mwan3
11
-PKG_VERSION:=1.5
12
-PKG_RELEASE:=10
11
+PKG_VERSION:=1.6
12
+PKG_RELEASE:=1
13 13
 PKG_MAINTAINER:=Jeroen Louwes <jeroen.louwes@gmail.com>
14 14
 PKG_LICENSE:=GPLv2
15 15
 
@@ -19,7 +19,7 @@ define Package/mwan3
19 19
    SECTION:=net
20 20
    CATEGORY:=Network
21 21
    SUBMENU:=Routing and Redirection
22
-   DEPENDS:=+ip +iptables +iptables-mod-conntrack-extra +iptables-mod-ipopt
22
+   DEPENDS:=+ip +ipset +iptables +iptables-mod-conntrack-extra +iptables-mod-ipopt
23 23
    TITLE:=Multiwan hotplug script with connection tracking support
24 24
    MAINTAINER:=Jeroen Louwes <jeroen.louwes@gmail.com>
25 25
    PKGARCH:=all

+ 8
- 7
net/mwan3/files/etc/config/mwan3 View File

@@ -61,17 +61,18 @@ config policy 'wan2_wan'
61 61
 	list use_member 'wan_m2_w3'
62 62
 	list use_member 'wan2_m1_w2'
63 63
 
64
-config rule 'sticky_even'
65
-	option src_ip '0.0.0.0/0.0.0.1'
66
-	option dest_port '443'
64
+config rule 'youtube'
65
+	option sticky '1'
66
+	option ipset 'youtube'
67
+	option dest_port '80,443'
67 68
 	option proto 'tcp'
68
-	option use_policy 'wan_wan2'
69
+	option use_policy 'balanced'
69 70
 
70
-config rule 'sticky_odd'
71
-	option src_ip '0.0.0.1/0.0.0.1'
71
+config rule 'https'
72
+	option sticky '1'
72 73
 	option dest_port '443'
73 74
 	option proto 'tcp'
74
-	option use_policy 'wan2_wan'
75
+	option use_policy 'balanced'
75 76
 
76 77
 config rule 'default_rule'
77 78
 	option dest_ip '0.0.0.0/0'

+ 117
- 52
net/mwan3/files/etc/hotplug.d/iface/15-mwan3 View File

@@ -12,12 +12,18 @@ mwan3_set_general_iptables()
12 12
 		$IPT -N mwan3_ifaces
13 13
 	fi
14 14
 
15
-	if ! $IPT -S mwan3_rules &> /dev/null; then
16
-		$IPT -N mwan3_rules
17
-	fi
18
-
19 15
 	if ! $IPT -S mwan3_connected &> /dev/null; then
20 16
 		$IPT -N mwan3_connected
17
+		$IPS create mwan3_connected hash:net
18
+		$IPT -A mwan3_connected -m set --match-set mwan3_connected dst -j MARK --set-xmark 0xff00/0xff00
19
+	fi
20
+
21
+	if ! $IPT -S mwan3_track &> /dev/null; then
22
+		$IPT -N mwan3_track
23
+	fi
24
+
25
+	if ! $IPT -S mwan3_rules &> /dev/null; then
26
+		$IPT -N mwan3_rules
21 27
 	fi
22 28
 
23 29
 	if ! $IPT -S mwan3_hook &> /dev/null; then
@@ -25,15 +31,12 @@ mwan3_set_general_iptables()
25 31
 		$IPT -A mwan3_hook -j CONNMARK --restore-mark --nfmask 0xff00 --ctmask 0xff00
26 32
 		$IPT -A mwan3_hook -m mark --mark 0x0/0xff00 -j mwan3_ifaces
27 33
 		$IPT -A mwan3_hook -m mark --mark 0x0/0xff00 -j mwan3_connected
34
+		$IPT -A mwan3_hook -m mark --mark 0x0/0xff00 -j mwan3_track
28 35
 		$IPT -A mwan3_hook -m mark --mark 0x0/0xff00 -j mwan3_rules
29 36
 		$IPT -A mwan3_hook -j CONNMARK --save-mark --nfmask 0xff00 --ctmask 0xff00
30 37
 		$IPT -A mwan3_hook -m mark ! --mark 0xff00/0xff00 -j mwan3_connected
31 38
 	fi
32 39
 
33
-	if ! $IPT -S mwan3_output_hook &> /dev/null; then
34
-		$IPT -N mwan3_output_hook
35
-	fi
36
-
37 40
 	if ! $IPT -S PREROUTING | grep mwan3_hook &> /dev/null; then
38 41
 		$IPT -A PREROUTING -j mwan3_hook
39 42
 	fi
@@ -42,10 +45,6 @@ mwan3_set_general_iptables()
42 45
 		$IPT -A OUTPUT -j mwan3_hook
43 46
 	fi
44 47
 
45
-	if ! $IPT -S OUTPUT | grep mwan3_output_hook &> /dev/null; then
46
-		$IPT -A OUTPUT -j mwan3_output_hook
47
-	fi
48
-
49 48
 	$IPT -F mwan3_rules
50 49
 }
51 50
 
@@ -62,28 +61,29 @@ mwan3_set_general_rules()
62 61
 
63 62
 mwan3_set_connected_iptables()
64 63
 {
65
-	local connected_networks
64
+	local connected_network
66 65
 
67 66
 	if $IPT -S mwan3_connected &> /dev/null; then
68
-		$IPT -F mwan3_connected
69 67
 
70
-		for connected_networks in $($IP route | awk '{print $1}' | egrep '[0-9]{1,3}(\.[0-9]{1,3}){3}'); do
71
-			$IPT -A mwan3_connected -d $connected_networks -j MARK --set-xmark 0xff00/0xff00
68
+		$IPS create mwan3_connected_temp hash:net
69
+
70
+		for connected_network in $($IP route | awk '{print $1}' | egrep '[0-9]{1,3}(\.[0-9]{1,3}){3}'); do
71
+			$IPS -! add mwan3_connected_temp $connected_network
72 72
 		done
73 73
 
74
-		for connected_networks in $($IP route list table 0 | awk '{print $2}' | egrep '[0-9]{1,3}(\.[0-9]{1,3}){3}'); do
75
-			$IPT -A mwan3_connected -d $connected_networks -j MARK --set-xmark 0xff00/0xff00
74
+		for connected_network in $($IP route list table 0 | awk '{print $2}' | egrep '[0-9]{1,3}(\.[0-9]{1,3}){3}'); do
75
+			$IPS -! add mwan3_connected_temp $connected_network
76 76
 		done
77 77
 
78
-		$IPT -I mwan3_connected -d 224.0.0.0/3 -j MARK --set-xmark 0xff00/0xff00
79
-		$IPT -I mwan3_connected -d 127.0.0.0/8 -j MARK --set-xmark 0xff00/0xff00
78
+		$IPS add mwan3_connected_temp 224.0.0.0/3
79
+		$IPS swap mwan3_connected_temp mwan3_connected
80
+		$IPS destroy mwan3_connected_temp
81
+
80 82
 	fi
81 83
 }
82 84
 
83 85
 mwan3_set_iface_iptables()
84 86
 {
85
-	local local_net local_nets
86
-
87 87
 	if ! $IPT -S mwan3_iface_$INTERFACE &> /dev/null; then
88 88
 		$IPT -N mwan3_iface_$INTERFACE
89 89
 	fi
@@ -92,16 +92,7 @@ mwan3_set_iface_iptables()
92 92
 	$IPT -D mwan3_ifaces -m mark --mark 0x0/0xff00 -j mwan3_iface_$INTERFACE &> /dev/null
93 93
 
94 94
 	if [ $ACTION == "ifup" ]; then
95
-		local_nets=$($IP route list dev $DEVICE scope link | awk '{print $1}' | egrep '[0-9]{1,3}(\.[0-9]{1,3}){3}')
96
-
97
-		if [ -n "$local_nets" ]; then
98
-			for local_net in $local_nets ; do
99
-				if [ $ACTION == "ifup" ]; then
100
-					$IPT -I mwan3_iface_$INTERFACE -i $DEVICE -s $local_net -m mark --mark 0x0/0xff00 -m comment --comment "default" -j MARK --set-xmark 0xff00/0xff00
101
-				fi
102
-			done
103
-		fi
104
-
95
+		$IPT -I mwan3_iface_$INTERFACE -i $DEVICE -m set --match-set mwan3_connected src -m mark --mark 0x0/0xff00 -m comment --comment "default" -j MARK --set-xmark 0xff00/0xff00
105 96
 		$IPT -A mwan3_iface_$INTERFACE -i $DEVICE -m mark --mark 0x0/0xff00 -m comment --comment "$INTERFACE" -j MARK --set-xmark $(($iface_id*256))/0xff00
106 97
 		$IPT -A mwan3_ifaces -m mark --mark 0x0/0xff00 -j mwan3_iface_$INTERFACE
107 98
 	fi
@@ -131,6 +122,17 @@ mwan3_set_iface_rules()
131 122
 	[ $ACTION == "ifup" ] && $IP rule add pref $(($iface_id+2000)) fwmark $(($iface_id*256))/0xff00 lookup $iface_id
132 123
 }
133 124
 
125
+mwan3_set_iface_ipset()
126
+{
127
+	local setname entry
128
+
129
+	for setname in $(ipset -n list | grep ^mwan3_sticky_); do
130
+		for entry in $(ipset list $setname | grep "$(echo $(($iface_id*256)) | awk '{ printf "0x%08x", $1; }')" | cut -d ' ' -f 1); do
131
+			$IPS del $setname $entry
132
+		done
133
+	done
134
+}
135
+
134 136
 mwan3_track()
135 137
 {
136 138
 	local track_ip track_ips reliability count timeout interval down up
@@ -154,22 +156,23 @@ mwan3_track()
154 156
 		config_get down $INTERFACE down 5
155 157
 		config_get up $INTERFACE up 5
156 158
 
157
-		if ! $IPT -S mwan3_track_$INTERFACE &> /dev/null; then
158
-			$IPT -N mwan3_track_$INTERFACE
159
-			$IPT -A mwan3_output_hook -p icmp -m icmp --icmp-type 8 -m length --length 32 -j mwan3_track_$INTERFACE
160
-		fi
161
-
162
-		$IPT -F mwan3_track_$INTERFACE
159
+		$IPS -! create mwan3_track_$INTERFACE hash:ip
160
+		$IPS create mwan3_track_temp_$INTERFACE hash:ip
163 161
 
164 162
 		for track_ip in $track_ips; do
165
-			$IPT -A mwan3_track_$INTERFACE -d $track_ip -j MARK --set-xmark 0xff00/0xff00
163
+			$IPS -! add mwan3_track_temp_$INTERFACE $track_ip
166 164
 		done
167 165
 
166
+		$IPS swap mwan3_track_temp_$INTERFACE mwan3_track_$INTERFACE
167
+		$IPS destroy mwan3_track_temp_$INTERFACE
168
+
169
+		$IPT -D mwan3_track -p icmp -m set --match-set mwan3_track_$INTERFACE dst -m icmp --icmp-type 8 -m length --length 32 -j MARK --set-xmark 0xff00/0xff00 &> /dev/null
170
+		$IPT -A mwan3_track -p icmp -m set --match-set mwan3_track_$INTERFACE dst -m icmp --icmp-type 8 -m length --length 32 -j MARK --set-xmark 0xff00/0xff00
171
+
168 172
 		[ -x /usr/sbin/mwan3track ] && /usr/sbin/mwan3track $INTERFACE $DEVICE $reliability $count $timeout $interval $down $up $track_ips &
169 173
 	else
170
-		$IPT -D mwan3_output_hook -p icmp -m icmp --icmp-type 8 -m length --length 32 -j mwan3_track_$INTERFACE &> /dev/null
171
-		$IPT -F mwan3_track_$INTERFACE &> /dev/null
172
-		$IPT -X mwan3_track_$INTERFACE &> /dev/null
174
+		$IPT -D mwan3_track -p icmp -m set --match-set mwan3_track_$INTERFACE dst -m icmp --icmp-type 8 -m length --length 32 -j MARK --set-xmark 0xff00/0xff00 &> /dev/null
175
+		$IPS destroy mwan3_track_$INTERFACE
173 176
 	fi
174 177
 }
175 178
 
@@ -182,7 +185,7 @@ mwan3_set_policy()
182 185
 	config_get weight $1 weight 1
183 186
 
184 187
 	[ -n "$INTERFACE" ] || return 0
185
-	
188
+
186 189
 	config_foreach mwan3_get_iface_id interface
187 190
 
188 191
 	[ -n "$iface_id" ] || return 0
@@ -200,19 +203,19 @@ mwan3_set_policy()
200 203
 
201 204
 			total_weight=$(($total_weight+$weight))
202 205
 			probability=$(($weight*1000/$total_weight))
203
-			
206
+
204 207
 			if [ "$probability" -lt 10 ]; then
205 208
 				probability="0.00$probability"
206
-				elif [ $probability -lt 100 ]; then
209
+			elif [ $probability -lt 100 ]; then
207 210
 				probability="0.0$probability"
208
-				elif [ $probability -lt 1000 ]; then
211
+			elif [ $probability -lt 1000 ]; then
209 212
 				probability="0.$probability"
210 213
 			else
211 214
 				probability="1"
212 215
 			fi
213 216
 
214 217
 			probability="-m statistic --mode random --probability $probability"
215
-			
218
+
216 219
 			$IPT -I mwan3_policy_$policy -m mark --mark 0x0/0xff00 $probability -m comment --comment "$INTERFACE $weight $total_weight" -j MARK --set-xmark $(($iface_id*256))/0xff00
217 220
 		fi
218 221
 	fi
@@ -254,10 +257,34 @@ mwan3_set_policies_iptables()
254 257
 	config_list_foreach $policy use_member mwan3_set_policy
255 258
 }
256 259
 
260
+mwan3_set_sticky_iptables()
261
+{
262
+	local INTERFACE iface_count iface_id
263
+
264
+	INTERFACE="$1"
265
+
266
+	config_foreach mwan3_get_iface_id interface
267
+	unset iface_count
268
+
269
+	$IPS -! create mwan3_sticky_$rule hash:ip,mark markmask 0xff00 timeout $timeout
270
+
271
+	if [ -n "$iface_id" ]; then
272
+		if [ -n "$($IPT -S mwan3_iface_$1 2> /dev/null)" ]; then
273
+			$IPT -I mwan3_rule_$rule -m set ! --match-set mwan3_sticky_$rule src,src -j MARK --set-xmark 0x0/0xff00
274
+			$IPT -I mwan3_rule_$rule -m mark --mark 0/0xff00 -j MARK --set-xmark $(($iface_id*256))/0xff00
275
+		fi
276
+	fi
277
+
278
+	unset iface_id
279
+}
280
+
257 281
 mwan3_set_user_rules_iptables()
258 282
 {
259
-	local proto src_ip src_port dest_ip dest_port use_policy
283
+	local ipset proto src_ip src_port sticky dest_ip dest_port use_policy rule timeout
260 284
 
285
+	config_get sticky $1 sticky 0
286
+	config_get timeout $1 timeout 600
287
+	config_get ipset $1 ipset
261 288
 	config_get proto $1 proto all
262 289
 	config_get src_ip $1 src_ip 0.0.0.0/0
263 290
 	config_get src_port $1 src_port 0:65535
@@ -265,6 +292,20 @@ mwan3_set_user_rules_iptables()
265 292
 	config_get dest_port $1 dest_port 0:65535
266 293
 	config_get use_policy $1 use_policy
267 294
 
295
+	rule="$1"
296
+
297
+	if [ "$rule" != $(echo "$rule" | cut -c1-15) ]; then
298
+		$LOG warn "Rule $rule exceeds max of 15 chars. Not setting rule" && return 0
299
+	fi
300
+
301
+	if [ -n "$ipset" ]; then
302
+		if [ -z "$($IPS -n list $ipset)" ]; then
303
+			$IPS create $ipset hash:ip timeout 3600
304
+		fi
305
+
306
+		ipset="-m set --match-set $ipset dst"
307
+	fi
308
+
268 309
 	if [ -n "$use_policy" ]; then
269 310
 		if [ "$use_policy" == "default" ]; then
270 311
 			use_policy="MARK --set-xmark 0xff00/0xff00"
@@ -273,15 +314,32 @@ mwan3_set_user_rules_iptables()
273 314
 		elif [ "$use_policy" == "blackhole" ]; then
274 315
 			use_policy="MARK --set-xmark 0xfd00/0xff00"
275 316
 		else
276
-			use_policy="mwan3_policy_$use_policy"
317
+			if [ "$sticky" -eq 1 ]; then
318
+
319
+				if ! $IPT -S mwan3_rule_$rule &> /dev/null; then
320
+					$IPT -N mwan3_rule_$rule
321
+				fi
322
+
323
+				$IPT -F mwan3_rule_$rule
324
+
325
+				config_foreach mwan3_set_sticky_iptables interface
326
+
327
+				$IPT -A mwan3_rule_$rule -m mark --mark 0/0xff00 -j mwan3_policy_$use_policy
328
+				$IPT -A mwan3_rule_$rule -m mark ! --mark 0xfc00/0xfc00 -j SET --del-set mwan3_sticky_$rule src,src
329
+				$IPT -A mwan3_rule_$rule -m mark ! --mark 0xfc00/0xfc00 -j SET --add-set mwan3_sticky_$rule src,src
330
+
331
+				use_policy="mwan3_rule_$rule"
332
+			else
333
+				use_policy="mwan3_policy_$use_policy"
334
+			fi
277 335
 		fi
278 336
 
279 337
 		case $proto in
280 338
 			tcp|udp)
281
-			$IPT -A mwan3_rules -p $proto -s $src_ip -d $dest_ip -m multiport --sports $src_port -m multiport --dports $dest_port -m mark --mark 0/0xff00 -m comment --comment "$1" -j $use_policy &> /dev/null
339
+			$IPT -A mwan3_rules -p $proto -s $src_ip -d $dest_ip $ipset -m multiport --sports $src_port -m multiport --dports $dest_port -m mark --mark 0/0xff00 -m comment --comment "$1" -j $use_policy &> /dev/null
282 340
 			;;
283 341
 			*)
284
-			$IPT -A mwan3_rules -p $proto -s $src_ip -d $dest_ip -m mark --mark 0/0xff00 -m comment --comment "$1" -j $use_policy &> /dev/null
342
+			$IPT -A mwan3_rules -p $proto -s $src_ip -d $dest_ip $ipset -m mark --mark 0/0xff00 -m comment --comment "$1" -j $use_policy &> /dev/null
285 343
 			;;
286 344
 		esac
287 345
 	fi
@@ -333,6 +391,7 @@ mwan3_ifupdown()
333 391
 	mwan3_set_iface_route
334 392
 	mwan3_set_iface_rules
335 393
 
394
+	[ $ACTION == "ifdown" ] && mwan3_set_iface_ipset
336 395
 	[ $ACTION == "ifup" ] && mwan3_track
337 396
 
338 397
 	config_foreach mwan3_set_policies_iptables policy
@@ -346,9 +405,15 @@ if [ $ACTION == "ifup" ]; then
346 405
 	[ -n "$DEVICE" ] || exit 0
347 406
 fi
348 407
 
349
-local IP IPT LOG
408
+[ -x /usr/sbin/ip ] || exit 1
409
+[ -x /usr/sbin/ipset ] || exit 1
410
+[ -x /usr/sbin/iptables ] || exit 1
411
+[ -x /usr/bin/logger ] || exit 1
412
+
413
+local IP IPS IPT LOG
350 414
 
351 415
 IP="/usr/sbin/ip -4"
416
+IPS="/usr/sbin/ipset"
352 417
 IPT="/usr/sbin/iptables -t mangle -w"
353 418
 LOG="/usr/bin/logger -t mwan3 -p"
354 419
 

+ 27
- 21
net/mwan3/files/usr/sbin/mwan3 View File

@@ -2,14 +2,15 @@
2 2
 . /lib/functions.sh
3 3
 
4 4
 IP="/usr/sbin/ip -4"
5
+IPS="/usr/sbin/ipset"
5 6
 IPT="/usr/sbin/iptables -t mangle -w"
6 7
 
7 8
 help()
8
-{                                                                    
9
-	cat <<EOF                                                                                      
10
-Syntax: mwan3 [command]                                                                          
11
-                                                                                                       
12
-Available commands:                                                                                    
9
+{
10
+	cat <<EOF
11
+Syntax: mwan3 [command]
12
+
13
+Available commands:
13 14
 	start           Load iptables rules, ip rules and ip routes
14 15
 	stop            Unload iptables rules, ip rules and ip routes
15 16
 	restart         Reload iptables rules, ip rules and ip routes
@@ -54,11 +55,11 @@ ifup()
54 55
 	if [ -n "$2" ]; then
55 56
 		echo "Too many arguments. Usage: mwan3 ifup <interface>" && exit 0
56 57
 	fi
57
-	
58
+
58 59
 	config_get enabled "$1" enabled 0
59 60
 
60 61
 	device=$(uci get -p /var/state network.$1.ifname) &> /dev/null
61
-	
62
+
62 63
 	if [ -n "$device" ] ; then
63 64
 		[ "$enabled" -eq 1 ] && ACTION=ifup INTERFACE=$1 DEVICE=$device /sbin/hotplug-call iface
64 65
 	fi
@@ -71,14 +72,14 @@ interfaces()
71 72
 	config_load mwan3
72 73
 
73 74
 	echo "Interface status:"
74
-	
75
+
75 76
 	check_iface_status()
76 77
 	{
77 78
 		let iface_id++
78 79
 		device=$(uci get -p /var/state network.$1.ifname) &> /dev/null
79 80
 
80 81
 		if [ -z "$device" ]; then
81
-			echo "Interface $1 is unknown"
82
+			echo " interface $1 is unknown"
82 83
 			return 0
83 84
 		fi
84 85
 
@@ -92,21 +93,21 @@ interfaces()
92 93
 
93 94
 		if [ -n "$($IP rule | awk '$5 == "'$device'"')" -a -n "$($IPT -S mwan3_iface_$1 2> /dev/null)" -a -n "$($IP route list table $iface_id default dev $device 2> /dev/null)" ]; then
94 95
 			if [ -n "$(uci get -p /var/state mwan3.$1.track_ip 2> /dev/null)" ]; then
95
-				echo "Interface $1 is online (tracking $tracking)"
96
+				echo " interface $1 is online (tracking $tracking)"
96 97
 			else
97
-				echo "Interface $1 is online"
98
+				echo " interface $1 is online"
98 99
 			fi
99 100
 		elif [ -n "$($IP rule | awk '$5 == "'$device'"')" -o -n "$($IPT -S mwan3_iface_$1 2> /dev/null)" -o -n "$($IP route list table $iface_id default dev $device 2> /dev/null)" ]; then
100
-			echo "Interface $1 error"
101
+			echo " interface $1 error"
101 102
 		else
102 103
 			if [ "$enabled" -eq 1 ]; then
103 104
 				if [ -n "$(uci get -p /var/state mwan3.$1.track_ip 2> /dev/null)" ]; then
104
-					echo "Interface $1 is offline (tracking $tracking)"
105
+					echo " interface $1 is offline (tracking $tracking)"
105 106
 				else
106
-					echo "Interface $1 is offline"
107
+					echo " interface $1 is offline"
107 108
 				fi
108 109
 			else
109
-				echo "Interface $1 is disabled"
110
+				echo " interface $1 is disabled"
110 111
 			fi
111 112
 		fi
112 113
 	}
@@ -141,17 +142,19 @@ policies()
141 142
 }
142 143
 rules()
143 144
 {
145
+	local address
146
+
144 147
 	if [ -n "$($IPT -S mwan3_connected 2> /dev/null)" ]; then
145 148
 		echo "Known networks:"
146
-		echo "destination policy hits" | awk '{ printf "%-19s%-19s%-9s%s\n",$1,$2,$3}' | awk '1; {gsub(".","-")}1'
147
-		$IPT -L mwan3_connected -n -v 2> /dev/null | tail -n+3 | sed 's/mark.*//' | sed 's/mwan3_policy_//' | awk '{printf "%-19s%-19s%-9s%s\n",$9,"default",$1}'
149
+		for address in $($IPS list mwan3_connected | egrep '[0-9]{1,3}(\.[0-9]{1,3}){3}'); do
150
+			echo " $address"
151
+		done
148 152
 		echo -e
149 153
 	fi
150 154
 
151 155
 	if [ -n "$($IPT -S mwan3_rules 2> /dev/null)" ]; then
152 156
 		echo "Active rules:"
153
-		echo "source destination proto src-port dest-port policy hits" | awk '{ printf "%-19s%-19s%-7s%-14s%-14s%-16s%-9s%s\n",$1,$2,$3,$4,$5,$6,$7}' | awk '1; {gsub(".","-")}1'
154
-		$IPT -L mwan3_rules -n -v 2> /dev/null | tail -n+3 | sed 's/mark.*//' | sed 's/mwan3_policy_//' | awk '{ printf "%-19s%-19s%-7s%-14s%-14s%-16s%-9s%s\n",$8,$9,$4,$12,$15,$3,$1}'
157
+		$IPT -L mwan3_rules -n -v 2> /dev/null | tail -n+3 | sed 's/mark.*//' | sed 's/mwan3_policy_/- /' | sed 's/mwan3_rule_/S /'
155 158
 		echo -e
156 159
 	fi
157 160
 }
@@ -171,7 +174,7 @@ start()
171 174
 
172 175
 stop()
173 176
 {
174
-	local route rule table
177
+	local ipset route rule table
175 178
 
176 179
 	killall mwan3track &> /dev/null
177 180
 	rm /var/run/mwan3track-* &> /dev/null
@@ -186,7 +189,6 @@ stop()
186 189
 
187 190
 	$IPT -D PREROUTING -j mwan3_hook &> /dev/null
188 191
 	$IPT -D OUTPUT -j mwan3_hook &> /dev/null
189
-	$IPT -D OUTPUT -j mwan3_output_hook &> /dev/null
190 192
 
191 193
 	for table in $($IPT -S | awk '{print $2}' | grep mwan3 | sort -u); do
192 194
 		$IPT -F $table &> /dev/null
@@ -195,6 +197,10 @@ stop()
195 197
 	for table in $($IPT -S | awk '{print $2}' | grep mwan3 | sort -u); do
196 198
 		$IPT -X $table &> /dev/null
197 199
 	done
200
+
201
+	for ipset in $(ipset -n list | grep mwan3); do
202
+		$IPS destroy $ipset
203
+	done
198 204
 }
199 205
 
200 206
 restart() {