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

В Linux пакет coreutils содержит даже команду yes . Итак, вы должны запустить:

yes | $MAIN_SCRIPT_PATH/first.sh stop
2
29.01.2017, 21:54
3 ответа

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

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

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

1
27.01.2020, 22:42

Да.

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

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

Я предполагаю, что bind прослушивает только lo: Также похоже, что вы забыли о способе возврата пакетов DNS от BIND к виртуальным машинам в вашем примере конфигурации. После этого BIND может помещать пакеты только в lo.Таким образом, вам нужно будет вывести их из lo и в сеть виртуальной машины, здесь вам может не понадобиться 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 - не лучшее решение безопасности . lo означает быть исключительно localhost.

0
27.01.2020, 22:42

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

dnsmasq -dq -I lo -S 127.0.0.1

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

-d or --no-daemon
-q or --log-queries
-S or --server
-I or --except-interface
-1
27.01.2020, 22:42

Теги

Похожие вопросы