내부 네트워크에 대한 BIND의 일부 DNS 항목 재정의


39

단일 게이트웨이를 통해 인터넷에 연결된 BIND를 실행하는 DNS 서버가있는 내부 네트워크가 있습니다. 내 도메인 "example.com"은 외부 DNS 공급자가 관리합니다. 해당 도메인의 "host1.example.com"및 "host2.example.com"항목과 최상위 항목 "example.com"은 게이트웨이의 공개 IP 주소를 가리 킵니다.

내부 네트워크에있는 호스트가 "host1.example.com", "host2.example.com"및 "example.com"을 게이트웨이 대신 내부 IP 주소로 확인하고 싶습니다. "otherhost.example.com"과 같은 다른 호스트는 여전히 외부 DNS 공급자가 해결해야합니다.

"host1.example.com"및 "host2.example.com"에 대해 BIND에 두 개의 단일 입력 영역을 정의하여 host1 및 host2 항목에 대해이를 수행했습니다. 그러나 "example.com"에 대한 영역을 추가하면 해당 도메인에 대한 모든 쿼리가 로컬 DNS 서버에 의해 해결되므로 "otherhost.example.com"을 쿼리하면 오류가 발생합니다.

도메인의 일부 항목 만 무시 하고 나머지는 재귀 적으로 해결 하도록 BIND를 구성 할 수 있습니까?



1
"도메인의 일부 항목 만 무시하도록 BIND를 구성 할 수 있습니까?" 아니요, BIND가 아닙니다. 하위 도메인을 사용하십시오.
bortzmeyer 2016 년

1
언 바운드는 내가 요청한 것과 정확히 일치하는 것으로 보이므로 Alnitak의 답변을 수락 된 답변으로 설정하고 있습니다. 그러나 결국에는 bortzmeyer의 조언을 따르고 도메인 항목을 재정의 하지 않습니다 . 모든 답장을 보내 주셔서 감사합니다!
Remy Blank

1
바인드는 이제 응답 정책 영역으로이를 수행 할 수 있습니다. 아래 답변을 참조하십시오. 언 바운드와 같은 다른 솔루션은 CNAME을 재정의 할 수 없습니다. 바인드에있는 정책 영역을 사용하면 하위 도메인을 수행 할 필요가 없습니다. 개별 레코드를 마음대로 재정의 할 수 있습니다.
Florin Andrei

답변:


18

가장 좋은 방법은 바인드 9.8.1 이상의 응답 정책 영역을 통하는 것입니다. 임의 영역에서 단일 레코드를 대체 할 수 있으며 (변경하려는 단일 레코드 만 전체 서브 도메인을 작성할 필요가 없음) CNAME 등을 대체 할 수 있습니다. 언 바운드와 같은 다른 솔루션은 CNAME을 대체 할 수 없습니다. .

https://www.redpill-linpro.com/sysadvent/2015/12/08/dns-rpz.html


편집 : 이 제대로 수행하자. 위에 링크 된 자습서를 기반으로 수행 한 작업을 문서화합니다.

내 OS는 Raspberry Pi 용 Raspbian 4.4이지만이 기술은 Debian 및 Ubuntu에서 변경하지 않거나 다른 플랫폼에서 최소한의 변경으로 작동해야합니다.

바인드 구성 파일이 시스템에서 유지되는 위치로 이동하십시오 /etc/bind. 여기는에 있습니다. 거기에 db.rpz다음 내용으로 불리는 파일을 작성하십시오 .

$TTL 60
@            IN    SOA  localhost. root.localhost.  (
                          2015112501   ; serial
                          1h           ; refresh
                          30m          ; retry
                          1w           ; expiry
                          30m)         ; minimum
                   IN     NS    localhost.

localhost       A   127.0.0.1

www.some-website.com    A        127.0.0.1

www.other-website.com   CNAME    fake-hostname.com.

무엇을합니까?

  • www.some-website.com가짜 주소로 IP 주소를 재정 의하여 127.0.0.1해당 사이트의 모든 트래픽을 효과적으로 루프백 주소로 보냅니다.
  • www.other-website.com다른 사이트 로 트래픽을 보냅니다.fake-hostname.com

바인드 존 파일에 들어갈 수있는 것은 여기에서 사용할 수 있습니다.

이러한 변경 사항을 활성화하려면 몇 가지 단계가 더 있습니다.

named.conf.local이 섹션을 편집 하고 추가하십시오.

