
Tudo descrito no artigo é implementado como uma ferramenta Toroxy disponível no GitHub
Recentemente, o anonimato on-line tem sido objeto de acalorado debate. Não é segredo que dados sobre visitas a recursos da Internet a partir de um dispositivo local podem ser coletados em diferentes níveis, a fim de criar um "modelo" do usuário, que posteriormente poderá ser usado contra ele (ou
poderia ). Portanto, não surpreende que um número crescente de usuários ativos da Internet esteja se convencendo da necessidade de mecanismos de proxy e anonimização. Nesse sentido, há mais e mais novos clientes VPN, mas, como mostra a prática, nem todos podem ser confiáveis: nem tudo funciona imediatamente, apenas o tráfego HTTP é anonimizado, a qualidade da implementação é ruim ou e desenvolvedores pecam mesclando dados sobre seus usuários.
Neste artigo, tentaremos montar nossa própria ferramenta com uma interface do usuário a partir de vários componentes de software, o que permitiria anonimizar completamente o tráfego do sistema local e impedir vazamentos nos canais de "escuta" em qualquer estágio do trabalho.
Nosso principal objetivo será "construir" um utilitário confiável a partir de ferramentas prontas. Obviamente, a idéia de criar uma ferramenta de alta qualidade a partir do zero em um tempo razoável é repleta de erros e, portanto, será mais rápido e confiável escolher componentes prontos e conectá-los corretamente!
O que uma ferramenta deve ser capaz de fazer?
- Redirecione todo o tráfego do sistema de destino para os nós intermediários (de preferência vários) para mascarar com segurança a origem
- Rastreie possíveis violações de anonimato, corrija-as e relate-as usando notificações da interface do usuário
Componentes selecionados para criar a ferramenta:
- tor
- iptables
- python3
- systemd
Ao misturar todos os componentes em um shell chamado “Linux”, podemos definitivamente obter algo que vale a pena que ajudará a alcançar o objetivo final.
Componente # 1: Tor
É nesse componente que o restante da infraestrutura da ferramenta será construída. O Tor fornece um mecanismo que faz parte de qualquer cliente VPN - um mecanismo para agrupar o tráfego através de nós intermediários, anônimos para um observador externo (na configuração padrão desses nós 3).
Por padrão, o cliente Tor dos repositórios em lote padrão após a instalação começa a escutar a porta 9050, que aceita qualquer cliente que possa meias. O problema é que, além do tráfego de meias em nosso sistema, pode haver muitos outros tráfegos de aplicativos que não funcionam nesse protocolo. Nesse sentido, em primeiro lugar, dentro do sistema local, você deverá abrir uma janela na rede Tor para qualquer nova conexão de rede. Isso é feito simplesmente aumentando o
proxy transparente na configuração do
torrc :
/etc/tor/torrc ... TransPort 9040 # python ControlPort 9051 ...
Atenção especial deve ser dada ao tráfego UDP. O fato é que o princípio de roteamento de cebola é baseado no conceito de "fluxo", que, como você sabe, existe apenas no TCP. Ao enviar um pacote UDP através do Tor, o sistema de destino não poderá receber uma resposta, pois o pacote de resposta não encontrará o caminho de retorno. Mas, apesar dessa peculiaridade, ainda temos a oportunidade de anonimizar as consultas DNS, conhecidas por serem realizadas no UDP, e ao mesmo tempo incluir a resolução .onion:
/etc/tor/torrc ... AutomapHostsOnResolve 1 DNSPort 53 ...
Nisso, o acesso ao Tor é aberto dentro do loopback.
Componente # 2: Iptables
Como nossa tarefa é ocultar a verdadeira fonte de tráfego de um observador externo dentro de todo o sistema e a janela do Tor já está aberta, resta apenas envolver todo o tráfego nessa janela. O firewall do sistema incluído no kernel do Linux nos ajudará com isso:
# tcp iptables -t nat -A OUTPUT -p tcp --syn -j REDIRECT --to-ports $TRANS_PORT # udp (dns only) iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 53 iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A OUTPUT -j REJECT ip6tables -A OUTPUT -j REJECT
Nesta fase, obtemos um utilitário funcional que disfarça de forma confiável todo o tráfego de saída, mas isso é apenas metade do trabalho.
Componente 3: python + interface do usuário do ambiente de desktop
Sempre que a configuração manual do console (mesmo que executará um script bash) será bastante cansativa, é hora de começar a escrever um pequeno utilitário que nos ajuda especificamente no seguinte:
- Configuração automática
- Mude sua identidade no Tor a qualquer momento
- Monitorar a integridade das regras do iptables e reescrever se violado
- Rastreando sua identidade atual (IP)
- Notificação dos dois parágrafos anteriores com notificações gráficas
Na primeira inicialização, o utilitário fará o download de todos os
componentes necessários por conta própria e, em lançamentos subsequentes, configurará o Tor em conjunto com o iptables, conforme descrito acima.
Se você deseja alterar seu endereço IP externo, você interagirá com a porta de serviço Tor - 9051, que foi aberta no início para automatizar a alteração de IP:
with Controller.from_port(port = 9051) as controller: controller.authenticate() controller.signal(Signal.NEWNYM)
O rastreamento de integridade pode ser implementado de maneira banal (nós fazemos isso no joelho) lendo periodicamente a estrutura de regras do iptables e verificando sua soma SHA256:
def rulesOk(self): RULES_CHECKSUM_CMD = "{ iptables-save && ip6tables-save; } | sed s/\-\-uid\-owner\\\\s[0-9]\\\\+\\\\s//g | grep -viE '^#' | grep -viE '^\:' | sort | uniq | sha256sum | cut -d' ' -f 1" checkSum = getoutput(RULES_CHECKSUM_CMD).strip() alright = checkSum == Strings.RULES_CHECKSUM_CORRECT_HASH if not alright: rules = getoutput('iptables-save && ip6tables-save') self.lastSnapshotFileName = "/tmp/broken-rules-%s.log" % time.strftime("%d-%m-%Y_%I-%M-%S") open(self.lastSnapshotFileName, "w").write(rules) return False else: return True
Além disso, se houver inconsistências com a soma de verificação esperada, você poderá salvar o dump de regras do iptables em
/tmp/broken-rules-%d-%m-%Y_%I-%M-%S.log
para procedimentos adicionais. Se isso acontecer
rulesOk() == False
isso iniciará uma reescrita da tabela de regras do iptables.
O monitoramento do IP atual ocorrerá acessando constantemente algum recurso externo que forneça o cliente IP - por exemplo,
ident.me
.
Bem, finalmente, usaremos a DE UI para relatar problemas com as regras ou alterações de IP. Cada ambiente gráfico é único de alguma maneira, especialmente quando se trata de usar a interface do usuário do processo daemon, mas na maioria dos sistemas Linux, esse código de base chamado Python exibirá notificações com êxito:
Ao combinar tudo isso em um script Python de 200 linhas, obtemos o que conseguimos. Aqui, por exemplo, como será uma notificação de que nossa identidade foi atualizada:

