Korzystanie z dnsmasq z NetworkManager


15

Powszechnie wiadomo, że NetworkManager nie działa dobrze dnsmasq(patrz: tutaj ). Przeszedłem przez długą dyskusję tutaj, ale wciąż nie jestem pewien, jaki jest zalecany sposób radzenia sobie z sytuacją.

Wszystko, co chcę, to użyć dnsmasqdo zapewnienia DNS i DHCP mojej sieci lokalnej. Jaki byłby zalecany sposób w tym przypadku?

Wygląda na to, że problem występuje nawet w Ubuntu 14.04, nawet błąd został rzekomo naprawiony.

Podczas obejścia ludzie wyłączają zniewolony przez NM dnsmasq-basez następujących powodów:

Zniewolony przez NM dnsmasqwykorzystuje zakodowane opcje (w C), które zapewniają wyjątkowo ograniczoną funkcjonalność.

  • Nie nasłuchuje na ethX ( --listen-address=127.0.0.1). Dlatego nie możemy używać naszych serwerów jako serwerów DNS dla naszych komputerów w sieci lokalnej, tzn. Jest to całkowicie bezużyteczne dla sieci LAN.
  • Nie buforuje żądań ( --cache-size=0). Brak buforowania ==> brak przyspieszenia zapytań DNS. To znowu jest bardzo istotne dla sieci LAN, ponieważ jest wielu współbieżnych użytkowników.
  • Wreszcie potrzebujemy również funkcji DHCP i TFTP dnsmasq, więc nawet jeśli NM + dnsmasq zawiera prawdziwy serwer DNS, musielibyśmy uruchomić kolejny dnsmasq

Ale nie jestem pewien, czy nadal występują i / lub jak poprawka rozwiązuje problem (y). Co więcej, żadne z nich nie jest bardzo jasne, co dokładnie zrobili i jak zrobili, aby rozwiązać swój problem. Tj. W długiej dyskusji brakuje części dotyczącej rozwiązania . Czy ktoś może wypełnić puste pola? To znaczy,

dnsmasqPod warunkiem, out-of-box przez Ubuntu nie działa, po stronie serwera, z powyższych powodów. Ponadto po stronie klienta „dnsmasq zainstalowany na tych laptopach Ubuntu nie może wykonywać zapytań DNS LAN z mojego serwera DNS” , ponieważ „NetworkManager (laptopy Ubuntu) powoduje, że mają dziwne ustawienie serwera nazw 127.0.1.1” ( ref: rozwiązanie DNS dla LAN lub lokalnej sieci domowej )

Jak sprawić, by dnsmasq działał płynnie z NetworkManagerem, aby zapewnić DNS i DHCP (i TFTP) mojej sieci lokalnej, zarówno po stronie serwera, jak i klienta?

TL'dr

dla tych, którzy szukają odpowiedzi. Ze wszystkich poniższych odpowiedzi znalazłem najprostsze rozwiązanie @ brada, po stronie serwera (wciąż nie ma dobrej odpowiedzi po stronie klienta):

jedynym rozwiązaniem tego problemu jest wyłączenie napędu dnsmasq ... i zainstalowanie „standardowego” dnsmasq, a następnie skonfigurowanie go za pomocą standardowego /etc/dnsmasq.confpliku konfiguracyjnego.


2
Tylko dla Googlersów (takich jak ja): W nowszych wersjach Ubuntu dnsmasq-core wewnątrz NetworkManager jest nieco bardziej przyjazny. Zobacz tutaj: askubuntu.com/questions/233195/…
A. Rabus

Odpowiedzi:


3

Mam też twoje problemy.

Zasadniczo po wiki.archlinux wydaje się, że włączenie buforowania powinno wystarczyć do utworzenia pliku /etc/NetworkManager/dnsmasq.d/cachezawierającego po prostu

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

Próbowałem tego, ale po ponownym uruchomieniu NM nadal nie mam pamięci podręcznej:

# 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

Zauważ, że cytowany plik conf jest zawsze pusty: nie byłem w stanie skonfigurować żadnej opcji przy użyciu tej procedury.

Podsumowując, wydaje się, że maska ​​dnsmask zniewolona przez NM w 14.04 (która jest dostarczana przez pakiet dnsmasq-base) jest całkowicie zablokowana, więc nie jest możliwe włączenie buforowania ani nic innego (dhcp, tftp).

Jeśli jest to słuszne, myślę, że jak mówisz, jedynym rozwiązaniem tego problemu jest wyłączenie dnsmasq z napędem NM, komentując linię

dns=dnsmasq

w pliku /etc/NetworkManager/NetworkManager.confi zainstaluj „standardowy” dnsmasq, a następnie skonfiguruj go za pomocą standardowego /etc/dnsmasq.confpliku konfiguracyjnego.


