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:
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:
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!