Общий DNS для виртуальных машин – с iptables / netfilter

У меня есть Bind9 на хосте.
У меня есть несколько гостевых виртуальных машин.
Я хочу, чтобы мои виртуальные машины использовали Bind9, расположенный на хосте.

Я знаю, как заставить Bind9 принимать запросы от моих жизненных машин (listen-on + allow-recursion).
Я хочу достичь этого с помощью iptables / netfilter, не изменяя конфигурацию Bind9 (иначе слушайте только 127.0.0.1).
-> Это просто перенаправление локального порта. Я знаю, как это сделать с помощью socat, но я застрял, когда делаю это с помощью iptables / netfilter

Привяжите прослушивать только 127.0.0.1, поэтому пакеты должны начинаться с 127.0.0.1
Виртуальные машины находятся на мосту vmbr0 10.10.10.0/24
Хост также находится на мосту в 10.10.10.1

Должен ли я сделать пакеты входящими в пользовательскую цепочку, затем DNAT + SNAT их, или есть более простой способ?

Я сделал это (но не работает):

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 

Вы должны использовать sysctl -w net.ipv4.conf.XXX.route_localnet=1 как вы это делали, но, вероятно, на виртуальном интерфейсе Ethernet.
Это позволяет ядру сохранять пакеты martin.

Также имейте в виду, что локально созданные пакеты не переходят в цепочку PREROUTING. Поэтому вы должны использовать цепочку OUTPUT.

И, наконец, не пытайтесь NAT для этого особого случая. --jump TPROXY этого используйте --jump TPROXY .
Я не могу дать вам рабочий пример по памяти, вам нужно найти точную настройку. Затем, пожалуйста, заполните ответ для дальнейшего использования.

Да.

Вам понадобится DNAT, потому что вам понадобятся пакеты, поступающие с виртуальных машин, чтобы перейти на 127.0.0.1 на лот вместо 10.10.10.1. Вы, очевидно, не можете настроить виртуальные машины для доступа к localhost как DNS, по крайней мере, это только усложнит ситуацию.

В этом случае вам может понадобиться SNAT, потому что в этом случае могут возникнуть проблемы с нелокальными адресами, которые не принадлежат сети.

Я предполагаю, что связывание только прослушивается на лоу. Также кажется, что вы забыли о возврате пути DNS-пакетов от BIND к виртуальным машинам в вашем образце конфигурации. BIND затем может помещать пакеты в lo. Таким образом, вам нужно будет вывести их из сети и в сеть VM, здесь вам может не понадобиться SNAT, в зависимости от того, насколько привлекателен DNS-клиент на вашей виртуальной машине. Если вы использовали SNAT выше, вам понадобится DNAT.

Наконец, мне немного любопытно, почему это стоило бы усилий … похоже, было бы намного проще реализовать правила брандмауэра, чтобы изолировать BIND от того, от чего вы хотите его изолировать, даже чтобы дать ему свой собственный виртуальную сеть, затем использовать lo. Может быть, если бы вы описали, почему BIND должен быть включен, возможно, вам удастся найти лучший способ решить проблему.

Для пути к 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 

Для обратного пути к виртуальным машинам:

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

Если это не сработает, вам может потребоваться:

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

Все это на 90%, потому что у меня нет такой настройки, чтобы попробовать. Пожалуйста, имейте в виду, что обычно это не хорошее решение по безопасности, чтобы направить что-либо на место. lo означает, что это будет исключительно localhost.

Полная настройка для UDP, TCP, IPv4 и IPv6 является сложной. Используйте DNS-отправитель (прокси) для своих виртуальных машин. Моя рекомендация dnsmasq:

 dnsmasq -dq -I lo -S 127.0.0.1 

Пересылает все запросы серверу, запущенному на локальном хосте, но игнорирует устройство loopback. Позже запустите dnsmasq в качестве демона без параметров -dp.

 -d or --no-daemon -q or --log-queries -S or --server -I or --except-interface