DHCP atanmış DNS sunucuları ile dnsmasq nasıl kullanılır?


6

TL; DR sürümü: Kablosuz ağları değiştirmek için dnsmasq'ı LAN'ımdaki DHCP sunucusu tarafından gösterilen DNS sunucularına geri dönecek şekilde nasıl yapılandırabilirim?

Geliştirici dizüstü bilgisayarımda kısa bir süre önce dnsmasq kullanmaya başladım, böylece * .dev'deki tüm trafiği yakalayabilir ve sanal bir makineye yönlendirebilirim (mod_vhost_alias kullanarak).

Bunun çalışması için ağ ayarlarımı, dnsmasq (127.0.0.1'de çalışıyor) birincil DNS sunucusu olarak kullanılacağı ve normal DNS sunucularının ikincil olacağı şekilde yapılandırmam gerekiyordu. etki alanı araması. Geri dönüş DNS sunucularının artık DHCP aracılığıyla yapılandırılmadığı durumlar dışında, bu iyi çalışıyor. Ne zaman kablosuz ağları değiştirirsem, bağlantım kopuyor - özellikle de bir web sayfasından kimlik doğrulama gerektiren ağlarda (aksi takdirde 8.8.8.8 gibi bir genel DNS sunucusu kullanmak bir seçenek olabilir).

Dnsmasq belgelerini okumayı denedim, ancak gazillion seçeneklerinin hiçbiri ihtiyacım olanı yapmıyor gibiydi ya da belki bazı seçeneklerin ne yaptığını yanlış anlıyorum.

Not: Bu soru aslen dnsmasq'ın serverish niteliği göz önüne alınarak, ServerFault'a gönderildi. Mac OS X'in sunucu işletim sistemi olmaması nedeniyle derhal kapatıldı. Bir hamle başlatmak için orada yeterli bir itibarım yok, bu yüzden daha iyi kararımı aleyhime SU'ya çarpıyorum.

Yanıtlar:


14

Yeni MacBook'uma kurduğum tam olarak aynı şeyi yapmaya çalışıyor ve daha önce Linux bilgisayarlarım üzerinde çalışıyordum.

Bildiğiniz gibi, ağ ayarlarındaki DNS girişlerinize 127.0.0.1'in elle eklenmesi sıkıntı verici bir durumdur çünkü ağ arabirimlerini değiştirirken / alternatif wifi erişim noktalarına bağlanırken yeniden uygulanmalıdır ve makinenizin otomatik olarak atanmış DNS sunucularını otomatik olarak almasını önler. DHCP. Neyse ki, aşağıdaki çözüm tamamen DHCP'yi normal şekilde kullanabilmeniz için ağ ayarlarınızı karıştırmaktan tamamen kaçınır.

Öncelikle, daha önce manuel olarak 127.0.0.1 ve harici DNS sunucularını ağ arayüzünüze eklediyseniz, şimdi bunları silme ve DHCP varsayılanlarına sıfırlama zamanı.

Bunu yaptıktan sonra, / etc / resolver klasörünü yaratmanız gerekiyor.

sudo mkdir /etc/resolver

Bu klasörde, eşleşecek ve eşleşen istekler için kullanılacak ad sunucusu girişlerini içerecek şekilde etki alanı tarafından adlandırılmış metin dosyaları ekleyebilirsiniz. OS X, kurallar için otomatik olarak bu klasöre bakacak, bu yüzden gerçekten bu kadar basit.

Bu nedenle, kurulumunuz için (benimkiyle aynı) 127.0.0.1 (dnsmasq tarafından kullanılan yerel IP) için standart bir ad sunucusu girişi içeren / etc / resolver / dev (* .dev için tüm istekleri yakalamak için) adlı bir metin dosyası oluşturmak istiyoruz ).

sudo bash -c 'echo "nameserver 127.0.0.1" > /etc/resolver/dev'

Şimdi * .dev alanlarına ilişkin tüm DNS istekleri 127.0.0.1'de dnsmasq'a iletilecek ve * .dev ile eşleşmeyen herhangi bir şey DHCP'nizin aldığı DNS sunucuları tarafından normal olarak ele alınacaktır.


