ใช้ dnsmasq กับ NetworkManager


15

เป็นที่ทราบกันดีว่า NetworkManager เล่นได้ไม่ดีdnsmasq(อ้างอิง: ที่นี่ ) ฉันได้อ่านบทสนทนายาว ๆที่นี่แต่ก็ยังไม่แน่ใจว่าวิธีที่แนะนำในการจัดการกับสถานการณ์นั้นคืออะไร

สิ่งที่ฉันต้องการคือการใช้dnsmasqเพื่อมอบ DNS และ DHCP ให้กับเครือข่ายท้องถิ่นของฉัน วิธีที่แนะนำในกรณีนี้คืออะไร?

ดูเหมือนว่าปัญหาจะยังคงอยู่สำหรับ Ubuntu 14.04 แม้กระทั่งข้อผิดพลาดที่อ้างว่าได้รับการแก้ไข

ผู้คนกำลังปิดใช้งาน NM-enslaved dnsmasq-baseเนื่องจากเหตุผลต่อไปนี้:

NM-enslaved dnsmasqใช้ตัวเลือกฮาร์ดโค้ด (ใน C) ที่ให้การทำงานที่ จำกัด อย่างมาก

  • ไม่ฟัง ethX ( --listen-address=127.0.0.1) ดังนั้นเราจึงไม่สามารถใช้เซิร์ฟเวอร์ของเราเป็นเซิร์ฟเวอร์ DNS สำหรับพีซีในเครือข่ายท้องถิ่นของเรานั่นคือไร้ประโยชน์อย่างสมบูรณ์สำหรับ LAN
  • มันไม่ได้ร้องขอแคช ( --cache-size=0) ไม่มีการแคช ==> ไม่มีการสอบถาม DNS เร่งความเร็ว สิ่งนี้มีความสำคัญมากสำหรับ LAN เนื่องจากมีผู้ใช้พร้อมกันจำนวนมาก
  • ท้ายที่สุดเรายังต้องการฟังก์ชั่น DHCP และ TFTP ของ dnsmasq ดังนั้นแม้ว่า NM + dnsmasq จะรวมเซิร์ฟเวอร์ DNS จริงเราก็ต้องเรียกใช้ dnsmasq อีกครั้ง

แต่ฉันไม่แน่ใจว่าพวกเขายังคงถือครองและ / หรือวิธีการแก้ไขได้แก้ปัญหาได้อย่างไร นอกจากนี้ยังไม่มีใครชัดเจนว่าพวกเขาทำอะไรและวิธีแก้ไขปัญหาของพวกเขา คือส่วนวิธีการแก้ปัญหาจะหายไปจากการอภิปรายยาว ใครบางคนสามารถเติมลงในช่องว่างได้ไหม กล่าวคือ

dnsmasqมีให้ออกจากกล่องโดยอูบุนตูไม่ทำงานในฝั่งเซิร์ฟเวอร์ด้วยเหตุผลดังกล่าวข้างต้น และในฝั่งไคลเอ็นต์"dnsmasq ที่ติดตั้งบนแล็ปท็อป Ubuntu เหล่านั้นไม่สามารถทำการสอบถาม LAN DNS จากเซิร์ฟเวอร์ DNS ของฉัน"เพราะ"NetworkManager (แล็ปท็อป Ubuntu)" ทำให้ผู้ใช้มีการตั้งค่าเนมเซิร์ฟเวอร์แปลก ๆ 127.0.1.1 " ( อ้างอิง: โซลูชั่น DNS สำหรับ LAN หรือเครือข่ายในบ้าน )

วิธีทำให้ dnsmasq ทำงานอย่างราบรื่นกับ NetworkManager เพื่อมอบ DNS และ DHCP (และ TFTP) ให้กับเครือข่ายท้องถิ่นของฉันทั้งบนเซิร์ฟเวอร์และฝั่งไคลเอ็นต์

TL'dr

สำหรับผู้ที่ต้องการคำตอบ จากคำตอบทั้งหมดด้านล่างนี้ฉันพบวิธีแก้ปัญหาที่ง่ายที่สุดคือ @ brad สำหรับฝั่งเซิร์ฟเวอร์ (ยังไม่มีคำตอบที่ดีสำหรับฝั่งไคลเอ็นต์):

ทางออกเดียวของปัญหาคือการปิดการใช้งาน NM- ไดรฟ์ dnsmasq ... และติดตั้ง dnsmasq "มาตรฐาน" แล้วกำหนดค่าผ่านทาง/etc/dnsmasq.confไฟล์การกำหนดค่ามาตรฐาน


2
สำหรับ Googler (อย่างฉัน): ในรุ่นใหม่ของ Ubuntu dnsmasq-core ใน NetworkManager นั้นค่อนข้างเป็นมิตรมากกว่า ดูที่นี่: askubuntu.com/questions/233195/…
A. Rabus

คำตอบ:


3

ฉันยังมีปัญหาของคุณ

ตามหลักการแล้วหลังจากwiki.archlinuxดูเหมือนว่าการเปิดใช้งานแคชควรเพียงพอที่จะสร้างไฟล์/etc/NetworkManager/dnsmasq.d/cacheที่มีเพียง

$ cat /etc/NetworkManager/dnsmasq.d/cache 
cache-size=1000

ฉันลองสิ่งนี้ แต่หลังจากที่รีสตาร์ท NM ฉันยังไม่มีแคช:

# ps ax | grep dns
11724 ?        S      0:00 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/run/sendsigs.omit.d/network-manager.dnsmasq.pid --listen-address=127.0.1.1 --conf-file=/var/run/NetworkManager/dnsmasq.conf --cache-size=0 --proxy-dnssec --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d

โปรดทราบว่าไฟล์อ้างอิงที่อ้างถึงนั้นว่างเปล่าเสมอ: ฉันไม่สามารถกำหนดค่าตัวเลือกใด ๆ ได้โดยใช้ขั้นตอนนี้

โดยรวมแล้วดูเหมือนว่า NM-enslaved dnsmask ใน 14.04 (ซึ่งจัดทำโดยแพ็คเกจ dnsmasq-base) ถูกล็อคอย่างสมบูรณ์ดังนั้นจึงเป็นไปไม่ได้ที่จะเปิดใช้งานการแคชหรือสิ่งอื่นใด (dhcp, tftp)

ถ้าเป็นสิ่งที่ถูกต้องฉันคิดว่าอย่างที่คุณพูดทางออกเดียวของปัญหาคือการปิดการใช้งานไดรฟ์ NM-dnsmasq ด้วยการแสดงความคิดเห็นในบรรทัด

dns=dnsmasq

ในไฟล์/etc/NetworkManager/NetworkManager.confและติดตั้ง "มาตรฐาน" dnsmasq แล้วกำหนดค่าผ่าน/etc/dnsmasq.confไฟล์กำหนดค่ามาตรฐาน


ยินดีต้อนรับสู่ superuser brad! ขอบคุณสำหรับความช่วยเหลือของคุณ!
xpt

1
ที่จริงนี้ไม่เปิดใช้งานแคชเพราะมันทำงานกับ--conf-dir=/etc/NetworkManager/dnsmasq.dที่cache-sizeระบุไว้ในแฟ้มที่คุณสร้างจะใช้ คุณสามารถเห็นความแตกต่างโดยใช้dig
sirfz

6

/etc/NetworkManager/dnsmasq.d/*.confมันเป็นไปได้ที่จะตั้งค่าการแทนที่โดยวางไว้ใน การตั้งค่าไฟล์การกำหนดค่ามีความสำคัญเหนือกว่าแฟล็กบรรทัดคำสั่ง พวกเขาจะใช้เมื่อ NetworkManager เริ่ม dnsmasq ใช้sudo service network-manager restartเพื่อนำไปใช้ใหม่ (หากมีข้อสงสัยใด ๆ คำตอบของแบรดพลาดข้อเท็จจริงที่ps ax | grep dnsแสดงว่ามีการ--conf-dirโต้แย้ง)

ตัวอย่างเช่น:

echo cache-size=1000 |sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf

ตามที่ฉันจำได้ NetworkManager จะปิดใช้งานการแคช dnsmasq ตามค่าเริ่มต้นเนื่องจากความกังวลเกี่ยวกับการวางยาพิษในแคช สำหรับเครื่องที่ผู้ใช้ทุกคนเชื่อถือได้อาจไม่เป็นปัญหา

NetworkManager ไม่ได้รวมกับresolvconfและเซิร์ฟเวอร์ของ NM ที่127.0.1.1จะไม่ถูกใช้ภายในหากติดตั้งแพ็คเกจ resolvconf resolvconf เป็นส่วนหนึ่งของการติดตั้ง Ubuntu น้อยและเดเบียนมาตรฐาน NetworkManager reimplements ฟังก์ชั่นในลักษณะที่รวมมากขึ้นและใช้สคริปต์น้อยลง

NetworkManager ตรวจสอบให้แน่ใจว่าจะไม่เข้าไปยุ่งเกี่ยวกับอินสแตนซ์ dnsmasq ทั่วโลก (เชื่อมโยงกับ IP ลูปแบ็ครองและการตั้งค่าbind-interfacesผ่าน/etc/dnsmasq.d/network-manager) หากคุณติดตั้งอินสแตนซ์โกลบอล dnsmasq และเก็บอินสแตนซ์ของ NM ให้ทำการเช็คอินซ้ำ/etc/resolv.confเพื่อดูว่าโฮสต์ใดที่จะใช้เป็นค่าเริ่มต้น

ในขณะที่คุณสามารถปรับแต่งเช่น dnsmasq NetworkManager เป็นที่ปรากฏข้างต้นถ้าคุณต้องการเซิร์ฟเวอร์ DNS ที่ผูกกับอินเตอร์เฟซที่สาธารณะคุณควรติดตั้งdnsmasqแพคเกจ (NetworkManager ใช้เท่านั้นdnsmasq-baseซึ่งไม่ได้กำหนดค่าอินสแตนซ์ทั่วโลก) /etc/dnsmasq.d/*.confและใส่ในการกำหนดค่าของคุณ อินสแตนซ์ทาสของ NetworkManager มีไว้เพื่อเชื่อมโยงกับอินเทอร์เฟซย้อนกลับเท่านั้นและการกำหนดค่าเกินขอบเขตที่อาจเสี่ยงต่อการทำลาย


โดยสรุปสำหรับคนที่ต้องการแคช DNS ในเครื่อง:

sudo apt-get remove dnsmasq resolvconf dhcpcd5 rdnssd
echo cache-size=1000 |sudo tee -a /etc/NetworkManager/dnsmasq.d/cache.conf

สำหรับ LAN อย่างง่ายการแชร์การเชื่อมต่อของ NetworkManager ยังคงเพียงพอ แต่สำหรับ LAN ที่กำหนดค่าเองด้วย TFTP และอื่น ๆ :

sudo apt-get install resolvconf dnsmasq
echo 192.168.0.50,192.168.0.150,12h |sudo tee -a /etc/dnsmasq.d/lan.conf
echo enable-tftp |sudo tee -a /etc/dnsmasq.d/lan.conf
sudo service dnsmasq restart

ขอบคุณ แม้ว่าคุณควรอธิบายมากขึ้นอย่างเต็มที่สิ่งที่คุณ "ในการสรุป" คำสั่งทำคือคำแนะนำยังเอา 4 แพคเกจถ้าคุณมีพวกเขาในขณะนี้ การเชื่อมโยงเพิ่มเติมและการอภิปรายที่ reddit.com/r/Ubuntu/comments/2j0va4/...
nealmcb

ค่อนข้างเห็นด้วยกับ @nealmcb, Tobuโปรดอธิบายว่าทำไม"สำหรับคนที่เพียงแค่ต้องการแคช DNS ท้องถิ่น"พวกเขาจำเป็นต้องลบdnsmasqแพคเกจ ดังนั้นechoคำสั่งถัดไปคืออะไร ตั้งแต่dnsmasqจะหายไป
xpt

@xpt Tobu แนะนำให้นำออกdnsmasqแต่คุณยังควรdnsmasq-baseติดตั้งเนื่องจาก NM
Thalis Kalfigkopoulos

0

ฉันต้องการกำหนด MAC เฉพาะให้กับที่อยู่ IP เฉพาะและเพื่อความมั่นคงให้ติดตั้ง Network Manager / dnsmasq ที่เป็นค่าเริ่มต้นให้มากที่สุด

https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/src/dnsmasq/nm-dnsmasq-manager.cมีความคิดเห็นเกี่ยวกับการใช้ --conf-file เพื่อละเว้นการกำหนดค่า แต่ต่อมาในไฟล์ที่เรามี

/* dnsmasq exits if the conf dir is not present */
    if (g_file_test (CONFDIR, G_FILE_TEST_IS_DIR))
        nm_cmd_line_add_string (cmd, "--conf-dir=" CONFDIR);

ภายใต้ Ubuntu 16.04 LTS หลังจากตั้งค่าฮอตสปอต Wi-Fi และแบ่งปันการเชื่อมต่ออื่นps auxgww | grep dnsmasqแสดงว่าอาร์กิวเมนต์บรรทัดคำสั่งสุดท้ายของกระบวนการ dnsmasq แต่ละกระบวนการคือ:

--conf-dir=/etc/NetworkManager/dnsmasq-shared.d

ดังนั้นจึงเป็นไปได้ที่จะสร้างไฟล์กำหนดค่าในไดเรกทอรีนั้นที่ใช้ร่วมกันระหว่างการร้องขอทั้งหมดของ dnsmasq ที่เริ่มโดย Network Manager

ฉันสร้าง /etc/NetworkManager/dnsmasq-shared.d/Hue

dhcp-host=0c:4d:e9:a0:ce:cf,192.168.1.221

และรีบูตแม้ว่าจะทำงานอยู่

sudo service network-manager restart

จะได้ทำงาน

ทำให้อุปกรณ์ของฉันได้รับที่อยู่ IP ที่เหมาะสม

ใช่นี่เป็นสิ่งที่ผิดเพราะมันหมายถึงว่าการร้องขอทั้งหมดของ dnsmasq โดย NetworkManager จะได้รับการประกาศนี้ แต่ในกรณีนี้มันไม่เป็นอันตรายเพราะมันจะสำคัญถ้า MAC ปรากฏบนเครือข่ายที่เป็นปัญหาเท่านั้น หากเครือข่ายไม่ใช่ 192.168.1 แสดงว่ามีปัญหา

สิ่งนี้มีประสิทธิภาพมากกว่าการแทนที่ / usr / sbin / dnsmasq ด้วยสคริปต์ตามที่เสนอไว้ที่https://gist.github.com/magnetikonline/6236150

ทางออกที่ถูกต้องคือแก้ไขวิธีเรียกใช้ dnsmasq ให้ใช้ไฟล์การกำหนดค่า dnsmasq อย่างเหมาะสม ฉันเข้าใจถึงความปรารถนาที่จะมี Network Manager "เพิ่งใช้งานได้" แต่การสร้างเครื่องมือที่พิสูจน์ได้นั้นหมายความว่าคนงี่เง่าเท่านั้นที่สามารถใช้งานได้


ขอบคุณสำหรับคำตอบของคริสโตเฟอร์ แต่ฉันไม่สามารถทำตามได้ ... "ฉันต้องการมอบหมาย MAC เฉพาะให้กับที่อยู่ IP เฉพาะและเพื่อความมั่นคง" ... "ps auxgww | grep dnsmasq แสดงให้เห็นว่า อาร์กิวเมนต์บรรทัดคำสั่งสุดท้ายของกระบวนการ dnsmasq แต่ละกระบวนการ " ... " ฉันสร้างขึ้น ... จะได้ผล " ... " ใช่นี่ผิด "" ... ใช่ฉันไม่สามารถติดตามความคิดของคุณได้ เพื่อให้เข้าใจถึงสิ่งที่คุณพยายามจะพูดที่นี่
xpt

0

โซลูชันของฉันอาจทำลายตัวจัดการเครือข่ายและทำให้ทุกอย่างเป็นเรื่องง่ายในการทำสิ่งต่าง ๆ ด้วยวิธีการที่ไม่เหมาะสมของ NM ในการจัดการกับ dnsmasq ฉันแค่แทนที่มันด้วยวิธีการของฉันด้านล่าง

วิธีแก้ไขปัญหานี้เพียงทำสิ่งต่อไปนี้:

sudo apt install dnsmasq
cp /etc/dnsmasq.conf ~/

แก้ไข~/dnsmasq.confไฟล์ในไดเรกทอรีผู้ใช้ของคุณในแบบที่คุณต้องการและบันทึก

sudo rm -v /etc/dnsmasq.conf
sudo cp -v ~/dnsmasq.conf /etc/
sudo chattr +i /etc/dnsmasq.conf
sudo systemctl restart dnsmasq.service

ฉันสร้างนามแฝง bash อย่างง่ายและวางไว้ที่ด้านล่างของไฟล์ ~ / .bash_aliases ของฉันเพื่อให้ง่ายต่อการแก้ไขไฟล์ dnsmasq.conf นี่คือนามแฝง:

alias="sudo chattr -i /etc/dnsmasq.conf && sudo nano -w /etc/dnsmasq.conf && sudo chattr +i /etc/dnsmasq.conf && sudo systemctl restart dnsmasq.service"

แน่นอนคุณสามารถเลือกบรรณาธิการที่คุณชื่นชอบสำหรับคำสั่ง sudo ที่สองในนามแฝง แต่ฉันใช้ nano ที่นั่นเพื่อความสะดวกสำหรับทุกคน บันทึกไฟล์ปิดและเปิดแท็บเทอร์มินัล / หน้าต่างคำสั่งอีกครั้ง ที่ควรเปิดใช้งานนามแฝงที่จะสามารถใช้ได้กับแท็บ / หน้าต่างเทอร์มินัลที่เพิ่งเปิดใหม่

เพียงเรียกใช้eddmcจากบัญชีผู้ใช้ของคุณและมันจะถามรหัสผ่านของคุณเพื่อดำเนินการคำสั่งยกระดับ

แจ้งให้ทราบว่าฉันchattr +iไฟล์เสมอ นี่คือผู้จัดการเครือข่ายจะไม่เขียนทับการกำหนดค่าของคุณด้วยตัวเอง

ในการเชื่อมต่ออีเธอร์เน็ตแบบใช้สายไม่ควรมีปัญหาใด ๆ ฉันพบตั้งแต่ฉันใช้ dnsmasq สำหรับการแคช dns บนแล็ปท็อปที่มีระบบไร้สายซึ่งฉันต้องรีสตาร์ท dnsmasq.service ด้วยตนเองหลังจากเชื่อมต่อกับจุดเชื่อมต่อ ฉันคิดว่าตัวจัดการเครือข่ายสามารถทำงานได้เช่นเริ่มบริการใหม่เมื่อเชื่อมต่อ แต่ฉันยังไม่ได้ตรวจสอบ


0

แม้จะมีการเรียกร้องที่นี่และที่อื่น ๆ ไปในทางตรงกันข้าม NetworkManager สมบูรณ์ละเว้นแฟ้มการกำหนดค่าใด ๆ และทั้งหมด dmsmasq - /etc/NetworkManager/dnsmasq-shared.dแม้ผู้ที่อยู่ในไดเรกทอรีของตัวเอง หลักฐานอยู่ในซอร์สโค้ดสำหรับ NetworkManager ... นี่คือความคิดเห็นที่เกี่ยวข้อง:

/ * dnsmasq อาจอ่านได้จากตำแหน่งไฟล์กำหนดค่าเริ่มต้นซึ่งหากตำแหน่งนั้นเป็นไฟล์กำหนดค่าที่ถูกต้องมันจะรวมกับตัวเลือกที่นี่และทำให้เกิดผลข้างเคียงที่ไม่พึงประสงค์ เช่นการส่งที่อยู่ IP ปลอมเป็นเกตเวย์หรืออะไรก็ตาม ดังนั้นบอก dnsmasq ว่าอย่าใช้ไฟล์ปรับแต่งใด ๆ เลย * /

นี่คือลิงค์ไปยังซอร์สโค้ดที่เกี่ยวข้อง (บรรทัดที่ 139-144)


2
ลิงก์ที่ชี้ไปที่ซอร์สโค้ดเพื่อให้ผู้อ่านสามารถตรวจสอบความถูกต้องนี้และการอ่านรหัสที่เกี่ยวข้องจะมีประโยชน์หากเป็นไปได้
jamesc

1
ใช่แล้วเราไม่สามารถระบุไฟล์กำหนดค่าได้อย่างชัดเจน - ไฟล์ config เป็นรหัสยากที่ / dev / null อย่างไรก็ตามถ้าคุณดูบรรทัดคำสั่งแบบเต็มที่ใช้ในการเริ่ม dnsmasq ผ่าน NetworkManager คุณจะเห็นว่ามีการใช้ conf-dir: '/ usr / sbin / dnsmasq --no-resolv --keep-in-foreground --no-hosts - ผูกอินเทอร์เฟซ --pid-file = / var / run / NetworkManager / dnsmasq.pid - listen-address = 127.0.0.1 - แคชขนาด = 400 - เคลียร์โหลดอีกครั้ง --conf-file = / dev / null --proxy-dnssec --enable-dbus = org.freedesktop.NetworkManager.dnsmasq --conf-dir = / etc / NetworkManager / dnsmasq.d 'หมายถึงไฟล์ทั้งหมดในไดเรกทอรีที่กำหนด
Hardy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.