batch,@echo off,set ethname="以太网",set secondDNS=8.8.4.4,netsh interface ip add dnsservers name=%ethname% addr=%secondDNS% index=2,
`,将
ethname替换为实际网卡名,
secondDNS`换成目标备用DNS地址即可《给网卡加备用DNS脚本详解》
背景介绍
在网络使用过程中,DNS(域名系统)扮演着至关重要的角色,它负责将人类可读的域名转换为计算机能够理解的IP地址,从而使我们可以通过网址访问各种网站和服务,有时主DNS服务器可能会出现故障、响应缓慢或者遭受攻击等情况,导致网络连接不稳定甚至无法正常上网,为了避免这种情况对网络体验造成严重影响,为网卡设置备用DNS是一种非常有效的措施,通过编写脚本来自动添加备用DNS,可以提高操作效率并确保配置的准确性和一致性。
脚本原理
本脚本主要基于操作系统提供的网络配置工具和命令行接口来实现,它将获取当前网卡的信息,然后按照预定的规则向其中添加指定的备用DNS服务器地址,不同操作系统下具体的实现方式略有差异,但基本思路都是修改系统的网络配置文件或调用相关函数来完成DNS设置的改变,以下是针对常见操作系统(如Windows和Linux)的具体实现步骤。
(一)Windows系统下的实现
步骤序号 | 详细说明 | |
---|---|---|
1 | 获取网卡列表 | 使用GetNetAdapter PowerShell命令获取系统中所有的网络适配器信息,包括名称、状态等属性。 |
2 | 选择目标网卡 | 根据用户输入或其他条件(如默认网关所在的网卡)确定要配置备用DNS的目标网卡。 |
3 | 读取现有DNS设置 | 利用GetDnsClientServerAddress InterfaceAlias <网卡别名> 命令获取该网卡当前的DNS服务器列表。 |
4 | 添加备用DNS | 使用SetDnsClientServerAddress InterfaceAlias <网卡别名> ServerAddresses <新的DNS地址> 命令将新的备用DNS地址添加到现有列表中,如果需要删除某个已有的DNS记录,可以使用类似的命令并指定相应的参数进行操作。 |
(二)Linux系统下的实现
步骤序号 | 详细说明 | |
---|---|---|
1 | 确定网络接口名称 | 通过查看/etc/network/interfaces 文件或执行ip link show 命令找到对应的网络接口名称,例如eth0、wlan0等。 |
2 | 备份原配置文件 | 在进行任何修改之前,最好先备份一下原有的resolv.conf文件,以防万一出现问题可以恢复原始设置,通常这个文件位于/etc 目录下。 |
3 | 编辑resolv.conf文件 | 打开resolv.conf文件,在其中追加新的nameserver行,指定备用DNS服务器的IP地址,格式一般为nameserver <IP地址> ,注意不要覆盖原有的nameserver条目,而是将其添加到后面。 |
4 | 重启网络服务(可选) | 为了使更改立即生效,可以选择重启相关的网络服务,如NetworkManager或者systemdnetworkd等,不过在某些情况下,系统会自动检测到文件的变化并更新DNS解析缓存。 |
完整脚本示例(以Python为例)
import os import platform import subprocess def add_backup_dns(): system = platform.system().lower() if system == 'windows': # Windows下的实现逻辑 try: # 获取所有网络适配器的信息 adapters = subprocess.check_output(['powershell', 'GetNetAdapter'], universal_newlines=True) lines = adapters.split('\n') for line in lines: if "Name" in line and "InterfaceDescription" not in line: part = line.strip().split() if len(part) > 1: adapter_name = part[1] # 这里假设我们要给第一个符合条件的网卡添加备用DNS,实际应用中可以根据更复杂的规则选择特定网卡 break # 定义备用DNS服务器地址列表 backup_dns_servers = ["8.8.8.8", "8.8.4.4"] # Google公共DNS示例 for dns in backup_dns_servers: cmd = f'netsh interface ip set dns {adapter_name} static {dns}' subprocess.run(cmd, shell=True, check=True) print("成功为Windows系统的网卡添加了备用DNS。") except Exception as e: print(f"在Windows系统中添加备用DNS时出错: {str(e)}") elif system == 'linux': # Linux下的实现逻辑 try: # 查找活动的网络接口名称 result = subprocess.check_output(['ip', 'link', 'show']).decode('utf8') interfaces = [] for line in result.split('\n'): if 'state UP' in line: parts = line.split() if len(parts) >= 2: interfaces.append(parts[1]) if not interfaces: raise ValueError("未找到活动的网络接口。") # 选择第一个活动的网络接口进行配置 target_interface = interfaces[0] # 定义备用DNS服务器地址列表 backup_dns_servers = ["8.8.8.8", "8.8.4.4"] # Google公共DNS示例 # 打开resolv.conf文件并追加新的DNS记录 with open('/etc/resolv.conf', 'a') as f: for dns in backup_dns_servers: f.write(f"nameserver {dns}\n") print("成功为Linux系统的网卡添加了备用DNS。") except Exception as e: print(f"在Linux系统中添加备用DNS时出错: {str(e)}") else: print(f"不支持的操作系统: {system}") if __name__ == "__main__": add_backup_dns()
相关问题与解答
问题1:为什么有时候设置了备用DNS但还是不能正常上网?
解答:可能有以下几种原因,一是虽然设置了备用DNS,但本地计算机的DNS缓存还没有更新,可以尝试清空DNS缓存(在Windows中使用ipconfig /flushdns
命令,在Linux中使用sudo systemdresolve flushcache
命令),二是网络防火墙或者安全软件阻止了对备用DNS服务器的访问,需要检查相关设置并允许流量通过,三是备用DNS服务器本身存在问题,比如负载过高、被屏蔽等,这时可以尝试更换其他可靠的公共DNS服务器。
问题2:如何验证是否成功添加了备用DNS?
解答:在不同的操作系统中有不同方法,在Windows中,可以通过命令提示符输入nslookup <任意域名>
,观察返回的结果中的服务器地址是否包含刚刚设置的备用DNS服务器IP,在Linux中,同样可以使用nslookup
或dig
命令来进行测试,也可以查看系统的网络配置文件,确认备用DNS是否已经被正确写入相应的位置,在Linux中查看/etc/resolv.conf
文件