zone "rpz" {
  type master;
  file "/etc/bind/db.rpz";
};

위에 링크 된 튜토리얼은 더 많은 것을 추가하라고 지시 zone "rpz" { }하지만 간단한 설정에서는 필요하지 않습니다. 여기에 표시된 것은 로컬 리졸버에서 작동하도록하는 최소값입니다.

편집 named.conf.options하고 options { }섹션 어딘가에 response-policy옵션을 추가하십시오 .

options {
  // bunch
  // of
  // stuff
  // please
  // ignore

  response-policy { zone "rpz"; };
}

이제 다시 시작하십시오.

service bind9 restart

그게 다야. 네임 서버는 지금 그 레코드를 덮어 쓰기 시작해야합니다.

변경이 필요한 경우 편집 db.rpz을 한 다음 바인드를 다시 시작하십시오.

보너스 : DNS 쿼리를 syslog에 기록하려면 진행 상황을 주시하고 편집 named.conf.local하고 logging다음 내용이 포함 된 섹션이 있는지 확인하십시오 .

logging {
    // stuff
    // already
    // there

    channel my_syslog {
        syslog daemon;
        severity info;
    };
    category queries { my_syslog; };
};

다시 시작하십시오. 바인드하십시오.

바인드를 실행중인 머신에서 테스트하십시오.

dig @127.0.0.1 www.other-website.com. any

다른 컴퓨터에서 dig를 실행하는 경우 @ 127.0.0.1 대신 @ the-ip-address-of-Bind-server를 사용하십시오.

이 기술을 사용하여 작업중인 웹 사이트에 대한 CNAME을 재정의하고 방금 테스트중인 새로운 AWS로드 밸런서로 보냈습니다. Raspberry Pi는 Bind를 실행하는 데 사용되었으며 RPi는 WiFi 라우터로도 작동하도록 구성되었습니다. 따라서 RPi에서 실행되는 SSID에 장치를 연결하면 테스트에 필요한 DNS 재정의를 얻게됩니다.


1
BIND RPZ는 실제로 QTYPE별로 단일 레코드를 대체 할 수는 없지만 특정 소유자 이름에 대한 모든 레코드를 대체 합니다 . 즉, MX 레코드가 아닌 도메인에 대한 A 레코드를 재정의하려는 경우 할 수 없습니다. MX 레코드도 RPZ 영역에 넣고 실제 영역과 동기화 상태를 유지해야합니다.
Alnitak

2
당신이 한 것처럼 이것을 분해 주셔서 감사합니다. 매우 도움이됩니다.
sruffell

경고가 있습니까? 나는 pfsense 에서이 작업을 시도하고 있지만 결과를 "가짜"나칠 수는 없지만 여전히 실제 주소를보고합니다. 나는 편지의 지시를 따랐다 고 믿는다.
Lenne

@Lenne 그것은 작동합니다. 게시물을 수정하고 변경 사항을 테스트하기위한 제안을 추가했습니다.
Florin Andrei

@Lenne pfSense BIND 패키지는 현재 약 1 년 동안 GUI에 내장되어 있으므로 구성을 사용하지 않아도됩니다. OP : NXDOMAIN으로 응답하거나 응답을 삭제하는 등 RPZ로 수행 할 수있는 다른 작업을 언급 할 가치가 있습니다 .
miken32

21

언 바운드 재귀 적 DNS 서버는 개별 리소스 레코드를 오버라이드 (override) 할 수있는 능력을 가지고 있습니다.

상기 봐 local-zonelocal-data의 구성 설정 매뉴얼 , 예를 들면 :

local-zone: "example.com." transparent
local-data: "foo.example.com. IN A 192.168.1.1"

transparent설정 local-zone은와 함께 제공되지 않은 이름에 대해 정상적인 재귀 적 조회를 수행 하도록 지시합니다 local-data.


1
정확히 내가하고 싶은 일 인 것 같습니다. 감사합니다. 오늘 밤 언 바운드에서 읽겠습니다.
레미 블랭크

다른 한편으로, 그것의 지혜는 의심 스럽다. internal.example.com 도메인이 더 명확합니다.
bortzmeyer 2016 년

@Bortzmeyer-당신이 옳을 수는 있지만 Wouter가 재미를 위해 그것을 넣었다고 상상하지는 않습니다 ;-)
Alnitak

