การเอาชนะบางรายการ DNS ใน BIND สำหรับเครือข่ายภายใน


39

ฉันมีเครือข่ายภายในที่มีเซิร์ฟเวอร์ DNS ที่ใช้ BIND เชื่อมต่อกับอินเทอร์เน็ตผ่านเกตเวย์เดียว โดเมนของฉัน "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 และ host2 โดยกำหนดสองรายการโซนเดี่ยวใน BIND สำหรับ "host1.example.com" และ "host2.example.com" อย่างไรก็ตามหากฉันเพิ่มโซนสำหรับ "example.com" การค้นหาทั้งหมดสำหรับโดเมนนั้นจะได้รับการแก้ไขโดยเซิร์ฟเวอร์ DNS ในพื้นที่ของฉันและเช่นการค้นหา "otherhost.example.com" จะทำให้เกิดข้อผิดพลาด

เป็นไปได้หรือไม่ที่จะกำหนดค่า BIND เพื่อแทนที่เฉพาะบางรายการของโดเมนและแก้ไขส่วนที่เหลือซ้ำ?


คำถามที่คล้ายกัน: serverfault.com/questions/8694/…
MikeyB

1
"เป็นไปได้ไหมที่จะกำหนดค่า BIND เพื่อแทนที่เฉพาะบางรายการของโดเมน" ไม่ไม่ใช่กับ BIND ใช้โดเมนย่อย
bortzmeyer

1
ดูเหมือนว่า Unbound จะทำสิ่งที่ฉันขออย่างแน่นอนดังนั้นฉันจึงตั้งค่าการตอบของ Alnitak เป็นคำตอบที่ยอมรับ แต่ในที่สุดฉันจะทำตามคำแนะนำของ bortzmeyer และไม่แทนที่รายการโดเมน ขอบคุณสำหรับคำตอบทั้งหมด!
ว่าง Remy

1
ตอนนี้การโยงสามารถทำได้ด้วยโซนนโยบายการตอบกลับ ดูคำตอบของฉันด้านล่าง โซลูชันอื่น ๆ เช่น Unbound ไม่สามารถแทนที่ CNAME ได้ ด้วยโซนนโยบายใน Bind คุณไม่จำเป็นต้องทำโดเมนย่อย คุณสามารถแทนที่ระเบียนแต่ละรายการได้ตามต้องการ
Florin Andrei

คำตอบ:


18

วิธีที่ดีที่สุดคือผ่านโซนนโยบายการตอบสนองใน Bind 9.8.1 หรือใหม่กว่า จะช่วยให้คุณสามารถแทนที่ระเบียนเดียวในโซนโดยพลการ (และไม่จำเป็นต้องสร้างทั้งโดเมนย่อยสำหรับเฉพาะระเบียนเดียวที่คุณต้องการเปลี่ยน) จะช่วยให้คุณสามารถแทนที่ CNAMEs ฯลฯ โซลูชั่นอื่น ๆ เช่น Unbound ไม่สามารถแทนที่ CNAME .

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


แก้ไข:เรามาทำอย่างถูกต้องแล้ว ฉันจะบันทึกสิ่งที่ฉันทำตามบทช่วยสอนที่ลิงก์ด้านบน

ระบบปฏิบัติการของฉันคือ Raspbian 4.4 สำหรับ Raspberry Pi แต่เทคนิคควรใช้งานได้โดยไม่มีการเปลี่ยนแปลงบน Debian และ Ubuntu หรือมีการเปลี่ยนแปลงเล็กน้อยบนแพลตฟอร์มอื่น ๆ

ไปที่ config ไฟล์ผูกของคุณจะถูกเก็บไว้ในระบบของคุณ - /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.

มันทำอะไร?

  • มันจะแทนที่ที่อยู่ IP สำหรับwww.some-website.comด้วยที่อยู่ปลอม127.0.0.1ส่งการรับส่งข้อมูลทั้งหมดสำหรับไซต์นั้นไปยังที่อยู่ย้อนกลับอย่างมีประสิทธิภาพ
  • มันส่งปริมาณการใช้งานwww.other-website.comไปยังไซต์อื่นที่เรียกว่าfake-hostname.com

สิ่งใดก็ตามที่สามารถไปในไฟล์โซน Bind คุณสามารถใช้ที่นี่

หากต้องการเปิดใช้งานการเปลี่ยนแปลงเหล่านี้มีขั้นตอนเพิ่มเติมไม่กี่ขั้นตอน

แก้ไข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; };
};

รีสตาร์ท Bind อีกครั้งและนั่นแหละ

