Tunelar dados IPv4 através de servidores DNS para contornar restrições de firewall e fornecer acesso de rede encoberto para testes de penetração.
Este é um software que permite tunelar dados IPv4 através de um servidor DNS. Isto pode ser útil em diferentes situações onde o acesso à internet é bloqueado por firewall, mas as consultas DNS são permitidas.
Para compilar o iodine você precisa do meson.
Execute os seguintes comandos para compilar dentro do diretório build:
meson setup build
cd build
ninja
Para compilar e executar os testes você precisa da biblioteca check. Inicie-os
executando ninja test dentro do diretório de build.
Experimente na sua própria LAN! Siga estes passos simples:
./iodined -f 10.0.0.1 test.com.
Se você já usa a rede 10.0.0.0, use outra rede interna como
172.16.0.0../iodine -f -r 192.168.0.1 test.com.
Substitua 192.168.0.1 pelo endereço IP do seu servidor.10.0.0.2 e o servidor tem 10.0.0.1.Para realmente usá-lo através de um nameserver de retransmissão, veja abaixo.
Nota: servidor e cliente precisam falar exatamente o mesmo protocolo. Na maioria dos casos, isto significa executar a mesma versão do iodine. Infelizmente, implementar compatibilidade de protocolo retroativa e futura geralmente não é viável.
Para usar este túnel, você precisa de controle sobre um domínio real (como mydomain.com),
e um servidor com um endereço IP público para executar o iodined. Se este servidor
já executa um programa DNS, altere sua porta de escuta e então use a opção -b do iodined
para permitir que o iodined encaminhe as requisições DNS. (Note que este procedimento
não é aconselhado em ambientes de produção, porque o encaminhamento DNS do iodined
não é completamente transparente, por exemplo transferências de zona não funcionarão.)
Alternativamente, você pode encaminhar o subdomínio do seu servidor DNS para o iodined
que então deve ser executado em uma porta diferente (-p).
Então, delegue um subdomínio (digamos, t1.mydomain.com) para o servidor iodined.
Se você usa BIND para o seu domínio, adicione duas linhas como estas ao arquivo de zona:
t1 IN NS t1ns.mydomain.com. ; note the dot!
t1ns IN A 10.15.213.99
A linha NS é tudo o que é necessário para rotear consultas para o subdomínio t1
para o servidor t1ns. Usamos um nome curto para o subdomínio, para manter o máximo
de espaço possível disponível para o tráfego de dados. No final da linha NS
está o nome do seu servidor iodined. Este pode ser qualquer nome, apontando para qualquer lugar,
mas neste caso é facilmente mantido no mesmo arquivo de zona. Deve ser um nome
(não um endereço IP), e esse nome em si deve ter um registro A
(não um CNAME).
Se o seu servidor iodined tem um IP dinâmico, use um provedor de DNS dinâmico. Simplesmente
aponte a linha NS para ele, e omita a linha A:
t1 IN NS myname.mydyndnsprovider.com. ; note the dot!
Então recarregue ou reinicie o seu programa nameserver. Agora quaisquer consultas DNS para
domínios terminando em t1.mydomain.com serão enviadas para o seu servidor iodined.
Finalmente inicie o iodined no seu servidor. O primeiro argumento é o endereço IP
dentro do túnel, que pode ser de qualquer faixa que você ainda não usa (por
exemplo 192.168.99.1), e o segundo argumento é o domínio atribuído (neste
caso t1.mydomain.com). Usar a opção -f manterá o iodined em execução no
primeiro plano, o que ajuda durante os testes. O iodined abrirá uma interface virtual
("tun device"), e também começará a escutar por consultas DNS na porta UDP 53.
Digite uma senha na linha de comando (-P pass) ou depois que o servidor
iniciar. Agora tudo está pronto para o cliente.
Se houver chance de você usar um túnel iodine de ambientes inesperados,
inicie o iodined com a opção -c.
Linha de comando resultante nesta situação de exemplo:
./iodined -f -c -P secretpassword 192.168.99.1 t1.mydomain.com
Toda a configuração está feita, apenas inicie o iodine. Ele recebe um ou dois argumentos, o
primeiro é o servidor DNS de retransmissão local (opcional) e o segundo é o domínio
que você usou (t1.mydomain.com). Se você não especificar o primeiro argumento, a
configuração DNS atual do sistema será consultada.
Se consultas DNS são permitidas para qualquer computador, você pode diretamente fornecer o endereço
do servidor iodined como primeiro argumento (no exemplo: t1ns.mydomain.com ou
10.15.213.99). Nesse caso, também pode acontecer que qualquer tráfego seja permitido
para a porta DNS (53 UDP) de qualquer computador. O Iodine detectará isto, e mudará
para tunelamento UDP bruto se possível. Para forçar o tunelamento DNS em qualquer caso, use a
opção -r (especialmente útil ao testar dentro da sua própria rede).
A interface de túnel do cliente receberá um IP próximo ao do servidor (neste
caso 192.168.99.2 ou .3 etc.) e uma MTU adequada. Digite a mesma senha que
no servidor, seja como opção de linha de comando ou depois que o cliente iniciar.
Usar a opção -f manterá o cliente iodine em execução no primeiro plano.
Linha de comando resultante nesta situação de exemplo, adicionando -r força o tunelamento DNS mesmo se o tunelamento UDP bruto fosse possível:
./iodine -f -P secretpassword t1.mydomain.com
De qualquer lado, você agora deve ser capaz de pingar o endereço IP na outra
extremidade do túnel. Neste caso, ping 192.168.99.1 do cliente iodine, e
192.168.99.2 do servidor iodine.
Os dados dentro do túnel são apenas IPv4.
O servidor escuta tanto IPv4 quanto IPv6 para requisições recebidas por padrão.
Use as opções -4 ou -6 para escutar apenas em um protocolo. O modo bruto será
tentado no mesmo protocolo usado para o login.
O cliente pode usar nameservers IPv4 ou IPv6 para conectar ao iodined. Os
nameservers de retransmissão traduzirão entre protocolos automaticamente se necessário. Use
as opções -4 ou -6 para forçar o cliente a usar uma versão específica de IP para suas consultas
DNS.
Se o seu servidor está escutando em IPv6 e é alcançável, adicione um registro AAAA para ele na sua configuração DNS. Estendendo o exemplo acima ficaria assim:
t1 IN NS t1ns.mydomain.com. ; note the dot!
t1ns IN A 10.15.213.99
t1ns IN AAAA 2001:db8::1001:99
É possível rotear todo o tráfego através do túnel DNS. Para fazer isto, primeiro adicione uma rota de host para o nameserver usado pelo iodine sobre a interface com fio/sem fio com o gateway padrão como gateway. Então substitua o gateway padrão pelo endereço IP do servidor iodined dentro do túnel DNS, e configure o servidor para fazer NAT.
No entanto, note que o tráfego de dados tunelado não é criptografado de forma alguma, e pode ser lido e alterado por terceiros com relativa facilidade. Para máxima segurança, execute uma VPN através do túnel DNS (=tunelamento duplo), ou use acesso secure shell (SSH), possivelmente com encaminhamento de porta. Este último também pode ser usado para navegação web, quando você executa um proxy web (por exemplo Privoxy) no seu servidor.
O servidor iodined responde a requisições NS enviadas para subdomínios do domínio
do túnel. Se o seu subdomínio iodined é t1.mydomain.com, envie uma requisição NS para
foo123.t1.mydomain.com para ver se a delegação funciona.
dig é uma boa ferramenta para isto:
% dig -t NS foo123.t1.mydomain.com
ns.io.citronna.de.
Além disso, o servidor iodined responderá a requisições começando com 'z' para qualquer um dos tipos de requisição suportados, por exemplo:
dig -t TXT z456.t1.mydomain.com
dig -t SRV z456.t1.mydomain.com
dig -t CNAME z456.t1.mydomain.com
A resposta deve parecer texto embaralhado em todos estes casos.