Eu preciso adicionar uma regra ao iptables para bloquear as conexões a uma porta tcp da Internet.
Como meu script pode ser chamado várias vezes e não há um script para excluir a regra, desejo verificar se já existe uma regra do iptables antes de inseri-la - caso contrário, haverá muitas regras de dup na cadeia INPUT.
Como posso verificar se já existe uma regra do iptables?
Respostas:
Há uma nova
-C --check
opção nas versões recentes do iptables.Para versões mais antigas do iptables, eu usaria a sugestão de Garrett:
fonte
A nova
-C
opção não é satisfatória, pois está aberta a uma condição de corrida de tempo de verificação até o tempo de uso (TOCTTOU). Se dois processos tentarem adicionar a mesma regra ao mesmo tempo,-C
não os protegerá de adicioná-la duas vezes.Portanto, não é realmente melhor que a
grep
solução. Um trabalho preciso de processamento de texto na saída deiptables-save
pode funcionar com a maior confiabilidade possível-C
, pois essa saída é uma captura instantânea confiável do estado das tabelas.O que é necessário é uma
--ensure
opção que verifique e adicione atomicamente uma regra apenas se ela ainda não existir. Além disso, seria bom se a regra fosse movida para a posição correta, onde uma nova regra seria inserida se ela já não existisse (--ensure-move
). Por exemplo, seiptables -I 1
for usada para criar uma regra no início de uma cadeia, mas essa regra já existir na sétima posição, a regra existente deverá passar para a primeira posição.Sem esses recursos, acho que uma solução possível é escrever um loop de script de shell com base neste pseudo-código:
Esse código pode girar; não garante que dois ou mais corredores saiam dentro de um número fixo de iterações. Alguns adormecimentos exponenciais aleatórios podem ser adicionados para ajudar nisso.
fonte
Isso pode parecer um pouco atrasado, mas funciona para mim - tente excluir a regra primeiro.
iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP;
Você deve receber uma mensagem semelhante a:
iptables: Regra incorreta (existe uma regra correspondente nessa cadeia?)
Em seguida, basta adicionar sua regra normalmente:
iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP;
fonte
Basta listar e procurar por ele?
... ou no entanto você tem a regra especificada. Se você usá-
grep -q
lo, não produzirá nada, e você pode apenas verificar o valor de retorno com$?
fonte
iptables-save|grep $ip
vez disso, sugiro que seja um formato mais facilmente analisável, especialmente em um script. Você também pode verificar a sintaxe exata do comando, se desejar.iptables-save|grep $ip
poderia muito bem corresponder a várias regras. Possivelmenteiptables-save
poderia ser usado para verificar a especificação completa da regra, mas isso ainda é um pouco complicado: o formato retornado poriptables-save
pode não corresponder exatamente à regra no script.iptables-save
pode gerar as opções em uma ordem diferente, adicionar coisas (como-m tcp
) e assim por diante.iptables --list
tentará resolver portas conhecidas. Portanto, certifique-se disso antes de grep para uma porta.Que tal primeiro adicionar e remover duplicatas, conforme descrito em https://serverfault.com/questions/628590/duplicate-iptable-rules . O mais fácil (para linhas adjacentes) parece ser
fonte
Para evitar regras duplicadas do seu script, adicione a linha abaixo.
Na primeira vez em que o comando acima é executado, observaremos a mensagem abaixo
Isto é apenas para informação. Mas a segunda metade do comando garantiria a adição da regra.
fonte