ทดสอบบนเครื่องที่รัน Bind:

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

หากคุณเรียกใช้ dig บนเครื่องอื่นให้ใช้ @ the-ip-address-of-Bind-server แทน @ 127.0.0.1

ฉันใช้เทคนิคนี้ด้วยความสำเร็จที่ยิ่งใหญ่ในการแทนที่ CNAME สำหรับเว็บไซต์ที่ฉันทำงานอยู่ส่งไปยัง load balancer AWS ใหม่ที่ฉันเพิ่งทดสอบ Raspberry Pi ใช้เพื่อเรียกใช้ Bind และ RPi ก็ถูกกำหนดค่าให้ทำงานเป็นเราเตอร์ WiFi ด้วยการเชื่อมต่ออุปกรณ์กับ SSID ที่ทำงานบน RPi ฉันจะได้รับการแทนที่ DNS ที่ฉันต้องการสำหรับการทดสอบ


1
โปรดทราบว่าห่วง RPZ ไม่สามารถจริง (ยัง) แทนที่ระเบียนเดียวบนพื้นฐานต่อ QTYPE - มันจะแทนที่ทั้งหมดของระเบียนสำหรับชื่อเจ้าของโดยเฉพาะอย่างยิ่ง ซึ่งหมายความว่าหากคุณต้องการแทนที่ระเบียน A สำหรับโดเมน แต่ไม่ใช่เช่นระเบียน MX คุณจะไม่สามารถทำได้ คุณต้องใส่ระเบียน MX ในโซน RPZ ด้วยและทำให้ข้อมูลตรงกันกับโซนจริง
Alnitak

2
ขอขอบคุณที่ทำลายสิ่งนี้เหมือนที่คุณทำ มีประโยชน์มาก
sruffell

มีคำเตือนใด ๆ หรือไม่? ฉันพยายามทำสิ่งนี้ใน pfsense แต่ฉันไม่สามารถ "ปลอม" ผลลัพธ์ใด ๆ มันยังคงรายงานที่อยู่จริง ฉันเชื่อว่าฉันได้ปฏิบัติตามคำแนะนำในจดหมาย
Lenne

@Lenne มันควรจะทำงาน ฉันได้แก้ไขโพสต์และเพิ่มข้อเสนอแนะสำหรับการทดสอบการเปลี่ยนแปลง
Florin Andrei

@Lenne แพคเกจ pfSense BIND มีสิ่งนี้อยู่ใน GUI เป็นเวลาประมาณหนึ่งปีแล้วดังนั้นการลอกคราบกับ configs ก็ไม่จำเป็น OP: อาจคุ้มค่าที่จะพูดถึงสิ่งอื่น ๆ ที่คุณสามารถทำได้กับ RPZ เช่นการตอบกลับด้วย NXDOMAIN หรือเพียงแค่ลดการตอบสนองลง
miken32

21

หลุดเซิร์ฟเวอร์ DNS recursive มีความสามารถที่จะแทนที่ระเบียนทรัพยากรบุคคล

ดูที่การตั้งค่าlocal-zoneและlocal-dataการกำหนดค่าในคู่มือเช่น:

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

การtransparentตั้งค่าบนlocal-zoneบอกให้ทำการค้นหาแบบเรียกซ้ำตามปกติสำหรับชื่อใด ๆ ที่ไม่ได้ให้local-dataมา


1
ดูเหมือนจะเป็นสิ่งที่ฉันต้องการจะทำขอบคุณ ฉันจะอ่านใน Unbound คืนนี้
ว่าง Remy

ในทางกลับกันภูมิปัญญาของมันค่อนข้างน่าสงสัย การมีโดเมน internal.example.com จะชัดเจนขึ้น
bortzmeyer

@Bortzmeyer - คุณสามารถได้รับสิทธิ แต่ฉันไม่คิด Wouter ใส่ไว้ในเพียงเพื่อความสนุกสนาน ;-)
Alnitak

3
@ bortzmeyer บางครั้งก็ไม่มีทางเลือก ตัวอย่าง: SBS 2008 ต้องมี LAN IP เดียว แต่ต้องเข้าถึงจากภายนอกโดยใช้ IP ภายนอกที่เราเตอร์กำลังส่งต่อ Microsoft ไม่อนุญาตการ์ดเครือข่ายสองใบใน SBS หรือสอง IP ที่กำหนดค่าไว้ในการ์ดเดียวกัน หากเซิร์ฟเวอร์ในพื้นที่แก้ไขชื่อ DNS เป็น IP ภายนอกเราเตอร์จำเป็นต้องทำทั้ง DNAT และ SNAT สำหรับ LAN ของ IP จากนั้นบันทึกใน SBS จะแสดงการเข้าถึงทั้งหมดที่มาจาก IP ของเราเตอร์และนั่นเป็นสิ่งที่ผิด ฉันจะติดตั้งunboundบนเราเตอร์ของตัวเองฉันคิดว่าทางออกดีกว่ามาก
Cosmin Prund

