Script iptables do Linux para bloquear todo o acesso à Internet, exceto os aplicativos desejados

2

CONTEXTO:

Eu queria ter um shell script que bloqueasse todo o tráfego de entrada / saída para o meu computador, A MENOS QUE eu decidisse usar o navegador ou algum outro aplicativo, nesse caso eu o invocaria e somente esses aplicativos seriam executados.

Eu pesquisei scripts anteriores feitos por pessoas inteligentes (links para fontes no final), assim como investi o tempo necessário para aprender a usar o iptables (ainda trabalhando nessa frente).

Aqui está o resultado do trabalho realizado:

RESULTADOS:

antes da execução do script de shell, é criado um grupo chamado internet :

sudo groupadd internet

Shell Script:

#!/bin/sh
#only allow apps run from "internet" group to run

# clear previous rules
sudo iptables -F

# accept packets for internet group
sudo iptables -A OUTPUT -p tcp -m owner --gid-owner internet -j ACCEPT
sudo iptables -A OUTPUT -p udp -m owner --gid-owner internet -j ACCEPT

# also allow local connections
sudo iptables -A OUTPUT -p tcp -d 127.0.0.1 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d 192.168.0.1/24 -j ACCEPT

# reject packets for other users
sudo iptables -A OUTPUT -j REJECT

# same process for IPv6:
sudo ip6tables -A OUTPUT -p tcp -m owner --gid-owner internet -j ACCEPT
sudo ip6tables -A OUTPUT -p udp -m owner --gid-owner internet -j ACCEPT
sudo ip6tables -A OUTPUT -p tcp -d 127.0.0.1 -j ACCEPT
sudo ip6tables -A OUTPUT -p tcp -d 192.168.0.1/24 -j ACCEPT
sudo ip6tables -A OUTPUT -j REJECT

essa é a outra parte do shell em que estou trabalhando atualmente e não estou 100% confiante:

#DROPS ALL INPUT and FORWARD
sudo iptables -A INPUT -j DROP
sudo iptables -A FORWARD -j DROP

#ONLY ACCEPTS INPUT THAT WAS INITIATED BY SOME OUTPUT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#SAME REPEATED FOR IPv6
sudo ip6tables -A INPUT -j DROP
sudo ip6tables -A FORWARD -j DROP
sudo ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

depois que todo o script acima for executado, o comando a seguir abriria um terminal que seria parte do grupo internet e, portanto, qualquer aplicativo (como o firefox por exemplo) aberto por esse terminal teria acesso à Internet, enquanto todos os outros INPUT / OUTPUT serão interrompidos

sudo -g internet -s

PERGUNTA:

A lógica anterior está em ordem? Atualmente estou trabalhando em testar todos os recursos, instalando software de monitoramento de rede (nethogs), testando cada linha de código e vendo se o resultado é o esperado, MAS ao mesmo tempo, eu só comecei Aprendendo sobre iptables há 2 dias, então mesmo que as fontes do código original sejam feitas por codificadores experientes, eu não estou 100% confiante em minha habilidade de juntar tudo para produzir o resultado desejado. Obrigado a qualquer pessoa que tenha lido tudo isso e participe da discussão !!!

fontes:

link link

P.S .: Obrigado a @dirkt por me ajudar a entender muitos dos conceitos fundamentais do iptables, além de responder algumas das minhas perguntas sobre o código-fonte.

ATUALIZAÇÃO:

Então, depois de executar o código, parece haver algo errado. O que acontece é o seguinte. Eu corro o script de shell:

bash myscript

Eu recebo 2 erros da seguinte forma:

ip6tables v1.6.0: host/network 127.0.0.1 not found Try 'ip6tables -h' or 'ip6tables --help' for more information.

ip6tables v1.6.0: host/network 198.168.0.1 not found Try 'ip6tables -h' or 'ip6tables --help' for more information.

mas tudo correu bem, e ao fazer sudo iptables -L , confirmei que todas as outras regras estão em vigor. DEPOIS disso, tentei o seguinte:

  • Execute o firefox clicando duas vezes no ícone manualmente. O resultado foi o esperado, logo recebi um erro Servidor não encontrado , que era um bom sinal
  • Depois disso, executei o comando sudo -g internet -s no terminal e, em seguida, firefox . AGORA ... quando eu tentei carregar um site, ele não me mostrou Servidor não encontrado , mas continua carregando por um longo período de tempo, muito longo. Isso me leva a acreditar que talvez a resposta de saída tenha sido enviada, MAS a entrada estava sendo bloqueada.

Se alguém souber por que isso pode estar acontecendo, adoraria saber sua opinião!

    
por Webeng 20.04.2017 / 09:42

0 respostas