Skip to content

Commit e079e3a

Browse files
author
bol-van
committed
ipset: rewrite IPSET_HOOK logic. now scripts outputs ip addresses
1 parent 027b381 commit e079e3a

File tree

3 files changed

+28
-15
lines changed

3 files changed

+28
-15
lines changed

config

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ SET_MAXELEM=522288
1313
# too low hashsize can cause memory allocation errors on low RAM systems , even if RAM is enough
1414
# too large hashsize will waste lots of RAM
1515
IPSET_OPT="hashsize 262144 maxelem $SET_MAXELEM"
16-
# create_ipset hook
17-
#IPSET_POST_HOOK="/etc/zapret.ipset.hook"
16+
# dynamically generate additional ip. $1 = ipset/nfset/table name
17+
#IPSET_HOOK="/etc/zapret.ipset.hook"
1818

1919
# options for ip2net. "-4" or "-6" auto added by ipset create script
2020
IP2NET_OPT4="--prefix-length=22-30 --v4-threshold=3/4"

docs/readme.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,9 @@ NFQUEUE работает без изменений.
158158

159159
Рекомендуется версия nft 1.0.2 или выше.
160160

161+
Относительно старые версии ядра и/или утилиты nft могут вызывать ошибки.
162+
В частности, на ubuntu 18.04 с ядром 4.15 будут проблемы. В 20.04 - работает.
163+
161164

162165
Когда это работать не будет
163166
---------------------------
@@ -945,6 +948,10 @@ TMPDIR=/opt/zapret/tmp
945948
SET_MAXELEM=262144
946949
IPSET_OPT="hashsize 262144 maxelem 2097152"
947950

951+
Хук, позволяющий внести ip адреса динамически. $1 = имя таблицы
952+
Адреса выводятся в stdout. В случае nfset автоматически решается проблема возможного пересечения интервалов.
953+
IPSET_HOOK="/etc/zapret.ipset.hook"
954+
948955
ПРО РУГАНЬ в dmesg по поводу нехватки памяти.
949956
Может так случиться, что памяти в системе достаточно, но при попытке заполнить огромный ipset
950957
ядро начинает громко ругаться, ipset заполняется не полностью.

ipset/create_ipset.sh

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ NFSET_TEMP="$TMPDIR/nfset_temp.txt"
1919
NFSET_SAVERAM_MIN_FILESIZE=16384
2020
NFSET_SAVERAM_CHUNK_SIZE=1000
2121

22+
IPSET_HOOK_TEMP="$TMPDIR/ipset_hook.txt"
2223

2324
while [ -n "$1" ]; do
2425
[ "$1" = "no-update" ] && NO_UPDATE=1
@@ -53,10 +54,15 @@ ipset_restore_chunked()
5354

5455

5556
ipset_get_script()
57+
{
58+
# $1 - ipset name
59+
sed -nEe "s/^.+$/add $1 &/p"
60+
}
61+
ipset_get_script_from_file()
5662
{
5763
# $1 - filename
5864
# $2 - ipset name
59-
zzcat "$1" | sort -u | sed -nEe "s/^.+$/add $2 &/p"
65+
zzcat "$1" | sort -u | ipset_get_script $2
6066
}
6167
ipset_restore()
6268
{
@@ -75,11 +81,11 @@ ipset_restore()
7581
echo $T
7682

7783
if [ "$svram" = "1" ]; then
78-
ipset_get_script "$2" "$1" >"$IPSET_CMD"
84+
ipset_get_script_from_file "$2" "$1" >"$IPSET_CMD"
7985
ipset_restore_chunked "$IPSET_CMD" $IPSET_SAVERAM_CHUNK_SIZE
8086
rm -f "$IPSET_CMD"
8187
else
82-
ipset_get_script "$2" "$1" | ipset -! restore
88+
ipset_get_script_from_file "$2" "$1" | ipset -! restore
8389
fi
8490
}
8591
create_ipset()
@@ -97,7 +103,7 @@ create_ipset()
97103
for f in "$5" "$6" ; do
98104
ipset_restore "$2" "$f"
99105
done
100-
ipset_post_hook "$2"
106+
[ -n "$IPSET_HOOK" ] && $IPSET_HOOK $2 | ipset_get_script $2 | ipset -! restore
101107
}
102108
return 0
103109
}
@@ -139,7 +145,13 @@ nfset_restore()
139145
# $2,$3,... - filenames
140146

141147
echo "Adding to nfset $1 : $2 $3 $4 $5"
142-
nfset_get_script_multi "$@" | nft -f -
148+
local hookfile
149+
[ -n "$IPSET_HOOK" ] && {
150+
$IPSET_HOOK $1 >"$IPSET_HOOK_TEMP"
151+
[ -s "$IPSET_HOOK_TEMP" ] && hookfile=$IPSET_HOOK_TEMP
152+
}
153+
nfset_get_script_multi "$@" $hookfile | nft -f -
154+
rm -f "$IPSET_HOOK_TEMP"
143155
}
144156
create_nfset()
145157
{
@@ -156,7 +168,6 @@ create_nfset()
156168
}
157169
[ "$DO_CLEAR" = "1" ] || {
158170
nfset_restore $2 $4 $5
159-
ipset_post_hook "$2"
160171
}
161172
return 0
162173
}
@@ -192,7 +203,7 @@ create_ipfw_table()
192203
populate_ipfw_table $name "$1"
193204
shift
194205
done
195-
ipset_post_hook $name
206+
[ -n "$IPSET_HOOK" ] && $IPSET_HOOK $name | add_ipfw_table $name
196207
}
197208
return 0
198209
}
@@ -211,11 +222,6 @@ print_reloading_backend()
211222
echo $s
212223
}
213224

214-
ipset_post_hook()
215-
{
216-
[ -n "$IPSET_POST_HOOK" ] && $IPSET_POST_HOOK "$1"
217-
}
218-
219225

220226
oom_adjust_high
221227
get_fwtype
@@ -227,7 +233,7 @@ if [ -n "$LISTS_RELOAD" ] ; then
227233
else
228234
echo executing custom ip list reload command : $LISTS_RELOAD
229235
$LISTS_RELOAD
230-
ipset_post_hook
236+
[ -n "$IPSET_HOOK" ] && $IPSET_HOOK
231237
fi
232238
else
233239
case "$FWTYPE" in

0 commit comments

Comments
 (0)