Скорее всего, вы используете iptables вместо nftables, так как это используется по умолчанию в Debian buster. Чтобы убедиться, что это так, проверьте(nf_tables)
:
# ip6tables-restore --version
ip6tables-restore v1.8.2 (nf_tables)
Теперь в руководстве ip6tables всегда было:
-4, --ipv4
This option has no effect in iptables and iptables-restore. If a rule using the -4 option is inserted with (and only with) ip6tables-restore, it will be silently ignored. Any other uses will throw an error. This option allows IPv4 and IPv6 rules in a single rule file for use with both iptables-restore and ip6tables-restore.
Проблема в том, что теперь вы используете ip6tables-nft-restore
, а неip6tables-legacy-restore
.
В отличиях от устаревших iptables нет упоминания о -4
, что означает, что в этом не должно быть различий, но здесь они есть. Это действительно выглядит как ошибка :, либо новая версия ip6tables-nft-restore
должна с этим справляться, либо документация должна отражать это как дополнительное отличие, чтобы быть приемлемым.
Кстати, наоборот(-6
сiptables-nft-restore
)выглядит не лучше :принимается, а не игнорируется, что приводит к -A INPUT -p ipv6-icmp -j ACCEPT
в дополнение к -A INPUT -p icmp -j ACCEPT
в протоколе IPv4 (это будет никогда не произойдет, за исключением, возможно, специального теста, и IP-стек все равно его проигнорирует ).
Возможные обходные пути:
подайте отчет об ошибке, настаивая на регрессии, которая нарушила бы существующие правила и документацию. Это помогло бы и другим людям.
правила разделения
разбить ваш файл на два файла, но применить к каждому свой фильтр, например:
grep -v -- '^ *-4 ' < before > after.v6
grep -v -- '^ *-6 ' < before > after.v4
создать обертку для ip6tables-restore
в /usr/local/sbin/ip6tables-restore
, делая примерно то же самое (, а также сделать то же самое для iptables-restore
), позволяя сохранить одно правило
Откажитесь (на данный момент )от iptables вместо nftables и вернитесь к устаревшим iptables:
# readlink -f $(which ip6tables-restore)
/usr/sbin/xtables-nft-multi
# update-alternatives --config ip6tables
There are 2 choices for the alternative ip6tables (providing /usr/sbin/ip6tables).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/sbin/ip6tables-nft 20 auto mode
1 /usr/sbin/ip6tables-legacy 10 manual mode
2 /usr/sbin/ip6tables-nft 20 manual mode
Press to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/sbin/ip6tables-legacy to provide /usr/sbin/ip6tables (ip6tables) in manual mode
# readlink -f $(which ip6tables-restore)
/usr/sbin/xtables-legacy-multi
Ссылка соответствующей команды также изменилась, хорошо.
Сделайте то же самое с iptables
.
Текущие правила по-прежнему работают с nftables. Вы можете сбросить их с помощью iptables-nft-save
+ ip6tables-nft-save
и восстановить с помощью iptables-save
+ ip6tables-save
. Это приведет к тому, что правила будут выполняться дважды :один раз с бэкендом iptables ядра, один раз с бэкендом nftables ядра, и NAT может не всегда работать правильно с этим на ядре 4.19 (обычно побеждает первый загруженный модуль :здесь nft_nat)
. Лучше перезагрузиться или узнать, как сбросить правила и удалить соответствующие модули (nat )nftables.
принять новые функции и использовать их напрямуюnft
.
Здесь есть команды, которые могут помочь (, но у них та же проблема, что и выше):iptables-translate
/ ip6tables-translate
и iptables-restore-translate
/ ip6tables-restore-translate
, но результат обычно требует доработки в любом случае (, особенно с причудливыми соответствует типуu32
). У Nftables есть тип семейства inet
, который фактически может смешивать правила IPv4 и IPv6 (, для этого может потребоваться более новое ядро в nat ), так что это упростит ситуацию.
Вы можете написать свою собственную программируемую функцию завершения для этих команд, назовем ее _cpp
и установим с помощью
complete -F _cpp vim vi nano nvim less cat more nl head tail
Я не пишу сейчас всю функцию, но вы должны генерировать (и отбрасывать )совпадения следующим образом:
files=( $(compgen -f hello_) )
COMPREPLY=()
for word in "${files[@]}"; do
if [[ $word = *.cpp ]]; then
COMPREPLY+=("$word")
else
if [[ ! -f "${word}.cpp" ]]; then
COMPREPLY+=("$word")
fi
fi
done
Вместе с touch hello_world hello_world.cpp hello_world2
это дает:
echo ${COMPREPLY[@]}
hello_world.cpp hello_world2