DNS comum para máquinas virtuais - com iptables / netfilter

2

Eu tenho um Bind9 em um host.
Eu tenho várias máquinas virtuais convidadas. Eu quero que minhas máquinas virtuais usem o Bind9 localizado no host.

Eu sei como fazer Bind9 aceitar solicitações de minhas máquinas vitual (listen-on + allow-recursion).
Eu quero conseguir isso usando iptables / netfilter, sem modificar a configuração Bind9 ( aka ouça somente em 127.0.0.1).
- > este é apenas um redirecionamento de porta local. Eu sei como fazer isso com o socat, mas estou preso ao fazer isso com o iptables / netfilter

Ligue apenas para 127.0.0.1, para que os pacotes sejam originários de 127.0.0.1
As máquinas virtuais estão em uma ponte vmbr0 10.10.10.0/24
O host também está na ponte em 10.10.10.1

Devo fazer os pacotes entrarem em uma cadeia personalizada, depois DNAT + SNAT, ou existe uma maneira mais simples?

Eu fiz isso (mas não funciona):

sysctl -w net.ipv4.conf.vmbr0.route_localnet=1     # not sure if necessary. Let's see that when everything will work

iptables  --table nat  --new-chain dns-prerouting
iptables  --table nat  --append PREROUTING  --source 10.10.10.0/24  --destination 10.10.10.1  --protocol udp  --destination-port 53  --jump dns-prerouting
iptables  --table nat  --append PREROUTING  --source 10.10.10.0/24  --destination 10.10.10.1  --protocol tcp  --destination-port 53  --jump dns-prerouting

iptables  --table nat  --new-chain dns-postrouting
iptables  --table nat  --append POSTROUTING  --source 10.10.10.0/24  --destination 127.0.0.1  --protocol udp  --destination-port 53  --jump dns-postrouting
iptables  --table nat  --append POSTROUTING  --source 10.10.10.0/24  --destination 127.0.0.1  --protocol tcp  --destination-port 53  --jump dns-postrouting


iptables  --table nat  --append dns-prerouting   --jump DNAT  --to-destination 127.0.0.1
iptables  --table nat  --append dns-postrouting  --jump SNAT  --to-source      127.0.0.1
    
por Gregory MOUSSAT 29.01.2017 / 15:24

3 respostas

2

Você precisa usar sysctl -w net.ipv4.conf.XXX.route_localnet=1 como fez, mas provavelmente na interface Ethernet virtual.
Isso permite que o kernel mantenha os pacotes martin.

Lembre-se também de que os pacotes gerados localmente não passam para a cadeia PREROUTING. Então você tem que usar a cadeia OUTPUT.

E, finalmente, não tente NAT para este caso muito especial. Use --jump TPROXY em vez disso.
Eu não posso te dar um exemplo de trabalho por memória, você tem que encontrar a configuração exata. Então, por favor complete a resposta para referência futura.

    
por 07.02.2017 / 06:54
0

Sim.

Você precisará do DNAT porque precisará dos pacotes provenientes das VMs para ir até 127.0.0.1 em vez de 10.10.10.1. Obviamente, você não pode configurar as VMs para acessar o host local como DNS, pelo menos isso complicaria ainda mais as coisas.

Em segundo lugar, você pode precisar de SNAT, porque, em geral, você pode ter problemas com endereços não locais que não pertencem à rede.

Estou assumindo que bind está apenas ouvindo em lo: Também parece que você esqueceu sobre o caminho de retorno dos pacotes DNS do BIND para as VMs em seu exemplo de configuração. O BIND só pode colocar pacotes em lo. Portanto, você precisará colocá-los fora e dentro da rede de VMs. Aqui, talvez você não precise de SNAT, dependendo de como é exigente o cliente DNS em sua VM. Se você usou o SNAT acima, você precisará do DNAT agora.

Finalmente, estou um pouco curioso por que valeria a pena o esforço ... parece que seria muito mais fácil implementar as regras de firewall para isolar o BIND de qualquer coisa que você quisesse isolá-lo, mesmo para dar sua própria outra rede virtual, então use lo. Talvez se você descrever por que o BIND deve estar disponível, talvez seja possível encontrar uma maneira melhor de resolver o problema.

Para o caminho para o DNS:

iptables -F -t nat
echo 1 >| /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -p udp -d 10.10.10.1 --dport 53 \
 -j DNAT --to 127.0.0.1:53 

Para o caminho de volta para as VMs:

iptables -A FORWARD -i lo -o vmbr0 -m state \
--state ESTABLISHED,RELATED -j ACCEPT

Se isso não funcionar, você pode precisar de:

iptables -t nat -A POSTROUTING -o lo -j MASQUERADE

É tudo um pouco 90% lá porque eu não tenho essa configuração para tentar. Esteja ciente de que geralmente não é uma boa decisão de segurança encaminhar qualquer coisa para você. lo significa ser exclusivamente localhost.

    
por 03.02.2017 / 11:20
-1

A configuração completa para UDP, TCP, IPv4 e IPv6 é complexa. Use um encaminhador de DNS (proxy) para suas VMs. Minha recomendação é dnsmasq:

dnsmasq -dq -I lo -S 127.0.0.1

Encaminha todas as solicitações para o servidor em execução no host local, mas ignora o próprio dispositivo de loopback. Posteriormente, execute o dnsmasq como daemon sem as opções -dp.

-d or --no-daemon
-q or --log-queries
-S or --server
-I or --except-interface
    
por 05.02.2017 / 14:27