Como definir essas regras do iptables para serem executadas na inicialização

20

Normalmente, executo minhas regras do iptables sempre que faço login. Do terminal digito;

sudo sh firewall.sh

Configurando o computador da minha irmã, quero oferecer a ela alguma proteção básica de firewall. Ela não fará login como administrador, apenas uma conta padrão. Como posso executar um script de firewall toda vez que ela efetua login sem que ela precise digitar qualquer senha?

O script que escrevi para o computador da minha irmã contém;

#!/bin/sh

modprobe ip_conntrack
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

iptables -I OUTPUT -p tcp --dport 80 --sport 32768:61000 -j ACCEPT
iptables -I OUTPUT -p udp --dport 53 --sport 32768:61000 -j ACCEPT
iptables -I OUTPUT -p tcp --dport 443 --sport 32768:61000 -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -I OUTPUT -p icmp -j DROP

iptables -I INPUT -p icmp -j DROP
iptables -I INPUT -p udp -j DROP
iptables -I INPUT -p tcp -m tcp --syn -j DROP
iptables -I INPUT -i lo -j ACCEPT
iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Coloquei-o em sua pasta pessoal como firewall.sh e o configurei para ser executável (clique com o botão direito do mouse no arquivo e marque a opção "permitir a execução de arquivo como programa" na guia permissões).

A execução desse script a partir do terminal como root funciona bem.

Depois de digitar;

sudo sh firewall.sh

Eu digitei no terminal

sudo iptables -L -v

e eu recebo

Chain INPUT (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere            
    0     0 DROP       tcp  --  any    any     anywhere             anywhere             tcpflags: FIN,SYN,RST,ACK/SYN
    0     0 DROP       udp  --  any    any     anywhere             anywhere            
    0     0 DROP       icmp --  any    any     anywhere             anywhere            

Chain FORWARD (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy DROP 0 packets, 0 bytes)  pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       icmp --  any    any     anywhere             anywhere            
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp spts:32768:61000 dpt:https
    0     0 ACCEPT     udp  --  any    any     anywhere             anywhere             udp spts:32768:61000 dpt:domain
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp spts:32768:61000 dpt:http
    0     0 ACCEPT     all  --  any    lo      anywhere             anywhere

Como posso fazer com que esse script seja executado automaticamente no login ou, possivelmente, salve essas regras permanentemente no computador da minha irmã? Você poderia fornecer algum código detalhado, pois minhas primeiras tentativas no método rc.local e no iptables-save não foram muito bem-sucedidas. Em cada reinicialização, todas as cadeias INPUT, OUTPUT e FORWARD são redefinidas para ACCEPT, sem nenhuma política listada quando eu digitosudo iptables -L -v

Mikelane
fonte
Quase dois anos depois, mas um comentário importante: verifique se você possui ip6tablesregras para obter a conectividade v6 um dia, pois o IPv6 é tratado ip6tablese não iptables.
Thomas Ward

Respostas:

38

Você pode usar o iptables-persistentpacote em vez de mexer nos scripts de inicialização. Primeiro, execute seu script para configurar as regras do firewall. Em segundo lugar, execute sudo apt-get install iptables-persistente siga as instruções. Quando solicitar salvar as regras atuais, pressione "Sim" nos dois prompts. Agora, nas reinicializações, suas regras do iptables serão restauradas.


NOTA: Se você alterar suas regras após isso, precisará executar o (s) seguinte (s) comando (s) após as alterações:

Para salvar suas regras de tabelas de ipv4: sudo su -c 'iptables-save > /etc/iptables/rules.v4'

Para salvar suas regras de tabelas IPv6 ip6: sudo su -c 'ip6tables-save > /etc/iptables/rules.v6'

Thomas Ward
fonte
Obrigado, isso funcionou. Se eu quiser alterar temporariamente as regras, posso apenas executar um script no terminal, sim?
Mikelane 21/03
Sim, ou você pode manipular diretamente o sistema iptables diretamente. NO ENTANTO, se você planeja usar a regra temporária persistentemente, não é garantido que as novas regras sejam salvas, a menos que você execute os comandos que declaro na minha resposta.
Thomas Ward
É uma má ideia executar sudo dpkg-reconfigure iptables-persistentdepois de alterar uma regra.
souravc
@souravc A pergunta que responde a isso é "Por que você precisa ou deseja?" A idéia é que você não precisa reescrever (ou sobrescrever (os arquivos rules.v4ou rules.v6manualmente) para que eles sejam indexados na próxima inicialização ou imediatamente se você executar iptables-restore < /etc/iptables/rules.v4ouip6tables-restore < /etc/iptables/rules.v6
Thomas Ward
2

Supondo que você tenha as regras de firewall em:

/etc/iptables.up.rules

Talvez a resposta mais óbvia seja criar um arquivo chamado iptables em:

/etc/network/if-pre-up.d

com o conteúdo:

#!/bin/bash
/sbin/iptables-restore < /etc/iptables.up.rules

e torná-lo executável usando

sudo chmod +x /etc/network/if-pre-up.d/iptables

Dessa forma, antes que sua interface de rede seja ativada, suas regras serão carregadas.

Antonio J. de Oliveira
fonte
Obrigado, ele lança log em algum lugar? Isso não está funcionando e eu suspeito que isso se deva ao fato de meu servidor DNS usado ter um resolvedor ainda não iniciado quando meu host está inicializando.
Dimitri Kopriwa