在 Snow Leopard 上,如何在离线时使用本地主机 DNS 服务器

在 Snow Leopard 上,如何在离线时使用本地主机 DNS 服务器

我按照以下说明在 Mac 上设置了本地 DNS 服务器,并使用它为 localhost 上的通配符子域提供服务。这真是一件好事:

http://mikeferrier.ca/2011/04/04/setting-up-wildcard-dns-on-localhost-domains-on-osx/

但是有一个弱点:我有时尝试离线工作,并且仅当您与 DNS 服务器列表中的 127.0.0.1 建立实时连接时才会查询本地 BIND 实例。

有没有办法离线实现这种效果?

答案1

我也希望bind9离线时也能正常工作。不幸的是,/etc/resolver/*当所有网卡都断开连接时,该解决方案不起作用。

但我发现这个优秀的答案。唯一的缺点是它是基于运行时的,例如,配置在重启后不再有效。

为了解决这个问题,我引入了/Library/LaunchDaemon在操作系统启动期间管理它的简单方法。

shell脚本:

#!/bin/bash

LOG="/opt/local/var/log/local-ns.log"

function register() {
    cat <<EOF | /usr/sbin/scutil
d.init
d.add ServerAddresses * 127.0.0.1
d.add SupplementalMatchDomains * <YOUR-DOMAIN-HERE>
set State:/Network/Service/<YOUR-DOMAIN-HERE>/DNS
EOF
    scutilret=$?
    echo "$0[$$]" `date` "scutilret:$scutilret" >> "$LOG"
}

echo "Starting registering " `date` > "$LOG"

for (( i = 0; i < 10; i++ )); do
    register
    scutil --dns 2>&1 >> "$LOG"
    cnt=`scutil --dns | grep 127.0.0.1 | wc -l`
    if [ "$cnt" -ne 0 ]; then
        echo "DNS management done" >> "$LOG"
        break;
    fi
    echo "DNS not ready yet" >> "$LOG"
    echo "iteration $i" >> "$LOG"
    /bin/sleep 2
done

echo "DONE" >> "$LOG"

exit 0

脚本启动时,DNS子系统不会立即准备就绪,因此检查需要10次尝试。文件/Library/LaunchDaemons/YOUR-LABEL-HERE.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>YOUR-LABEL-HERE</string>
    <key>Program</key>
    <string>/bin/bash</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/bash</string>
        <string>/opt/local/root/local-ns.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true />
    <key>LaunchOnlyOnce</key>
    <true />
    <key>Disabled</key>
    <false />
    <key>KeepAlive</key>
    <dict>
        <key>SuccessfulExit</key>
        <false />
    </dict>
</dict>
</plist>

在 macOS Catalina 上在线或离线时均可工作。

答案2

也许我遗漏了什么,但你似乎完全忽略了 /etc/hosts 文件。Unix 操作系统将在发出 DNS 请求之前引用 /etc/hosts。localhost解析为,127.0.0.1因为它在 /etc/hosts 中指定为如此!

http://en.wikipedia.org/wiki/Hosts_%28file%29

您可以使用任何文本编辑器编辑 /etc/hosts,但您需要 root 权限。

sudo open -a TextEdit /etc/hosts

127.0.0.1 one.mydomain.local
127.0.0.1 two.mydomain.local
127.0.0.1 example.com subdomain.example.com

答案3

您需要设置解析器配置以使用 127.0.0.1 作为该本地域:

sudo mkdir /etc/resolver
sudo vim /etc/resolver/local

将以下行添加到/etc/resolver/local配置中:

nameserver 127.0.0.1
search_order 1

配置文件的名称“local”是您的搜索域的名称。(我的搜索域的名称恰好是“dev”;如果您按照该教程操作,那么您的搜索域的名称将是“local”。)

然后,您可以进入“系统偏好设置/网络配置”,删除您在那里为 127.0.0.1 设置的自定义 DNS 服务器。上述解析器配置意味着您的本地主机 DNS 将仅用于查询“本地”域。

更多详细信息请参阅此帮助serverfault 答案

答案4

线程一点点硬件黑客攻击==没有Wi-Fi建议使用硬件环回设备(亚马逊上为 6.79 美元)。

这可能是一种欺骗 OS X 使其认为它具有有效网络连接的解决方案。

由于没有 DHCP 服务器,这也需要使用静态 IP 地址。

图像

相关内容