我按照以下说明在 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 地址。