From 09416dee6419686f0abe01ff5b3fe82396bb378c Mon Sep 17 00:00:00 2001 From: bol-van Date: Wed, 23 Feb 2022 16:15:01 +0300 Subject: [PATCH] nft: avoid using complex maps --- common/nft.sh | 19 ++++++++++--------- docs/nftables_notes.txt | 4 ---- docs/readme.eng.md | 3 +-- docs/readme.txt | 3 +-- 4 files changed, 12 insertions(+), 17 deletions(-) diff --git a/common/nft.sh b/common/nft.sh index a5ba043..2e33fb2 100644 --- a/common/nft.sh +++ b/common/nft.sh @@ -84,7 +84,7 @@ cat << EOF | nft -f - add set inet $ZAPRET_NFT_TABLE lanif { type ifname; } add set inet $ZAPRET_NFT_TABLE wanif { type ifname; } add set inet $ZAPRET_NFT_TABLE wanif6 { type ifname; } - add map inet $ZAPRET_NFT_TABLE tpws6 { type ifname: ipv6_addr . inet_service; } + add map inet $ZAPRET_NFT_TABLE link_local { type ifname : ipv6_addr; } EOF } nft_del_chains() @@ -129,19 +129,19 @@ cat << EOF | nft -f - 2>/dev/null flush set inet $ZAPRET_NFT_TABLE lanif flush set inet $ZAPRET_NFT_TABLE wanif flush set inet $ZAPRET_NFT_TABLE wanif6 - flush map inet $ZAPRET_NFT_TABLE tpws6 + flush map inet $ZAPRET_NFT_TABLE link_local EOF } -nft_flush_tpws6() +nft_flush_link_local() { - nft flush map inet $ZAPRET_NFT_TABLE tpws6 2>/dev/null + nft flush map inet $ZAPRET_NFT_TABLE link_local 2>/dev/null } nft_list_ifsets() { nft list set inet $ZAPRET_NFT_TABLE lanif nft list set inet $ZAPRET_NFT_TABLE wanif nft list set inet $ZAPRET_NFT_TABLE wanif6 - nft list map inet $ZAPRET_NFT_TABLE tpws6 + nft list map inet $ZAPRET_NFT_TABLE link_local nft list flowtable inet $ZAPRET_NFT_TABLE ft 2>/dev/null } @@ -149,14 +149,14 @@ nft_create_firewall() { nft_create_table nft_del_flowtable - nft_flush_tpws6 + nft_flush_link_local nft_create_chains } nft_del_firewall() { nft_del_chains nft_del_flowtable - nft_flush_tpws6 + nft_flush_link_local # leave ifsets and ipsets because they may be used by custom rules } @@ -363,10 +363,11 @@ _nft_fw_tpws6() nft_print_op "$filter" "tpws (port $port)" 6 nft_add_rule dnat_output skuid != $WS_USER ${4:+oifname @wanif6 }meta l4proto tcp $filter ip6 daddr != @nozapret6 dnat ip6 to [::1]:$port [ -n "$3" ] && { - nft_add_rule dnat_pre meta l4proto tcp $filter ip6 daddr != @nozapret6 dnat ip6 to iifname map @tpws6 + nft_add_rule dnat_pre meta l4proto tcp $filter ip6 daddr != @nozapret6 dnat ip6 to iifname map @link_local:$port for i in $3; do _dnat6_target $i DNAT6 - [ -n "$DNAT6" -a "$DNAT6" != '-' ] && nft_add_set_element tpws6 "$i : $DNAT6 . $port" + # can be multiple tpws processes on different ports + [ -n "$DNAT6" -a "$DNAT6" != '-' ] && nft_add_set_element link_local "$i : $DNAT6" done } } diff --git a/docs/nftables_notes.txt b/docs/nftables_notes.txt index 54dc282..45fd258 100644 --- a/docs/nftables_notes.txt +++ b/docs/nftables_notes.txt @@ -102,7 +102,3 @@ iptables можно задействовать на любой openwrt верс Если используется fw3, применяется старый механизм интеграции в fw3. Если он не используется, то правилами iptables управляем как в традиционных linux системах - то есть с возможностью запуска и остановки, а скрипт запуска вносит в том числе и правила iptables. - -Скрипты zapret используют фичи из nftables, появившиеся только в версии 0.9.4 утилиты nft. -Ubuntu 20.04 содержит версию 0.9.3. Ничего не выйдет, придется собирать самому. -Рекомендуется версия 1.0.2 и выше. diff --git a/docs/readme.eng.md b/docs/readme.eng.md index c3e1695..beb95cd 100644 --- a/docs/readme.eng.md +++ b/docs/readme.eng.md @@ -120,8 +120,7 @@ nf sets do not support overlapping intervals and that's why nft process applies There're equivalents to iptables for all other functions. Interface and protocol anonymous sets allow not to write multiple similar rules. Flow offloading is built-in into new linux kernels and nft versions. -Zapret scripts are written for `nft 0.9.4` and higher. Older versions will fail. -`nft 1.0.2` is recommended. +nft version `1.0.2` or higher is recommended. ## When it will not work diff --git a/docs/readme.txt b/docs/readme.txt index 2934349..1a886f1 100644 --- a/docs/readme.txt +++ b/docs/readme.txt @@ -156,8 +156,7 @@ NFQUEUE работает без изменений. Если коротко, то в nftables невозможно работать с большими ip листами на системах с малым количеством RAM. Остальные рассматриваемые здесь функции могут быть перенесены на nftables. -Скрипты zapret написаны с расчетом на nft 0.9.4 и выше. На более старых работать не будет. -Рекомендуется версия 1.0.2 или выше. +Рекомендуется версия nft 1.0.2 или выше. Когда это работать не будет