web-dev-qa-db-ja.com

DHCPが割り当てられたDNSサーバーでdnsmasqを使用するにはどうすればよいですか?

TL; DRバージョン:LAN上のDHCPサーバーが指すDNSサーバーにフォールバックしてワイヤレスネットワークの切り替えを有効にするようにdnsmasqを構成するにはどうすればよいですか?

開発者のラップトップで、最近dnsmasqの使用を開始しました。これにより、*。devへのすべてのトラフィックをキャプチャし、仮想マシンにリダイレクトできます(mod_vhost_aliasを使用)。

これを機能させるには、dnsmasq(127.0.0.1で実行)がプライマリDNSサーバーとして使用され、通常のDNSサーバーがセカンダリになるようにネットワーク設定を構成する必要がありました-dnsmasqが処理できない場合にそれらのDNSサーバーへのフォールバックを引き起こしますドメインルックアップ。これは、フォールバックDNSサーバーがDHCPを介して構成されなくなったことを除いて、うまく機能します。ワイヤレスネットワークを切り替えると、接続が切断されます。特に、Webページを介した認証が必要なネットワークでは(そうでない場合は、8.8.8.8などのパブリックDNSサーバーを使用することをお勧めします)。

Dnsmasqのドキュメントを読んでみましたが、何億ものオプションが必要なことを実行していないようでした。あるいは、いくつかのオプションが何をするのか誤解しているのかもしれません。

注:この質問は、dnsmasqのサーバーっぽい性質を考慮して、元々ServerFaultに投稿されました。 Mac OS XがサーバーOSではないため、すぐに閉じられました。私はそこに引っ越しを始めるのに十分な評判がないので、私のより良い判断に反して、私はSUにクロスポストしています。

6
Sander Bol

新しいMacBookでセットアップしたばかりで、以前はLinux開発マシンで作業していたのとまったく同じことを達成しようとしているようです。

ご存知のように、ネットワーク設定のDNSエントリに127.0.0.1を手動で追加するのは面倒です。これは、ネットワークインターフェイスを変更したり、代替のWi-Fiアクセスポイントに接続したりするときに再適用する必要があり、マシンがを介して割り当てられたDNSサーバーを自動的に取得できないためです。 DHCP。ありがたいことに、次のソリューションは、ネットワーク設定を混乱させる必要を完全に回避するため、通常どおりDHCPを使用できます。

まず、以前に手動で127.0.0.1と外部DNSサーバーをネットワークインターフェイスに追加したことがある場合は、それらを削除してDHCPのデフォルトにリセットするときが来ました。

これが完了したら、/ etc/resolverフォルダーを作成する必要があります。

Sudo mkdir /etc/resolver

このフォルダ内に、一致するドメイン名のテキストファイルを追加し、一致するリクエストに使用するネームサーバーエントリを含めることができます。 OS Xは自動的にこのフォルダでルールを探すので、とても簡単です。

したがって、セットアップ(私のものと同じ)では、127.0.0.1(dnsmasqで使用されるローカルIP)の標準ネームサーバーエントリを含む/ etc/resolver/dev(* .devのすべての要求をキャッチする)というテキストファイルを作成します。 )。

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

これで、*。devドメインに対するすべてのDNS要求が127.0.0.1のdnsmasqに渡され、*。devに一致しないものはすべて、DHCPが取得したDNSサーバーによって通常どおり処理されます。

15
monkeyhybrid

これが私が思いついた解決策です:

Growl および HardwareGrowler を使用して、dnsmasqが使用するように構成されているリゾルバーファイルを書き出すスクリプトをトリガーしています。

誤解しているかもしれませんが(Growlのドキュメントの状況はかなり不足しています)、私thoughtGrowl 2.1には、正しいディレクトリでシェルスクリプトをトリガーする機能がありました。 、 直接。しかし、それを機能させることはできませんでした。したがって、代わりに、Applescriptルールスクリプトを使用して、次のようにシェルスクリプトを実行しています...

〜/ Library/Application Scripts/com.Growl.GrowlHelperApp/Rules.scpt:

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

次に、私のスクリプト/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

次に、HardwareGrowlerを構成してネットワークイベントを表示し、Growlを構成してIPアドレスの変更、ネットワークリンクのダウン、ネットワークリンクのアップに対してScriptActionを起動しました。

最後に、ネットワーク設定でネームサーバーを127.0.0.1に設定して、dnsmasqをヒットします。

次に、dnsmasqは次のオプションでセットアップされます。

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

最初の行は、dnsmasqが、上記のスクリプトがDHCP経由で検出されたネームサーバーと必要なパブリックサーバーを入力しているファイルを指し示しています。

2行目は、dnsmasqが認識しているすべてのネームサーバーにクエリを送信し、最初の応答を受け入れることができるようにするためのものです。 Mac OS Xリゾルバーshouldは、この特定のリゾルバーファイルとDHCPドメイン検索の必要性を排除します...そしてそれに依存することで、より良いネチズンになりますリスト内のすべてのサーバーに毎回クエリを実行するよりも。私はもう少しテストした後にそのオプションを削除するかもしれません、そして他の誰かがこのビットについて持っている洞察をいただければ幸いです。

1
Murray Langston

私がシナリオを正しく理解している場合-そして私がベースから外れているかもしれない場合、私はあなたが何をしようとしているのか、あなたの問題がどこで起こっているのかを完全には理解していません-あなたの問題を解決するための2つの部分/要素があると思います-

  1. 127.0.0.1ではなく、ボックスのネットワークカードに関連付けられているIPアドレスをDNSMasqに使用します。

  2. DNSMasqは/etc/resolv.confを読み取り、権限がない場合に使用する必要のあるネームサーバーを読み取ります。 (必要に応じて、-resolv-file(-r)オプションを使用して別のファイルを読み取るように変更できます。実際には、どこからでもクエリできる再帰DNSサーバーを指定する必要があります。たとえば、8.8.8.8のGoogleなどです。 DNSMasqがDHCPサーバーからネームサーバーを自動的に取得する「統合された」方法があったとしたら、私は非常に驚きます。ただし、DHCPクライアントがresolv.confファイルを書き換えている場合、間接的に発生する可能性がありますが、そうではありません。あなたに当てはまるようです。

0
davidgo