Bunu daha sonra bugün deneyeceğim. Tam olarak aradığım şeyi yapıyor gibi görünüyor!
Sander Bol

@SanderBol Ne umduğunu yaptın mı?
monkeyhybrid

Evet, evet! Sonunda hemen şimdi test etmeye başladı ve işe yarıyor. Siz efendim, sen bir dahisin.
Sander Bol

Bunu, tüm alanlar için bir çözümleyici eklemek için kullanmak mümkün mü, örneğin *? Veya bir şey DNSMasq üzerinden geçmek istediğimde sadece com, net, org, vb. Dosyalar ekleyebilir miyim?
wizonesolutions 22.03

@wizonesolutions - / etc / resolver / domain yöntemiyle bir catch-all kullanabileceğinizi sanmıyorum. Her TLD (veya alfabenin her bir harfi) için bir dosya oluşturabilirsiniz, ancak TÜM TLD'leri DNSMasq'a yeniden yönlendirmek istiyorsanız, 127.0.0.1'i yalnızca ad sunucunuz olarak ayarlamak daha iyi olur mu?
maymun melezi

1

İşte geldiğim çözüm:

Growl ve HardwareGrowler kullanıyorum , dnsmasq tarafından yapılandırılmış bir çözümleyici dosyası yazan bir komut dosyasını tetiklemek için.