E é assim que a notificação parecerá que a integridade das regras do Iptables foi violada, indicando o dump dump que contém a violação:

Componente # 4: systemd
E, finalmente, gostaríamos definitivamente de fazer uma configuração única e não pensar em nossa segurança no futuro e, portanto, a execução automática e os serviços serão úteis. O Linux possui vários subsistemas de gerenciamento de daemon padrão: systemd, sysV, init. No nosso caso, a escolha caiu no systemd devido à flexibilidade de sua configuração.
Suponha que o script python escrito na etapa anterior seja chamado "toroxy" e esteja em
/usr/bin/
, então sua execução automática e monitoramento subsequente com uma certa flexibilidade para controlar o daemon será assim:
[Unit] Description=Toroxy After=network.target StartLimitIntervalSec=0 [Service] Type=simple Restart=always RestartSec=1 User=root # service toroxy start ExecStart=/usr/bin/toroxy service # service toroxy stop ExecStop=/usr/bin/toroxy stop # service toroxy reload ExecReload=/usr/bin/toroxy switch [Install] # init 3, UI Tor WantedBy=multi-user.target
Quase tudo está pronto para operação "industrial". O toque final que eu gostaria de adicionar à ferramenta para aumentar a confiabilidade é a inicialização automática das regras do iptables na inicialização do sistema (como você sabe, as regras do iptables são redefinidas ao reiniciar) usando o iptables-persistent:
iptables-save > /etc/iptables/rules.v4 ip6tables-save > /etc/iptables/rules.v6 netfilter-persistent start && netfilter-persistent save
Conclusão
Por isso, montamos nossa própria ferramenta a partir de uma combinação de diversos componentes, os quais, com um alto grau de confiabilidade, são capazes de fornecer anonimato contínuo do usuário do Linux na rede. Em conclusão, deve-se dizer que tudo o que é descrito no artigo é implementado como uma ferramenta
Toroxy disponível no GitHub.