3
@ bortzmeyer, 때로는 선택의 여지가 없습니다. 예 : SBS 2008에는 단일 LAN IP가 있어야하지만 라우터가 전달하는 외부 IP를 사용하여 외부에서 도달해야합니다. Microsoft는 SBS에 두 개의 네트워크 카드를 허용하거나 같은 카드에 두 개의 IP를 구성 할 수 없습니다. 로컬 서버가 DNS 이름을 외부 IP로 확인하면 라우터는 LAN ip에 대해 DNAT와 SNAT를 모두 수행해야합니다. 그러면 SBS의 로그에 라우터의 IP로부터의 모든 액세스가 표시되며 이는 잘못된 것입니다. unbound내 라우터에 설치 하겠습니다. 솔루션이 훨씬 낫다고 생각합니다.
Cosmin Prund

질문은 BIND에만 해당되므로 질문에 대답하지 않습니다.
bzeaman

4

"dnsmasq"를 살펴보면 해상도를 조정할 수있는 매우 영리한 작업을 수행 할 수 있습니다.


고마워, 좋은 팁. 너무 나쁜 dnsmasq는 재귀 해상도를 수행하지 않으므로 다른 포트에서 BIND를 계속 실행해야합니다 (ISP의 DNS 서버는 결함이 있습니다).
Remy Blank

4

당신이 찾고있는 것은 Webopedia에 의해 다음 과 같이 정의 된 분할 DNS입니다 .

분할 된 DNS 인프라에서는 동일한 도메인에 대해 두 개의 영역을 만듭니다. 하나는 내부 네트워크에서 사용하고 다른 하나는 외부 네트워크에서 사용합니다. 분할 DNS는 이름 확인을 위해 내부 호스트를 내부 도메인 이름 서버로 보내고 이름 확인을 위해 외부 호스트를 외부 도메인 이름 서버로 보냅니다.

기본적으로 외부 영역 파일의 복사본을 만들어 내부 DNS 서버에 게시 한 다음 내부 네트워크에 필요한 레코드를 변경하거나 추가해야합니다. 이것은 매우 일반적인 설정이지만 두 DNS 서버간에 "외부"레코드를 동기화하기가 어려울 수 있습니다. 공용 서버에서 레코드를 작성하거나 변경하는 경우 개인 서버에서도 레코드를 작성하거나 변경해야합니다.

사용하는 DNS 서버 구현에 관계없이 구현할 수 있습니다. 대부분의 설정에서 외부 네트워크를 제공하는 하나의 DNS 서버와 내부 네트워크를 제공하는 하나의 DNS 서버가 있습니다. BIND를 사용하면 다른 구현과 마찬가지로 named.conf 파일의 zone 섹션에있는 "allow-query"문을 사용하여 동일한 서버에 두 버전의 영역을 둘 수 있습니다.

BIND에 대한 또 다른 가능성은 (내가 시도한 적이 없음) 내부 DNS 서버에서 example.com 도메인을 내부적으로 사용하는 레코드로 설정하는 것입니다. 그런 다음 "forwarders"와 함께 "first"인수를 사용하여 "forward"문을 설정하십시오. 이론적으로 이것은 외부 DNS 서버 ( "전달자"에서 설정 한대로 내부 레코드가없고 실패 응답을 반환하는 응답)를 요청한 다음 내부 서버 자체가 응답을 찾습니다. 그것이 효과가 있을지 확신하지만 생각입니다.


외부 영역이 동적 DNS 클라이언트를 통해 업데이트되므로 두 영역 파일을 동기화 상태로 유지하는 것은 복잡합니다. 그래도 앞으로 진술을 읽을 것입니다. 팁 고마워.
Remy Blank

아니요, BIND 전달은 작동하지 않습니다. 알 수없는 도메인에만 적용되지만 내부 이름 서버는 example.com에 대해 알고 있으며 신뢰할 수 있습니다.
bortzmeyer 2016 년

1
문서를 올바르게 읽으면 영역 섹션의 "forward first"문은 BIND에게 나가서 권한있는 로컬 도메인에 대한 전달자에서 답을 찾도록 지시 한 다음 로컬 정보를 사용할 수있는 경우에만 사용하십시오. 전달자로부터 답변을받지 마십시오.
Justin Scott

전역 "forward first"를 넣으면 '전달자에게 쿼리를 보내고 응답하지 않으면 쿼리에 응답하려고합니다'(문서에서)하지만 응답을 받으면 자체적으로 해결하려고 시도하지 않습니다. 응답이 신뢰할 수 없거나 NXDOMAIN 인 경우에도 강제로 해결할 수 있지만 바인드는 전달자로부터 응답을 받으면 시도하지 않습니다.
Pablo Martinez

