가상 머신용 범용 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

관련 정보