nft: avoid using complex maps

This commit is contained in:
bol-van 2022-02-23 16:15:01 +03:00
parent 9fbada53d2
commit 09416dee64
4 changed files with 12 additions and 17 deletions

View File

@ -84,7 +84,7 @@ cat << EOF | nft -f -
add set inet $ZAPRET_NFT_TABLE lanif { type ifname; } add set inet $ZAPRET_NFT_TABLE lanif { type ifname; }
add set inet $ZAPRET_NFT_TABLE wanif { type ifname; } add set inet $ZAPRET_NFT_TABLE wanif { type ifname; }
add set inet $ZAPRET_NFT_TABLE wanif6 { 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 EOF
} }
nft_del_chains() 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 lanif
flush set inet $ZAPRET_NFT_TABLE wanif flush set inet $ZAPRET_NFT_TABLE wanif
flush set inet $ZAPRET_NFT_TABLE wanif6 flush set inet $ZAPRET_NFT_TABLE wanif6
flush map inet $ZAPRET_NFT_TABLE tpws6 flush map inet $ZAPRET_NFT_TABLE link_local
EOF 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_ifsets()
{ {
nft list set inet $ZAPRET_NFT_TABLE lanif nft list set inet $ZAPRET_NFT_TABLE lanif
nft list set inet $ZAPRET_NFT_TABLE wanif nft list set inet $ZAPRET_NFT_TABLE wanif
nft list set inet $ZAPRET_NFT_TABLE wanif6 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 nft list flowtable inet $ZAPRET_NFT_TABLE ft 2>/dev/null
} }
@ -149,14 +149,14 @@ nft_create_firewall()
{ {
nft_create_table nft_create_table
nft_del_flowtable nft_del_flowtable
nft_flush_tpws6 nft_flush_link_local
nft_create_chains nft_create_chains
} }
nft_del_firewall() nft_del_firewall()
{ {
nft_del_chains nft_del_chains
nft_del_flowtable nft_del_flowtable
nft_flush_tpws6 nft_flush_link_local
# leave ifsets and ipsets because they may be used by custom rules # 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_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 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" ] && { [ -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 for i in $3; do
_dnat6_target $i DNAT6 _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 done
} }
} }

View File

@ -102,7 +102,3 @@ iptables можно задействовать на любой openwrt верс
Если используется fw3, применяется старый механизм интеграции в fw3. Если используется fw3, применяется старый механизм интеграции в fw3.
Если он не используется, то правилами iptables управляем как в традиционных linux системах - то есть с возможностью Если он не используется, то правилами iptables управляем как в традиционных linux системах - то есть с возможностью
запуска и остановки, а скрипт запуска вносит в том числе и правила iptables. запуска и остановки, а скрипт запуска вносит в том числе и правила iptables.
Скрипты zapret используют фичи из nftables, появившиеся только в версии 0.9.4 утилиты nft.
Ubuntu 20.04 содержит версию 0.9.3. Ничего не выйдет, придется собирать самому.
Рекомендуется версия 1.0.2 и выше.

View File

@ -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. 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. 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 version `1.0.2` or higher is recommended.
`nft 1.0.2` is recommended.
## When it will not work ## When it will not work

View File

@ -156,8 +156,7 @@ NFQUEUE работает без изменений.
Если коротко, то в nftables невозможно работать с большими ip листами на системах с малым количеством RAM. Если коротко, то в nftables невозможно работать с большими ip листами на системах с малым количеством RAM.
Остальные рассматриваемые здесь функции могут быть перенесены на nftables. Остальные рассматриваемые здесь функции могут быть перенесены на nftables.
Скрипты zapret написаны с расчетом на nft 0.9.4 и выше. На более старых работать не будет. Рекомендуется версия nft 1.0.2 или выше.
Рекомендуется версия 1.0.2 или выше.
Когда это работать не будет Когда это работать не будет