Estou usando o IPSet para gerenciar dezenas de milhares de intervalos IPv4 CIDR / netmask que, em seguida, são vinculados às regras do IPTables. Essa configuração está funcionando muito bem, mas eu gostaria de obter uma boa contagem geral de alto nível dos endereços IP do host em que o IPSet atua para fins de relatório do cliente.
A formatação de entrada do IPSet é consistentemente assim:
123.456.0.0/16 timeout 86400
Então eu posso encontrar as linhas que timeout
para obter valores para atuar nos intervalos CIDR / netmask contidos na entrada.
Por exemplo, se eu salvar a saída IPSet (via ipset -L -n > ipset-20181228.txt
) para um arquivo de texto chamado ipset-20181228.txt
e, em seguida, execute uma combinação de grep
e wc -l
como isso:
grep "timeout" ipset-20181228.txt | wc -l
Recebo uma contagem de mais de 39.000 itens, o que equivale a 39.000+ escalas de CIDR / netmask. Mas isso é (é claro) contar apenas os intervalos de CIDR / netmask e não as contagens completas de endereços de host IP nesse intervalo.
Tentei usar prips
(que expande valores CIDR / netmask para endereços IP reais no Bash) com o grep para selecionar apenas itens com intervalos CIDR / netmask como este:
grep -oE '(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\/([0-9]{1,2})' ipset-20181228.txt | awk 'NF { system( "prips " $0) }' | wc -l
E depois de um gritante 20 a 30 minutos (!!!) no meu 2018 MacBook Air (com os fãs chutando), a contagem que eu consegui foi de 736.000.000+ que é o que eu estou indo para… Mas 20 a 30 minutos é muito longo . Eu quero que isso seja o mais scriptável e não intrusivo possível, e não posso confiar em um comando como esse para ser executado em um servidor de produção sem consumir recursos. Quero dizer, observe como ele se comporta na configuração de desenvolvimento do MacBook Air local.
Existe alguma maneira de calcular apenas a contagem do intervalo CIDR / netmask com base simplesmente no valor CIDR / netmask? Espero que haja apenas uma ferramenta de linha de comando - ou uma opção nas ferramentas existentes que estou usando - que não conheço que possa ajudar.
1.2.3.0/24
para1.2.3.0-1.2.3.255
Opção B.1.2.3.0-1.2.3.255
para1.2.3.0/24
. Nmap, traceroute tem alguns recursos.2^(32-mask)-2
. A máscara representa os bits da rede, então a outra parte representa os bits dos hosts.-2
é para o endereço de rede e ips de transmissão. Se você temipcalc
instalado, execute-o para ver essas informações. (Desculpe-me se eu entendi mal sua pergunta).2^(32-mask)
endereços e é isso.2^(32-mask)
.Respostas:
Se seu
grep
Comando gera linhas como123.456.0.0/16
, então você precisa canalizá-los paraO comando apenas extrai máscaras (ou seja, o que é depois
/
) e conta as ocorrências de cada máscara. No final, o número de hosts é calculado para cada máscara encontrada (2^(32-mask)
), multiplicado pelo número de ocorrências e somado.Notas:
1.2.3.4/40
será aceito, a saída não inteira será calculada. Melhore sua preliminargrep
filtre se necessário.prips
não foi melhor nisso).fonte
grep -oE '(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\/([0-9]{1,2})' ipset-*.txt | awk -F / '{ count[$2]++ } END { for (mask in count) total+=count[mask]*2^(32-mask); print total }'
Eu pensei que algo assim funcionaria desde que o pôster original está executando grep para obter o CIDR de linhas com
timeout
:EDITAR-
awk
programa acima corre ok apenas comGNU awk
.ENDFILE
é uma extensão do GNU.eu acho
BSD awk
ignoraENDFILE
e executa essa seção se fosse parte da seção principal do programa.Isso é compatível com o GNU e o BSD awk.
fonte
prips
. Desculpe, obrigado pelo esforço, mas isso não está funcionando para dizer o mínimo.prips
e veja como funciona e sua saída. De qualquer forma vale a pena o exercício para obter oawk
relatório sem qualquer extensão GNU.