Belki de yanlış anlıyorum (Growl'un dokümantasyon durumu oldukça eksik), ancak Growl 2.1'in doğrudan doğru dizinde bir kabuk betiği tetikleyebildiğini sanıyordum . Ancak, bunun işe yaramadı. Yani, bunun yerine, kabuk komut dosyasını aşağıdaki gibi çalıştırmak için bir Applescript kuralları komut dosyası kullanıyorum ...

~ / Library / Application Script / com.Growl.GrowlHelperApp / Rules.scpt içinde:

using terms from application "Growl"
on evaluate notification with notification
    --Rules go in here
    if notification's note title contains "IP Address" then
        set shell_result to do shell script "/usr/local/sbin/set_nameservers.sh"
    end if
    --Ultimately return what you want Growl to do with the notification
end evaluate notification
end using terms from

Sonra benim komut / usr/local/sbin/set_nameservers.sh:

#!/bin/bash

# locking variables
LOCKDIR="/tmp/nameservers.lock"
PIDFILE="${LOCKDIR}/nameservers.pid"

# Temporary file for discovered nameservers
TMP_NAMESERVERS_FILE="${LOCKDIR}/nameservers.conf"
# List of public nameservers to add to the list
PUB_NAMESERVERS_FILE="/etc/nameservers_public.conf"
# The nameserver list read in by dnsmasq
SYS_NAMESERVERS_FILE="/etc/nameservers.conf"

# Commands
GROWL="/usr/local/bin/growlnotify"

# Setup a lock in case Growl triggers this script multiple times due to multiple network changes
if mkdir "${LOCKDIR}"; then
    echo "$$" >"${PIDFILE}";
    echo "# DHCP supplied nameserves:" > "${TMP_NAMESERVERS_FILE}";

    # 1) For each interface listed by the networksetup command...
    while IFS=" " read -r -a interfaces;
    do
        ((int_count = ${#interfaces[@]} - 1));
        for ((i = 0; i <= int_count; i++));
        do
        # 2) Try to get a nameserver from DHCP. (Only the first of multiple is returned)
        nameserver=`/usr/sbin/ipconfig getoption ${interfaces[i]} domain_name_server`
        # 3) If a nameserver was returned, add it to our configuration.
        if [ ${nameserver} ]; then
            echo "nameserver" ${nameserver} >> ${TMP_NAMESERVERS_FILE};
        fi
        done
    done <<< `networksetup -listallhardwareports | grep Device | sed 's/Device: //g'`

# 4) If a file of public nameservers exists, add these to our configuration.
if [ -e ${PUB_NAMESERVERS_FILE} ]; then
    cat ${PUB_NAMESERVERS_FILE} >> ${TMP_NAMESERVERS_FILE};
fi
cp ${TMP_NAMESERVERS_FILE} ${SYS_NAMESERVERS_FILE};

# Display a Growl notification showing what our new nameserver config looks like.
${GROWL} -d "us.loranz.steve.set_nameservers" \
         -N "Nameserver Configuration" \
         -m "`cat ${SYS_NAMESERVERS_FILE}`" \
         "System nameservers set to:";

rm -rf "${LOCKDIR}";
else
# Display an informational message if we failed to establish a lock.
${GROWL} -d "us.loranz.steve.set_nameservers" \
         -N "Nameserver Configuration Failed" \
         -m "$0 ($$) failed to run, lock already established by process: " `cat ${PIDFILE}` \
         "Failed to set nameservers:";
exit 1;
fi

exit 0

Ardından HardwareGrowler'ı ağ olaylarını gösterecek şekilde ve Growl'u IP Adresi Değişti, Ağ Bağlantısı Aşağı ve Ağ Bağlantısı Yukarı için bir ScriptAction başlatmak üzere yapılandırdım.

Sonunda, ağ sunucusundaki ad sunucumu 127.0.0.1 olarak ayarlıyorum, böylece dnsmasq'a çarpıyorum.

dnsmasq daha sonra aşağıdaki seçeneklerle kurulur:

resolv-file=/etc/nameservers.conf
all-servers

İlk satır, dnsmasq dosyasını yukarıdaki betiğin DHCP ve keşfedilen herhangi bir genel sunucu aracılığıyla keşfedilen ad sunucularıyla doldurduğu dosyaya dolduruyor.

İkinci satırın, dnsmasq'ın bildiği tüm ad sunucularına bir sorgu göndermesini ve ilk yanıtı kabul etmesini sağlaması beklenir. Mac OS X çözücüsü , verilen bu çözme dosyalarına ve DHCP etki alanı aramasına duyulan ihtiyacı ortadan kaldırmalıdır ... ve buna güvenmek, listenizdeki her sunucuyu sorgulamaktan daha iyi bir netizen yapar. Biraz daha testten sonra bu seçeneği kaldırabilirim ve başkasının bu konuda sahip olduğu her türlü görüş için minnettar olurum.


0

Senaryoyu doğru anlarsam - üssün dışına çıkmış olabilirim, ne yapmaya çalıştığınızı ya da probleminizin nerede olduğunu tam olarak anlamadım - sanırım sorununuzu çözecek 2 parça / unsur var -

  1. DNSMasq için kutunuzdaki ağ kartıyla ilişkili IP adresini kullanın, bunun yerine 127.0.0.1.

  2. DNSMasq, yetkili olmadığı yerlerde kullanması gereken ad sunucularını okumak için /etc/resolv.conf dosyasını okur. (İsterseniz, --resolv-file (-r) seçeneğiyle başka bir dosyayı okuyacak şekilde değiştirebilirsiniz. Pratik olarak, herhangi bir yerden sorgulanabilecek özyinelemeli DNS sunucuları belirtmeniz gerekir - örneğin, 8.8.8.8'deki Googles DNSMasq'ın ad sunucularını otomatik olarak bir DHCP sunucusundan alması için "tümleşik" bir yol olsaydı çok şaşırırdım - bunun nedeni DHCP İstemciniz resolv.conf dosyanızı yeniden yazıyorsa muhtemelen dolaylı olarak gerçekleşebilirdi - ama sizin için durum gibi görünüyor.


Merhaba David. Çözmeye çalıştığım sorun (heh), sanal bir makineye dinamik olarak yeni ana bilgisayar adları eklemek istediğimdir (böylece apache mod_vhost_alias kullanarak bunları işleyebilir), ana bilgisayarlarımı el ile girmek ve düzenlemek zorunda kalmadan.
Sander Bol

Mac OS X'teki resolv.conf bir bildirim içerir: Bu dosya, ana bilgisayar adı ve adres çözünürlüğü veya bu Mac OS X sistemindeki çoğu işlem tarafından kullanılan DNS sorgu yönlendirme mekanizmaları tarafından kullanılmaz. Dosya DHCP eklenmiş dns sunucularını doğru bir şekilde içeriyor gibi görünüyor. Bu caddeye daha fazla bakacağım.
Sander Bol
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.