
EXEMPLO:
tabelas de ip
:internet - [0:0] -A internet -m mac --mac-source 48:5D:60:FC:29:B0 -j RETURN
COMPROMETER-SE
[root@localhost:~] $ arp
Endereço HWtype HWaddress Flags Máscara Iface
10.2.0.1 éter 48:5D:60:FC:29:B0 C br0
gostaria de excluir a regra iptable (-D internet -m mac --mac-source 48:5D:60:FC:29:B0 -j RETURN) se o mac na lista ARP não estiver presente.
Responder1
Em que idioma você gostaria que esse script estivesse? Qualquer? Porque com um script de shell isso é no mínimo tedioso ...
Caso contrário, você poderia salvar o resultado do seu arp + grep e iptables -L em 2 arquivos diferentes e, em seguida, carregar esses dois arquivos em uma matriz. Aí fica bem fácil, você passa por um dos array e se existir/não existe no outro, então apaga.
arp |grep br0 | perl -nle '/her ([^ ]+)/ && print $1' >file1.txt
iptables -t mangle -L -v -n |grep MAC | perl -nle '/MAC ([^ ]+)/ && print $1' >file2.txt
php do-delete.php
E o do-delete.php poderia estar carregando os arquivos e executar uma chamada system() para excluir as entradas:
<?php
$f1 = file("file1.txt");
$f2 = file("file2.txt");
$to_delete = array_diff($f2, $f1);
foreach($to_delete as $mac)
{
system('iptables -t mangle -D internet -m mac --mac-source ' . $mac . ' -j RETURN');
}
Algo assim... (NOTA TESTADA!) Observe como oarray_diff()ligar é fácil! Nada do tipo que eu conheço em um script de shell.
Você também pode imprimir a tabela resultante em um arquivo.
file_put_contents('file3.txt', join($to_delete, "\n") . "\n");
Então use isso para excluir do shell ...
Além disso, você pode usar PHP para gerar os dois primeiros arquivos usandopopen().