Witamy u superużytkownika Brad! Dzięki za pomoc!
xpt

1
W rzeczywistości włącza to pamięć podręczną, ponieważ działa --conf-dir=/etc/NetworkManager/dnsmasq.d, cache-sizeużywana jest określona w utworzonym pliku. Możesz zobaczyć różnicę, używającdig
sirfz

6

Można zastąpić ustawienia, wprowadzając je /etc/NetworkManager/dnsmasq.d/*.conf. Ustawienia pliku konfiguracyjnego mają pierwszeństwo przed flagami wiersza poleceń. Są one stosowane, gdy NetworkManager uruchamia dnsmasq. Uruchom, sudo service network-manager restartaby ponownie zastosować. (W razie wątpliwości: w odpowiedzi brada pominięto fakt, który ps ax | grep dnspokazuje --conf-dirargument)

Na przykład:

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

O ile pamiętam, NetworkManager domyślnie wyłącza buforowanie dnsmasq z powodu obaw związanych z zatruciem pamięci podręcznej. W przypadku komputera, na którym wszyscy użytkownicy są zaufani, może to nie stanowić problemu.

NetworkManager nie integruje się resolvconf, a serwer NM 127.0.1.1nie będzie używany lokalnie, jeśli zainstalowany jest pakiet resolvconf. resolvconf jest częścią minimalnych i standardowych instalacji Debiana; NetworkManager przywraca tę funkcjonalność w sposób bardziej zintegrowany, mniej oparty na skryptach.

NetworkManager upewnia się, aby nie zakłócać globalnej instancji dnsmasq (wiązanie z wtórnym IP pętli zwrotnej i konfigurowanie bind-interfacesprzez /etc/dnsmasq.d/network-manager). Jeśli zainstalujesz globalną instancję dnsmasq i zachowasz instancję NM, dwukrotnie sprawdź, /etc/resolv.confz której host będzie domyślnie korzystał.

Chociaż możesz dostosować instancję dnsmasq NetworkManagera, jak pokazano powyżej, jeśli chcesz, aby serwer DNS łączył się z interfejsami publicznymi, powinieneś zainstalować dnsmasqpakiet (tylko NetworkManager używa dnsmasq-base, który nie konfiguruje instancji globalnej) i wprowadzić swoją konfigurację /etc/dnsmasq.d/*.conf. Instancja slave NetworkManagera służy wyłącznie do wiązania się z interfejsem sprzężenia zwrotnego, a skonfigurowanie go poza tym zakresem może spowodować jego uszkodzenie.


Podsumowując, dla kogoś, kto chce tylko lokalnego buforowania DNS:

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

W przypadku prostej sieci LAN współdzielenie połączenia przez NetworkManager powinno nadal wystarczyć. Ale w przypadku niestandardowej sieci LAN z TFTP i tak dalej:

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

Dzięki. Powinieneś jednak dokładniej opisać, co robią polecenia „w podsumowaniu”, tzn . Instrukcje usuwają również 4 pakiety, jeśli je masz. Więcej linków i dyskusji na reddit.com/r/Ubuntu/comments/2j0va4/…
nealmcb

Zupełnie zgadzam się z @nealmcb, Tobu, proszę wyjaśnić, dlaczego „dla kogoś, kto po prostu chce lokalne buforowanie DNS” , muszą usunąć ten dnsmasqpakiet. to po co jest następne echopolecenie? od kiedy dnsmasqzniknie.
xpt

@xpt Tobu sugeruje usunięcie dnsmasq, ale nadal powinieneś mieć dnsmasq-basezainstalowany ze względu na NM.
Thalis Kalfigkopoulos

0

Chciałem przypisać konkretny adres MAC do określonego adresu IP i dla celów stabilności trzymać się domyślnego Network Managera / dnsmasq w jak największym stopniu.

https://cgit.freedesktop.org/NetworkManager/NetworkManager/tree/src/dnsmasq/nm-dnsmasq-manager.c ma komentarz na temat używania pliku --conf do ignorowania konfiguracji, ale później w pliku mamy

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

W systemie Ubuntu 16.04 LTS po skonfigurowaniu hotspotu Wi-Fi i współużytkowaniu innego połączenia ps auxgww | grep dnsmasqpokazuje, że ostatnim argumentem wiersza poleceń każdego z procesów dnsmasq jest:

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

W ten sposób można tworzyć pliki konfiguracyjne w tym katalogu, które są współużytkowane przez wszystkie wywołania dnsmasq uruchamiane przez Network Managera.

Stworzyłem /etc/NetworkManager/dnsmasq-shared.d/Hue

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

i zrestartował się, choć działał

sudo service network-manager restart

działałby.

Spowodowało to, że moje urządzenie uzyskało odpowiedni adres IP.

Tak, jest to błędne, ponieważ oznacza, że ​​wszystkie wywołania dnsmasq przez NetworkManager otrzymają tę deklarację, ale w tym przypadku jest nieszkodliwe, ponieważ ma znaczenie tylko, jeśli MAC pojawi się w danej sieci. Jeśli sieć nie jest 192.168.1, wystąpią problemy.

Jest to bardziej niezawodne niż zastąpienie / usr / sbin / dnsmasq skryptem zaproponowanym na https://gist.github.com/magnetikonline/6236150

Właściwym rozwiązaniem byłoby zmodyfikowanie sposobu wywoływania dnsmasq w celu prawidłowego korzystania z plików konfiguracyjnych dnsmasq. Rozumiem pragnienie, aby Network Manager „po prostu działał”, ale tworzenie odpornych na idiotyzacje narzędzi oznacza, że ​​tylko idioci mogą z nich korzystać.


dzięki za odpowiedź Christopher, jednak tak naprawdę nie jestem w stanie śledzić ... „Chciałem przypisać określony MAC do konkretnego adresu IP i dla celów stabilności” ... ”ps auxgww | grep dnsmasq pokazuje, że ostatni argument wiersza poleceń każdego z procesów dnsmasq „ ... ” Stworzyłem… działałby„ Tak, to źle ” … Tzn. Naprawdę nie mogę podążać za tobą , aby nadać sens temu, co próbujesz tu powiedzieć.
xpt

0

Moje rozwiązanie może zepsuć Menedżera sieci i utrzymanie w nim wszystkiego prostego sposobu robienia rzeczy. Z powodu zepsutego sposobu radzenia sobie z dnsmasq przez NM, po prostu zastąpiłem go moją metodą poniżej.

Obejściem problemu było po prostu wykonanie następujących czynności:

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

Zmodyfikuj ~/dnsmasq.confplik w katalogu użytkownika, tak jak chcesz, i zapisz go.

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

Zrobiłem prosty alias bash i umieściłem go na dole mojego pliku ~ / .bash_aliases, aby ułatwić edycję pliku dnsmasq.conf. Oto 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"

Oczywiście możesz wybrać dowolny edytor według własnego uznania dla drugiego polecenia sudo w aliasie, ale dla ułatwienia użyłem nano. Zapisz plik, zamknij i ponownie otwórz kartę / okno terminala poleceń. Powinno to umożliwić dostęp do aliasu dla nowo otwieranych kart / okien terminali.

Po prostu uruchom eddmcz konta użytkownika, a poprosi Cię o podanie hasła w celu wykonania podniesionych poleceń.

Zauważ, że zawsze mam chattr +iplik. Dzieje się tak, aby Network Manager nie nadpisał twojej konfiguracji własną.

Na przewodowych połączeniach Ethernet nie powinno być żadnych problemów. Odkąd używam dnsmasq do buforowania DNS na laptopach z bezprzewodowym dostępem, muszę ręcznie zrestartować usługę dnsmasq po podłączeniu do punktu dostępowego. Myślę, że Network Manager może wykonywać takie zadania, jak ponowne uruchamianie usług podczas łączenia, ale jeszcze tego nie analizowałem.


0

Pomimo twierdzeń przeciwnych, NetworkManager całkowicie ignoruje wszystkie pliki konfiguracyjne dmsmasq - nawet te we własnym katalogu /etc/NetworkManager/dnsmasq-shared.d. Dowód znajduje się w kodzie źródłowym programu NetworkManager ... Oto odpowiedni komentarz:

/ * dnsmasq może odczytać z domyślnej lokalizacji pliku konfiguracyjnego, która, jeśli ta lokalizacja jest prawidłowym plikiem konfiguracyjnym, połączy się z opcjami tutaj i spowoduje niepożądane skutki uboczne. Jak wysyłanie fałszywych adresów IP jako bram lub cokolwiek innego. Powiedz dnsmasq, aby w ogóle nie używał żadnego pliku konfiguracyjnego. * /

Oto link do odpowiedniego kodu źródłowego (wiersze 139-144).


2
Link do wskazania kodu źródłowego, aby czytelnicy mogli to sprawdzić i odczytać powiązany kod, byłby pomocny, jeśli to możliwe.
jamesc

1
Tak więc nie można podać jawnego pliku konfiguracyjnego. --conf-file jest na stałe zakodowany w / dev / null. Jeśli jednak spojrzysz na pełny wiersz poleceń użyty do uruchomienia dnsmasq poprzez NetworkManager, zobaczysz, że użyto conf-dir: '/ 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 ', co oznacza, że ​​wszystkie pliki w danym katalogu są czytane.
Hardy,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.