Como posso duplicar pacotes DNS recebidos e enviá-los para um servidor de nomes diferente com iptables?

5

EDIT: o tldr: Eu quero usar o TEE e NAT para clonar o tráfego UDP. Não estou preocupado em lidar com respostas. Eu idealmente não quero instalar um novo software. Eu estou usando o TEE para enviar para o segmento local (127.0.0.2) com êxito, então eu quero NAT que trafegam para a WAN.

Eu tenho bind9 escutando na porta 53 no meu servidor Debian. Eu tenho um cliente externo fazendo solicitações de DNS para dito servidor. Tudo isso está funcionando bem. Eu gostaria de copiar os pedidos DNS recebidos na porta 53 e enviá-los para, digamos, 8.8.8.8. Anote a palavra copiar .

De muito googling e leitura no SU, descobri que o método mais frequentemente recomendado é usar o iptables TEE e o NAT. Eu tenho o TEE funcionando muito bem, aqui está o meu comando:

iptables -t mangle -A POSTROUTING -p udp -d 127.0.0.1 --dport 53 -j TEE --gateway 127.0.0.2

Confirmei que recebi uma cópia da solicitação de DNS em 127.0.0.2:53 com o netcat. Até aí tudo bem.

Agora, preciso alterar o IP de destino. Eu tento fazer isso com:

iptables -t nat -A PREROUTING -p udp -d 127.0.0.2 --dport 53 -j DNAT --to 8.8.8.8

Eu usei o tcpdump para monitorar o tráfego de saída para 8.8.8.8. Nada. Eu me perguntei: talvez eu precise alterar o endereço IP de origem para que o kernel não deixe cair esse pacote, já que ele está chegando em 127.0.0.2, mas o IP de origem está definido como o do meu cliente DNS externo. Porque não?

iptables -t nat -A POSTROUTING -p udp -d 127.0.0.2 --dport 53 -j SNAT --to DNS_SERVERS_PUBLIC_IP

Ainda assim, o tcpdump não mostra nada.

Eu tenho o encaminhamento de IP em:

$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1

Estou praticamente sem ideias e gostaria de receber toda e qualquer ajuda. Obrigado.

    
por returneax 28.09.2018 / 01:32

3 respostas

2

Nada é impossível, com o iptables.

# iptables -t nat -L -v --line-numbers -n
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        5   281 MARK       udp  --  docker0 *       0.0.0.0/0            172.17.0.1           udp dpt:53 MARK set 0xc0fe
2        5   281 TEE        udp  --  docker0 *       0.0.0.0/0            172.17.0.1           udp dpt:53 TEE gw:127.1.2.3
3        3   167 DNAT       udp  --  *      *       0.0.0.0/0            0.0.0.0/0            mark match 0xc0fe to:1.1.1.1:53

Eu estava testando isso com o docker, já que é mais fácil de jogar com sua interface. Observe que eu coloquei essas regras antes de qualquer outra regra na tabela de pré-detalhamento.

O que você faz é marcar o pacote que você está interessado, então TEE (copiar) esse pacote, e agora você pode DNAT aquele pacote para 1.1.1.1.

Marque-os, aqui você deve usar seu eth0 ou eno1, não docker0.

iptables -t nat -I PREROUTING 1 -i docker0 -p udp -d 172.17.0.1 --dport 53 -j MARK --set-mark 0xc0fe

Copie / tee para o localhost, a regra pode ser assim

iptables -t nat -I PREROUTING 2 -i docker0 -p udp --dst 172.17.0.1 --dport 53 -j TEE --gateway 127.1.2.3

Mas também pode ser assim      iptables -t nat -I PREROUTING 3 -p udp -m mark --mark 0xc0fe -j TEE --gateway 127.1.2.3

Finalmente

iptables -t nat -I PREROUTING 3 -p udp  -m mark --mark 0xc0fe -j DNAT --to-destination 1.1.1.1:53

Ei, então você estava no caminho certo, exceto pelo uso de TEE na tabela mangle, aqui estou usando tanto o TEE quanto o DNAT na tabela nat, e a MARK não é necessária, exceto para facilitar a depuração e lidar com regras. alterar. Também outro erro que você teve foi deixar a regra DNAT atuar no que você acreditou que o TEE deveria ir, mas em vez disso a TEE e a DNAT deveriam agir nas mesmas condições. Mas vou deixar as regras da marca aqui, apenas para me divertir com cultistas de carga.

Em forma abreviada     iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dst 172.17.0.1 --dportar 53 -j TEE --gateway 127.3.3.3     iptables -t nat -I PREROUTING 2 -i eth0 -p udp --dst 172.17.0.1 --dportar 53 -j DNAT --para o destino 1.1.1.1:53

    
por 17.10.2018 / 13:07
4

A documentação diz

The TEE target will clone a packet and redirect this clone to another machine on the local network segment. In other words, the nexthop must be the target, or you will have to configure the nexthop to forward it further if so desired.

Eu não sei sobre o motivo dessa restrição, mas parece que não pode ser superado com o iptables NAT, o que faz sentido, porque se a implementação subjacente suportar destinos externos, então por que restringir o intervalo alvo do TEE. Eu suspeito que o TEE é feito abaixo do nível NAT.

Não funcionaria de qualquer maneira porque a resposta chegaria com o endereço de origem errado.

    
por 28.09.2018 / 07:27
1

Como o TEE só pode ser usado na mesma sub-rede, você pode ser capaz de usar a ferramenta de Daemonlogger , também disponível no no github (onde parece mais fresco?).

Daemonlogger is a packet logger and soft tap developed by Martin Roesch. The libpcap-based program has two runtime modes:

  1. It sniffs packets and spools them straight to the disk and can daemonize itself for background packet logging. By default the file rolls over when 2 GB of data is logged.
  2. It sniffs packets and rewrites them to a second interface, essentially acting as a soft tap. It can also do this in daemon mode. These two runtime modes are mutually exclusive, if the program is placed in tap mode (using the -I switch) then logging to disk is disabled.

Alguns comentários:

por 30.09.2018 / 11:05