Script bash Iptables

0

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.


fonte
o que cria keys.txt e hellos.txt? Os dados vêm do syslog, outro conjunto de regras do iptables? ou o que? Ele pode ser possível acabar com a maior parte deste código.
cybernard
Esses dois arquivos vêm de uma máquina remota a cada poucos segundos.
Você tem alguns problemas diferentes aqui, mas em geral você não deve adicionar endereços IP individuais diretamente ao IPTables em um caso como este em que você está planejando adicionar toneladas de valores de variáveis. O IPSet é a maneira melhor e mais escalável de fazer isso. O IPSet funciona com o IPTables e o conceito básico é que você inclua, por exemplo, uma regra no IPTables que se refere a um valor IPSet e que o valor IPSet tenha os endereços IP.
JakeGould

Respostas:

0

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)

ipset add allowed_hosts <ip> <ip>

(não permitirá duplicatas automaticamente)

Configura o ipset para estar pronto: (ajuste o maxelem ao seu gosto)

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

Sua nova regra:

 "/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

Agora seu novo loop:

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

done < "$filename"

Se você precisar salvar a tabela ipset, diga para uma reinicialização.

ipset save >ipset.txt

ou

ipset save -f ipset.txt

importação em massa, incluindo autocreate de salvar.

ipset restore -f ipset.txt

Será muito mais eficiente, já que você não precisa continuar mudando o iptables.

esta linha única pode acabar com tudo, mas o loop

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

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.

cybernard
fonte
Por algum motivo, não consigo resolver esse erro. Eu recebo o erro ipset v6.29: Syntax error: Second element is missing from 192.168.151.15.
Um comando simples como 'sudo ipset -! add allowed_hosts 192.168.151.15 24.120.232.103 'daria o mesmo erro
@AbhimanyuKhanna geralmente "segundo elemento" significa que você está perdendo alguma coisa. Nesse caso, eles são delimitados por vírgula e não delimitados por espaço. Ops Além disso, se o seu comando $ 2, $ 3 de impressão não emitir uma vírgula, adicione um. sudo ipset -! add allowed_hosts 192.168.151.15,24.120.232.103
cybernard
espaços antes ou depois do , (vírgula) também dará o mesmo erro.
cybernard
Consegui corrigir o problema de formatação, mas de alguma forma a interação leva a um conjunto de outros problemas.