【问题标题】:Programatically set DNS servers (Windows, MacOS)以编程方式设置 DNS 服务器(Windows、MacOS)
【发布时间】:2021-08-06 12:55:01
【问题描述】:

我需要在 Windows、MacOS 和 Linux 上的活动网络接口(Wi-fi、以太网等)上以编程方式设置主机的 DNS 服务器。

我想避免为我在 ingress 上运行的 Kubernetes 服务手动更新/污染/etc/hosts

目前,我的流程是为团队中运行我们应用程序的每个人手动设置 DNS 服务器

这个问题是它是一个手动过程,我在尝试自动化它时遇到了麻烦,因为输出的格式很奇怪并且难以解析。这意味着我无法知道使用哪个网络接口合适。

基本上,需要做的是以下(在两个平台上)

  1. 获取活动网络名称
  2. 将活动网络的 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 的公共 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

【问题讨论】:

  • 基本上,我想知道是否有任何方法可以将netsh 输出格式化为机器可读格式

标签: node.js windows macos dns command-line-interface


【解决方案1】:

在 macOS 上,我认为这不会满足您的要求。当您在 macOS 上配置多个 DNS 服务器时,系统解析器不会按顺序尝试它们,它只是在可用服务器之间半随机地触发请求。这意味着它有时会将您的私人服务器的请求发送到公共(Google)服务器,被告知没有这样的域,然后停在那里。或者它将公共站点的请求发送到本地主机 DNS,如果没有正确响应,则决定 那个 站点不起作用。基本上,macOS 解析器不会进行故障转移。

您的私人服务器是否属于非标准 TLD 或类似的?如果是这样,您也许可以通过在 /etc/resolver/ 下添加一个文件来将该 TLD 的查询重定向到私有 DNS 服务器来完成这项工作。

无论如何,如果有用,这里有一种方法可以检测主(活动)网络接口并在 macOS 中设置其 DNS 服务器:

#!/bin/bash

interfaceDevice=$(netstat -rn | awk '($1 == "default") {print $6; 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-16
    • 2011-05-05
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    相关资源
    最近更新 更多