3

BIND에서 원하는 호스트 이름을 사용하여 영역을 정의하여이 결과를 얻습니다. 소수의 호스트 만 재정의하려는 경우이 방법이 좋습니다.

내 영역 선언은 다음과 같습니다.

zone "override.example.com" {
        type master;
        notify no;
        file "zone-config/override.example.com";
};

내 영역 정의는 다음과 같습니다.

$TTL 4H
@       IN      SOA     ns.override.example.com.    root.override.example.com. (
                        2009072215      ; Serial
                        3600            ; Refresh
                        600             ; Retry
                        604800          ; Expire
                        3600    )       ; Minimum
;
                NS      ns
        IN      NS      ns.override.example.com.
        IN      A       192.168.1.100
ns      IN      A       192.168.1.100

따라서 인트라넷 DNS와 ISP DNS에서 example.com을 쿼리하면 동일한 IP를 얻지 만 override.example.com을 쿼리하면 인트라넷 DNS (기본)에 액세스 할 수있는 경우 다른 결과가 나타납니다.


2

이미 올바른 길을 가고 있습니다.

내부 DNS 서버에서 "example.com"바로 아래에있는 모든 예외 호스트에 대한 영역을 정의해야합니다. 이러한 예외를 최소화하기 위해 DNS 서버가 대부분의 쿼리를 외부 DNS 서버로 보내지 만 "internal.example.com"영역에 대해 권한이있는 모든 내부 컴퓨터의 이름을 "hosta.internal.example.com"으로 지정하는 것이 일반적입니다. (작은 작업을 거친 후에는 일반적으로 클라이언트가 연결되는 몇 개의 DNS 서버와 서버가 "internal.example.com"으로 연결되는 별도의 권한있는 DNS가 있습니다.

일반적으로 설명하는 예외가 발생하는 외부 및 내부적으로 호스트에 도달 할 수있는 경우에만 해당됩니다. 그럼에도 불구하고 외부에서 "host1.example.com"을 사용하고 내부에서 "host1.internal.example.com"을 사용할 수 있습니다. 내부 호스트는 "internal.example.com"내에서 이름을 찾도록 구성됩니다. 서버 인증서가 서버를 "host1.example.com"으로 식별하는 경우와 같이 이미 수행중인 상황이 적절한 경우가 있습니다.이 경우 클라이언트가 연결하는 이름이됩니다.


예, "host1.example.com"호스트의 경우 이미 잘 작동하고 있습니다. 까다로운 부분은 같은 방법으로 최상위 "example.com"을 처리하는 것입니다.
Remy Blank

2

dnsmasq를 사용하면 정말 쉽습니다. http://www.thekelleys.org.uk/dnsmasq/doc.html DNS 서버로 작동하지만 로컬 DNS 서버에서 응답을받습니다. 좋은 점은 영역 파일을 망칠 필요없이 단일 도메인 레코드를 무시할 수 있다는 것입니다


2

실제로 약간 다른 방법이 있더라도이를 수행 할 수있는 다른 방법이 있습니다. 나는 같은 상황을 가지고 있으며, 외부 및 내부적으로 사용되는 도메인이 있으며 외부 정적 및 동적 호스트가 있습니다. 정말 고통스러운 유일한 것은 외부의 역동적 인 것들입니다. 이 솔루션은 아마도 가장 우아하지는 않지만 작은 스크립트로 구현할 수 있습니다. 주로 동적 DNS 공급자의 API를 사용하여 자체 동적 DNS 스크립트를 수행하고 있으며 5 분마다 cron으로이 스크립트를 실행합니다.

1) 외부 IP를 얻습니다. 바뀌 었습니까? 아니요, 종료하십시오.

2) 새로운 IP 주소로 IP, dyndns-provider의 호출 API 변경,

3) 외부 IP로 db.mydomain.com을 sed

4) 바인드를 다시 시작하십시오.

내 홈 네트워크에서 매우 안정적으로 작동


저도 같은 과정을 했어요. 자세한 내용은 Wiki Stealth Name Server 에서 찾으십시오 . 그러나 dyn.dev.shahed.biz월드 와이드에서 해결할 수 없습니다 ! 이 문제를 해결하도록 도와 주시겠습니까?
Md Shahed Hossain
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.