สิ่งนี้ไม่ตอบคำถามเนื่องจากเป็นคำถามเฉพาะของ BIND
bzeaman

4

คุณอาจต้องการดูเป็น "dnsmasq" ซึ่งช่วยให้คุณทำสิ่งที่ค่อนข้างฉลาดด้วยความละเอียด tweaking


ขอบคุณเคล็ดลับดี แย่มาก dnsmasq ไม่ทำการแก้ปัญหาแบบเรียกซ้ำดังนั้นฉันจะยังคงต้องใช้ BIND บนพอร์ตอื่นสำหรับสิ่งนั้น (เซิร์ฟเวอร์ DNS ของ ISP ของฉันนั้นไม่มั่นคง)
ว่าง Remy

4

สิ่งที่คุณกำลังมองหาคือการแยก DNS ซึ่งถูกกำหนดโดยWebopediaเป็น:

ในโครงสร้างพื้นฐาน DNS แบบแยกคุณสร้างสองโซนสำหรับโดเมนเดียวกันหนึ่งรายการที่จะใช้โดยเครือข่ายภายในอีกเครือข่ายหนึ่งใช้โดยเครือข่ายภายนอก แยก DNS นำโฮสต์ภายในไปยังเซิร์ฟเวอร์ชื่อโดเมนภายในสำหรับการจำแนกชื่อและโฮสต์ภายนอกจะถูกนำไปยังเซิร์ฟเวอร์ชื่อโดเมนภายนอกสำหรับการจำแนกชื่อ

โดยพื้นฐานแล้วคุณจะต้องทำสำเนาของไฟล์โซนภายนอกของคุณและส่งไปที่เซิร์ฟเวอร์ DNS ภายในของคุณจากนั้นเปลี่ยนหรือเพิ่มระเบียนที่จำเป็นสำหรับเครือข่ายภายในของคุณโดยเฉพาะ นี่คือการตั้งค่าที่ใช้กันโดยทั่วไปแม้ว่ามันจะเป็นเรื่องยากที่จะเก็บบันทึกข้อมูล "ภายนอก" ที่ซิงโครไนซ์ระหว่างเซิร์ฟเวอร์ DNS สองเครื่อง หากคุณสร้างหรือเปลี่ยนการบันทึกบนเซิร์ฟเวอร์สาธารณะก็จะต้องมีการสร้างหรือเปลี่ยนแปลงบนเซิร์ฟเวอร์ส่วนตัวเช่นกัน

สิ่งนี้สามารถนำมาใช้ได้ไม่ว่าคุณจะใช้เซิร์ฟเวอร์ DNS แบบใดก็ตาม ในการตั้งค่าส่วนใหญ่คุณจะมีเซิร์ฟเวอร์ DNS หนึ่งตัวที่ให้บริการเครือข่ายภายนอกและอีกหนึ่งตัวที่ให้บริการเครือข่ายภายใน ด้วย BIND เช่นเดียวกับการใช้งานอื่น ๆ คุณสามารถมีโซนทั้งสองเวอร์ชันบนเซิร์ฟเวอร์เดียวกันผ่านการใช้คำสั่ง "allow-query" ภายในส่วนโซนของไฟล์ named.conf

