以编程方式设置 DNS 服务器(Windows,MacOS)
Programatically set DNS servers (Windows, MacOS)
我需要在 Windows、MacOS 和 Linux.[= 的活动网络接口(Wi-fi、以太网等)上以编程方式设置主机的 DNS 服务器21=]
我想避免为我的 Kubernetes 服务手动 update/pollute /etc/hosts
我 运行 在我的入口。
目前,我的流程是为团队中的每个人手动设置 DNS 服务器运行 我们的应用程序
这个问题是一个手动过程,我在尝试自动化它时遇到了麻烦,因为输出的格式很奇怪并且很难解析。这意味着我无法知道哪个是正确的网络接口。
本质上,需要做的是以下(在两个平台上)
- 获取活动网络名称
- 将活动网络的 DNS 服务器设置为
127.0.0.1
& 8.8.4.4
目前正在手动完成什么
MacOS:
networksetup -setdnsservers Wi-Fi 127.0.0.1 8.8.8.8
sudo killall -HUP mDNSResponder
127.0.0.1
是节点上的本地 DNS 服务器 运行,为服务 A
记录提供服务
8.8.8.8
是 Google 的 Public DNS 服务器
目前,我假设 MacOS 上的用户正在使用“Wi-Fi”网络,但我想以编程方式确定这一点
Windows
作为管理员:
netsh interface show interface
找到您想要更改 DNS 服务器的网络连接(例如:WiFi
)。
netsh interface ipv4 add dns "WiFi" 127.0.0.1 index=1
netsh interface ipv4 add dns "WiFi" 8.8.8.8 index=2
ipconfig /flushdns
在 macOS 上,我认为这不会满足您的要求。当您在 macOS 上配置多个 DNS 服务器时,系统解析器不会按顺序尝试它们,它只是在可用服务器之间半随机地触发请求。这意味着它有时会将您的私人服务器请求发送到 public (Google) 服务器,被告知没有这样的域,然后就停在那里。或者它会向本地主机 DNS 发送对公共站点的请求,如果没有正确响应,则决定 that 站点不工作。基本上,macOS 解析器不进行故障转移。
您的私人服务器是否使用非标准 TLD 或类似名称?如果是这样,您可以通过在 /etc/resolver/ 下添加一个文件来将对该 TLD 的查询重定向到私有 DNS 服务器来完成这项工作。
无论如何,如果它有用,这里有一种检测主要(活动)网络接口并在 macOS 中设置其 DNS 服务器的方法:
#!/bin/bash
interfaceDevice=$(netstat -rn | awk '( == "default") {print ; exit}')
if [[ -z "$interfaceDevice" ]]; then
echo "Unable to get primary network interface device" >&2
exit 1
fi
interfaceName=$(networksetup -listallhardwareports | grep -B1 "Device: $interfaceDevice$" | sed -n 's/^Hardware Port: //p')
if [[ -z "$interfaceName" ]]; then
echo "Unable to get primary network interface name" >&2
exit 1
fi
networksetup -setdnsservers "$interfaceName" 127.0.0.1 8.8.8.8
我需要在 Windows、MacOS 和 Linux.[= 的活动网络接口(Wi-fi、以太网等)上以编程方式设置主机的 DNS 服务器21=]
我想避免为我的 Kubernetes 服务手动 update/pollute /etc/hosts
我 运行 在我的入口。
目前,我的流程是为团队中的每个人手动设置 DNS 服务器运行 我们的应用程序
这个问题是一个手动过程,我在尝试自动化它时遇到了麻烦,因为输出的格式很奇怪并且很难解析。这意味着我无法知道哪个是正确的网络接口。
本质上,需要做的是以下(在两个平台上)
- 获取活动网络名称
- 将活动网络的 DNS 服务器设置为
127.0.0.1
&8.8.4.4
目前正在手动完成什么
MacOS:
networksetup -setdnsservers Wi-Fi 127.0.0.1 8.8.8.8
sudo killall -HUP mDNSResponder
127.0.0.1
是节点上的本地 DNS 服务器 运行,为服务A
记录提供服务8.8.8.8
是 Google 的 Public DNS 服务器
目前,我假设 MacOS 上的用户正在使用“Wi-Fi”网络,但我想以编程方式确定这一点
Windows 作为管理员:
netsh interface show interface
找到您想要更改 DNS 服务器的网络连接(例如:WiFi
)。
netsh interface ipv4 add dns "WiFi" 127.0.0.1 index=1
netsh interface ipv4 add dns "WiFi" 8.8.8.8 index=2
ipconfig /flushdns
在 macOS 上,我认为这不会满足您的要求。当您在 macOS 上配置多个 DNS 服务器时,系统解析器不会按顺序尝试它们,它只是在可用服务器之间半随机地触发请求。这意味着它有时会将您的私人服务器请求发送到 public (Google) 服务器,被告知没有这样的域,然后就停在那里。或者它会向本地主机 DNS 发送对公共站点的请求,如果没有正确响应,则决定 that 站点不工作。基本上,macOS 解析器不进行故障转移。
您的私人服务器是否使用非标准 TLD 或类似名称?如果是这样,您可以通过在 /etc/resolver/ 下添加一个文件来将对该 TLD 的查询重定向到私有 DNS 服务器来完成这项工作。
无论如何,如果它有用,这里有一种检测主要(活动)网络接口并在 macOS 中设置其 DNS 服务器的方法:
#!/bin/bash
interfaceDevice=$(netstat -rn | awk '( == "default") {print ; exit}')
if [[ -z "$interfaceDevice" ]]; then
echo "Unable to get primary network interface device" >&2
exit 1
fi
interfaceName=$(networksetup -listallhardwareports | grep -B1 "Device: $interfaceDevice$" | sed -n 's/^Hardware Port: //p')
if [[ -z "$interfaceName" ]]; then
echo "Unable to get primary network interface name" >&2
exit 1
fi
networksetup -setdnsservers "$interfaceName" 127.0.0.1 8.8.8.8