本文目录导读:

- 方式一:通过图形界面脚本(模拟手动点击,适合普通家用路由器)
- 方式二:通过SSH命令行(适合OpenWrt/Linux网关)
- 方式三:通过路由器API(华硕/Merlin/OpenWrt)
- 方式四:静态修改(自定义脚本)
- 常见成功经验
- 注意事项
要修改网关的DNS,通常有两种主要方式:通过路由器的Web管理界面或通过SSH命令行(如果网关是Linux/OpenWrt系统)。
以下是具体步骤:
通过图形界面脚本(模拟手动点击,适合普通家用路由器)
大多数家用路由器没有直接的API,但可以使用 Playwright/Selenium(自动化浏览器)写脚本来模拟操作:
步骤:
- 登录路由器后台(如
168.1.1)。 - 找到“网络设置” -> “DHCP服务器”或“WAN口设置”。
- 修改DNS字段。
- 保存/应用。
示例(Python + Selenium):
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 启动浏览器
driver = webdriver.Chrome()
# 登录路由器
driver.get("http://192.168.1.1")
driver.find_element(By.ID, "username").send_keys("admin")
driver.find_element(By.ID, "password").send_keys("password")
driver.find_element(By.ID, "login").click()
time.sleep(2)
# 导航到DHCP设置(路径取决于品牌,可能需要手动检查元素ID)
driver.get("http://192.168.1.1/network/dhcp")
# 修改DNS
dns_input = driver.find_element(By.ID, "dns1")
dns_input.clear()
dns_input.send_keys("114.114.114.114")
# 保存
driver.find_element(By.ID, "save").click()
driver.quit()
缺点: 不同品牌路由器页面元素ID不同,脚本需针对特定固件修改。
通过SSH命令行(适合OpenWrt/Linux网关)
如果你的网关跑的是Linux发行版(如OpenWrt、Debian、Ubuntu),可以直接通过SSH执行命令。
一次性临时修改(重启后失效)
# 修改 /etc/resolv.conf sudo sed -i 's/nameserver .*/nameserver 114.114.114.114/' /etc/resolv.conf echo "nameserver 8.8.8.8" >> /etc/resolv.conf
永久修改DNS(使用resolvectl或netplan)
使用 resolvectl(systemd-resolved):
# 设置全局DNS sudo resolvectl dns eth0 114.114.114.114 8.8.8.8 # 如果使用resolvconf(Debian/Ubuntu传统方式) sudo sed -i 's/dns-nameservers.*/dns-nameservers 114.114.114.114/' /etc/network/interfaces
使用 uci(OpenWrt专用):
# SSH到OpenWrt网关 ssh root@192.168.1.1 # 修改DHCP分配的DNS uci set dhcp.@dnsmasq[0].server='114.114.114.114' uci commit dhcp # 如果是WAN口DNS uci set network.wan.dns='114.114.114.114 8.8.8.8' uci commit network # 重启网络服务 /etc/init.d/network reload
编写自动化脚本(SSH远程执行)
#!/bin/bash # 远程修改OpenWrt网关DNS ssh root@192.168.1.1 "uci set network.wan.dns='114.114.114.114'; uci commit network; /etc/init.d/network reload"
通过路由器API(华硕/Merlin/OpenWrt)
部分路由器支持HTTP API或REST API。
华硕路由器(Merlin固件):
# 使用curl通过web接口
curl -k -H "Authorization: Basic $(echo -n admin:password | base64)" \
"http://192.168.1.1/apply.cgi?action_mode=apply&dns1_x=114.114.114.114&dns2_x=8.8.8.8"
MikroTik RouterOS(API):
# 通过SSH修改 /system dns set servers=114.114.114.114,8.8.8.8
静态修改(自定义脚本)
如果你能直接物理访问网关或拥有root权限:
创建 /usr/local/bin/set_dns.sh:
#!/bin/bash # 修改主DNS echo "nameserver 1.1.1.1" > /etc/resolv.conf echo "nameserver 9.9.9.9" >> /etc/resolv.conf chattr +i /etc/resolv.conf # 防止被覆盖(谨慎使用)
通过cron定时恢复DNS:
# 每5分钟检查并恢复DNS */5 * * * * sudo /usr/local/bin/set_dns.sh
常见成功经验
| 场景 | 推荐方法 | 示例工具 |
|---|---|---|
| 家用TP-Link/小米 | 浏览器自动化 | Playwright/Puppeteer |
| 公司网关OpenWrt | SSH + UCI命令 | ssh + uci set |
| 树莓派作为网关 | SSH + resolvectl |
systemd-resolved |
| 华硕路由Asuswrt-Merlin | Web API | curl |
| MikroTik | SSH + CLI | ssh + /system dns |
注意事项
- DNS回环风险:不要把网关指向自己(如
0.0.1),除非你运行了本地DNS服务。 - 持久化:
/etc/resolv.conf经常被网络管理器覆盖,推荐用resolvectl或netplan。 - 备份:修改前先
cp /etc/config/dhcp /etc/config/dhcp.bak。 - 重启服务:修改后需要重启
dnsmasq或network。
如果方便,可以告诉我你的网关是什么系统(小米路由器”、“Ubuntu Server服务器”),我可以提供更精确的脚本。