netid=(10 20 30 40)
for i in "${netid[@]}"; do
out="iptables -I FORWARD -s 192.168.$i.0/24 -d "
for j in "${netid[@]}"; do
(( i == j )) && continue
out+="192.168.$j.0/24,"
done
out="${out%,} -j DROP"
printf '%s\n' "$out"
done
Этот сценарий Bash создает
iptables -I FORWARD -s 192.168.10.0/24 -d 192.168.20.0/24,192.168.30.0/24,192.168.40.0/24 -j DROP
iptables -I FORWARD -s 192.168.20.0/24 -d 192.168.10.0/24,192.168.30.0/24,192.168.40.0/24 -j DROP
iptables -I FORWARD -s 192.168.30.0/24 -d 192.168.10.0/24,192.168.20.0/24,192.168.40.0/24 -j DROP
iptables -I FORWARD -s 192.168.40.0/24 -d 192.168.10.0/24,192.168.20.0/24,192.168.30.0/24 -j DROP
через двойную петлю. Внутренний цикл пропускает итерации, в которых переменная цикла численно равна переменной цикла внешнего цикла для создания желаемого эффекта.
Если у вас есть строка в $out
, вы можете eval
ее.
В качестве альтернативы, чтобы избежатьeval
:
netid=(10 20 30 40)
for i in "${netid[@]}"; do
sarg="192.168.$i.0/24"
darg=""
for j in "${netid[@]}"; do
(( i == j )) && continue
darg+="192.168.$j.0/24,"
done
darg="${darg%,}"
iptables -I FORWARD -s "$sarg" -d "$darg" -j DROP
done
Подстановка переменной ${parameter%word}
удалит word
из самого конца $parameter
, поэтому darg="${darg%,}"
удалит запятую в конце af $darg
.
Обновление после вопроса в комментарии:
Единственное, чтоbash
-специфично в вышеизложенном, это использование массива $netid
, оператора +=
для добавления к строке $darg
и ((...))
. Мы можем превратить это в sh
скрипт, подобный этому (здесь, предполагая, что $IFS
по-прежнему имеет значение по умолчанию):
netid="10 20 30 40"
for i in $netid; do
sarg="192.168.$i.0/24"
darg=""
for j in $netid; do
[ "$i" -eq "$j" ] && continue
darg="${darg}192.168.$j.0/24,"
done
darg="${darg%,}"
iptables -I FORWARD -s "$sarg" -d "$darg" -j DROP
done
Если у вас есть отдельный список номеров, которые вы хотите подставить для $darg
, используйте его во внутреннем цикле вместо $netid
. Это должна быть строка чисел, разделенных пробелом -.
Нет, объяснение намного проще :операторcounterимеет необязательные аргументы пакеты и байты , которые отображают количество пакетов и байтов, подсчитанных счетчик, когда пакет достиг правила, где он находился. Таким образом, без фильтра перед счетчиком любой пакет (, в том числе по шлейфу ), будет увеличивать значения, поэтому это может произойти очень рано и быстро. Инструмент, выполняющий преобразование, увидел счетчик по умолчанию iptables и решил также перевести его значения для точности.
Так что обычно, когда вы пишете правило, вы не устанавливаете эти значения, вы ставите один простой counter
, и они оба получают по умолчанию 0. Когда пакеты проходят через это значение, эти значения увеличиваются. Дополнительно , особенно при использовании в именованном счетчике объекте с состоянием , где его можно даже отобразить -и -сбросить (с помощью чего-то вроде nft reset counters
), чтобы сделать некоторые форма учета, эти значения можно установить при записи набора правил :, обычно при восстановлении набора правил, сохраненного непосредственно перед перезагрузкой. Этот можно сбросить только в том случае, если он используется как именованный вариант , а не как «встроенный» анонимный счетчик. Их нельзя использовать для изменения совпадения в правиле, нет другого варианта , кроме их отображения.
Любая ваша проблема с Wi-Fi не может быть вызвана каким-либо оператором счетчика .
Если теперь вы хотите использовать количество пакетов для ограничения использования правил в брандмауэре nftables, существует несколько различных методов в зависимости от потребностей:
другой объект с состояниемquota(снова, который можно использовать анонимно, но можно сбросить, только если он используется с именем). Затем вы можете, например, правило никогда не совпадать или начать совпадать в зависимости от его количества.
есть операторlimitдля подсчета ставок . Например, если вы опасаетесь, что правило журнала может затопить файлы журнала, вы можете использовать это, чтобы ограничить количество выполняемых журналов. Он также может ограничить скорость некоторым ресурсом (, обычно используемым с другими фильтрами с conntrack ).
с достаточно новой nftables (0.9.2? )и ядро (4.18? ), есть ct countвыражение conntrack для подсчета количества установленных соединений с использованием conntrack, обычно для ограничения одновременного доступа к какому-либо ресурсу (ssh, веб-сервер...)