Eu usei as duas técnicas no passado. Nos dias de hoje, estou gravitando em direção a um híbrido dos dois.
Se o seu conjunto de regras tiver cinco ou seis regras simples, o método está bem. As coisas começam a ficar interessantes quando você tem grandes conjuntos de regras: grandes instalações, sua caixa de firewall faz um pouco de roteamento, etc.
Lembre-se, você pode atirar no próprio pé, não importa como você carregue seus conjuntos de regras. :)
Baseado em script
Você faz um script bash, um script Perl, um script Python - inferno, escreva um programa Lisp ou Befunge para todos se importam! No script, você cria todas as regras do Netfilter que deseja.
As vantagens:
- Direcionalidade. Você está experimentando regras e copia e cola as que funcionam diretamente da linha de comando para o script.
- Firewall dinâmico. Um cliente meu executa configurações de OpenVPN para seus próprios clientes, e cada cliente obtém sua própria instância do OpenVPN por motivos de segurança, firewall e contabilidade. O firewall de primeira linha de defesa precisa abrir as portas do OpenVPN dinamicamente para cada tupla (IP, porta). Portanto, o script de firewall analisa o manifesto das configurações do OpenVPN e dinamicamente envia os furos necessários. Outro armazena detalhes do servidor da web no LDAP; o script iptables consulta o servidor LDAP e permite automaticamente a entrada nos servidores da web. Em grandes instalações, esse é um grande benefício.
- Esperteza. Meus scripts de firewall permitem administração remota, mesmo sem o gerenciamento de luzes apagadas: depois que o conjunto de regras é carregado, se o operador não responder dentro de alguns minutos, o conjunto de regras é revertido para o último conhecido por funcionar. Se por algum motivo esse falhar, haverá um terceiro (e quarto) failback de segurança decrescente.
- Mais inteligência: você pode abrir o acesso SSH ao seu netblock no início do script, depois rescindi-lo no final do script (e deixar as sessões SSH filtradas entrarem). Então, se o seu script falhar, você ainda pode entrar lá.
- Exemplos online. Por alguma razão, a maioria dos exemplos que vi online usaram invocações de
iptables
(isso pode ser influenciado pelo fato de minhas primeiras configurações de firewall terem sido anteriores aiptables-save
, e também pelo Netfilter - mas isso é outra história)
As desvantagens:
- Um erro de sintaxe no script e você está bloqueado no seu firewall. Parte da inteligência acima se resume a experiências dolorosas. :)
- Velocidade. Em caixas embutidas do Linux, um script bash (ou até mesmo traço) será lento e lento para ser executado. Devagar o suficiente para que, dependendo da sua política de segurança, você precise considerar a ordem da adição de regras - você pode ter um breve furo nas suas defesas, e isso é o suficiente. O carregamento do conjunto de regras é em nenhum lugar próximo à atômica.
- Complexidade. Sim, você pode fazer coisas incríveis, mas sim, você também pode tornar o script complexo demais para entender ou manter.
Baseado em regras
Adicione suas regras a um arquivo de conjunto de regras e use iptables-restore
para carregá-lo (ou apenas salve seu conjunto de regras existente usando iptables-save
). Isto é o que o Debian faz por padrão.
Os profissionais:
- Velocidade.
iptables-restore
é um programa em C, e é deliciosamente rápido comparado a scripts de shell. A diferença é óbvia mesmo em máquinas decentes, mas é ordens de magnitude mais rápido em hardware mais modesto. - Regularidade. O formato é mais fácil de entender, é essencialmente auto-documentado (uma vez que você se acostumar com as peculiaridades do Netfilter).
- É a ferramenta padrão, se você se importa com isso.
- Salva todas as tabelas do Netfilter. Muitas ferramentas do Netfilter (incluindo
iptables
) operam apenas na tabelafilter
, e você pode esquecer que tem outras à sua disposição (com regras possivelmente danosas). Desta forma, você consegue ver todas as tabelas.
Os contras:
- Falta de flexibilidade.
- Com a falta de recursos de templates / parametrização / dinâmicos, a repetição pode levar a conjuntos de regras menos fáceis de manter e a enormes bugs de regras. Você não quer isso.
Uma solução híbrida - o melhor dos dois mundos
Eu tenho desenvolvido este por um tempo no meu Copious Free Time. Estou pensando em usar a mesma configuração baseada em script que tenho agora, mas depois que o conjunto de regras é carregado, ele salva com iptables-save
e, em seguida, armazena em cache para mais tarde. Você pode ter um conjunto de regras dinâmico com todos os seus benefícios, mas pode ser carregado muito rapidamente quando, por exemplo, a caixa do firewall for reinicializada.