Questão Use o netcat para converter consultas DNS UDP em consultas DNS TCP


Eu estou executando o Debian 9 em uma rede isolada e preciso de serviços DNS para resolver nomes de host externos.

(Tenho certeza que alguns se perguntarão por que eu preciso ser capaz de resolver hostnames externos se eu estiver em uma rede insolada, mas isso é mais detalhe do que eu preciso entrar aqui para fazer a minha pergunta. Basta dizer, essa necessidade existe.)

No host isolado do qual preciso resolver nomes de host externos, configurei este túnel SSH:

ssh -N -L localhost:53:192.168.13.14:53 myUserId@jumpServer

Aqui, 192.168.13.14 é um servidor DNS que pode resolver todos os nomes, globalmente. Este túnel SSH encaminha qualquer coisa ouvida em locais TCP porta 53 para TCP porta 53 em 192.168.13.14.

Eu posso usar dig para resolver um nome de host, especificando que a consulta deve ser feita usando a porta TCP 53, em vez da porta UDP usual 53:

root@isolatedHost:~# dig @localhost +vc example.com

; <<>> DiG 9.10.3-P4-Debian <<>> @localhost +vc example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53054
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;example.com.                   IN      A

;; ANSWER SECTION:
example.com.            3600    IN      A       93.184.216.34

;; Query time: 133 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Dec 20 15:21:01 MST 2017
;; MSG SIZE  rcvd: 56

A chave para fazer este exemplo funcionar é que:

  1. dig tem o sinalizador "+ vc +" ("circuito virtual") que lhe permite dizer para usar o TCP em vez do UDP normal
  2. Nosso servidor de nomes (aquele em 192.168.13.14) está configurado para aceitar consultas recursivas normais no TCP, bem como o UDP usual

Claro, cavar é especial. Pode ser dito para usar TCP em vez de UDP. No caso genérico de um aplicativo aleatório que chama a biblioteca de resolvedor local, a consulta sempre será feita por meio do UDP usual.

O problema com meu túnel SSH é que o SSH só pode encaminhar TCP portas. Não pode encaminhar portas UDP. Então, eu preciso de uma maneira de converter todas as consultas DNS do UDP usual para o TCP. Eles podem sair da nossa rede isolada através do túnel SSH e seguir para o servidor de nomes.

A primeira coisa que vem à mente é o netcat:

nc -u -l -p 53 | nc localhost 53

Isso, infelizmente, não funciona, e ainda não sei por quê.

Alguém tem uma solução para encaminhar consultas DNS UDP para fora se uma rede isolada, usando netcat em conjunto com um túnel SSH ou de outra forma?


0


origem


Você não pode simplesmente converter um datagrama UDP em um segmento TCP. O UDP é sem conexão, mas o TCP exige uma conexão entre os hosts. A consulta DNS deve ser feita com o TCP desde o início, porque o TCP deve primeiro estabelecer uma conexão entre o solicitante e o respondente. Uma implementação de DNS adequada é necessária para suportar o TCP, por RFC 7766: "Portanto, este documento atualiza as principais especificações do protocolo DNS, de modo que o suporte para TCP é, a partir de agora, uma parte REQUERIDA de uma implementação completa do protocolo DNS."Seu aplicativo e sistema operacional devem suportar TCP para DNS. - Ron Maupin
Problema XY. Como configurar o Linux para usar o TCP para consultas DNS? - Kamil Maciorowski
Sim, a intenção era que para cada pacote UDP que chegasse (e a pilha entregasse fragmentos completos ao aplicativo, não fragmentos), uma conexão TCP seria estabelecida, a carga UDP enviada pela conexão TCP e a conexão TCP fechadas. Meu primeiro comando netcat foi muito simplista. Graças a Ron e Kamil! Vou olhar o link "Como configurar o Linux para usar o TCP para consultas DNS". Isso parece perfeito, exceto que eu não tenho garantia de que qualquer aplicativo arbitrário que venha junto sistema resolver. - Dave
Deseja corrigir meu último comentário, mas não pode editá-lo por algum motivo ... "(e a pilha faz a entrega completa pacotes (não fragmentos) para o aplicativo, não fragmentos ... ") - Dave
@Dave o tempo de edição do comentário é limitado a 3 minutos (até onde eu sei). Depois disso, você só precisa copiar / colar / corrigir e postar como um novo comentário (provavelmente excluindo o antigo, assumindo que não é correto / relevante). - Anaksunaman


Respostas: