Menggunakan dnsmasq dengan NetworkManager

15

Sudah terkenal bahwa NetworkManager tidak bermain dengan baik dnsmasq(ref: di sini ). Saya telah membaca diskusi panjang di sini tapi masih tidak yakin apa cara yang disarankan untuk menangani situasi ini.

Yang saya inginkan adalah menggunakan dnsmasqDNS dan DHCP untuk jaringan lokal saya. Apa yang akan menjadi cara yang direkomendasikan dalam kasus ini?

Tampaknya masalah tetap ada bahkan untuk Ubuntu 14.04, bahkan bug tersebut diklaim telah diperbaiki.

Saat bekerja di sekitarnya, orang-orang menonaktifkan NM yang diperbudak dnsmasq-basekarena alasan berikut:

NM-diperbudak dnsmasqmenggunakan opsi hardcoded (dalam C) yang menyediakan fungsionalitas yang sangat terbatas.

  • Itu tidak mendengarkan di ethX ( --listen-address=127.0.0.1). Jadi kami tidak dapat menggunakan server kami sebagai server DNS untuk PC jaringan lokal kami, artinya sama sekali tidak berguna untuk LAN.
  • Itu tidak men-cache permintaan ( --cache-size=0). Tanpa caching ==> tidak ada speedup permintaan DNS. Ini lagi sangat penting untuk LAN karena ada banyak pengguna bersamaan.
  • Akhirnya, kita juga memerlukan fungsionalitas DHCP dan TFTP dari dnsmasq, jadi meskipun NM + dnsmasq menyertakan server DNS asli, kita harus menjalankan dnsmasq lainnya

Tapi saya tidak yakin apakah mereka masih memegang dan / atau bagaimana perbaikannya telah memecahkan masalah. Lebih jauh, tidak satupun dari mereka yang sangat jelas apa yang mereka lakukan dan bagaimana mereka lakukan untuk menyelesaikan masalah mereka. Yaitu, bagian solusinya hilang dari diskusi panjang . Bisakah seseorang mengisi bagian yang kosong? Yaitu,

The dnsmasqdisediakan out-of-box dengan Ubuntu tidak bekerja, pada sisi server, karena alasan di atas. Dan juga, di sisi klien, "dnsmasq yang diinstal pada laptop Ubuntu tersebut tidak dapat melakukan permintaan DNS LAN dari server DNS saya" , karena "NetworkManager (Ubuntu laptops) menyebabkan mereka memiliki pengaturan nameserver 127.0.1.1 yang aneh" ( ref: solusi DNS untuk LAN atau jaringan rumah lokal )

Bagaimana membuat dnsmasq agar bekerja dengan NetworkManager, sehingga dapat memberikan DNS dan DHCP (dan TFTP) ke jaringan lokal saya, baik di sisi server dan klien?

TL'dr

bagi mereka yang mencari jawabannya. Dari semua jawaban di bawah ini, saya menemukan solusi paling sederhana adalah @ brad, untuk sisi server (masih belum ada jawaban yang baik untuk sisi klien):

satu-satunya solusi untuk masalah ini adalah dengan menonaktifkan NM-drive dnsmasq ..., dan menginstal "standar" dnsmasq dan kemudian mengkonfigurasinya melalui /etc/dnsmasq.conffile konfigurasi standarnya .

xpt
sumber
2
Hanya untuk Googler (seperti saya): Dalam versi yang lebih baru dari ubuntu dnsmasq-core di dalam NetworkManager agak lebih ramah. Lihat di sini: askubuntu.com/questions/233195/…
A. Rabus

Jawaban:

3

Saya juga punya masalah.

Pada prinsipnya, setelah wiki.archlinux , tampaknya untuk mengaktifkan caching harus cukup untuk membuat file yang /etc/NetworkManager/dnsmasq.d/cacheberisi sederhana

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

Saya mencoba ini tetapi, setelah NM restart, saya masih tidak memiliki cache:

# 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

Perhatikan bahwa file conf yang dikutip selalu kosong: Saya belum dapat mengkonfigurasi opsi apa pun menggunakan prosedur ini.

Secara keseluruhan, nampaknya dnsmask NM yang diperbudak dalam 14,04 (yang disediakan oleh paket dnsmasq-base) benar-benar terkunci, sehingga tidak mungkin untuk mengaktifkan caching, atau apa pun yang lain (dhcp, tftp).

Jika ini benar saya pikir, seperti yang Anda katakan, satu-satunya solusi untuk masalah ini adalah dengan menonaktifkan NM-drive dnsmasq dengan mengomentari baris

dns=dnsmasq

dalam file /etc/NetworkManager/NetworkManager.confdan instal "standar" dnsmasq dan kemudian konfigurasikan melalui /etc/dnsmasq.conffile konfigurasi standarnya .

brad
sumber
Selamat datang di superuser brad! Terima kasih atas bantuan Anda!
xpt
1
Sebenarnya ini tidak memungkinkan cache, karena itu berjalan dengan --conf-dir=/etc/NetworkManager/dnsmasq.d, yang cache-sizeditentukan dalam file yang Anda buat digunakan. Anda dapat melihat perbedaannya menggunakandig
sirfz
6

Dimungkinkan untuk mengganti pengaturan dengan memasukkannya ke dalam /etc/NetworkManager/dnsmasq.d/*.conf. Pengaturan file konfigurasi lebih diutamakan daripada flag baris perintah. Mereka diterapkan ketika NetworkManager memulai dnsmasq. Jalankan sudo service network-manager restartuntuk mendaftar kembali. (Jika ada keraguan: jawaban brad melewatkan fakta yang ps ax | grep dnsmenunjukkan --conf-dirargumen)

Sebagai contoh:

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

Seingat saya NetworkManager menonaktifkan caching dnsmasq secara default karena kekhawatiran akan keracunan cache. Untuk mesin yang dipercaya semua pengguna, ini mungkin bukan masalah.

NetworkManager tidak berintegrasi dengan resolvconf, dan server NM di 127.0.1.1tidak akan digunakan secara lokal jika paket resolvconf diinstal. resolvconf adalah bagian dari penginstalan Debian minimal-Ubuntu dan standar; NetworkManager menambahkan kembali fungsionalitas itu dengan cara yang lebih terintegrasi, kurang berbasis script.

NetworkManager memastikan untuk tidak mengganggu instance global dnsmasq (mengikat IP loopback sekunder dan pengaturan bind-interfacesmelalui /etc/dnsmasq.d/network-manager). Jika Anda menginstal turunan global dnsmasq dan menyimpan turunan milik NM, periksa ulang /etc/resolv.confuntuk melihat mana yang akan digunakan oleh host secara default.

Meskipun Anda dapat mengkustomisasi instance dnsmasq NetworkManager seperti yang ditunjukkan di atas, jika Anda ingin server DNS yang mengikat ke antarmuka publik, Anda harus menginstal dnsmasqpaket (NetworkManager hanya menggunakan dnsmasq-base, yang tidak mengkonfigurasi instance global) dan memasukkan konfigurasi Anda /etc/dnsmasq.d/*.conf. Contoh slave NetworkManager hanya dimaksudkan untuk mengikat ke antarmuka loopback dan mengonfigurasinya di luar lingkup itu akan berisiko melanggar itu.


Singkatnya, untuk seseorang yang hanya ingin caching DNS lokal:

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

Untuk LAN sederhana, berbagi koneksi NetworkManager masih cukup. Tetapi untuk LAN yang dikonfigurasi khusus, dengan TFTP dan sebagainya:

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
Tobu
sumber
Terima kasih. Meskipun Anda harus menjelaskan lebih lengkap apa yang dilakukan perintah "dalam ringkasan" Anda, yaitu petunjuk itu juga menghapus 4 paket jika saat ini Anda memilikinya Lebih banyak tautan dan diskusi di reddit.com/r/Ubuntu/comments/2j0va4/…
nealmcb
Cukup setuju dengan @nealmcb, Tobu, tolong jelaskan mengapa "untuk seseorang yang hanya ingin DNS caching lokal" , mereka harus menghapus yang dnsmasqpaket. lalu untuk apa echoperintah selanjutnya ? karena dnsmasqakan hilang.
xpt
@xpt Tobu menyarankan untuk menghapus dnsmasq, tetapi Anda harus tetap dnsmasq-basemenginstal karena NM.
Thalis Kalfigkopoulos
0

Saya ingin menetapkan MAC tertentu ke alamat IP tertentu dan untuk tujuan stabilitas, tetap menggunakan Network Manager / dnsmasq default sebanyak mungkin.

https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/src/dnsmasq/nm-dnsmasq-manager.c memang memiliki komentar tentang penggunaan --conf-file untuk mengabaikan konfigurasi, tetapi kemudian pada file yang kita miliki

/* 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);

Di bawah Ubuntu 16.04 LTS, setelah menyiapkan Hot Spot Wi-Fi dan berbagi koneksi lain, ps auxgww | grep dnsmasqmenunjukkan bahwa argumen baris perintah terakhir dari setiap proses dnsmasq adalah:

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

Dengan demikian, dimungkinkan untuk membuat file config di direktori tersebut yang dibagikan di antara semua permintaan dnsmasq yang dimulai oleh Network Manager.

Saya membuat /etc/NetworkManager/dnsmasq-share.d/Hue

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

dan reboot, meskipun sedang berjalan

sudo service network-manager restart

akan bekerja.

Ini mengakibatkan perangkat saya mendapatkan alamat IP yang sesuai.

Ya, ini salah karena itu berarti bahwa semua doa dnsmasq oleh NetworkManager akan mendapatkan deklarasi ini, tetapi dalam kasus ini, tidak berbahaya karena itu hanya masalah jika MAC muncul di jaringan yang dimaksud. Jika jaringan bukan 192.168.1, maka akan ada masalah.

Ini lebih kuat daripada mengganti / usr / sbin / dnsmasq dengan skrip seperti yang diusulkan di https://gist.github.com/magnetikonline/6236150

Solusi yang tepat adalah memodifikasi bagaimana dnsmasq dipanggil untuk menggunakan file konfigurasi dnsmasq dengan benar. Saya mengerti keinginan untuk memiliki Network Manager "hanya bekerja", tetapi membuat alat-alat idiot-proof berarti hanya idiot yang dapat menggunakannya.

Christopher Brooks
sumber
terima kasih atas jawaban Christopher, namun, saya benar-benar tidak dapat mengikuti ... "Saya ingin menetapkan MAC tertentu ke alamat IP tertentu dan untuk tujuan stabilitas" ... "ps auxgww | grep dnsmasq menunjukkan bahwa argumen baris perintah terakhir dari masing - masing proses dnsmasq " ... " yang saya buat ... akan berhasil " ... " Ya, ini salah " ... Yaitu, saya benar-benar tidak dapat mengikuti alur pemikiran Anda , masuk akal apa yang ingin Anda katakan di sini.
xpt
0

Solusi saya mungkin merusak Network Manager dan menjaga segala cara sederhana dalam melakukan sesuatu. Dengan cara NM yang rusak dalam menangani dnsmasq, saya hanya menimpanya dengan metode saya di bawah ini.

Solusi untuk masalah ini adalah dengan hanya melakukan hal berikut:

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

Edit ~/dnsmasq.conffile di direktori pengguna Anda seperti yang Anda inginkan dan simpan.

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

Saya membuat alias bash sederhana dan meletakkannya di bagian bawah file ~ / .bash_aliases saya untuk memudahkan mengedit file dnsmasq.conf. Inilah alias:

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

Tentu saja, Anda dapat memilih editor yang Anda sukai untuk perintah sudo kedua di alias, tapi saya menggunakan nano di sana untuk memudahkan semua orang. Simpan file, tutup dan buka kembali tab / jendela terminal perintah Anda. Itu harus memungkinkan alias tersedia untuk tab / jendela terminal yang baru dibuka.

Cukup jalankan eddmcdari akun pengguna Anda dan itu akan meminta kata sandi Anda untuk melakukan perintah yang ditinggikan.

Perhatikan bahwa saya selalu chattr +ifile. Ini agar Network Manager tidak akan menimpa konfigurasi Anda dengan miliknya.

Pada koneksi ethernet kabel seharusnya tidak ada masalah. Saya telah menemukan sejak saya menggunakan dnsmasq untuk caching dns pada laptop dengan nirkabel yang saya harus me-restart secara manual dnsmasq.service setelah terhubung ke titik akses. Saya pikir Network Manager dapat melakukan tugas-tugas seperti memulai kembali layanan saat menghubungkan, tetapi saya belum melihatnya.

jpyper
sumber
0

Meskipun klaim di sini dan di tempat lain sebaliknya, NetworkManager sepenuhnya mengabaikan semua dan semua file konfigurasi dmsmasq - bahkan yang ada di direktori sendiri /etc/NetworkManager/dnsmasq-shared.d. Buktinya ada dalam kode sumber untuk NetworkManager ... Berikut adalah komentar yang relevan:

/ * dnsmasq dapat membaca dari lokasi file konfigurasi default, yang jika lokasi itu adalah file konfigurasi yang valid, ia akan bergabung dengan opsi di sini dan menyebabkan efek samping yang tidak diinginkan. Seperti mengirim alamat IP palsu sebagai gateway atau apa pun. Jadi beri tahu dnsmasq untuk tidak menggunakan file konfigurasi sama sekali. * /

Berikut ini tautan ke kode sumber yang relevan (baris 139-144).

bsalnick
sumber
2
Tautan ke titik pada kode sumber sehingga pembaca dapat memvalidasi ini dan membaca kode terkait akan sangat membantu jika memungkinkan.
jamesc
1
Jadi ya, orang tidak dapat menentukan file konfigurasi eksplisit. --conf-file dikodekan ke / dev / null. Namun, jika Anda melihat baris perintah penuh yang digunakan untuk memulai dnsmasq melalui NetworkManager Anda melihat bahwa conf-dir digunakan: '/ usr / sbin / dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file = / var / run / NetworkManager / dnsmasq.pid --listen-address = 127.0.0.1 --cache-size = 400 --clear-on-reload --conf-file = / dev / null --proxy-dnssec --enable-dbus = org.freedesktop.NetworkManager.dnsmasq --conf-dir = / etc / NetworkManager / dnsmasq.d ', artinya semua file dalam direktori yang diberikan dibaca.
Hardy