ความเป็นไปได้อีกอย่างของ BIND (และฉันไม่เคยลองมาก่อน) คือการตั้งค่าโดเมน example.com ของคุณบนเซิร์ฟเวอร์ DNS ภายในที่มีเฉพาะระเบียนที่คุณใช้ภายในเท่านั้น จากนั้นตั้งค่าคำสั่ง "ส่งต่อ" ด้วยอาร์กิวเมนต์ "แรก" (ร่วมกับ "ส่งต่อ") ในทางทฤษฎีสิ่งนี้จะไปถามเซิร์ฟเวอร์ DNS ภายนอก (ตามที่กำหนดไว้ใน "ผู้ส่งต่อ" สำหรับคำตอบซึ่งจะไม่มีระเบียนภายในของคุณและส่งกลับการตอบสนองความล้มเหลวจากนั้นเซิร์ฟเวอร์ภายในจะมองหาคำตอบเอง แน่นอนว่ามันใช้ได้ แต่ก็เป็นความคิด


การซิงค์ไฟล์ทั้งสองโซนจะมีความซับซ้อนเนื่องจากไฟล์ภายนอกได้รับการอัพเดตผ่านไคลเอนต์ DNS แบบไดนามิก ฉันจะอ่านคำแถลงล่วงหน้า ขอบคุณสำหรับทิป.
ว่าง Remy

ไม่การส่งต่อ BIND จะไม่ทำงานจะใช้สำหรับโดเมนที่ไม่รู้จักเท่านั้น แต่เซิร์ฟเวอร์ชื่อภายในจะรู้เกี่ยวกับ example.com และจะมีสิทธิ์สำหรับมัน
bortzmeyer

1
หากฉันอ่านเอกสารอย่างถูกต้องคำสั่ง "ส่งต่อครั้งแรก" ภายในส่วนโซนควรบอก BIND ให้ออกไปและค้นหาคำตอบที่ผู้ส่งถึงแม้จะเป็นโดเมนท้องถิ่นที่เชื่อถือได้จากนั้นใช้ข้อมูลท้องถิ่นเฉพาะเมื่อมันสามารถ ' ไม่ได้รับคำตอบจากผู้ส่ง
จัสติน, สกอตต์

หากคุณใส่ "ส่งต่อก่อน" ทั่วโลกระบบจะส่งข้อความค้นหาไปยังผู้ส่งและหากไม่ได้รับคำตอบจะพยายามตอบคำถาม '(จากเอกสาร) แต่ถ้าได้รับการตอบกลับจะไม่พยายามแก้ไขเอง มันจะดีถ้าคุณสามารถบังคับให้แก้ไขหากการตอบสนองไม่ได้มีอำนาจหรือแม้ว่าจะเป็น 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

ดังนั้นหากฉันค้นหา example.com บนอินทราเน็ต DNS และ ISP DNS ฉันจะได้รับ IP เดียวกัน แต่ถ้าฉันค้นหา override.example.com ฉันจะได้รับผลลัพธ์ที่แตกต่างกันหากอินทราเน็ต DNS (หลัก) สามารถเข้าถึงได้


2

คุณมาถูกทางแล้ว

บนเซิร์ฟเวอร์ DNS ภายในของคุณคุณจะต้องกำหนดโซนสำหรับโฮสต์ข้อยกเว้นทุกแห่งที่อยู่ด้านล่าง "example.com" เพื่อลดข้อยกเว้นเหล่านี้เป็นเรื่องธรรมดาที่จะตั้งชื่อเครื่องภายในทั้งหมดว่า "hosta.internal.example.com" โดยที่เซิร์ฟเวอร์ DNS ส่งข้อความค้นหาส่วนใหญ่ไปยังเซิร์ฟเวอร์ DNS ภายนอก แต่มีสิทธิ์สำหรับโซน "internal.example.com" (เมื่อคุณได้รับการดำเนินการเล็ก ๆ น้อย ๆ มักจะมีเซิร์ฟเวอร์ DNS สองตัวที่ไคลเอ็นต์ถูกกำหนดทิศทางและ DNS ที่มีสิทธิ์แยกต่างหากซึ่งเป็นเซิร์ฟเวอร์ที่ถูกนำไปใช้สำหรับ "internal.example.com")

โดยปกติจะเป็นเมื่อโฮสต์ต้องสามารถเข้าถึงได้ทั้งภายนอกและภายในว่าข้อยกเว้นที่คุณอธิบายได้ถูกสร้างขึ้น แม้ว่าคุณอาจต้องการใช้ "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 แบบไดนามิกของฉันฉันใช้สคริปต์นี้โดย cron ทุกๆ 5 นาที:

1) รับ IP ภายนอกของฉัน มันเปลี่ยนไปไหม? ไม่มีทางออก.

2) เปลี่ยน IP, เรียก API ของ dyndns-provider, ด้วย IP-address ใหม่

3) ติดตั้ง db.mydomain.com ด้วย IP ภายนอก

4) รีสตาร์ทการเชื่อมโยง

ทำงานได้อย่างน่าเชื่อถือมากสำหรับเครือข่ายในบ้านของฉัน


กระบวนการเดียวกันทำโดยฉัน โปรดค้นหารายละเอียดในวิกิเซิร์ฟเวอร์ Stealth Name ของเรา แต่ไม่สามารถแก้ไขได้dyn.dev.shahed.bizจาก World Wide! คุณช่วยเราแก้ไขปัญหานี้ได้ไหม
Md Shahed Hossain
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.