Atualmente, tenho um script que adiciona regras à tabela de firewall com base em um critério de seleção entre dois arquivos.
ARQUIVO 1 keys.txt
<string>
<string>
..
..
ARQUIVO 2 hellos.txt
<string> <ipaddress> <ipaddress>
<string> <ipaddress> <ipaddress>
..
..
Meu script corresponde a uma string do arquivo 2 com uma string do arquivo 1. Se houver uma correspondência, ela adicionará a regra de firewall para o ipaddress após a correspondência da string.
O roteiro é o seguinte -
#!/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
Como posso melhorar esse script de forma que eu não adicione regras de firewall duplicadas sempre que o loop while for executado. Eu tentei adicionar a opção -C (check), mas não funciona para mim. Acabei de receber uma saída de regra ruim.
Respostas:
Coincidir com uma string de ambos os arquivos e imprimir o ipaddress para um arquivo
Em vez disso execute: (depois de seguir as instruções)
(não permitirá duplicatas automaticamente)
Configura o ipset para estar pronto: (ajuste o maxelem ao seu gosto)
Sua nova regra:
Agora seu novo loop:
Se você precisar salvar a tabela ipset, diga para uma reinicialização.
ou
importação em massa, incluindo autocreate de salvar.
Será muito mais eficiente, já que você não precisa continuar mudando o iptables.
esta linha única pode acabar com tudo, mas o loop
O xargs -n1 repete o comando para cada linha do stdin. a -! ocultar o alerta de entradas duplicadas. A saída do stdin é automaticamente anexada, portanto, não é mencionada.
Você ainda precisará de 1 entrada do iptables e do ipset mencionado acima.
fonte
ipset v6.29: Syntax error: Second element is missing from 192.168.151.15.