Tenho uma dúvida sobre como configurar a filtragem conforme descrito no seguinte cenário:
Vejo que systemd-resolved
escuta na porta 53 e envia todas as solicitações de DNS para os resolvedores de DNS reais.
Estou procurando uma maneira de fazer isso:
- Capture a resposta do resolvedor DNS que está prestes a entrar na
systemd-resolved
porta at53
- Segure este pacote, leia seu conteúdo (veja a resposta real do endereço IP), faça algo com este IP
- Libere o pacote de resposta para passar pela porta
53
Isso é algo que pode ser alcançado com ou iptables
com libpcap
qualquer outra solução disponível?
Eu sei que é possível instalar meu próprio ouvinte na porta, 53
mas realmente não quero interromper isso systemd-resolver
aqui e estou procurando uma solução transparente.
systemd-resolvd
é um resolvedor "real" (tão real quanto qualquer outro resolvedor recursivo): ele precisa dos resolvedores responsáveis por algumas zonas sobre respostas; é assim que o DNS funcionaNão, não é assim que funciona: as solicitações de DNS virão de uma porta aleatória, indo para a porta 53 no resolvedor remoto, que responderá na mesma porta de onde a solicitação foi feita.
53 é a porta de destino , não a porta de origem da solicitação. Para a resposta, a porta de origem (no servidor DNS remoto) é 53 e a porta de destino (na sua máquina) é igual ao número da porta de origem aleatória escolhida pelo solicitante.
Normalmente, você apenas implementaria isso tendo um resolvedor que você configuraria para usar. Você já tem
systemd-resolved
, o que é basicamente isso, então a questão aqui é por que você está fazendo isso e se já existe alguma funcionalidade em seu sistema que possa cumprir esse propósito.Claro, você poderia implementar a quantidade mínima de rastreamento de solicitação/resposta no eBPF e deixar isso rodar no lado do kernel. Então você inventaria alguma maneira de fazer o que quer dizer com "fazer algo com este IP" no kernel, ou um protocolo para o lado do kernel trocar essas informações com um processo de usuário que saiba como fazer isso.
Mas isso é apenas colocar o trabalho de um programa de usuário proxy resolvedor no kernel, e parece muito mais trabalhoso e muito mais intrusivo do que apenas fazer com que o systemd-resolved faça o que você deseja, por si só ou configurando-o para usar sua própria implementação de resolvedor.
O DNS é recursivo por design de qualquer maneira. Adicionar mais um nível não é nada especial e, portanto, "transparente" para qualquer programa que use DNS.