В настоящее время у меня есть скрипт, который добавляет правила к таблице брандмауэра на основе критерия выбора между двумя файлами.

ФАЙЛ 1 keys.txt

<string>
<string>
..
..

ФАЙЛ 2 hellos.txt

<string> <ipaddress> <ipaddress>
<string> <ipaddress> <ipaddress>
..
..

Мой скрипт сопоставляет строку из файла 2 со строкой из файла 1. Если совпадение существует, то оно добавляет правило брандмауэра для ipaddress после совпадения строки.

Сценарий выглядит следующим образом -

#!/bin/bash

while true
do

#Match a string from both the files and print the ipaddress to a file
word=$(awk 'FNR==NR{a[$1];next}($1 in a){print}' keys.txt hellos.txt | awk -v OFS=' ' '{ print $2, $3 }') >address.txt

#Remove duplicates for the ipaddress file
awk '!a[$0]++' address.txt > address_improved.txt

#Add firewall rule from new file.

filename=address_improved.txt
while read -r a b
do      
  "/sbin/iptables"  -I FORWARD 1 -m physdev --physdev-is-bridged --physdev-in enxa0cec80f92bd --physdev-out eno1 -s $a -d $b  -j ACCEPT

done < "$filename"
sleep 0.01

#Run while loop again because the files are changing constantly
done

Как я могу улучшить этот скрипт так, чтобы я не добавлял повторяющиеся правила брандмауэра каждый раз, когда выполняется цикл while. Я попытался добавить опцию -C (проверить), но она не работает для меня. Я просто получаю плохое правило вывода.

1 ответ1

0

Сопоставьте строку из обоих файлов и распечатайте ipaddress в файл

Вместо этого выполните: (после следующих инструкций)

ipset add allowed_hosts <ip> <ip>

(не позволяет дубликаты автоматически)

Устанавливает ipset для готовности: (отрегулируйте maxelem по своему вкусу)

ipset create allowed_hosts hash:net,net family inet hashsize 262144 maxelem 333000 counters comment

Ваше новое правило:

 "/sbin/iptables" -I INPUT 1 -m conntrack -j ACCEPT --ctstate RELATED,ESTABLISHED
 "/sbin/iptables" -I INPUT 2 -m physdev --physdev-is-bridged --physdev-in enxa0cec80f92bd --physdev-out eno1 -m set --match-set allowed_hosts src,dst -j ACCEPT
 "/sbin/iptables" -I INPUT 3 -m physdev --physdev-is-bridged --physdev-in enxa0cec80f92bd --physdev-out eno1 -m u32 --u32 "0>>22&0x3C@ 12>>26&0x3C@ 0 & 0xFF000000=0x17000000" -j DROP
 "/sbin/iptables" -I FORWARD 1 -m conntrack -j ACCEPT --ctstate RELATED,ESTABLISHED
 "/sbin/iptables" -I FORWARD 2 -m physdev --physdev-is-bridged --physdev-in enxa0cec80f92bd --physdev-out eno1 -m set --match-set allowed_hosts src,dst  -j ACCEPT
 "/sbin/iptables" -I FORWARD 3 -m physdev --physdev-is-bridged --physdev-in enxa0cec80f92bd --physdev-out eno1 -m u32 --u32 "0>>22&0x3C@ 12>>26&0x3C@ 0 & 0xFF000000=0x17000000" -j DROP

Теперь ваш новый цикл:

while read -r a b
do      
  "/sbin/ipset" -! add allowed_hosts $a,$b

done < "$filename"

Если вам когда-нибудь понадобится сохранить таблицу ipset, скажем, для перезагрузки.

ipset save >ipset.txt

или же

ipset save -f ipset.txt

массовый импорт, в том числе автоматическое создание из сохранения.

ipset restore -f ipset.txt

Это будет намного эффективнее, так как вам не нужно постоянно менять iptables.

эта единственная строка может покончить со всем, кроме цикла

word=$(awk 'FNR==NR{a[$1];next}($1 in a){print}' keys.txt hellos.txt | awk -v OFS=' ' '{ print $2,$3 }') |xargs -n1 ipset -! add allowed_hosts

Xargs -n1 повторяет команду для каждой строки из стандартного ввода. -! скрыть предупреждение о дубликатах записей. Вывод из stdin автоматически добавляется, поэтому он не упоминается.

Вам все еще понадобится 1 запись iptables и упомянутый выше ipset.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .