仮想マシン用の汎用DNS - iptables / netfilterを使用する

仮想マシン用の汎用DNS - iptables / netfilterを使用する

私のホストコンピュータにBind9があります。
ゲスト仮想マシンが複数あります。
私の仮想マシンがホストマシンでBind9を使用したいと思います。

Bind9が自分の仮想マシンからの要求を受け入れる方法を知っています(受信+再帰を許可)。
Bind9設定を変更せずにiptables / netfilterを使用して実装したいと思います。(別名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

答え1

以前と同じように使用する必要がありますsysctl -w net.ipv4.conf.XXX.route_localnet=1が、おそらく仮想イーサネットインターフェイスで使用する必要があります。
これにより、カーネルはマーティンパケットを保持することができます。

また、ローカルで生成されたパケットはPREROUTINGチェーンに転送されません。したがって、OUTPUTチェーンを使用する必要があります。

最後に、非常に特定のケースではNATを試してはいけません。代わりに使用してください--jump TPROXY
思い出に残る実際の例を提示することはできないので、正確な設定を見つける必要があります。次に、後で参考になるように回答を作成してください。

答え2

はい。

10.10.10.1ではなくloの127.0.0.1に移動するには、仮想マシンからのパケットが必要なので、DNATが必要です。明らかに、ローカルホストにDNSとしてアクセスするようにVMを設定することはできませんが、少なくとも状況はより複雑になります。

loでは、ネットワークに属さない非ローカルアドレスに問題がある可能性があるため、SNATが必要になることがあります。

私はBindがloだけを受信すると仮定します。設定例では、DNSパケットがBINDからVMに返される方法も忘れてしまったようです。これにより、BIND はパッケージを lo にのみ入れることができます。したがって、これをローカルネットワークから仮想マシンネットワークにインポートする必要があります。仮想マシンの DNS クライアントがどれほど厳しいかによっては、SNAT が不要な場合があります。上記でSNATを使用した場合は、DNATが必要です。

最後に、なぜ努力する価値があるのか​​少し疑問に思います...分離したいすべてのアイテムからBINDを隔離するためにファイアウォールルールを実装する方がはるかに簡単になります。仮想ネットワークが使用されます。 BINDがlo状態にある理由を説明すると、問題を解決するためのより良い方法を見つけることもできます。

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 は完全にローカルホストを意味します。

答え3

UDP、TCP、IPv4、およびIPv6の完全な設定は複雑です。仮想マシンにDNSフォワーダ(プロキシ)を使用します。私の推薦はdnsmasqです。

dnsmasq -dq -I lo -S 127.0.0.1

すべての要求は localhost で実行されているサーバーに転送されますが、ループバックデバイス自体は無視されます。後で -dp オプションなしで dnsmasq をデーモンとして実行します。

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

関連情報